using System; using System.Collections.Generic; using System.Linq; using System.Text; using DuckEmulator.HabboHotel.Inside.Storage.MySql.Database.Interfaces; using System.Data; using DuckEmulator.HabboHotel.Inside.NET; using DuckEmulator.HabboHotel.Outside.Habbos.HabStructure; using DuckEmulator.HabboHotel.Outside.Rooms; using DuckEmulator.HabboHotel.Outside.Messages.Types; using System.Timers; using DuckEmulator.Security; namespace DuckEmulator.HabboHotel.Outside.Habbos { class HabboData { internal readonly uint Id; internal readonly string Username; internal string Email; internal int Rank = 1; internal string Motto; internal string Look; internal string Gender = "M"; internal int Credits = new int(); internal int Pixels = new int(); internal int Score = new int(); internal int Respect = new int(); internal int DailyRespect = 3; internal int DailyRespectPet = 3; internal int RespectGiven = new int(); internal int TimeOnline = new int(); internal int TimeInRoom = new int(); private SocketConnection Connection; internal List Favorites; internal List RatedRooms; internal List Tags; internal List LastVisited; internal Dictionary Achievements; internal List Quests; internal uint ProgressQuest = new uint(); internal int ProgressForQuest = new int(); internal uint LastQuestCat = new uint(); internal DateTime LoginTimestamp = DateTime.Now; internal string LastRespectUpdate = ""; internal uint HomeRoom = new uint(); internal int RoomVisits = new int(); private Messenger UserMessenger; private BadgeTable BadgeTable; private Inventory Inventory; private UserEffects EffectTable; internal uint CurrentRoomId = new uint(); internal uint LoadingRoom = new uint(); internal int FollowingLogins; internal int LoginDay = new int(); internal int FurniCount = new int(); internal int FurniCountUnsigned = new int(); internal int IceTagTime = new int(); internal int IceTagPerks = new int(); internal Boolean InRoom { get { return (GetCurrentRoom() != null); } } internal HabboData(uint Id, string Username, string Email, int Rank, string Motto, string Look, string Gender, int Credits, int Pixels, int Score, int Respect, int DailyRespect, int DailyRespectPet, uint HomeRoom,int TimeOnline, int RoomVisits, string LastRespectUpdate, int RespectGiven, int FollowingLogins, int LoginDay, int TimeInRoom, int FurniCount, int FurniCountUnsigned, int IceTagTime, int IceTagPerks, uint ProgressQuest, int ProgressForQuest ) { this.Id = Id; this.Username = Username; this.Email = Email; this.Rank = Rank; this.Motto = Motto; this.Look = Look; this.Gender = Gender; this.Credits = Credits; this.Pixels = Pixels; this.Score = Score; this.Respect = Respect; this.DailyRespect = DailyRespect; this.DailyRespectPet = DailyRespectPet; this.HomeRoom = HomeRoom; this.TimeOnline = TimeOnline; this.RoomVisits = RoomVisits; this.LastRespectUpdate = LastRespectUpdate; this.RespectGiven = RespectGiven; this.FollowingLogins = FollowingLogins; this.LoginDay = LoginDay; this.TimeInRoom = TimeInRoom; this.FurniCount = FurniCount; this.FurniCountUnsigned = FurniCountUnsigned; this.IceTagTime = IceTagTime; this.IceTagPerks = IceTagPerks; this.ProgressQuest = ProgressQuest; this.ProgressForQuest = ProgressForQuest; this.RatedRooms = new List(); this.LastVisited = new List(); DuckEnvironment.WriteLine("User " + Username + " came online.", ConsoleColor.Green); } internal void LoadStructure() { this.LoadAchievements(); this.LoadFavs(); this.LoadTags(); this.LoadQuests(); this.UserMessenger = new Messenger(this); this.BadgeTable = new BadgeTable(this); this.Inventory = new Inventory(this); this.EffectTable = new UserEffects(this); this.UpdateLastlogin(); this.UpdateDailyRespect(); } internal void UpdateLastlogin() { if (LoginDay == 0) { FollowingLogins++; LoginDay = DateTime.Now.DayOfYear; DuckEnvironment.AchievementManager.UpdateAchievement(this, 3); } if ((DateTime.Now.DayOfYear - LoginDay) == 1) { FollowingLogins++; DuckEnvironment.AchievementManager.UpdateAchievement(this, 3); LoginDay = DateTime.Now.DayOfYear; } else if ((DateTime.Now.DayOfYear - LoginDay) > 1) { FollowingLogins = 1; DuckEnvironment.AchievementManager.UpdateAchievement(this, 3); LoginDay = DateTime.Now.DayOfYear; } UpdateVariable("ip_reg", Connection.GetSocket().RemoteEndPoint.ToString().Split(':')[0]); UpdateVariable("last_login", DateTime.Now); UpdateVariable("sso_ticket", ""); UpdateVariable("login_day", LoginDay); UpdateVariable("following_logins", FollowingLogins); } internal void LoadFavs() { Favorites = new List(); DataTable Data = null; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("SELECT room_id FROM user_favorites WHERE user_id = '" + Id + "' ORDER BY id DESC"); Data = Adapter.getTable(); } if (Data == null) return; foreach (DataRow Row in Data.Rows) { Favorites.Add((uint)Row["room_id"]); } } internal void LoadTags() { Tags = new List(); DataTable Data = null; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("SELECT tag FROM user_tags WHERE user_id = '" + Id + "'"); Data = Adapter.getTable(); } if (Data == null) return; foreach (DataRow Row in Data.Rows) { Tags.Add((string)Row["tag"]); } } internal void LoadAchievements() { Achievements = new Dictionary(); DataTable Data = null; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("SELECT achievement_id,level FROM user_achievements WHERE user_id = '" + Id + "' ORDER BY id DESC"); Data = Adapter.getTable(); } if (Data == null) return; foreach (DataRow Row in Data.Rows) { Achievements.Add((uint)Row["achievement_id"], (int)Row["level"]); } } internal void LoadQuests() { Quests = new List(); DataTable Data = null; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("SELECT quest_id FROM user_quests WHERE user_id = '" + Id + "' ORDER BY id DESC"); Data = Adapter.getTable(); } if (Data == null) return; foreach (DataRow Row in Data.Rows) { Quests.Add((uint)Row["quest_id"]); } } internal void OnEnterRoom() { GetMessenger().UpdateStatus(); if (!GetCurrentRoom().RoomEngine.HasRights(this, true)) { RoomVisits++; DuckEnvironment.AchievementManager.UpdateAchievement(this, 104); UpdateVariable("room_visits", RoomVisits); if (ProgressQuest == 10) { DuckEnvironment.QuestManager.UpdateQuest(this); } } } internal void OnLeaveRoom() { if (DuckEnvironment.TradeManager.GetTradeByHabbo(Id) != null) { DuckEnvironment.TradeManager.GetTradeByHabbo(Id).StopTrade(Id); } if (GetCurrentRoom().HasRoller(GetRoomUser().VirtualId)) { GetCurrentRoom().RemoveRoller(GetRoomUser().VirtualId); } LastVisited.Add(CurrentRoomId); CurrentRoomId = 0; GetMessenger().UpdateStatus(); } internal void OnDisconnect() { if (InRoom && (GetRoomUser() != null)) { GetCurrentRoom().RemoveUserFromRoom(GetRoomUser().VirtualId, true); } if (UserMessenger != null) { UserMessenger.OnLogin(false); } DuckEnvironment.WriteLine("User " + Username + " gone offline.", ConsoleColor.Green); } internal void UpdateCredits(int Amout, bool InDb) { if (Amout < 0) Amout = 0; if (Credits < 0) Credits = 0; Credits += Amout; ServerMessage Message = new ServerMessage(6); Message.AppendStringWithBreak(((double)Credits).ToString()); Connection.SendResponse(Message); if (InDb) { UpdateVariable("credits", Credits); } } internal void UpdatePixels(int Amout, bool InDb) { if (Amout < 0) Amout = 0; if (Pixels < 0) Pixels = 0; Pixels += Amout; ServerMessage Message = new ServerMessage(438); Message.AppendInt32(Pixels); Message.AppendInt32(Amout); Connection.SendResponse(Message); if (InDb) { UpdateVariable("pixels", Pixels); } } internal void UpdateDailyRespect() { DateTime LastUpdate; if (!DateTime.TryParse(LastRespectUpdate, out LastUpdate)) { DailyRespect = 3; DailyRespectPet = 3; LastRespectUpdate = DateTime.Now.ToString(); UpdateVariable("respect_update", LastRespectUpdate); } else { if ((DateTime.Now - LastUpdate).TotalDays >= 1) { DailyRespect = 3; DailyRespectPet = 3; LastRespectUpdate = DateTime.Now.ToString(); UpdateVariable("respect_update", LastRespectUpdate); } } UpdateVariable("daily_respect", DailyRespect); UpdateVariable("daily_respect_pet", DailyRespectPet); } internal void UpdateVariable(string Var, Object e) { using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE users SET " + Var.ToLower() + " = '" + e + "' WHERE id = '" + Id + "' LIMIT 1"); } } internal void UpdateVariable(string Var, Object e, bool Param) { using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.setQuery("UPDATE users SET " + Var.ToLower() + " = @param WHERE id = '" + Id + "' LIMIT 1"); Adapter.addParameter("param", e); Adapter.runQuery(); } } internal void UpdateTimeOnline(bool InDb, bool Serialize) { TimeOnline++; if (Serialize) { DuckEnvironment.AchievementManager.UpdateAchievement(this, 6); } if (InDb) { UpdateVariable("timeonline", TimeOnline); } } internal void RefreshUserDetails() { if (!InRoom) return; ServerMessage Message = new ServerMessage(266); Message.AppendUInt(GetRoomUser().VirtualId); Message.AppendStringWithBreak(Look); Message.AppendStringWithBreak(Gender.ToLower()); Message.AppendStringWithBreak(Motto); Message.AppendInt32(Score); GetCurrentRoom().BroadcastResponse(Message); } internal void CheckTimeAchievements() { UpdateTimeOnline(true, true); if (TimeOnline < 0) TimeOnline = 0; } internal void SendResponse(ServerMessage Message) { if (GetConnection() == null) return; GetConnection().SendResponse(Message); } internal Room GetCurrentRoom() { return DuckEnvironment.RoomManager.GetRoom(CurrentRoomId); } internal RoomUser GetRoomUser() { return ((!InRoom) ? null : GetCurrentRoom().RoomEngine.GetUserByHabboId(Id)); } internal SocketConnection GetConnection() { return Connection; } internal SocketConnection iConn { get { return GetConnection(); } set { Connection = value; } } internal Messenger GetMessenger() { return UserMessenger; } internal BadgeTable GetBadgeTable() { return BadgeTable; } internal Inventory GetInventory() { return Inventory; } internal UserEffects GetEffectsTable() { return EffectTable; } } }