namespace Holo.Socketservers { using Holo; using Holo.Managers; using Holo.Virtual.Users; using System; using System.Net; using System.Net.Sockets; using System.Text; public static class musSocketServer { private static string _musHost; private static int _Port; private static Socket socketHandler; private static void connectionRequest(IAsyncResult iAr) { musConnection connection = new musConnection(((Socket) iAr.AsyncState).EndAccept(iAr)); socketHandler.BeginAccept(new AsyncCallback(musSocketServer.connectionRequest), socketHandler); } internal static bool Init(int bindPort, string musHost) { _Port = bindPort; _musHost = musHost; socketHandler = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Out.WriteLine("Avvio del server MUS asincrono sulla porta " + bindPort + "..."); try { socketHandler.Bind(new IPEndPoint(IPAddress.Any, bindPort)); socketHandler.Listen(0x19); socketHandler.BeginAccept(new AsyncCallback(musSocketServer.connectionRequest), socketHandler); Out.WriteLine("Server MUS asincrono avviato sulla porta " + bindPort); Out.WriteLine("Ricevo dati MUS da " + musHost); return true; } catch { Out.WriteError("Errore durante il tentativo di avvio del server MUS asincrono dalla porta " + bindPort); Out.WriteError("Porta " + bindPort + " invailida o gi\x00e0 occupata."); return false; } } private class musConnection { private Socket Connector; private byte[] dataBuffer = new byte[0x2711]; internal musConnection(Socket Connector) { this.Connector = Connector; Connector.BeginReceive(this.dataBuffer, 0, this.dataBuffer.Length, SocketFlags.None, new AsyncCallback(this.dataArrival), null); } private void dataArrival(IAsyncResult iAr) { try { int num2; string str3; virtualUser user; int count = this.Connector.EndReceive(iAr); string str = System.Text.Encoding.ASCII.GetString(this.dataBuffer, 0, count); string str2 = str.Substring(0, 4); string[] strArray = str.Substring(4).Split(new char[] { Convert.ToChar(2) }); Out.WriteLine("Ricevo: " + str); switch (str2) { case "HKTM": num2 = int.Parse(strArray[0]); str3 = strArray[1]; userManager.getUser(num2).sendData("BK" + str3); return; case "HKMW": num2 = int.Parse(strArray[0]); str3 = strArray[1]; userManager.getUser(num2).sendData("B!" + str3 + Convert.ToChar(2)); return; case "HKUK": num2 = int.Parse(strArray[0]); str3 = strArray[1]; user = userManager.getUser(num2); if (user.Room != null) { user.Room.removeUser(user.roomUser.roomUID, true, str3); } return; case "HKAR": { byte rank = byte.Parse(strArray[0]); bool includeHigher = strArray[1] == "1"; userManager.sendToRank(rank, includeHigher, "BK" + strArray[2]); return; } case "HKSB": num2 = int.Parse(strArray[0]); str3 = strArray[1]; user = userManager.getUser(num2); user.sendData("@c" + str3); user.Disconnect(0x3e8); return; case "HKRC": catalogueManager.Init(); return; case "UPRA": userManager.getUser(int.Parse(strArray[0])).refreshAppearance(true, true, true); return; case "UPRC": userManager.getUser(int.Parse(strArray[0])).refreshValueables(true, false); return; case "UPRT": userManager.getUser(int.Parse(strArray[0])).refreshValueables(false, true); return; case "UPRS": user = userManager.getUser(int.Parse(strArray[0])); user.refreshClub(); user.refreshBadges(); return; case "UPRH": userManager.getUser(int.Parse(strArray[0])).refreshHand("new"); return; } } catch { } } } } }