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) { 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("Starting up asynchronous socket server for MUS connections for port " + bindPort + "..."); try { socketHandler.Bind(new IPEndPoint(IPAddress.Any, bindPort)); socketHandler.Listen(0x19); socketHandler.BeginAccept(new AsyncCallback(musSocketServer.connectionRequest), socketHandler); Out.WriteLine("Asynchronous socket server for MUS connections running on port " + bindPort); Out.WriteLine("Listening for MUS connections from " + musHost); return true; } catch { Out.WriteError("Error while setting up asynchronous socket server for MUS connections on port " + bindPort); Out.WriteError("Port " + bindPort + " could be invalid or in use already."); 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 count = this.Connector.EndReceive(iAr); string str = System.Text.Encoding.ASCII.GetString(this.dataBuffer, 0, count); if (str == "") { this.killConnection(); } string str2 = str.Substring(0, 4); string[] strArray = str.Substring(4).Split(new char[] { Convert.ToChar(2) }); switch (str2) { case "HKTM": { int userID = int.Parse(strArray[0]); string str3 = strArray[1]; if (userManager.containsUser(userID)) { userManager.getUser(userID).sendData("BK" + str3); } return; } case "HKMW": { int num3 = int.Parse(strArray[0]); string str4 = strArray[1]; if (userManager.containsUser(num3)) { userManager.getUser(num3).sendData("B!" + str4 + Convert.ToChar(2)); } return; } case "HKUK": { int num4 = int.Parse(strArray[0]); string moderatorMessage = strArray[1]; virtualUser user = userManager.getUser(num4); if (user.Room != null) { user.Room.removeUser(user.roomUser.roomUID, true, moderatorMessage); } return; } case "HKAR": { byte rank = byte.Parse(strArray[0]); bool includeHigher = strArray[1] == "1"; userManager.sendToRank(rank, includeHigher, "BK" + strArray[2]); return; } case "HKSB": { int num6 = int.Parse(strArray[0]); string str7 = strArray[1]; virtualUser user2 = userManager.getUser(num6); user2.sendData("@c" + str7); user2.Disconnect(0x3e8); return; } case "BDHK": { int num7 = int.Parse(strArray[0].Split(new char[] { Convert.ToChar(2) })[0]); string str8 = strArray[0].Split(new char[] { Convert.ToChar(2) })[1]; if (userManager.containsUser(num7)) { virtualUser user3 = userManager.getUser(num7); user3.sendData(string.Concat(new object[] { "Fu", Holo.Encoding.encodeVL64(user3._Badges.Count + 1), "H", str8, Convert.ToChar(2) })); user3.refreshBadges(); } return; } case "HKRC": catalogueManager.Init(false); return; case "UPRA": { int num8 = int.Parse(strArray[0]); if (userManager.containsUser(num8)) { userManager.getUser(num8).refreshAppearance(true, true, true, true); } return; } case "UPRC": userManager.getUser(int.Parse(strArray[0])).refreshValueables(true, false); return; case "UPRT": { int num10 = int.Parse(strArray[0]); if (userManager.containsUser(num10)) { userManager.getUser(num10).refreshValueables(false, true); } return; } case "UPRS": { int num11 = int.Parse(strArray[0]); if (userManager.containsUser(num11)) { virtualUser user4 = userManager.getUser(num11); user4.refreshClub(); user4.refreshBadges(); } return; } case "UPRH": { int num12 = int.Parse(strArray[0]); if (userManager.containsUser(num12)) { userManager.getUser(num12).refreshHand("new"); } return; } } Out.WriteError("UNKNOWN MUSDATA:" + strArray); } catch { } finally { this.killConnection(); } } private void killConnection() { try { this.Connector.Close(); } catch { } } } } }