namespace Devoid.Net.Server { using Devoid; using Devoid.Encoding; using Devoid.Net.Server.Messages; using Devoid.Sessions; using System; using System.Collections.Generic; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; public class userConnection { public bool enteringPublicSpace; public int enteringRoomID; public bool inPublicSpace; public bool isLoggedIn = false; private byte[] mClientBuffer; private int mClientBufferSize; private bool mDances = false; private string mMessageBuffer = ""; private byte[] mServerBuffer; private int mServerBufferSize; private userSession mSession; private Socket mShockwaveSocket; private Socket mSocket; public int roomID; public userConnection(userSession pSession, Socket pShockwaveSocket) { this.mSession = pSession; this.mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); this.mServerBuffer = new byte[0x200]; if (pShockwaveSocket != null) { this.mShockwaveSocket = pShockwaveSocket; this.mClientBuffer = new byte[0x400]; } } private void completeSendDataToClient(IAsyncResult iAr) { try { this.mShockwaveSocket.EndSend(iAr); } catch { this.Disconnect(); } } private void completeSendDataToServer(IAsyncResult iAr) { try { this.mSocket.EndSend(iAr); } catch { } } private void connectedToServer(IAsyncResult iAr) { this.mSocket.EndConnect(iAr); Engine.Interface.mainForm.setTools(); this.waitForServerData(); } public void ConnectToServer() { if (this.mSocket != null) { this.mSocket.BeginConnect(Engine.Connections.serverHost, new AsyncCallback(this.connectedToServer), null); } } public void Dance() { if (this.mDances) { this.stopAction("Dance"); } else { clientMessage pMessage = new clientMessage(0x5d); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": Dance();"); } } this.mDances = !this.mDances; } public void Disconnect() { if (this.mSocket != null) { if (this.isTracker) { Engine.Sessions.trackerSession = null; Engine.Interface.showMessageBox("Tracker (user: " + this.mSession.Username + ") disconnected, connection closed.", "Devoid : disconnected", MessageBoxIcon.Asterisk); } else { Engine.Sessions.removeSession(this.mSession.Username); Engine.Interface.botForm.removeBot(this.mSession.Username); } try { this.mSocket.Close(); } catch { } this.mSocket = null; if (this.isTracker) { try { this.mShockwaveSocket.Close(); } catch { } this.mShockwaveSocket = null; Engine.Interface.mainForm.setTools(); } this.mSession = null; this.mServerBuffer = null; this.mClientBuffer = null; } } public void enterRoom(int roomID, bool Publicroom) { if (!this.isTracker) { if (roomID == 0) { this.leaveRoom(true); } else { clientMessage pMessage = new clientMessage(2); if (Publicroom) { pMessage.Append("A"); } else { pMessage.Append("@"); } pMessage.appendInteger(roomID); pMessage.appendInteger(0); this.sendMessageToServer(pMessage); this.enteringRoomID = roomID; this.enteringPublicSpace = Publicroom; if (Engine.DEBUG_ENABLED) { Engine.Log(string.Concat(new object[] { "User ", this.mSession.Username, ": enterRoom(", roomID, ",", Publicroom.ToString().ToLower(), ";" })); } } } } public void getItem(string Item) { clientMessage pMessage = new clientMessage(80); pMessage.Append(Item); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": getItem(" + Item + ");"); } } private int[] grabItemIDsFromItemMessage(string sMessageBody) { string[] strArray = sMessageBody.Split(new char[] { Convert.ToChar(2) }); List list = new List(); for (int i = 0; i < strArray.Length; i += 6) { int result = 0; if (int.TryParse(strArray[i], out result) && (strArray[i + 5].Substring(1).Length > 0)) { list.Add(result); } } return list.ToArray(); } public void leaveRoom(bool notifyServer) { if (!this.isTracker) { if (notifyServer) { this.sendMessageToServer(new clientMessage(0x35)); } this.roomID = 0; this.inPublicSpace = false; this.enteringRoomID = 0; this.enteringPublicSpace = false; Engine.Interface.botForm.modBot(this.mSession.Username, 1, "0"); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": leaveRoom(" + notifyServer.ToString().ToLower() + ");"); } } } public void lookTo(int X, int Y) { clientMessage pMessage = new clientMessage(0x4f); pMessage.Append(X); pMessage.Append(" "); pMessage.Append(Y); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log(string.Concat(new object[] { "User ", this.mSession.Username, ": lookTo(", X, ",", Y, ");" })); } } public void moveTo(int X, int Y) { clientMessage pMessage = new clientMessage(0x4b); pMessage.appendStrInteger(X); pMessage.appendStrInteger(Y); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log(string.Concat(new object[] { "User ", this.mSession.Username, ": moveTo(", X, ",", Y, ");" })); } } private bool processClientMessage(clientMessage clientMessage) { Dictionary dictionary; Engine.Interface.mainForm.logClientServerMessage(clientMessage); bool flag = true; int iD = clientMessage.ID; if (iD <= 0x35) { switch (iD) { case 0x34: { if (!Engine.extSettings.botsShoutForTrackerSay) { return flag; } string text = clientMessage.popString(); lock ((dictionary = Engine.Sessions.mSessions)) { foreach (userSession session in Engine.Sessions.mSessions.Values) { session.Connection.Shout(text); } } return false; } case 0x35: return flag; case 2: { this.inPublicSpace = clientMessage.popStrBoolean(); this.roomID = clientMessage.popInteger(); int num = clientMessage.popInteger(); if (Engine.extSettings.botsFollowTrackerToRooms) { lock ((dictionary = Engine.Sessions.mSessions)) { foreach (userSession session in Engine.Sessions.mSessions.Values) { session.Connection.enterRoom(this.roomID, this.inPublicSpace); } return flag; } } return flag; } } return flag; } switch (iD) { case 0x4b: { if (!Engine.extSettings.botsFollowTrackerWalk) { return flag; } int x = clientMessage.popStrInteger(); int y = clientMessage.popStrInteger(); Monitor.Enter(dictionary = Engine.Sessions.mSessions); try { foreach (userSession session in Engine.Sessions.mSessions.Values) { if (this.mSession.Connection.roomID == this.roomID) { session.Connection.moveTo(x, y); } } } catch { } finally { Monitor.Exit(dictionary); } return false; } case 0x4f: if (Engine.extSettings.botsFollowTrackerWalk) { string[] strArray = clientMessage.GetContent().Split(new char[] { ' ' }); int num4 = int.Parse(strArray[0]); int num5 = int.Parse(strArray[1]); lock ((dictionary = Engine.Sessions.mSessions)) { foreach (userSession session in Engine.Sessions.mSessions.Values) { if (this.mSession.Connection.roomID == this.roomID) { session.Connection.lookTo(num4, num5); } } } } return flag; } return flag; } private void processServerMessage(serverMessage serverMessage) { string str2; if (this.isTracker) { Engine.Interface.mainForm.logServerClientMessage(serverMessage); } clientMessage pMessage = new clientMessage(-1); switch (serverMessage.ID) { case 0x20: if (Engine.extSettings.applyLingoInjectionsToItems) { string stringData = serverMessage.GetStringData(); int i = wireEncoding.Decode(ref stringData); stringData = stringData.Substring(wireEncoding.Encode(i).Length); Random random = new Random(DateTime.Now.Millisecond); int[] numArray = this.grabItemIDsFromItemMessage(stringData); for (int j = 0; j < numArray.Length; j++) { str2 = Engine.extSettings.getRandomItemCustomData(); if (str2.Length > 0) { this.setItemData(numArray[j], str2); Thread.Sleep(30); } } } break; case 0x5f: try { int itemID = this.grabItemIDsFromItemMessage(serverMessage.GetStringData())[0]; str2 = Engine.extSettings.getRandomItemCustomData(); this.setItemData(itemID, str2); } catch { } break; case 3: if (!this.isLoggedIn) { this.isLoggedIn = true; if (Engine.DEBUG_ENABLED) { Engine.Log("Got LOGINOK from gameserver, username=" + this.mSession.Username + ", SSO login ticket was: " + this.mSession.ssoTicket); } if (!this.isTracker) { pMessage.Initialize(7); this.sendMessageToServer(pMessage); pMessage.Initialize(8); this.sendMessageToServer(pMessage); pMessage.Initialize(0x9d); Engine.Sessions.addSession(this.mSession); Engine.Interface.botForm.addBot(this.mSession.Username); } break; } break; case 0: if (this.isTracker) { this.waitForClientData(); if (Engine.DEBUG_ENABLED) { Engine.Log("Opened stream for client data from tracker client. (user=" + this.mSession.Username + ")"); } } else { pMessage.Initialize(0xcc); pMessage.appendString(this.mSession.ssoTicket); if (Engine.DEBUG_ENABLED) { Engine.Log("Sent SSO login ticket for bot, username=" + this.mSession.Username + ", ticket=" + this.mSession.ssoTicket); } } break; } if (!this.isTracker) { switch (serverMessage.ID) { case 0x29: if (!((this.enteringRoomID <= 0) || this.enteringPublicSpace)) { pMessage.Initialize(60); } break; case 50: pMessage.Initialize(0xc4); break; case 0x12: if (this.roomID > 0) { if (!Engine.extSettings.botsReEnterOnKick) { this.leaveRoom(true); break; } this.enterRoom(this.roomID, this.inPublicSpace); } break; case 0x13: if (this.enteringRoomID > 0) { if (!this.enteringPublicSpace) { pMessage.Initialize(0x39); pMessage.Append(this.enteringRoomID); break; } pMessage.Initialize(60); } break; case 0x1f: if (this.enteringRoomID > 0) { pMessage.Initialize(0x40); this.roomID = this.enteringRoomID; this.inPublicSpace = this.enteringPublicSpace; this.enteringRoomID = 0; this.enteringPublicSpace = false; Engine.Interface.botForm.modBot(this.mSession.Username, 1, this.roomID.ToString()); } break; } } if (pMessage.ID != -1) { this.sendMessageToServer(pMessage); } } private void receivedDataFromClient(IAsyncResult iAr) { int num; try { this.mClientBufferSize = this.mShockwaveSocket.EndReceive(iAr); } catch { if (this.mClientBuffer != null) { this.Disconnect(); } return; } bool flag = true; for (string str = Engine.Latin1Encoder.GetString(this.mClientBuffer, 0, this.mClientBufferSize); str != ""; str = str.Substring(num + 3)) { num = base64Encoding.Decode(str.Substring(1, 2)); clientMessage clientMessage = new clientMessage(str.Substring(3, num)); flag = this.processClientMessage(clientMessage); } if (flag) { this.sendClientBufferToServer(); } this.waitForClientData(); } private void receivedDataFromServer(IAsyncResult iAr) { try { this.mServerBufferSize = this.mSocket.EndReceive(iAr); } catch { this.Disconnect(); return; } string str = Engine.Latin1Encoder.GetString(this.mServerBuffer, 0, this.mServerBufferSize); if (this.mMessageBuffer.Length > 0) { str = this.mMessageBuffer + str; this.mMessageBuffer = ""; } try { while (str.Length > 0) { if (str.Contains(Convert.ToChar(1).ToString())) { string str2 = str.Substring(0, str.IndexOf(Convert.ToChar(1))); int messageID = base64Encoding.Decode(str2.Substring(0, 2)); string s = str2.Substring(2); serverMessage serverMessage = new serverMessage(messageID, Engine.Latin1Encoder.GetBytes(s)); this.processServerMessage(serverMessage); str = str.Substring(str.IndexOf(Convert.ToChar(1)) + 1); } else { this.mMessageBuffer = str; goto Label_0118; } } } catch { } Label_0118: if (this.isTracker) { try { this.sendDataToClient(this.mServerBuffer, 0, this.mServerBufferSize); } catch { } } this.waitForServerData(); } public void sendClientBufferToServer() { try { this.mSocket.BeginSend(this.mClientBuffer, 0, this.mClientBufferSize, SocketFlags.None, new AsyncCallback(this.completeSendDataToServer), null); } catch { } } public void sendDataToClient(byte[] bData) { this.sendDataToClient(bData, 0, bData.Length); } public void sendDataToClient(byte[] bData, int Start, int End) { try { this.mShockwaveSocket.BeginSend(bData, Start, End, SocketFlags.None, new AsyncCallback(this.completeSendDataToClient), null); } catch { this.Disconnect(); } } public void sendDataToServer(byte[] bData) { try { this.mSocket.BeginSend(bData, 0, bData.Length, SocketFlags.None, new AsyncCallback(this.completeSendDataToServer), null); } catch { } } public void sendMessageToClient(serverMessage pMessage) { byte[] bytes = pMessage.GetBytes(); this.sendDataToClient(bytes); } public void sendMessageToServer(clientMessage pMessage) { byte[] bytes = pMessage.GetBytes(); string str = Engine.Latin1Encoder.GetString(bytes); this.sendDataToServer(bytes); } public void setItemData(int itemID, string sData) { clientMessage pMessage = new clientMessage(0x4a); pMessage.appendString(itemID.ToString()); pMessage.appendString(sData); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log(string.Concat(new object[] { "User ", this.mSession.Username, ": setItemData(", itemID, ",", sData, ");" })); } } public void Shout(string Text) { clientMessage pMessage = new clientMessage(0x37); pMessage.appendString(Text); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": Shout(" + Text + ");"); } } public void stopAction(string Action) { clientMessage pMessage = new clientMessage(0x58); pMessage.Append(Action); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": stopAction(" + Action + ");"); } } private void waitForClientData() { try { this.mShockwaveSocket.BeginReceive(this.mClientBuffer, 0, this.mClientBuffer.Length, SocketFlags.None, new AsyncCallback(this.receivedDataFromClient), null); } catch { this.Disconnect(); } } private void waitForServerData() { try { this.mSocket.BeginReceive(this.mServerBuffer, 0, this.mServerBuffer.Length, SocketFlags.None, new AsyncCallback(this.receivedDataFromServer), null); } catch { this.Disconnect(); } } public void Wave() { clientMessage pMessage = new clientMessage(0x5e); this.sendMessageToServer(pMessage); if (Engine.DEBUG_ENABLED) { Engine.Log("User " + this.mSession.Username + ": Wave();"); } } public bool isTracker { get { return (this.mShockwaveSocket != null); } } public userSession Session { get { return this.mSession; } } } }