using System; using System.Data; using System.Text; using System.Threading; using System.Collections; using System.Collections.Generic; using Holo.Virtual.Users.Messenger; using Holo.Virtual.Users; using Ion.Storage; namespace Holo.Managers { public static class userManager { public static Hashtable _Users = new Hashtable(); private static Thread pingChecker; private static Thread effectsChecker; public static void Init() { try { pingChecker.Abort(); } catch { } try { pingChecker = new Thread(new ThreadStart(checkPings)); pingChecker.Priority = ThreadPriority.Lowest; pingChecker.Start(); effectsChecker = new Thread(new ThreadStart(CheckEffects)); effectsChecker.Priority = ThreadPriority.Lowest; effectsChecker.Start(); } catch { } } private static string OnlineTime(DateTime startGame) { TimeSpan timeOnline = startGame.Subtract(DateTime.Now); string timeOn2 = timeOnline.ToString(); string[] OnlineTime = timeOn2.Replace("-", "").Split('.'); return OnlineTime[0]; } private static string timeOnline() { TimeSpan online = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)); double time = online.TotalSeconds; string online_now = Convert.ToString(time); string[] args = online_now.Split('.'); online_now = args[0]; args = online_now.Split(','); return args[0]; } private static void sendAlert(string Message, virtualUser User) { User.sendData("BK" + stringManager.fixWords(Message) + Convert.ToChar(2)); } public static void addUser(int userID, virtualUser User) { if (_Users.ContainsKey(userID)) { virtualUser oldUser = ((virtualUser)_Users[userID]); oldUser.Disconnect(); if (_Users.ContainsKey(userID)) _Users.Remove(userID); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", User._Username); if (User.IP == dbClient.getString("SELECT ipaddress_last FROM users WHERE name = @name LIMIT 1")) { _Users.Add(userID, User); dbClient.runQuery("UPDATE users SET ticket_sso = '', logins = logins + 1, timeOnline = '" + OnlineTime(User.startGame) + "', dateOnline = '" + DateTime.Now + "' WHERE id = '" + userID + "' LIMIT 1"); Out.WriteLine(User._Username + " viens de se connecter sur Habbo-Story.", ConsoleColor.DarkMagenta); #region Sistema de Premios por Logins. int logins; logins = dbClient.getInt("SELECT logins FROM users WHERE id = '" + userID + "'"); if (logins == 5) { dbClient.runQuery("INSERT INTO users_badges (userid,badgeid) VALUES ('" + userID + "','ACH_Login1')"); User.refreshBadges(); User.refreshValueables(false, true, 50); } if (logins == 8) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login2' WHERE badgeid = 'ACH_Login1' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 80); } if (logins == 15) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login3' WHERE badgeid = 'ACH_Login2' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 120); } if (logins == 28) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login4' WHERE badgeid = 'ACH_Login3' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 150); } if (logins == 35) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login5' WHERE badgeid = 'ACH_Login4' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } if (logins == 60) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login6' WHERE badgeid = 'ACH_Login5' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } if (logins == 70) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login7' WHERE badgeid = 'ACH_Login6' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } if (logins == 80) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login8' WHERE badgeid = 'ACH_Login7' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } if (logins == 90) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login9' WHERE badgeid = 'ACH_Login8' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } if (logins == 100) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_Login10' WHERE badgeid = 'ACH_Login9' AND userid = '" + userID + "'"); User.refreshBadges(); User.refreshValueables(false, true, 200); } #endregion } else { User.Disconnect(3000); sendAlert("IP Invalide", User); } } } public static void removeUser(int userID) { if (_Users.ContainsKey(userID)) { _Users.Remove(userID); } } public static bool containsUser(int userID) { return _Users.ContainsKey(userID); } public static bool containsUser(string userName) { int userID = getUserID(userName); return _Users.ContainsKey(userID); } public static int userCount { get { return _Users.Count; } } public static int getUserID(string userName) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", userName); return dbClient.getInt("SELECT id FROM users WHERE name = @name LIMIT 1"); } } public static string getUserName(int userID) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { return dbClient.getString("SELECT name FROM users WHERE id = '" + userID + "' LIMIT 1"); } } public static bool userExists(int userID) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { return dbClient.findsResult("SELECT id FROM users WHERE id = '" + userID + "'"); } } public static int[] getUserFriendIDs(int userID, int Category) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { try { ArrayList idBuilder = new ArrayList(); DataColumn dCol = dbClient.getColumn("SELECT friendid FROM messenger_friendships WHERE userid = '" + userID + "' AND friendid > 0 AND category = '" + Category + "'"); int[] friendIDs = dataHandling.dColToArray(dCol, null); foreach (int i in friendIDs) idBuilder.Add(i); dCol = dbClient.getColumn("SELECT userid FROM messenger_friendships WHERE friendid = '" + userID + "' AND userid > 0 AND category = '" + Category + "'"); friendIDs = dataHandling.dColToArray(dCol, null); foreach (int i in friendIDs) idBuilder.Add(i); return (int[])idBuilder.ToArray(typeof(int)); } catch { return new int[0]; } } } public static virtualUser getUser(int userID) { try { return (virtualUser)_Users[userID]; } catch { return null; } } public static virtualUser getUser(string userName) { int userID = getUserID(userName); return getUser(userID); } public static void sendData(string Data) { try { Hashtable Users = (Hashtable)_Users.Clone(); foreach (virtualUser User in Users.Values) { try { User.sendData(Data); } catch { } } } catch { } } public static void sendToRank(byte Rank, bool includeHigher, string Data) { try { { foreach (virtualUser User in _Users.Values) { if (User._Rank < Rank || (includeHigher == false && User._Rank > Rank)) continue; else User.sendData(Data); } } } catch { } } public static void addChatMessage(string userName, int roomID, string Message) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("username", userName); dbClient.AddParamWithValue("roomid", roomID); dbClient.AddParamWithValue("message", Message); dbClient.runQuery("INSERT INTO system_chatlog (username,roomid,mtime,message) VALUES (@username,@roomid,CURRENT_TIMESTAMP,@message)"); } if (Eucalypt.remoteConnection) Holo.Socketservers.remoteSocketServer.replyConnection.sendData("RMWL" + Convert.ToChar(2) + userName + ": " + Message + " [Room ID: " + roomID + "]"); } public static void addInstantMessage(string userName, int Receiver, string Message, int Invite) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("username", userName); dbClient.AddParamWithValue("receiver", getUserName(Receiver)); dbClient.AddParamWithValue("message", Message); dbClient.AddParamWithValue("invite", Invite); dbClient.runQuery("INSERT INTO messenger_log (username,receiver,mtime,message,invite) VALUES (@username,@receiver,CURRENT_TIMESTAMP,@message,@invite)"); } } public static string generateUserInfo(int userID, byte Rank) { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,rank,mission,credits,pixels,email,birth,hbirth,ipaddress_last,lastvisit,timeOnline FROM users WHERE id = '" + userID + "' AND rank <= " + Rank); } if (dRow.Table.Rows.Count == 0) { return stringManager.getString("userinfo_accesserror"); } else { StringBuilder Info = new StringBuilder(stringManager.getString("userinfo_header") + "\r"); // Append header Info.Append(stringManager.getString("common_userid") + ": " + userID + "\r"); // Append user ID Info.Append(stringManager.getString("common_username") + ": " + Convert.ToString(dRow[0]) + "\r"); // Append username Info.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(dRow[1]) + "\r"); // Append rank Info.Append(stringManager.getString("common_usermission") + ": " + Convert.ToString(dRow[2]) + "\r"); // Append user's mission Info.Append(stringManager.getString("common_credits") + ": " + Convert.ToString(dRow[3]) + "\r"); // Append user's amount of credits Info.Append(stringManager.getString("common_pixels") + ": " + Convert.ToString(dRow[4]) + "\r"); // Append user's amount of credits Info.Append(stringManager.getString("common_hbirth") + ": " + Convert.ToString(dRow[7]) + "\r\r"); // Append 'registered at' date + blank line Info.Append(stringManager.getString("common_birth") + ": " + Convert.ToString(dRow[6]) + "\r"); // Append real birthday Info.Append(stringManager.getString("common_email") + ": " + Convert.ToString(dRow[5]) + "\r"); // Append email address Info.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(dRow[8]) + "\r"); // Append user's last used IP address Info.Append("Tiempo dentro del Hotel" + ": " + Convert.ToString(dRow[9]) + "\r\r"); // if (_Users.ContainsKey(userID)) // User online { virtualUser User = (virtualUser)_Users[userID]; string Location = ""; if (User._roomID == 0) Location = stringManager.getString("common_hotelview"); else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { Location = stringManager.getString("common_room") + " '" + dbClient.getString("SELECT name FROM rooms WHERE id = '" + User._roomID + "'") + "' [id: " + User._roomID + ", " + stringManager.getString("common_owner") + ": " + dbClient.getString("SELECT owner FROM rooms WHERE id = '" + User._roomID + "'") + "]"; // Roomname, room ID and name of the user that owns the room } } Info.Append(stringManager.getString("common_location") + ": " + Location); } else Info.Append(stringManager.getString("common_lastaccess") + ": " + Convert.ToString(dRow[9])); // Append last server access date return Info.ToString(); } } public static void setBan(int userID, int Hours, string Reason) { string Expires = DateTime.Now.AddHours(Hours).ToString().Replace("/", "-").Replace(".", "-"); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("userid", userID); dbClient.AddParamWithValue("expires", Expires); dbClient.AddParamWithValue("reason", Reason); dbClient.runQuery("INSERT INTO users_bans (userid,date_expire,descr) VALUES (@userid,@expires,@reason)"); } if (_Users.ContainsKey(userID)) { virtualUser User = ((virtualUser)_Users[userID]); User.sendData("@c" + Reason); User.Disconnect(10000); } } public static string getBanReason(string IP) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT ipaddress FROM users_bans WHERE ipaddress = '" + IP + "'")) { string banExpires = dbClient.getString("SELECT date_expire FROM users_bans WHERE ipaddress = '" + IP + "'"); if (DateTime.Compare(DateTime.Parse(banExpires), DateTime.Now) > 0) return dbClient.getString("SELECT descr FROM users_bans WHERE ipaddress = '" + IP + "'"); // Still banned, return reason else dbClient.runQuery("DELETE FROM user_bans WHERE ipaddress = '" + IP + "' LIMIT 1"); } } return ""; } public static void setBan(string IP, int Hours, string Reason, int userID) { string Expires = DateTime.Now.AddHours(Hours).ToString().Replace("/", "-").Replace(".", "-"); DataColumn dCol; virtualUser User; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("ip", IP); dbClient.AddParamWithValue("expires", Expires); dbClient.AddParamWithValue("reason", Reason); dbClient.AddParamWithValue("ID", userID); dbClient.runQuery("INSERT INTO users_bans (ipaddress,date_expire,descr,userid) VALUES (@ip,@expires,@reason,@ID)"); dCol = dbClient.getColumn("SELECT id FROM users WHERE ipaddress_last = '" + IP + "'"); } foreach (DataRow dRow in dCol.Table.Rows) { if (_Users.ContainsKey(Convert.ToInt32(dRow["id"]))) { User = ((virtualUser)_Users[Convert.ToInt32(dRow["ID"])]); User.sendData("@c" + Reason); User.Disconnect(10000); } } } public static string getBanReason(int userID) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT userid FROM users_bans WHERE userid = '" + userID + "'")) { string banExpires = dbClient.getString("SELECT date_expire FROM users_bans WHERE userid = '" + userID + "'"); if (DateTime.Compare(DateTime.Parse(banExpires), DateTime.Now) > 0) // Still banned, return reason return dbClient.getString("SELECT descr FROM users_bans WHERE userid = '" + userID + "'"); else dbClient.runQuery("DELETE FROM users_bans WHERE userid = '" + userID + "' LIMIT 1"); } } return ""; } public static string generateBanReport(string userID) { try { DataRow dbRow; DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT date_expire,descr,ipaddress FROM users_bans WHERE userid = '" + userID + "' OR ipaddress = '" + userID + "' LIMIT 1"); dbRow = dbClient.getRow("SELECT name,rank,ipaddress_last FROM users WHERE id = '" + userID + "' OR ipaddress_last = '" + userID + "' LIMIT 1"); } if (dRow.Table.Rows.Count == 0) { return "holo.cast.banreport.null"; } else { string Note = "-"; string banPoster = ""; string banPosted = ""; DataRow DRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { DRow = dbClient.getRow("SELECT userid,note,timestamp FROM system_stafflog WHERE action = 'ban' AND targetid = '" + userID + "' ORDER BY id ASC"); // Get latest stafflog entry for this action (if exists) } if (DRow.Table.Rows.Count > 0) // system_stafflog table could be cleaned up { if (Convert.ToString(DRow[1]) != "") Note = Convert.ToString(DRow[1]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { banPoster = dbClient.getString("SELECT name FROM users WHERE id = '" + Convert.ToString(DRow[0]) + "'"); } banPosted = Convert.ToString(DRow[2]); } StringBuilder Report = new StringBuilder(stringManager.getString("banreport_header") + " "); Report.Append(Convert.ToString(dbRow[0]) + " [" + userID + "]" + "\r"); // Append username and user ID Report.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(dbRow[1]) + "\r"); // Append user's rank Report.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(dbRow[2]) + "\r"); // Append the IP address of user Report.Append(stringManager.getString("banreport_banner") + ": " + banPoster + "\r"); // Append username of banner Report.Append(stringManager.getString("banreport_posted") + ": " + banPosted + "\r"); // Append datetime when ban was posted Report.Append(stringManager.getString("banreport_expires") + ": " + Convert.ToString(dRow[0]) + "\r"); // Append datetime when ban expires Report.Append(stringManager.getString("banreport_reason") + ": " + Convert.ToString(dRow[1]) + "\r"); // Append the reason that went with the ban Report.Append(stringManager.getString("banreport_ipbanflag") + ": " + (Convert.ToString(dRow[2]) != "").ToString().ToLower() + "\r"); // Append true/false for the IP ban status Report.Append(stringManager.getString("banreport_staffnote") + ": " + Note); // Append the staffnote that went with the ban return Report.ToString(); } } catch (Exception ex) { throw ex; } } private static void checkPings() { List vir = new List(); while (true) { //lock (_Users) //{ try { foreach (virtualUser User in _Users.Values) { if (!User._isDisconnected) { if (User.pingOK) { User._clean = false; User.pingOK = false; User.sendData("@r"); int inRoom = 0; if (User.Room != null || User.roomUser != null) inRoom = User.Room.roomID; if (User._Username != "") { User._Minuteperiod = User._Minuteperiod + 1; if (User._Minuteperiod == 8) // 4 Minutos { User._Minuteperiod = 0; User.refreshValueables(false, true, Config.UpdatePixels); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { string onlineStatus = dbClient.getString("SELECT showOnlineStatus FROM users WHERE id = '" + User.userID + "'"); if (onlineStatus == "true") { dbClient.runQuery("UPDATE users SET online = '" + timeOnline() + "', timeOnline = '" + OnlineTime(User.startGame) + "', dateOnline = '" + DateTime.Now + "' WHERE id = '" + User.userID + "' LIMIT 1"); } else dbClient.runQuery("UPDATE users SET online = '0', timeOnline = '" + OnlineTime(User.startGame) + "', dateOnline = '" + DateTime.Now + "' WHERE id = '" + User.userID + "' LIMIT 1"); DataColumn myPets = dbClient.getColumn("SELECT * FROM pets WHERE owner = '" + User.userID + "'"); if (myPets.Table.Rows.Count > 0) { foreach (DataRow dRow in myPets.Table.Rows) { dbClient.runQuery("UPDATE pets SET hungry = hungry - 2 WHERE id = '" + dRow["id"] + "' AND hungry > 0 LIMIT 1"); } } } } } else { vir.Add(User); } } } } catch { } foreach (virtualUser User in vir) { User.Disconnect(); } //} vir.Clear(); Thread.Sleep(30000); } } private static void CheckEffects() { while (true) { try { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users_effects SET effect_timeleft = effect_timeleft - 60 WHERE effect_activated = '1'"); DataColumn dCol = dbClient.getColumn("SELECT num FROM users_effects WHERE effect_timeleft < 0"); int[] effectIDs = dataHandling.dColToArray(dCol, null); foreach (int i in effectIDs) { int userID = dbClient.getInt("SELECT userid FROM users_effects WHERE num = " + i + " LIMIT 1"); if (userManager.containsUser(userID)) { virtualUser User = userManager.getUser(userID); User.refreshEffect(); } } dbClient.runQuery("DELETE FROM users_effects WHERE effect_timeleft < 0"); } } catch { } Thread.Sleep(60000); } } } }