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 table3; if (!update) { if (!guestRooms.ContainsKey(query)) { DataTable table; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { table = client.getTable(query); } guestRooms.Add(query, table); } return guestRooms[query]; } if (guestRooms.ContainsKey(query)) { DataTable table2; using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { table2 = client2.getTable(query); } guestRooms.Remove(query); guestRooms.Add(query, table2); return guestRooms[query]; } using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { table3 = client3.getTable(query); } guestRooms.Add(query, table3); 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; type = new Dictionary(); parent = new Dictionary(); name = new Dictionary(); roomAccesName = new Dictionary(); roomAccesParent = new Dictionary(); roomsInsideCatagories = new Dictionary(); guestRooms = new Dictionary(); using (DatabaseClient 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 (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { table = client2.getTable("SELECT id, parent FROM room_categories"); } foreach (DataRow row2 in table.Rows) { parent.Add(Convert.ToInt32(row2[0]), Convert.ToInt32(row2[1])); } using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { table = client3.getTable("SELECT id, name FROM room_categories"); } foreach (DataRow row3 in table.Rows) { name.Add(Convert.ToInt32(row3[0]), Convert.ToString(row3[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() { while (true) { int num = 0; Rooms = ""; while (num < 3) { DataRow row; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT id,name,owner,description,state,visitors_now,visitors_max FROM rooms WHERE owner != '' ORDER BY RAND() LIMIT 1"); } 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) }); num++; } Thread.Sleep(0x7530); } } private static void refreshGuestrooms() { List list = new List(); while (true) { lock (roomsInsideCatagories) { foreach (KeyValuePair pair in roomsInsideCatagories) { list.Add(pair.Key); } } 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) { lock (roomAccesName) { roomAccesName.Clear(); 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])); continue; } catch { continue; } } } } Thread.Sleep((int) (0x61a80 + random.Next(0x2710))); } } } }