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++; }
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(); } }