using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; using Blizzard.HabboHotel.Users; namespace Blizzard.Connections { class UserConnection { public GameClientConnection GetClient; public int ConnectionID; public Socket ConnectionSock; private Task Thread; private AsyncCallback Callback; private byte[] dataBuffer = new byte[200]; public UserConnection(int ID, Socket Sock) { this.ConnectionID = ID; this.ConnectionSock = Sock; Callback = new AsyncCallback(RequestData); Thread = new Task(StartListenAndResponse); Thread.Start(); } private void StartListenAndResponse() { WaitForData(); } private void WaitForData() { if (ConnectionSock == null) return; try { if (ConnectionSock.Connected) this.ConnectionSock.BeginReceive(dataBuffer, 0, dataBuffer.Length, SocketFlags.None, Callback, null); } catch { OnDisconnect(); } } public void OnDisconnect() { if (ConnectionSock == null) return; if (ConnectionSock.Connected) @ConnectionSock.Close(); if (GetClient != null) { //? } ConnectionSock.Dispose(); ConnectionSock = null; try { Thread.Dispose(); } catch { } } private void RequestData(IAsyncResult iAr) { try { int Bytes = ConnectionSock.EndReceive(iAr); if (Bytes == 0) { OnDisconnect(); return; } string ReceiveData = System.Text.Encoding.Default.GetString(dataBuffer, 0, Bytes); if (ReceiveData.StartsWith("")) { SenddData("" + "\r\n" + "" + "\r\n" + "" + "\r\n" + " " + "\r\n" + ""); } else { if (GetClient == null) GetClient = new GameClientConnection(ConnectionID); GetClient.HandleData(ReceiveData); } } catch { OnDisconnect(); } finally { Thread = new Task(StartListenAndResponse); Thread.Start(); } } public void SenddData(string Data) { if (ConnectionSock == null) return; Data += Convert.ToChar(0); byte[] dataBytes = System.Text.Encoding.Default.GetBytes(Data); ConnectionSock.Send(dataBytes); } public void SendPacket(string Data) { if (ConnectionSock == null) return; Data += Convert.ToChar(1); byte[] dataBytes = System.Text.Encoding.Default.GetBytes(Data); ConnectionSock.Send(dataBytes); } public void SendPackets(string Data) { if (ConnectionSock == null) return; byte[] dataBytes = System.Text.Encoding.Default.GetBytes(Data); ConnectionSock.Send(dataBytes); } } class GameClientConnection { public int ID = 0; public ClientMessage Request; public RequestMessages Requests; public Habbo User; public UserConnection GetConnection() { return BlizzardSystem.Net.UsersConnections[ID]; } public void SendPacket(string Message) { GetConnection().SendPacket(Message); } public void SendPackets(string Message) { GetConnection().SendPackets(Message); } public GameClientConnection(int ID) { this.ID = ID; Requests = new RequestMessages(ID); Habbo User = new Habbo(GetConnection(), ID); Requests.GetClasses(User); } public void HandleData(string Data) { StringBuilder Buffer = new StringBuilder(Data); while (Buffer.Length > 0) { int v = HabboEncode.decodeB64(Buffer.ToString().Substring(1, 2)); Requests.ProcessPackets(Buffer.ToString().Substring(3, v)); Buffer.Remove(0, 3 + v); } } } }