namespace Holo.Managers { using Holo; using Holo.Virtual.Users; using Ion.Storage; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Text; using System.Threading; public static class userManager { private static int _peakUserCount; public static Hashtable _Users = new Hashtable(); private static Thread effectsChecker; private static Thread pingChecker; 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)"); } } public static void addUser(int userID, virtualUser User) { if (_Users.ContainsKey(userID)) { ((virtualUser) _Users[userID]).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 = NULL WHERE id = '" + userID + "' LIMIT 1"); Out.WriteLine(string.Concat(new object[] { "User ", userID, " logged in. [", User._Username, "]" }), Out.logFlags.BelowStandardAction); } else { User.Disconnect(0x3e8); User.sendData("BKERROR #1: [SESSIONTICKET]"); } if (_Users.Count > dbClient.getInt("SELECT onlinecount_peak FROM system")) { _peakUserCount = _Users.Count; } } } 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'"); int[] effectIDs = dataHandling.dColToArray(dbClient.getColumn("SELECT num FROM users_effects WHERE effect_timeleft < 0"), null); foreach (int i in effectIDs) { int userID = dbClient.getInt("SELECT userid FROM users_effects WHERE num = " + i + " LIMIT 1"); if (containsUser(userID)) { getUser(userID).refreshEffect(); } } dbClient.runQuery("DELETE FROM users_effects WHERE effect_timeleft < 0"); } } catch { } Thread.Sleep(0xea60); GC.Collect(); } } 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++; if (User._Minuteperiod == 15) { User._Minuteperiod = 0; User._Pixels += 200; User._Credits += 100; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery(string.Concat(new object[] { "UPDATE users SET credits = '", User._Credits, "' WHERE id = '", User.userID, "' LIMIT 1" })); dbClient.runQuery(string.Concat(new object[] { "UPDATE users SET pixels = '", User._Pixels, "' WHERE id = '", User.userID, "' LIMIT 1" })); User.refreshValueables(true, false); } User.sendData("BKJust received 100 extra coins!" + Convert.ToChar(2)); User.sendData("Fv" + Encoding.encodeVL64(User._Pixels) + "I"); } } } else { vir.Add(User); } } } } catch { } foreach (virtualUser User in vir) { User.Disconnect(); } } vir.Clear(); Thread.Sleep(0x186a0); } } 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 string generateBanReport(int userID) { string CS$1$0000; try { DataRow dbRow; DataRow dRow; DatabaseClient dbClient; DataRow DRow; using (dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT date_expire,descr,ipaddress FROM users_bans WHERE userid = '" + userID + "'"); dbRow = dbClient.getRow("SELECT name,rank,ipaddress_last FROM users WHERE id = '" + userID + "'"); } if ((dRow.Table.Rows.Count == 0) || (dbRow.Table.Rows.Count == 0)) { return "holo.cast.banreport.null"; } string Note = "-"; string banPoster = ""; string banPosted = ""; using (dbClient = Eucalypt.dbManager.GetClient()) { DRow = dbClient.getRow("SELECT userid,note,timestamp FROM system_stafflog WHERE action = 'ban' AND targetid = '" + userID + "' ORDER BY id ASC"); } if (DRow.Table.Rows.Count > 0) { if (Convert.ToString(DRow[1]) != "") { Note = Convert.ToString(DRow[1]); } using (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(string.Concat(new object[] { Convert.ToString(dbRow[0]), " [", userID, "]\r" })); Report.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(dbRow[1]) + "\r"); Report.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(dbRow[2]) + "\r"); Report.Append(stringManager.getString("banreport_banner") + ": " + banPoster + "\r"); Report.Append(stringManager.getString("banreport_posted") + ": " + banPosted + "\r"); Report.Append(stringManager.getString("banreport_expires") + ": " + Convert.ToString(dRow[0]) + "\r"); Report.Append(stringManager.getString("banreport_reason") + ": " + Convert.ToString(dRow[1]) + "\r"); bool CS$0$0003 = Convert.ToString(dRow[2]) != ""; Report.Append(stringManager.getString("banreport_ipbanflag") + ": " + CS$0$0003.ToString().ToLower() + "\r"); Report.Append(stringManager.getString("banreport_staffnote") + ": " + Note); CS$1$0000 = Report.ToString(); } catch (Exception ex) { throw ex; } return CS$1$0000; } public static string generateBanReport(string IP) { string CS$1$0000; try { DataRow dRow; DatabaseClient dbClient; DataRow DRow; DataColumn dCol; using (dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT userid,date_expire,descr FROM users_bans WHERE ipaddress = '" + IP + "'"); } if (dRow.Table.Rows.Count == 0) { return "holo.cast.banreport.null"; } string Note = "-"; string banPoster = ""; string banPosted = ""; using (dbClient = Eucalypt.dbManager.GetClient()) { DRow = dbClient.getRow("SELECT userid,note,timestamp FROM system_stafflog WHERE action = 'ban' AND targetid = '" + Convert.ToString(dRow[0]) + "' ORDER BY id ASC"); } if (DRow.Table.Rows.Count > 0) { if (Convert.ToString(DRow[1]) != "") { Note = Convert.ToString(DRow[1]); } using (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(IP + "\r"); Report.Append(stringManager.getString("banreport_banner") + ": " + banPoster + "\r"); Report.Append(stringManager.getString("banreport_posted") + ": " + banPosted + "\r"); Report.Append(stringManager.getString("banreport_expires") + ": " + Convert.ToString(dRow[0]) + "\r"); Report.Append(stringManager.getString("banreport_reason") + ": " + Convert.ToString(dRow[1]) + "\r"); bool CS$0$0002 = Convert.ToString(dRow[2]) != ""; Report.Append(stringManager.getString("banreport_ipbanflag") + ": " + CS$0$0002.ToString().ToLower() + "\r"); Report.Append(stringManager.getString("banreport_staffnote") + ": " + Note + "\r\r"); using (dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.getColumn("SELECT name FROM users WHERE ipaddress_last = '" + IP + "'"); } Report.Append(stringManager.getString("banreport_affectedusernames") + ":"); foreach (DataRow dbRow in dCol.Table.Rows) { Report.Append("\r - " + Convert.ToString(dRow["name"])); } CS$1$0000 = Report.ToString(); } catch (Exception ex) { throw ex; } return CS$1$0000; } public static string generateCommands(byte Rank, int userID, virtualUser End) { string[] Commands = null; StringBuilder Packet = new StringBuilder("BKYour Commands:"); string Cmds = ""; Cmds = ((((Cmds + "%" + ":im NAME [MESSAGE] - Stuur een bericht naar een vriend%") + ":events - Laat evenementen venster zien%" + ":about - Laat informatie over de server zien%") + ":whosonline - Laat alle gebruikers + rank die online zijn zien%" + ":cleanhand - Verwijderd ALLE items in je hand (geen vergoeding)%") + ":brb - Zegt tegen iedereen dat je weg bent (Max 15 minutes)%" + ":back - Stop met het vertellen dat je weg bent%") + ":hotel/:info/:version - laat de informatie over dit hotel zien.%" + ":staff - Verteld je hoe je de staff kan bereiken%"; if (Rank > 1) { Cmds = (Cmds + "%") + ":chooser - Laat iedereen zien in de kamer%" + ":furni - Laat alle meubels zien in de kamer%"; if (rankManager.containsRight(End, "fuse_alert", userID)) { Cmds = Cmds + "%" + ":alert NAME MESSAGE - Sends a moderator alert%"; } if (rankManager.containsRight(End, "fuse_room_alert", userID)) { Cmds = Cmds + "%" + ":roomalert MESSAGE - Sends a moderator alert to a whole room%"; } if (rankManager.containsRight(End, "fuse_kick", userID)) { Cmds = Cmds + "%" + ":kick [MESSAGE] - Kicks a user from the room they are in%"; } if (rankManager.containsRight(End, "fuse_room_kick", userID)) { Cmds = Cmds + "%" + ":roomkick [MESSAGE] - Kicks all users but you from the room"; } if (rankManager.containsRight(End, "fuse_mute", userID)) { Cmds = (Cmds + "%") + ":shutup NAME [MESSAGE] - Stops a user from using say/shout%" + ":unmute NAME - Allows a user to say/shout again%"; } if (rankManager.containsRight(End, "fuse_room_mute", userID)) { Cmds = (Cmds + "%") + ":roomshutup [MESSAGE] - Stops all users in the room from using say/shout%" + ":roomunmute Allows all users in the room to say/shout again%"; } if (rankManager.containsRight(End, "fuse_ban", userID)) { Cmds = Cmds + "%" + ":ban NAME HOURS REASON - Bans a user for the how many hours%"; } if (rankManager.containsRight(End, "fuse_superban", userID)) { Cmds = Cmds + "%" + ":superban NAME HOURS REASON - Bans a user and there IP for how many hours%"; } if (rankManager.containsRight(End, "fuse_administrator_access", userID)) { Cmds = (((Cmds + "%" + ":ha MESSAGE - Sends an alert to all online users%") + ":offline MINUTES - Informs all online users that the hotel is going offline in how long you said%" + ":refresh - Updates certain parts of the server%") + ":cords - Display your current room position%" + ":teleport - Turns on teleport mode (WARNING: It causes the room to screw up)%") + ":warp X Y - Teleports you the the the location input%" + ":sendme PACKET - Sends a packet to your self (For debuging)%"; } if (rankManager.containsRight(End, "fuse_alert", userID)) { Cmds = Cmds + "%" + ":ra MESSAGE - Sends an alert to all online users with the same rank as you%"; } if (rankManager.containsRight(End, "fuse_teleport", userID)) { Cmds = (Cmds + "%") + ":teleport - Toggles your movent to teleport mode on/off%" + ":warp X Y - Teleports you to the co-ordinates entered%"; } if (rankManager.containsRight(End, "fuse_moderator_access", userID)) { Cmds = Cmds + "%" + ":userinfo NAME/:ui NAME - Displays infomation about a user%"; } } Commands = Cmds.Split("%".ToCharArray()); int r = 30; foreach (string Command in Commands) { if (r == 0) { Packet.Append(Convert.ToChar(1) + "BKYour Commands:" + Convert.ToChar(2)); r = 30; } Packet.Append("\r" + Command); r--; } return (Packet.ToString() + Convert.ToChar(2)); } public static string generateUserInfo(int userID, byte Rank) { DataRow dRow; DatabaseClient dbClient; using (dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow(string.Concat(new object[] { "SELECT name,rank,mission,credits,pixels,email,birth,hbirth,ipaddress_last,lastvisit FROM users WHERE id = '", userID, "' AND rank <= ", Rank })); } if (dRow.Table.Rows.Count == 0) { return stringManager.getString("userinfo_accesserror"); } StringBuilder Info = new StringBuilder(stringManager.getString("userinfo_header") + "\r"); Info.Append(string.Concat(new object[] { stringManager.getString("common_userid"), ": ", userID, "\r" })); Info.Append(stringManager.getString("common_username") + ": " + Convert.ToString(dRow[0]) + "\r"); Info.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(dRow[1]) + "\r"); Info.Append(stringManager.getString("common_usermission") + ": " + Convert.ToString(dRow[2]) + "\r"); Info.Append(stringManager.getString("common_credits") + ": " + Convert.ToString(dRow[3]) + "\r"); Info.Append(stringManager.getString("common_hbirth") + ": " + Convert.ToString(dRow[7]) + "\r\r"); Info.Append(stringManager.getString("common_birth") + ": " + Convert.ToString(dRow[6]) + "\r"); Info.Append(stringManager.getString("common_email") + ": " + Convert.ToString(dRow[5]) + "\r"); Info.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(dRow[8]) + "\r\r"); if (_Users.ContainsKey(userID)) { virtualUser User = (virtualUser) _Users[userID]; string Location = ""; if (User._roomID == 0) { Location = stringManager.getString("common_hotelview"); } else { using (dbClient = Eucalypt.dbManager.GetClient()) { Location = string.Concat(new object[] { 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 + "'"), "]" }); } } Info.Append(stringManager.getString("common_location") + ": " + Location); } else { Info.Append(stringManager.getString("common_lastaccess") + ": " + Convert.ToString(dRow[9])); } return Info.ToString(); } public static string generateWhosOnline(bool Admin) { int i = userCount; int alerts = 0; while (i > 30) { alerts++; i -= 30; } alerts++; StringBuilder packet = new StringBuilder("BKOnline Users"); if (alerts > 1) { packet.Append(" page 1/" + alerts); } packet.Append(" Total online: " + userCount); int r = 30; int p = 1; if (Admin) { foreach (DictionaryEntry user in _Users) { if (r == 0) { p++; packet.Append(string.Concat(new object[] { Convert.ToChar(1), "BKOnline Users page ", p, "/", alerts, " Total online: ", userCount })); r = 30; } packet.Append(string.Concat(new object[] { "\r", getUserName((int) user.Key), " [", user.Key.ToString(), "] {", getUser((int) user.Key)._Rank, "} ", getUser((int) user.Key).IP })); r--; } } else { foreach (DictionaryEntry user in _Users) { if (r == 0) { p++; packet.Append(string.Concat(new object[] { Convert.ToChar(1), "BKOnline Users page ", p, " Total online: ", userCount })); r = 30; } packet.Append(string.Concat(new object[] { "\r", getUserName((int) user.Key), " {", getUser((int) user.Key)._Rank, "}" })); r--; } } return (packet.ToString() + Convert.ToString(Convert.ToChar(2))); } public static string getBanReason(int userID) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT userid FROM users_bans WHERE userid = '" + userID + "'")) { if (DateTime.Compare(DateTime.Parse(dbClient.getString("SELECT date_expire FROM users_bans WHERE userid = '" + userID + "'")), DateTime.Now) > 0) { return dbClient.getString("SELECT descr FROM users_bans WHERE userid = '" + userID + "'"); } dbClient.runQuery("DELETE FROM users_bans WHERE userid = '" + userID + "' LIMIT 1"); } } return ""; } public static string getBanReason(string IP) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT ipaddress FROM users_bans WHERE ipaddress = '" + IP + "'")) { if (DateTime.Compare(DateTime.Parse(dbClient.getString("SELECT date_expire FROM users_bans WHERE ipaddress = '" + IP + "'")), DateTime.Now) > 0) { return dbClient.getString("SELECT descr FROM users_bans WHERE ipaddress = '" + IP + "'"); } dbClient.runQuery("DELETE FROM user_bans WHERE ipaddress = '" + IP + "' LIMIT 1"); } } return ""; } public static virtualUser getUser(int userID) { try { return (virtualUser) _Users[userID]; } catch { return null; } } public static virtualUser getUser(string userName) { return getUser(getUserID(userName)); } internal static string GetUserFigure(int ID) { return getUser(ID)._Figure; } public static int[] getUserFriendIDs(int userID) { int[] CS$1$0000; DatabaseClient dbClient = Eucalypt.dbManager.GetClient(); try { ArrayList idBuilder = new ArrayList(); int[] friendIDs = dataHandling.dColToArray(dbClient.getColumn("SELECT friendid FROM messenger_friendships WHERE userid = '" + userID + "' AND friendid > 0"), null); foreach (int i in friendIDs) { idBuilder.Add(i); } friendIDs = dataHandling.dColToArray(dbClient.getColumn("SELECT userid FROM messenger_friendships WHERE friendid = '" + userID + "' AND userid > 0"), null); foreach (int i in friendIDs) { idBuilder.Add(i); } CS$1$0000 = (int[]) idBuilder.ToArray(typeof(int)); } catch { CS$1$0000 = new int[0]; } finally { if (dbClient != null) { dbClient.Dispose(); } } return CS$1$0000; } 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 void Init() { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { _peakUserCount = dbClient.getInt("SELECT onlinecount_peak FROM system"); } try { pingChecker.Abort(); } catch { } try { pingChecker = new Thread(new ThreadStart(userManager.checkPings)); pingChecker.Priority = ThreadPriority.Lowest; pingChecker.Start(); effectsChecker = new Thread(new ThreadStart(userManager.CheckEffects)); effectsChecker.Priority = ThreadPriority.Lowest; effectsChecker.Start(); } catch { } } public static void removeUser(int userID) { if (_Users.ContainsKey(userID)) { _Users.Remove(userID); Out.WriteLine("User [" + userID + "] disconnected.", Out.logFlags.BelowStandardAction); } } public static void sendData(string Data) { try { Hashtable Users = (Hashtable) _Users.Clone(); foreach (virtualUser User in Users.Values) { try { User.sendData(Data); } catch { Out.WritePlain("Gebruiker " + User._Username + " is offline"); } } } catch { } } public static void sendToGuides(int userID, int roomID, string Data) { try { foreach (virtualUser User in _Users.Values) { if (userID == User._guideRequest) { User._guideRequest = 0; User._guideRoom = 0; User.sendData(Data); } else if (User._guideRequest == 0) { User._guideRequest = userID; User._guideRoom = roomID; User.sendData(Data); } } } catch { } } public static void sendToRank(byte Rank, bool includeHigher, string Data) { try { foreach (virtualUser User in _Users.Values) { if ((User._Rank >= Rank) && (includeHigher || (User._Rank <= Rank))) { User.sendData(Data); } } } catch { } } public static void setBan(int userID, int Hours, string Reason) { string Expires = DateTime.Now.AddHours((double) 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(0x3e8); } } public static void setBan(string IP, int Hours, string Reason, int userID) { DataColumn dCol; string Expires = DateTime.Now.AddHours((double) Hours).ToString().Replace("/", "-").Replace(".", "-"); 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"]))) { virtualUser User = (virtualUser) _Users[Convert.ToInt32(dRow["ID"])]; User.sendData("@c" + Reason); User.Disconnect(0x3e8); } } } 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 peakUserCount { get { return _peakUserCount; } } public static int userCount { get { return _Users.Count; } } } }