namespace Otaku.Socketservers { using Otaku; using Otaku.Managers; using Otaku.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) { Socket connector = ((Socket) iAr.AsyncState).EndAccept(iAr); if (connector.RemoteEndPoint.ToString().Split(new char[] { ':' })[0] != _musHost) { connector.Close(); } else { new musConnection(connector); 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 { try { 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("DATA: " + str); switch (str2) { case "HKTM": { int userID = int.Parse(strArray[0]); string str3 = strArray[1]; userManager.getUser(userID).sendData("BK" + str3); return; } case "HKMW": { int num3 = int.Parse(strArray[0]); string str4 = strArray[1]; 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 str6 = strArray[1]; virtualUser user2 = userManager.getUser(num6); user2.sendData("@c" + str6); user2.Disconnect(0x3e8); return; } case "HKRC": catalogueManager.Init(); return; case "UPRA": { int num7 = int.Parse(strArray[0]); userManager.getUser(num7).refreshAppearance(true, true, true); userManager.getUser(num7).refreshBadges(); 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": { virtualUser user3 = userManager.getUser(int.Parse(strArray[0])); user3.refreshClub(); user3.refreshBadges(); return; } case "UPRH": userManager.getUser(int.Parse(strArray[0])).refreshHand("new"); return; } } catch { } } finally { this.killConnection(); } } private void killConnection() { try { this.Connector.Close(); } catch { } } } } }