コード例 #1
0
        /// <summary>
        ///     Reads the incoming and outcoming classes.
        /// </summary>
        private void LoadMessages()
        {
            var abc = _flash.AbcGame;

            // Find HabboMessages class.
            var habboMessagesClass = abc.Classes
                                     .AsParallel()
                                     .FirstOrDefault(x => x.Traits.Count == 2 &&
                                                     x.Instance.Traits.Count == 2 &&
                                                     x.Traits.All(y => y.Type.Name.Equals("Map")));

            if (habboMessagesClass == null)
            {
                throw new ApplicationException("Unable to find HabboMessages class.");
            }

            // Parse code.
            var code         = habboMessagesClass.Constructor.Body.ParseCode();
            var instructions = code
                               .Where(x => x.OP == OPCode.GetLex ||
                                      x.OP == OPCode.PushShort ||
                                      x.OP == OPCode.PushByte)
                               .ToArray();

            var messageMapIn  = habboMessagesClass.Traits[0].QNameIndex;
            var messageMapOut = habboMessagesClass.Traits[1].QNameIndex;

            // Walk through the instructions.
            for (var i = 0; i < instructions.Length; i += 3)
            {
                // Get instructions.
                var InsMessageMap   = (GetLexIns)instructions[i];
                var InsMessageId    = (Primitive)instructions[i + 1];
                var InsMessageClass = (GetLexIns)instructions[i + 2];

                // Get message data.
                var messageOut   = messageMapOut == InsMessageMap.TypeNameIndex;
                var messageId    = Convert.ToUInt16(InsMessageId.Value);
                var messageClass = abc.GetClass(InsMessageClass.TypeName);

                // Store data.
                var message = new MessageItem(messageId, messageOut ? MessageType.Outgoing : MessageType.Incoming, messageClass);
                if (message.Type == MessageType.Incoming)
                {
                    MessagesIncoming.Add(message.Id, message);
                }
                else
                {
                    MessagesOutgoing.Add(message.Id, message);
                }
            }
        }
コード例 #2
0
        public void PollChat(object state)
        {
            if (!_Initialized)
            {
                _pollingTimer.Change(PollingInterval * 1000, Timeout.Infinite);
                return;
            }

            var ret = REST.Post <BotChatRequest, BotReply>(API_ENDPOINT_URL + "/chat",
                                                           new BotChatRequest()
            {
                Command = "PENDING"
            },
                                                           GetBaseHeaders(   ));

            if (ret != null &&
                ret.Parts.Count > 0)
            {
                MessagesIncoming?.Invoke(this, ret);
            }

            _pollingTimer.Change(PollingInterval * 1000, Timeout.Infinite);
        }