namespace Holo.Source.Managers { using Holo; using Holo.Managers; using Ion.Storage; using System; using System.Collections.Generic; using System.Data; using System.Threading; public static class navigatorManager { public static Dictionary guestRooms; public static Dictionary name; public static Dictionary parent; private static Random random = new Random(); private static Thread randomizerThread; private static Thread reNewRooms; public static Dictionary roomAccesName; public static Dictionary roomAccesParent; private static Thread roomAccesSort; private static string Rooms; public static Dictionary roomsInsideCatagories; public static Dictionary type; private static Thread updateInRooms; public static DataColumn getAccesParent(int rank, int cataid) { DataColumn column; if (roomAccesParent.ContainsKey(rank.ToString() + cataid.ToString())) { return roomAccesParent[rank.ToString() + cataid.ToString()]; } using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { column = client.getColumn(string.Concat(new object[] { "SELECT id FROM room_categories WHERE parent = '", cataid, "' AND (access_rank_min <= ", rank, " OR access_rank_hideforlower = '0') ORDER BY id ASC" })); } roomAccesParent.Add(rank.ToString() + cataid.ToString(), column); return column; } public static DataTable getGuestroomQuery(string query, bool update) { DataTable table; DatabaseClient client; if (!update) { if (!guestRooms.ContainsKey(query)) { using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable(query); } guestRooms.Add(query, table); } return guestRooms[query]; } if (guestRooms.ContainsKey(query)) { using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable(query); } guestRooms.Remove(query); guestRooms.Add(query, table); return guestRooms[query]; } using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable(query); } guestRooms.Add(query, table); return guestRooms[query]; } public static string getName(int id) { return name[id]; } public static string getNameAcces(int rank, int id) { if (roomAccesName.ContainsKey(rank.ToString() + id.ToString())) { return roomAccesName[rank.ToString() + id.ToString()]; } return ""; } public static int getParent(int id) { return parent[id]; } public static string getRandomRooms() { return Rooms; } public static int getType(int id) { return type[id]; } public static void Init() { DataTable table; DatabaseClient client; type = new Dictionary(); parent = new Dictionary(); name = new Dictionary(); roomAccesName = new Dictionary(); roomAccesParent = new Dictionary(); roomsInsideCatagories = new Dictionary(); guestRooms = new Dictionary(); using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT id , type FROM room_categories"); } foreach (DataRow row in table.Rows) { type.Add(Convert.ToInt32(row[0]), Convert.ToInt32(row[1])); } using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT id, parent FROM room_categories"); } foreach (DataRow row in table.Rows) { parent.Add(Convert.ToInt32(row[0]), Convert.ToInt32(row[1])); } using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT id, name FROM room_categories"); } foreach (DataRow row in table.Rows) { name.Add(Convert.ToInt32(row[0]), Convert.ToString(row[1])); } ThreadStart start = new ThreadStart(navigatorManager.roomAcces); roomAccesSort = new Thread(start); roomAccesSort.Priority = ThreadPriority.BelowNormal; roomAccesSort.Start(); ThreadStart start2 = new ThreadStart(navigatorManager.reNewRoomsThread); reNewRooms = new Thread(start2); reNewRooms.Priority = ThreadPriority.BelowNormal; reNewRooms.Name = "Updates guestrooms catagories"; reNewRooms.Start(); ThreadStart start3 = new ThreadStart(navigatorManager.randomRooms); randomizerThread = new Thread(start3); randomizerThread.Priority = ThreadPriority.Lowest; randomizerThread.Name = "Update Random Rooms"; randomizerThread.Start(); ThreadStart start4 = new ThreadStart(navigatorManager.refreshGuestrooms); updateInRooms = new Thread(start4); updateInRooms.Priority = ThreadPriority.Lowest; updateInRooms.Name = "Update In Rooms"; updateInRooms.Start(); Out.WriteLine("Navigator names cached: " + name.Count); Out.WriteLine("Navigator \"Parent id's\" cached: " + parent.Count); Out.WriteLine("Navigator type's cached: " + type.Count); } private static void randomRooms() { int num4; DatabaseClient client; using (client = Eucalypt.dbManager.GetClient()) { num4 = client.getInt("SELECT min(id) FROM rooms"); } while (true) { int num; int num2 = 0; Rooms = ""; bool flag = false; using (client = Eucalypt.dbManager.GetClient()) { num = client.getInt("SELECT max(id)FROM rooms "); } while (num2 < 3) { int num3 = random.Next(num4, num); using (client = Eucalypt.dbManager.GetClient()) { flag = client.findsResult("SELECT id FROM rooms WHERE id = " + num3); } if (flag && (num3 > 0)) { DataRow row; using (client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT id,name,owner,description,state,visitors_now,visitors_max FROM rooms WHERE id = " + num3); } object rooms = Rooms; Rooms = string.Concat(new object[] { rooms, Encoding.encodeVL64(Convert.ToInt32(row["id"])), Convert.ToString(row["name"]), Convert.ToChar(2), Convert.ToString(row["owner"]), Convert.ToChar(2), roomManager.getRoomState(Convert.ToInt32(row["state"])), Convert.ToChar(2), Encoding.encodeVL64(Convert.ToInt32(row["visitors_now"])), Encoding.encodeVL64(Convert.ToInt32(row["visitors_max"])), Convert.ToString(row["description"]), Convert.ToChar(2) }); num2++; } } Thread.Sleep(0x7530); } } private static void refreshGuestrooms() { List list = new List(); while (true) { lock (roomsInsideCatagories) { foreach (KeyValuePair pair in roomsInsideCatagories) { list.Add(pair.Key); } } foreach (string str in list) { } list.Clear(); Thread.Sleep((int) (0x4e20 + random.Next(0x1388))); } } private static void reNewRoomsThread() { List list = new List(); while (true) { lock (guestRooms) { foreach (KeyValuePair pair in guestRooms) { list.Add(pair.Key); } } foreach (string str in list) { getGuestroomQuery(str, true); Thread.Sleep(random.Next(0x3e8)); } list.Clear(); Thread.Sleep((int) (0x7530 + random.Next(0x2710))); } } private static void roomAcces() { while (true) { for (int i = 0; i <= 7; i++) { DataTable table; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT id, name FROM room_categories WHERE (access_rank_min = " + i + " OR access_rank_hideforlower = '0')"); } foreach (DataRow row in table.Rows) { try { roomAccesName.Add(i + Convert.ToString(row[0]), Convert.ToString(row[1])); } catch (Exception exception) { Out.WriteError("error: " + exception.ToString()); } } } Thread.Sleep((int) (0x61a80 + random.Next(0x2710))); roomAccesName.Clear(); } } } }