using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using Uber.Net; using Uber.Messages; using Uber.HabboHotel.Users; using Uber.HabboHotel.Users.Authenticator; using Uber.HabboHotel.Support; using Uber.HabboHotel.Misc; using Uber.Storage; using Uber.Utilities.Encoding; namespace Uber.HabboHotel.GameClients { class GameClient { private uint Id; private TcpConnection Connection; private GameClientMessageHandler MessageHandler; private Habbo Habbo; public Boolean PongOK; public uint ClientId { get { return Id; } } public GameClient(uint ClientId) { this.Id = ClientId; this.Connection = UberEnvironment.GetConnectionManager().GetConnection(ClientId); this.MessageHandler = new GameClientMessageHandler(this); } public TcpConnection GetConnection() { return Connection; } public GameClientMessageHandler GetMessageHandler() { return MessageHandler; } public Habbo GetHabbo() { return Habbo; } public void StartConnection() { PongOK = true; MessageHandler.RegisterGlobal(); MessageHandler.RegisterHandshake(); MessageHandler.RegisterHelp(); TcpConnection.RouteReceivedDataCallback DataRouter = new TcpConnection.RouteReceivedDataCallback(HandleConnectionData); Connection.Start(DataRouter); } public void Login(string AuthTicket) { try { Habbo NewHabbo = Authenticator.TryLoginHabbo(AuthTicket); if (NewHabbo == null) { SendNotif("Can't login, use not found by SSO TICKED: "); Disconnect(); return; } UberEnvironment.GetGame().GetClientManager().LogClonesOut(NewHabbo.Username); this.Habbo = null; this.Habbo = NewHabbo; this.Habbo.LoadData(); } catch (IncorrectLoginException e) { SendNotif("Login error: " + e.Message); Disconnect(); return; } try { UberEnvironment.GetGame().GetBanManager().CheckForBanConflicts(this); } catch (ModerationBanException e) { SendBanMessage(e.Message); Disconnect(); return; } using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient()) { dbClient.ExecuteQuery("UPDATE users SET online = '1', auth_ticket = '', ip_last = '" + GetConnection().IPAddress + "' WHERE id = '" + GetHabbo().Id + "' LIMIT 1"); dbClient.ExecuteQuery("UPDATE user_info SET login_timestamp = '" + UberEnvironment.GetUnixTimestamp() + "' WHERE user_id = '" + GetHabbo().Id + "' LIMIT 1"); } GetMessageHandler().HandleRights(); if (GetHabbo().IsUltraVip && !GetHabbo().GetBadgeComponent().HasBadge("VIP")) { GetHabbo().GetBadgeComponent().GiveBadge("VIP", true); } if (GetHabbo().HasFuse("fuse_mod")) { SendMessage(UberEnvironment.GetGame().GetModerationTool().SerializeTool()); UberEnvironment.GetGame().GetModerationTool().SendOpenTickets(this); } SendMessage(GetHabbo().GetAvatarEffectsInventoryComponent().Serialize()); MessageHandler.GetResponse().Init(290); MessageHandler.GetResponse().AppendBoolean(true); MessageHandler.GetResponse().AppendBoolean(false); MessageHandler.SendResponse(); MessageHandler.GetResponse().Init(3); MessageHandler.SendResponse(); MessageHandler.GetResponse().Init(517); MessageHandler.GetResponse().AppendBoolean(true); MessageHandler.SendResponse(); if (UberEnvironment.GetGame().GetPixelManager().NeedsUpdate(this)) { UberEnvironment.GetGame().GetPixelManager().GivePixels(this); } if (UberEnvironment.StartRoomId > 0 && UberEnvironment.OnlyStartRoom) { MessageHandler.GetResponse().Init(455); MessageHandler.GetResponse().AppendUInt(UberEnvironment.StartRoomId); MessageHandler.SendResponse(); } else if (GetHabbo().HomeRoom > 0 && !UberEnvironment.OnlyStartRoom) { MessageHandler.GetResponse().Init(455); MessageHandler.GetResponse().AppendUInt(GetHabbo().HomeRoom); MessageHandler.SendResponse(); } MessageHandler.GetResponse().Init(458); MessageHandler.GetResponse().AppendInt32(30); MessageHandler.GetResponse().AppendInt32(GetHabbo().FavoriteRooms.Count); foreach (uint Id in GetHabbo().FavoriteRooms) { MessageHandler.GetResponse().AppendUInt(Id); } UberEnvironment.GetGame().GetAchievementManager().UnlockAchievement(this, 11, 1); // beta lab rat if (UberEnvironment.GetGame().GetGameConfiguration().Motd_Enabled == 1 && UberEnvironment.GetGame().GetGameConfiguration().Motd_Message.Length > 0) { SendMotd(UberEnvironment.GetGame().GetGameConfiguration().Motd_Message); } MessageHandler.SendResponse(); if (GetHabbo().GetSubscriptionManager().GetCurrentSub != null && GetHabbo().GetSubscriptionManager().GetCurrentSub.ItemsToSelect > 0) { MessageHandler.GetResponse().Init(280); MessageHandler.GetResponse().AppendBoolean(true); MessageHandler.SendResponse(); } MessageHandler.RegisterUsers(); MessageHandler.RegisterQuests(); MessageHandler.RegisterMessenger(); MessageHandler.RegisterCatalog(); MessageHandler.RegisterNavigator(); MessageHandler.RegisterRooms(); } public void SendBanMessage(string Message) { ServerMessage BanMessage = new ServerMessage(35); BanMessage.AppendStringWithBreak("A moderator has kicked you from the hotel:", 13); BanMessage.AppendStringWithBreak(Message); GetConnection().SendMessage(BanMessage); } public void SendMotd(String Message) { ServerMessage nMessage = new ServerMessage(810); nMessage.AppendUInt(1); nMessage.AppendStringWithBreak(Message); GetConnection().SendMessage(nMessage); } public void SendNotif(string Message) { SendNotif(Message, false); } public void SendNotif(string Message, Boolean FromHotelManager) { ServerMessage nMessage = new ServerMessage(); if (FromHotelManager) { nMessage.Init(139); } else { nMessage.Init(161); } nMessage.AppendStringWithBreak(Message); GetConnection().SendMessage(nMessage); } public void SendNotif(string Message, string Url) { ServerMessage nMessage = new ServerMessage(161); nMessage.AppendStringWithBreak(Message); nMessage.AppendStringWithBreak(Url); GetConnection().SendMessage(nMessage); } public void Stop() { if (GetHabbo() != null) { Habbo.OnDisconnect(); Habbo = null; } if (GetConnection() != null) { Connection = null; } if (GetMessageHandler() != null) { MessageHandler.Destroy(); MessageHandler = null; } } public void Disconnect() { UberEnvironment.GetGame().GetClientManager().StopClient(Id); } public void HandleConnectionData(ref byte[] data) { if (data[0] == 64) { int pos = 0; while (pos < data.Length) { try { int MessageLength = Base64Encoding.DecodeInt32(new byte[] { data[pos++], data[pos++], data[pos++] }); uint MessageId = Base64Encoding.DecodeUInt32(new byte[] { data[pos++], data[pos++] }); byte[] Content = new byte[MessageLength - 2]; for (int i = 0; i < Content.Length; i++) { Content[i] = data[pos++]; } ClientMessage Message = new ClientMessage(MessageId, Content); MessageHandler.HandleRequest(Message); //Console.WriteLine("[" + MessageId + "] > " + Message); } catch (IndexOutOfRangeException) { Disconnect(); } catch (NullReferenceException) { Disconnect(); } catch (EntryPointNotFoundException e) { UberEnvironment.GetLogging().WriteLine("User D/C: " + e.Message, Core.LogLevel.Error); Disconnect(); } } } else if (data[0] == 60) { Connection.SendData(CrossdomainPolicy.GetXmlPolicy()); } else { Disconnect(); } } public void SendMessage(ServerMessage Message) { if (Message == null) { throw new NullReferenceException("Attempt to send a null message to client user!! Check code!!"); } GetConnection().SendMessage(Message); } public void UnlockAchievement(uint Id, int Level) { if (Id <= 0) { return; } UberEnvironment.GetGame().GetAchievementManager().UnlockAchievement(this, Id, Level); } } }