using System; using System.Data; using System.Collections; using System.Collections.Generic; using MySql.Data.MySqlClient; namespace gServer { public class ServerData { public string Name = "null"; public string Meta = "null"; public string Game = "null"; public int CurrentUsers = 0; public int MaxUsers = 0; public string IP = "null"; public int Port = 0; public long lastUpdate; } public class ServerlistServer { public MainClass main; public MrAG.Networking.IncomingConnection Connection; public ServerData serverData = new ServerData(); public ServerlistServer (MrAG.Networking.IncomingConnection c, MainClass main) { this.main = main; c.Connection.Packets[0] = new Action(Packet_Add); c.Connection.Packets[1] = new Action(Packet_Update); c.Connection.Packets[2] = new Action(Packet_Offline); c.Connection.Packets[3] = new Action(Packet_UpdatePlayerCount); c.Connection.Packets[4] = new Action(Packet_UpdateMeta); this.Connection = c; } public void Disconnected(bool Unexpected) { if(Unexpected) this.main.Log(this.Connection.IP + " from Serverlist Server unexpectedly disconnected."); this.main.Servers.Remove(this.serverData); this.main.ServerlistServers.Remove(this); } public void Update() { try { this.Connection.Connection.Update(); }catch(Exception ex){ if(ex.Message == "The object was used after being disposed.") { this.Disconnected(true); } this.main.Log(this.Connection.IP + " from Serverlist Server errored: " + ex.Message); this.Connection.Kick("Socket error"); } } public void InvalidPacket() { this.Connection.Kick("Invalid packet received!"); this.main.Log(this.Connection.IP + " from Serverlist Server kicked for an invalid packet."); this.Disconnected(false); } public void Packet_Add(MrAG.Networking.Packet p) { bool shouldAdd = this.serverData.IP == "null"; this.serverData.IP = this.Connection.IP; //this.serverData.IP = "127.0.0.1"; try { this.serverData.Name = p.ReadString(); this.serverData.Meta = p.ReadString(); this.serverData.Game = p.ReadString(); this.serverData.Port = p.ReadInt(); this.serverData.MaxUsers = p.ReadInt(); }catch{ this.InvalidPacket(); return; } if(shouldAdd) { this.main.Servers.Add(this.serverData); this.main.Log("Added server " + this.serverData.Name + " to " + this.serverData.Game); }else this.main.Log("Tried adding " + this.serverData.Name + ", but shouldAdd = false"); p.Start_Send(); p.AddByte(0); p.AddBool(shouldAdd); if(!shouldAdd) p.AddString("Already added!"); p.Finish_Send(); } public void Packet_Update(MrAG.Networking.Packet p) { this.serverData.lastUpdate = this.main.Epoch(); if(this.serverData.IP == "null") { this.Connection.Connection.Connection.Start_Send(); this.Connection.Connection.Connection.AddByte(1); this.Connection.Connection.Connection.AddBool(false); this.Connection.Connection.Connection.Finish_Send(); } } public void Packet_Offline(MrAG.Networking.Packet p) { this.main.Servers.Remove(this.serverData); this.serverData = new ServerData(); this.main.Log("Server " + this.Connection.IP + " stopped"); } public void Packet_UpdatePlayerCount(MrAG.Networking.Packet p) { try { this.serverData.CurrentUsers = p.ReadInt(); }catch{ this.InvalidPacket(); return; } } public void Packet_UpdateMeta(MrAG.Networking.Packet p) { try { this.serverData.Meta = p.ReadString(); }catch{ this.InvalidPacket(); return; } } } }