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.Runtime.InteropServices; using System.Text; using System.Threading; public static class userManager { private static List _MessageQueue = new List(); private static Thread _MessageSaver; private static int _peakUserCount; private static Hashtable _Users = new Hashtable(); private static Thread effectsChecker; private static Thread pingChecker; public static void addChatMessage(string userName, int roomID, string Message) { ChatMessage item = new ChatMessage { Message = Message, RoomID = roomID, Username = userName, MessageSent = DateTime.Now.ToString() }; _MessageQueue.Add(item); } public static void addUser(int userID, string ShockwaveID, virtualUser User) { if (_Users.ContainsKey(userID)) { ((virtualUser) _Users[userID]).Disconnect(); if (_Users.ContainsKey(userID)) { _Users.Remove(userID); } } using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.AddParamWithValue("name", User._Username); if (User.IP == client.getString("SELECT ipaddress_last FROM users WHERE name = @name LIMIT 1")) { _Users.Add(userID, User); client.AddParamWithValue("shockid", ShockwaveID); client.runQuery("UPDATE users SET ticket_sso = NULL AND shockwaveid = @shockid WHERE id = '" + userID + "' LIMIT 1"); Out.WriteLine("User " + User._Username + " logged in."); } else { User.Disconnect(0x3e8); User.sendData("BKInvalid Session Ticket, please login again!" + Convert.ToChar(2)); } } } private static void CheckEffects() { while (true) { try { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.runQuery("UPDATE users_effects SET effect_timeleft = effect_timeleft - 60 WHERE effect_activated = '1'"); foreach (int num in dataHandling.dColToArray(client.getColumn("SELECT num FROM users_effects WHERE effect_timeleft < 0"), null)) { int userID = client.getInt("SELECT userid FROM users_effects WHERE num = " + num + " LIMIT 1"); if (containsUser(userID)) { getUser(userID).refreshEffect(); } } client.runQuery("DELETE FROM users_effects WHERE effect_timeleft < 0"); } } catch { } Thread.Sleep(0xea60); } } private static void checkPings() { List list = new List(); while (true) { try { Hashtable hashtable = (Hashtable) _Users.Clone(); foreach (virtualUser user in hashtable.Values) { if (user._isDisconnected) { continue; } if (user.pingOK) { user._clean = false; user.pingOK = false; user.sendData("@r"); if ((user.Room != null) || (user.roomUser != null)) { int roomID = user.Room.roomID; } if (user._Username != "") { user._Minuteperiod++; if (user._Minuteperiod == 5) { user._Minuteperiod = 0; user._Pixels += 50; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "UPDATE users SET pixels = '", user._Pixels, "' WHERE id = '", user.userID, "' LIMIT 1" })); } user.sendData("Fv" + Holo.Encoding.encodeVL64(user._Pixels) + "RL"); } } continue; } list.Add(user); } hashtable.Clear(); } catch { } foreach (virtualUser user2 in list) { user2.Disconnect(); } list.Clear(); Thread.Sleep(0x186a0); } } public static bool containsUser(int userID) { return _Users.ContainsKey(userID); } public static bool containsUser(string userName) { int key = getUserID(userName); return _Users.ContainsKey(key); } public static string generateBanReport(int userID) { string str4; try { DataRow row; DataRow row2; DataRow row3; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row2 = client.getRow("SELECT date_expire,descr,ipaddress FROM users_bans WHERE userid = '" + userID + "'"); row = client.getRow("SELECT name,rank,ipaddress_last FROM users WHERE id = '" + userID + "'"); } if ((row2.Table.Rows.Count == 0) || (row.Table.Rows.Count == 0)) { return "holo.cast.banreport.null"; } string str = "-"; string str2 = ""; string str3 = ""; using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { row3 = client2.getRow("SELECT userid,note,timestamp FROM system_stafflog WHERE action = 'ban' AND targetid = '" + userID + "' ORDER BY id ASC"); } if (row3.Table.Rows.Count > 0) { if (Convert.ToString(row3[1]) != "") { str = Convert.ToString(row3[1]); } using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { str2 = client3.getString("SELECT name FROM users WHERE id = '" + Convert.ToString(row3[0]) + "'"); } str3 = Convert.ToString(row3[2]); } StringBuilder builder = new StringBuilder(stringManager.getString("banreport_header") + " "); builder.Append(string.Concat(new object[] { Convert.ToString(row[0]), " [", userID, "]\r" })); builder.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(row[1]) + "\r"); builder.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(row[2]) + "\r"); builder.Append(stringManager.getString("banreport_banner") + ": " + str2 + "\r"); builder.Append(stringManager.getString("banreport_posted") + ": " + str3 + "\r"); builder.Append(stringManager.getString("banreport_expires") + ": " + Convert.ToString(row2[0]) + "\r"); builder.Append(stringManager.getString("banreport_reason") + ": " + Convert.ToString(row2[1]) + "\r"); bool flag = Convert.ToString(row2[2]) != ""; builder.Append(stringManager.getString("banreport_ipbanflag") + ": " + flag.ToString().ToLower() + "\r"); builder.Append(stringManager.getString("banreport_staffnote") + ": " + str); str4 = builder.ToString(); } catch (Exception exception) { throw exception; } return str4; } public static string generateBanReport(string IP) { string str4; try { DataRow row; DataRow row2; DataColumn column; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT userid,date_expire,descr FROM users_bans WHERE ipaddress = '" + IP + "'"); } if (row.Table.Rows.Count == 0) { return "holo.cast.banreport.null"; } string str = "-"; string str2 = ""; string str3 = ""; using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { row2 = client2.getRow("SELECT userid,note,timestamp FROM system_stafflog WHERE action = 'ban' AND targetid = '" + Convert.ToString(row[0]) + "' ORDER BY id ASC"); } if (row2.Table.Rows.Count > 0) { if (Convert.ToString(row2[1]) != "") { str = Convert.ToString(row2[1]); } using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { str2 = client3.getString("SELECT name FROM users WHERE id = '" + Convert.ToString(row2[0]) + "'"); } str3 = Convert.ToString(row2[2]); } StringBuilder builder = new StringBuilder(stringManager.getString("banreport_header") + " "); builder.Append(IP + "\r"); builder.Append(stringManager.getString("banreport_banner") + ": " + str2 + "\r"); builder.Append(stringManager.getString("banreport_posted") + ": " + str3 + "\r"); builder.Append(stringManager.getString("banreport_expires") + ": " + Convert.ToString(row[0]) + "\r"); builder.Append(stringManager.getString("banreport_reason") + ": " + Convert.ToString(row[1]) + "\r"); bool flag = Convert.ToString(row[2]) != ""; builder.Append(stringManager.getString("banreport_ipbanflag") + ": " + flag.ToString().ToLower() + "\r"); builder.Append(stringManager.getString("banreport_staffnote") + ": " + str + "\r\r"); using (DatabaseClient client4 = Eucalypt.dbManager.GetClient()) { column = client4.getColumn("SELECT name FROM users WHERE ipaddress_last = '" + IP + "'"); } builder.Append(stringManager.getString("banreport_affectedusernames") + ":"); using (IEnumerator enumerator = column.Table.Rows.GetEnumerator()) { while (enumerator.MoveNext()) { DataRow current = (DataRow) enumerator.Current; builder.Append("\r - " + Convert.ToString(row["name"])); } } str4 = builder.ToString(); } catch (Exception exception) { throw exception; } return str4; } public static string generateUserInfo(int userID, byte Rank) { DataRow row; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.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 (row.Table.Rows.Count == 0) { return stringManager.getString("userinfo_accesserror"); } StringBuilder builder = new StringBuilder(stringManager.getString("userinfo_header") + "\r"); builder.Append(string.Concat(new object[] { stringManager.getString("common_userid"), ": ", userID, "\r" })); builder.Append(stringManager.getString("common_username") + ": " + Convert.ToString(row[0]) + "\r"); builder.Append(stringManager.getString("common_userrank") + ": " + Convert.ToString(row[1]) + "\r"); builder.Append(stringManager.getString("common_usermission") + ": " + Convert.ToString(row[2]) + "\r"); builder.Append(stringManager.getString("common_credits") + ": " + Convert.ToString(row[3]) + "\r"); builder.Append(stringManager.getString("common_hbirth") + ": " + Convert.ToString(row[7]) + "\r\r"); builder.Append(stringManager.getString("common_birth") + ": " + Convert.ToString(row[6]) + "\r"); builder.Append(stringManager.getString("common_email") + ": " + Convert.ToString(row[5]) + "\r"); builder.Append(stringManager.getString("common_ip") + ": " + Convert.ToString(row[8]) + "\r\r"); if (_Users.ContainsKey(userID)) { virtualUser user = (virtualUser) _Users[userID]; string str = ""; if (user._roomID == 0) { str = stringManager.getString("common_hotelview"); } else { using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { str = string.Concat(new object[] { stringManager.getString("common_room"), " '", client2.getString("SELECT name FROM rooms WHERE id = '" + user._roomID + "'"), "' [id: ", user._roomID, ", ", stringManager.getString("common_owner"), ": ", client2.getString("SELECT owner FROM rooms WHERE id = '" + user._roomID + "'"), "]" }); } } builder.Append(stringManager.getString("common_location") + ": " + str); } else { builder.Append(stringManager.getString("common_lastaccess") + ": " + Convert.ToString(row[9])); } return builder.ToString(); } public static string generateWhosOnline(bool Admin) { int userCount = userManager.userCount; int num2 = 0; while (userCount > 30) { num2++; userCount -= 30; } num2++; StringBuilder builder = new StringBuilder("BKOnline Users"); if (num2 > 1) { builder.Append(" page 1/" + num2); } builder.Append(" Total online: " + userManager.userCount); int num3 = 30; int num4 = 1; if (Admin) { foreach (DictionaryEntry entry in _Users) { if (num3 == 0) { num4++; builder.Append(string.Concat(new object[] { Convert.ToChar(1), "BKOnline Users page ", num4, "/", num2, " Total online: ", userManager.userCount })); num3 = 30; } builder.Append(string.Concat(new object[] { "\r", getUserName((int) entry.Key), " [", entry.Key.ToString(), "] {", getUser((int) entry.Key)._Rank, "} ", getUser((int) entry.Key).IP })); num3--; } } else { foreach (DictionaryEntry entry2 in _Users) { if (num3 == 0) { num4++; builder.Append(string.Concat(new object[] { Convert.ToChar(1), "BKOnline Users page ", num4, " Total online: ", userManager.userCount })); num3 = 30; } builder.Append(string.Concat(new object[] { "\r", getUserName((int) entry2.Key), " {", getUser((int) entry2.Key)._Rank, "}" })); num3--; } } return (builder.ToString() + Convert.ToString(Convert.ToChar(2))); } public static string getBanReason(int userID) { string str; try { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { str = client.getString("SELECT descr FROM users_bans WHERE userid = '" + userID + "'"); } } catch { str = ""; } return str; } public static string getBanReason(string IP) { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { if (client.findsResult("SELECT ipaddress FROM users_bans WHERE ipaddress = '" + IP + "'")) { if (DateTime.Compare(DateTime.Parse(client.getString("SELECT date_expire FROM users_bans WHERE ipaddress = '" + IP + "'")), DateTime.Now) > 0) { return client.getString("SELECT descr FROM users_bans WHERE ipaddress = '" + IP + "'"); } client.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)); } public static int[] getUserFriendIDs(int userID) { int[] numArray2; DatabaseClient client = Eucalypt.dbManager.GetClient(); try { ArrayList list = new ArrayList(); foreach (int num in dataHandling.dColToArray(client.getColumn("SELECT friendid FROM messenger_friendships WHERE userid = '" + userID + "' AND friendid > 0"), null)) { list.Add(num); } foreach (int num2 in dataHandling.dColToArray(client.getColumn("SELECT userid FROM messenger_friendships WHERE friendid = '" + userID + "' AND userid > 0"), null)) { list.Add(num2); } numArray2 = (int[]) list.ToArray(typeof(int)); } catch { numArray2 = new int[0]; } finally { if (client != null) { client.Dispose(); } } return numArray2; } public static int getUserID(string userName) { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.AddParamWithValue("name", userName); return client.getInt("SELECT id FROM users WHERE name = @name LIMIT 1"); } } public static string getUserName(int userID) { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { return client.getString("SELECT name FROM users WHERE id = '" + userID + "' LIMIT 1"); } } public static void Init() { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { _peakUserCount = client.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(); _MessageSaver = new Thread(new ThreadStart(userManager.WriteAllChatMessages)); _MessageSaver.Priority = ThreadPriority.Lowest; _MessageSaver.Start(); } catch { } } public static void RefreshAllUser() { Hashtable hashtable = (Hashtable) _Users.Clone(); foreach (virtualUser user in hashtable.Values) { user.refreshAppearance(false, true, true, true); } hashtable.Clear(); } public static void removeUser(virtualUser User) { if (_Users.ContainsValue(User)) { _Users.Remove(User); } } public static void removeUser(int userID) { if (_Users.ContainsKey(userID)) { _Users.Remove(userID); } } public static void sendData(string Data) { try { Hashtable hashtable = (Hashtable) _Users.Clone(); byte[] bytes = System.Text.Encoding.Default.GetBytes(Data + Convert.ToChar(1)); foreach (virtualUser user in hashtable.Values) { try { user.SendByteArray(bytes); continue; } catch { Out.WritePlain("User " + user._Username + " is offline"); continue; } } } 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 val = DateTime.Now.AddHours((double) Hours).ToString().Replace("/", "-").Replace(".", "-"); using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.AddParamWithValue("userid", userID); client.AddParamWithValue("expires", val); client.AddParamWithValue("reason", Reason); client.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 column; string val = DateTime.Now.AddHours((double) Hours).ToString().Replace("/", "-").Replace(".", "-"); using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.AddParamWithValue("ip", IP); client.AddParamWithValue("expires", val); client.AddParamWithValue("reason", Reason); client.AddParamWithValue("ID", userID); client.runQuery("INSERT INTO users_bans (ipaddress,date_expire,descr,userid) VALUES (@ip,@expires,@reason,@ID)"); column = client.getColumn("SELECT id FROM users WHERE ipaddress_last = '" + IP + "'"); } foreach (DataRow row in column.Table.Rows) { if (_Users.ContainsKey(Convert.ToInt32(row["id"]))) { virtualUser user = (virtualUser) _Users[Convert.ToInt32(row["ID"])]; user.sendData("@c" + Reason); user.Disconnect(0x3e8); } } } public static void SetuserTempFigure(string Figure) { Hashtable hashtable = (Hashtable) _Users.Clone(); foreach (virtualUser user in hashtable.Values) { user.sendData(string.Concat(new object[] { "@E", user.ConnectionID, Convert.ToChar(2), user._Username, Convert.ToChar(2), Figure, Convert.ToChar(2), user._Sex, Convert.ToChar(2), user._Mission, Convert.ToChar(2), Convert.ToChar(2), "PCch=s02/53,51,44", Convert.ToChar(2), "HI" })); if ((user.Room != null) && (user.roomUser != null)) { user.Room.sendData(string.Concat(new object[] { "DJ", Holo.Encoding.encodeVL64(user.roomUser.roomUID), Figure, Convert.ToChar(2), user._Sex, Convert.ToChar(2), user._Mission, Convert.ToChar(2) })); } } hashtable.Clear(); } public static bool userExists(int userID) { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { return client.findsResult("SELECT id FROM users WHERE id = '" + userID + "'"); } } private static void WriteAllChatMessages() { lock (_MessageQueue) { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { foreach (ChatMessage message in _MessageQueue) { client.AddParamWithValue("username", message.Username); client.AddParamWithValue("roomid", message.RoomID); client.AddParamWithValue("message", message.Message); client.AddParamWithValue("timesent", message.MessageSent); client.runQuery("INSERT INTO system_chatlog (username,roomid,mtime,message) VALUES (@username,@roomid,@timesent,@message)"); _MessageQueue.Remove(message); } } } Thread.Sleep(0x4e20); } public static int peakUserCount { get { return _peakUserCount; } } public static int userCount { get { return _Users.Count; } } [StructLayout(LayoutKind.Sequential)] private struct ChatMessage { internal int RoomID; internal string Username; internal string Message; internal string MessageSent; } } }