Example #1
0
        public HChatRecordData(HMessage packet)
        {
            object ReadContextValue(HMessage anotherMessage)
            {
                switch (anotherMessage.ReadShort())
                {
                case 0: return(anotherMessage.ReadBoolean());

                case 1: return(anotherMessage.ReadInt32());

                case 2: return(anotherMessage.ReadUTF8());

                default: throw new System.Exception("Nothing");
                }
            }

            Type = (HChatRecordType)packet.ReadBytes(1)[0];
            int entryCount = packet.ReadShort();

            Context = new Dictionary <string, object>(entryCount);
            for (int i = 0; i < entryCount; i++)
            {
                Context.Add(packet.ReadUTF8(), ReadContextValue(packet));
            }

            Chatlogs = new List <HChatlineData>(packet.ReadShort());
            for (int i = 0; i < Chatlogs.Capacity; i++)
            {
                Chatlogs.Add(new HChatlineData(packet));
            }
        }
Example #2
0
        private async Task ReadMessageAsync()
        {
            HMessage readMessage = await _externalContractor
                                   .ReceiveAsync().ConfigureAwait(false);

            var destination = (HDestination)readMessage.Header;

            HandleMessage(readMessage.ReadBytes(readMessage.Length - 2), destination);
        }
Example #3
0
        private async Task ReceiveRemoteModuleDataAsync()
        {
            try
            {
                HMessage packet = await RemoteModule.ReceivePacketAsync().ConfigureAwait(false);

                if (packet == null)
                {
                    DataAwaiters.Values.ToList().ForEach(awaiter =>
                    {
                        if (awaiter != null)
                        {
                            awaiter.SetResult(null);
                        }
                    });

                    RemoteModule = null;
                    Task grabRemoteModuleTask =
                        GrabRemoteModuleAsync();

                    return;
                }

                var response = new HMessage(packet.Header);
                #region Switch: packet.Header
                switch (packet.Header)
                {
                default: response = null; break;

                case 0:
                {
                    response.WriteShort((ushort)Hotel);
                    break;
                }

                case 1:
                {
                    response.WriteString(Game?.Location);
                    if (!string.IsNullOrWhiteSpace(Game?.Location))
                    {
                        response.WriteString(Path.GetFullPath("Hashes.ini"));
                    }
                    break;
                }

                case 2:
                {
                    response.WriteString(GameData.Source);
                    break;
                }

                case 3:
                {
                    response.WriteShort(Connection.Port);
                    response.WriteString(Connection.Host);
                    response.WriteString(Connection.Address);
                    break;
                }

                case 4:
                {
                    if (Connection != null)
                    {
                        int    dataLength = packet.ReadInteger();
                        byte[] data       = packet.ReadBytes(dataLength);

                        await Connection.SendToClientAsync(
                            data).ConfigureAwait(false);

                        response = null;
                    }
                    break;
                }

                case 5:
                {
                    if (Connection != null)
                    {
                        int    dataLength = packet.ReadInteger();
                        byte[] data       = packet.ReadBytes(dataLength);

                        await Connection.SendToServerAsync(
                            data).ConfigureAwait(false);

                        response = null;
                    }
                    break;
                }

                case 6:
                case 7:
                {
                    string stamp = packet.ReadString();
                    if (DataAwaiters.ContainsKey(stamp))
                    {
                        var destination = (HDestination)(packet.Header - 6);

                        int    step        = packet.ReadInteger();
                        bool   isBlocked   = packet.ReadBoolean();
                        int    dataLength  = packet.ReadInteger();
                        byte[] data        = packet.ReadBytes(dataLength);
                        var    interPacket = new HMessage(data, destination);

                        var args = new DataInterceptedEventArgs(interPacket, step, (destination == HDestination.Server));
                        args.IsBlocked = isBlocked;

                        DataAwaiters[stamp].SetResult(args);
                        response = null;
                    }
                    break;
                }
                }
                #endregion

                if (response != null)
                {
                    await RemoteModule.SendPacketAsync(response).ConfigureAwait(false);
                }
            }
            finally
            {
                if (RemoteModule != null)
                {
                    Task receiveRemModuDataTask =
                        ReceiveRemoteModuleDataAsync();
                }
            }
        }
Example #4
0
        private async Task ReceiveRemoteContractorDataAsync()
        {
            try
            {
                HMessage packet = await _remoteContractor.ReceivePacketAsync().ConfigureAwait(false);

                if (packet == null)
                {
                    Environment.Exit(0);
                }
                #region Switch: packet.Header
                switch (packet.Header)
                {
                case 0:
                {
                    _initStep++;
                    _hotel = (HHotel)packet.ReadShort();
                    break;
                }

                case 1:
                {
                    _initStep++;
                    _in  = new Incoming();
                    _out = new Outgoing();

                    string location = packet.ReadString();
                    if (!string.IsNullOrWhiteSpace(location))
                    {
                        _game = new HGame(location);
                        _game.Disassemble();

                        _game.GenerateMessageHashes();
                        if (packet.Readable > 0)
                        {
                            string hashesPath = packet.ReadString();
                            _in.Load(_game, hashesPath);
                            _out.Load(_game, hashesPath);
                        }
                        _module.ModifyGame(_game);
                    }
                    break;
                }

                case 2:
                {
                    _initStep++;
                    _gameData = new HGameData(packet.ReadString());
                    _module.ModifyGameData(_gameData);
                    break;
                }

                case 3:
                {
                    _initStep++;
                    var connection = (ContractorProxy)_connection;
                    connection.Port    = packet.ReadShort();
                    connection.Host    = packet.ReadString();
                    connection.Address = packet.ReadString();
                    break;
                }

                case 4:
                case 5:
                {
                    var destination = (HDestination)(packet.Header - 4);

                    string stamp       = packet.ReadString();
                    int    step        = packet.ReadInteger();
                    bool   isBlocked   = packet.ReadBoolean();
                    int    dataLength  = packet.ReadInteger();
                    byte[] data        = packet.ReadBytes(dataLength);
                    var    interPacket = new HMessage(data, destination);

                    var args = new DataInterceptedEventArgs(interPacket, step, (destination == HDestination.Server));
                    try
                    {
                        if (destination == HDestination.Server)
                        {
                            _module.HandleOutgoing(args);
                        }
                        else
                        {
                            _module.HandleIncoming(args);
                        }
                    }
                    finally
                    {
                        await SendInterceptedDataResponseAsync(
                            stamp, args).ConfigureAwait(false);
                    }
                    break;
                }
                }
                #endregion

                if (_initStep == 4)
                {
                    _initializationSource?.SetResult(true);
                }
            }
            finally
            {
                Task receiveRemContDataTask = ReceiveRemoteContractorDataAsync();
            }
        }
Example #5
0
        public static void AppendPacketStructure(StringBuilder sb, HMessage packet, StructureType[] structure)
        {
            int originalPosition = packet.Position;

            try
            {
                packet.Position = 0;

                for (int i = 0; i < structure.Length; i++)
                {
                    sb.Append(" ");

                    switch (structure[i])
                    {
                    case StructureType.Boolean:
                        sb.Append(packet.ReadBoolean() ? "true" : "false");
                        break;

                    case StructureType.Byte:
                        sb.Append($"b:{packet.ReadBytes(1)[0]}");
                        break;

                    case StructureType.Short:
                        sb.Append($"s:{(short)packet.ReadShort()}");
                        break;

                    case StructureType.Integer:
                        sb.Append($"{packet.ReadInteger()}");
                        break;

                    case StructureType.String:
                        sb.Append($"\"{EscapeString(packet.ReadString())}\"");
                        break;

                    case StructureType.ByteArray:
                        int    len   = packet.ReadInteger();
                        byte[] bytes = packet.ReadBytes(len);
                        sb.Append("a:[");
                        for (int j = 0; j < bytes.Length; j++)
                        {
                            if (j > 0)
                            {
                                sb.Append(" ");
                            }
                            sb.Append(bytes[j].ToString("x2"));
                        }
                        sb.Append("]");
                        break;

                    default:
                        throw new Exception($"Unknown/unsupported structure type: {structure[i]}");
                    }
                }

                if (packet.Readable > 0)
                {
                    byte[] extra = packet.ReadBytes(packet.Readable);
                    sb.Append(" [");
                    for (int i = 0; i < extra.Length; i++)
                    {
                        if (i > 0)
                        {
                            sb.Append(" ");
                        }
                        sb.Append(extra[i].ToString("x2"));
                    }
                    sb.Append("]");
                }
            }
            finally { packet.Position = originalPosition; }
        }