private void HandleMessage(MessageType type, byte[] data)
        {
            var dataStream = new MemoryStream(data);
            IMessage <object> resultMessage = null;

            switch (type)
            {
            case MessageType.ServerToClientHeartbeat:
                resultMessage = new ServerToClientHeartbeatMessage(new BinaryReader(dataStream));
                break;

            case MessageType.ClientToServerHeartbeat:
                resultMessage = new ClientToServerHeartbeatMessage(new BinaryReader(dataStream));
                break;

            case MessageType.Ping:
                resultMessage = new PingMessage(new BinaryReader(dataStream));
                break;

            case MessageType.PingReply:
                resultMessage = new PingReplyMessage(new BinaryReader(dataStream));
                break;

            case MessageType.ConnectionRequest:
                resultMessage = new ConnectionRequestMessage(new BinaryReader(dataStream));
                break;

            case MessageType.ConnectionRequestReply:
                resultMessage = new ConnectionRequestReplyMessage(new BinaryReader(dataStream));
                break;

            case MessageType.ConnectionRequestReplyConfirm:
                resultMessage = new ConnectionRequestReplyConfirmMessage(new BinaryReader(dataStream));
                break;

            case MessageType.ConnectionAcceptOrDeny:
                resultMessage = new ConnectionAcceptOrDenyMessage(new BinaryReader(dataStream));
                break;

            case MessageType.GetOwnAddress:
                break;

            case MessageType.GetOwnAddressReply:
                break;

            case MessageType.NatPunchRequest:
                break;

            case MessageType.NatPunch:
                break;

            case MessageType.TransferBlockRequest:
                resultMessage = new TransferBlockRequestMessage(new BinaryReader(dataStream));
                break;

            case MessageType.TransferBlock:
                resultMessage = new TransferBlockMessage(new BinaryReader(dataStream));
                break;

            case MessageType.RequestForHeartbeatWhenDisconnecting:
                resultMessage = new RequestForHeartbeatWhenDisconnectingMessage(new BinaryReader(dataStream));
                break;

            case MessageType.LanBroadcast:
                resultMessage = new LanBroadcastMessage(new BinaryReader(dataStream));
                break;

            case MessageType.GameInformationRequest:
                resultMessage = new GameInformationRequestMessage(new BinaryReader(dataStream));
                break;

            case MessageType.GameInformationRequestReply:
                break;

            case MessageType.Empty:
                resultMessage = new EmptyMessage(new BinaryReader(dataStream));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }

            OnMessageReceived?.Invoke(resultMessage);

            if (dataStream.Position == dataStream.Length)
            {
                return;
            }

            Console.WriteLine($"F****d up: {dataStream.Position}/{dataStream.Length}; Type: {type}");
            File.WriteAllBytes($"f****d-up-{lastFuckedUpId}.bin", data);
            lastFuckedUpId++;
        }
Пример #2
0
        static void Main(string[] args)
        {
            ConnectionAcceptOrDenyMessage sinf = args.Length > 0 ? FactorioServerAPI.FactorioServerAPI.GetServerInfo(args[0]) ?? new ConnectionAcceptOrDenyMessage() : FactorioServerAPI.FactorioServerAPI.GetServerInfo(Console.ReadLine()) ?? new ConnectionAcceptOrDenyMessage();

            if (!sinf.online)
            {
                Console.WriteLine("OFFLINE");
                if (args.Length == 0)
                {
                    Console.ReadKey();
                }
                return;
            }
            Console.WriteLine("ONLINE");
            Console.WriteLine("\nServer options:");
            Console.WriteLine("|========================|========================|");
            Console.WriteLine("|Option                  |                   Value|");
            Console.WriteLine("|------------------------|------------------------|");
            WriteConsoleRaw("Name", sinf.name);
            WriteConsoleRaw("Description", sinf.serverDescription);
            WriteConsoleRaw("Latency", sinf.latency + "ms");
            WriteConsoleRaw("Paused By", (from i in sinf.clients where i.peerId == sinf.pausedBy select i.Username).FirstOrDefault());
            WriteConsoleRaw("Game Version", sinf.applicationVersion);
            WriteConsoleRaw("Maximum players", sinf.maxPlayers);
            WriteConsoleRaw("Game time", new TimeSpan(sinf.gameTimeElapsed * 10000000L));
            WriteConsoleRaw("Has password", sinf.hasPassword);
            WriteConsoleRaw("Autosave interval", sinf.autosaveInterval + "min");
            WriteConsoleRaw("AFK autokick interval", sinf.AFKAutoKickInterval == 0 ? (object)"Disabled" : (object)sinf.AFKAutoKickInterval);
            WriteConsoleRaw("Can everybody use lua", sinf.allowCommands);
            WriteConsoleRaw("Can everybody pause game", !sinf.onlyAdminsCanPauseTheGame);
            WriteConsoleRaw("Needs authorization", sinf.requireUserVerification);
            Console.WriteLine("|========================|========================|");

            Console.WriteLine("\nMods:");
            Console.WriteLine("|========================|========================|");
            Console.WriteLine("|Mod                     |                 Version|");
            Console.WriteLine("|------------------------|------------------------|");
            foreach (var i in sinf.mods)
            {
                WriteConsoleRaw(i.Name, i.Version);
            }
            Console.WriteLine("|========================|========================|");

            Console.WriteLine("\nWhitelist:");
            if (sinf.whitelist.Length == 0)
            {
                Console.WriteLine("Disabled");
            }
            foreach (var i in sinf.whitelist)
            {
                Console.WriteLine(i.Username);
            }

            Console.WriteLine("\nBanlist:");
            if (sinf.banlist.Length == 0)
            {
                Console.WriteLine("Empty");
            }
            foreach (var i in sinf.banlist)
            {
                Console.WriteLine(i.Username + "; reason: " + i.Reason);
            }

            Console.WriteLine("\nAdmins: ", sinf.admins.Length);
            foreach (var i in sinf.admins)
            {
                Console.WriteLine(i);
            }

            Console.WriteLine("\n{0} players online:", sinf.clients.Length);
            foreach (var i in sinf.clients)
            {
                Console.WriteLine(i.Username);
            }
            if (args.Length == 0)
            {
                Console.ReadKey();
            }
        }