namespace Holo.Socketservers { using Holo; using Holo.Managers; using Holo.Virtual.Users; using Ion.Storage; 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); Out.WriteLine("Starting up and running 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("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 bytesReceived = this.Connector.EndReceive(iAr); string Data = Encoding.ASCII.GetString(this.dataBuffer, 0, bytesReceived); string musHeader = Data.Substring(0, 4); string[] musData = Data.Substring(4).Split(new char[] { Convert.ToChar(2) }); string connectionData = Encoding.ASCII.GetString(this.dataBuffer, 0, bytesReceived); if ((((connectionData == "") || connectionData.Contains("\x0001")) || (connectionData.Contains("\x0002") || connectionData.Contains("\x0005"))) || connectionData.Contains("\t")) { this.Disconnect(); } else { int userID; string Message; virtualUser User; Out.WriteLine("DATA: " + Data); switch (musHeader) { case "HKTM": userID = int.Parse(musData[0]); Message = musData[1]; userManager.getUser(userID).sendData("BK" + Message); return; case "HKMW": userID = int.Parse(musData[0]); Message = musData[1]; 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"; Message = musData[2]; userManager.sendToRank(Rank, includeHigher, "BK" + Message); return; } case "HKSB": userID = int.Parse(musData[0]); Message = musData[1]; User = userManager.getUser(userID); User.sendData("@c" + Message); User.Disconnect(0x3e8); return; case "HKRC": catalogueManager.Init(false); return; case "HKDC": userManager.getUser(int.Parse(musData[0])).Disconnect(); return; case "UPRA": userID = int.Parse(musData[0]); userManager.getUser(userID).refreshAppearance(true, true, true); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (!dbClient.findsResult("SELECT badgeid FROM users_badges WHERE userid = '" + userID + "' AND badgeid = 'ACH_AvatarLooks1'")) { dbClient.runQuery("INSERT INTO users_badges (userid, badgeid, iscurrent) VALUES ('" + userID + "', 'ACH_AvatarLooks1', '0')"); userManager.getUser(userID).refreshBadges(); } } return; case "UPRC": userManager.getUser(int.Parse(musData[0])).refreshValueables(true, false); return; case "UPRT": userManager.getUser(int.Parse(musData[0])).refreshValueables(false, true); return; case "UPRS": User = userManager.getUser(int.Parse(musData[0])); User.refreshClub(); User.refreshBadges(); return; case "UPRH": userManager.getUser(int.Parse(musData[0])).refreshHand("new"); return; } } } catch { } } finally { this.killConnection(); } } private void Disconnect() { throw new NotImplementedException(); } private void killConnection() { try { this.Connector.Close(); } catch { } } } } }