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 newConnection = 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); 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); 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 userID; string Message; virtualUser User; int bytesReceived = this.Connector.EndReceive(iAr); string Data = Encoding.ASCII.GetString(this.dataBuffer, 0, bytesReceived); if (Data == "") { this.killConnection(); } string musHeader = Data.Substring(0, 4); string[] musData = Data.Substring(4).Split(new char[] { Convert.ToChar(2) }); Out.WriteLine("DATA: " + Data); switch (musHeader) { case "HKTM": userID = int.Parse(musData[0]); Message = musData[1]; if (userManager.containsUser(userID)) { userManager.getUser(userID).sendData("BK" + Message + Convert.ToChar(2)); } return; case "HKMW": userID = int.Parse(musData[0]); Message = musData[1]; if (userManager.containsUser(userID)) { userManager.getUser(userID).sendData("B!" + Message + Convert.ToChar(2)); } return; case "HKUK": userID = int.Parse(musData[0]); Message = musData[1]; User = userManager.getUser(userID); if (User.Room != null) { User.Room.removeUser(User.roomUser.roomUID, true, Message); } return; case "HKAR": { byte Rank = byte.Parse(musData[0]); bool includeHigher = musData[1] == "1"; userManager.sendToRank(Rank, includeHigher, "BK" + musData[2]); return; } case "HKSB": userID = int.Parse(musData[0]); Message = musData[1]; User = userManager.getUser(userID); User.sendData("@c" + Message); User.Disconnect(0x3e8); return; case "BDHK": { userID = int.Parse(musData[0].Split(new char[] { Convert.ToChar(2) })[0]); string badgeCode = musData[0].Split(new char[] { Convert.ToChar(2) })[1]; if (userManager.containsUser(userID)) { User = userManager.getUser(userID); User.sendData(string.Concat(new object[] { "Fu", Encoding.encodeVL64(User._Badges.Count + 1), "H", badgeCode, Convert.ToChar(2) })); User.refreshBadges(); } return; } case "HKRC": catalogueManager.Init(false); return; case "UPRA": userID = int.Parse(musData[0]); if (userManager.containsUser(userID)) { userManager.getUser(userID).refreshAppearance(true, true, true); } return; case "UPRC": userManager.getUser(int.Parse(musData[0])).refreshValueables(true, false); return; case "UPRT": userID = int.Parse(musData[0]); if (userManager.containsUser(userID)) { userManager.getUser(userID).refreshValueables(false, true); } return; case "UPRS": userID = int.Parse(musData[0]); if (userManager.containsUser(userID)) { User = userManager.getUser(userID); User.refreshClub(); User.refreshBadges(); } return; case "UPRH": userID = int.Parse(musData[0]); if (userManager.containsUser(userID)) { userManager.getUser(userID).refreshHand("new"); } return; } Out.WriteError("UNKNOWN MUSDATA:" + musData); } catch { } finally { this.killConnection(); } } private void killConnection() { try { this.Connector.Close(); } catch { } } } } }