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 dCol; if (roomAccesParent.ContainsKey(rank.ToString() + cataid.ToString())) { return roomAccesParent[rank.ToString() + cataid.ToString()]; } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.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(), dCol); return dCol; } public static DataTable getGuestroomQuery(string query, bool update) { DataTable dTable; DatabaseClient dbClient; if (!update) { if (!guestRooms.ContainsKey(query)) { using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Add(query, dTable); } return guestRooms[query]; } if (guestRooms.ContainsKey(query)) { using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Remove(query); guestRooms.Add(query, dTable); return guestRooms[query]; } using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Add(query, dTable); 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 dTable; DatabaseClient dbClient; type = new Dictionary(); parent = new Dictionary(); name = new Dictionary(); roomAccesName = new Dictionary(); roomAccesParent = new Dictionary(); roomsInsideCatagories = new Dictionary(); guestRooms = new Dictionary(); using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id , type FROM room_categories"); } foreach (DataRow dRow in dTable.Rows) { type.Add(Convert.ToInt32(dRow[0]), Convert.ToInt32(dRow[1])); } using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id, parent FROM room_categories"); } foreach (DataRow dRow in dTable.Rows) { parent.Add(Convert.ToInt32(dRow[0]), Convert.ToInt32(dRow[1])); } using (dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id, name FROM room_categories"); } foreach (DataRow dRow in dTable.Rows) { name.Add(Convert.ToInt32(dRow[0]), Convert.ToString(dRow[1])); } ThreadStart roomAccesThread = new ThreadStart(navigatorManager.roomAcces); roomAccesSort = new Thread(roomAccesThread); roomAccesSort.Priority = ThreadPriority.BelowNormal; roomAccesSort.Start(); ThreadStart guestRoomRefresh = new ThreadStart(navigatorManager.reNewRoomsThread); reNewRooms = new Thread(guestRoomRefresh); reNewRooms.Priority = ThreadPriority.BelowNormal; reNewRooms.Name = "Updates guestrooms catagories"; reNewRooms.Start(); ThreadStart randoms = new ThreadStart(navigatorManager.randomRooms); randomizerThread = new Thread(randoms); randomizerThread.Priority = ThreadPriority.Lowest; randomizerThread.Name = "Update Random Rooms"; randomizerThread.Start(); ThreadStart guestRoomsInroom = new ThreadStart(navigatorManager.refreshGuestrooms); updateInRooms = new Thread(guestRoomsInroom); 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 minimum; DatabaseClient dbClient; using (dbClient = Eucalypt.dbManager.GetClient()) { minimum = dbClient.getInt("SELECT min(id) FROM rooms where NOT(owner = NULL)"); } while (true) { int nummer; int i = 0; Rooms = ""; bool findResult = false; using (dbClient = Eucalypt.dbManager.GetClient()) { nummer = dbClient.getInt("SELECT max(id)FROM rooms "); } while (i < 3) { int randomNummer = random.Next(minimum, nummer); using (dbClient = Eucalypt.dbManager.GetClient()) { findResult = dbClient.findsResult("SELECT id FROM rooms WHERE id = " + randomNummer); } if (findResult && (randomNummer > 0)) { DataRow dRow; using (dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT id,name,owner,description,state,visitors_now,visitors_max FROM rooms WHERE id = " + randomNummer); } object CS$0$0001 = Rooms; Rooms = string.Concat(new object[] { CS$0$0001, Encoding.encodeVL64(Convert.ToInt32(dRow["id"])), Convert.ToString(dRow["name"]), Convert.ToChar(2), Convert.ToString(dRow["owner"]), Convert.ToChar(2), roomManager.getRoomState(Convert.ToInt32(dRow["state"])), Convert.ToChar(2), Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])), Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])), Convert.ToString(dRow["description"]), Convert.ToChar(2) }); i++; } } Thread.Sleep(0x7530); } } private static void refreshGuestrooms() { List roomToRenew = new List(); while (true) { lock (roomsInsideCatagories) { foreach (KeyValuePair var in roomsInsideCatagories) { roomToRenew.Add(var.Key); } } foreach (string s in roomToRenew) { } roomToRenew.Clear(); Thread.Sleep((int) (0x4e20 + random.Next(0x1388))); } } private static void reNewRoomsThread() { List toRenew = new List(); while (true) { lock (guestRooms) { foreach (KeyValuePair var in guestRooms) { toRenew.Add(var.Key); } } foreach (string s in toRenew) { getGuestroomQuery(s, true); Thread.Sleep(random.Next(0x3e8)); } toRenew.Clear(); Thread.Sleep((int) (0x7530 + random.Next(0x2710))); } } private static void roomAcces() { while (true) { for (int i = 0; i <= 7; i++) { DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id, name FROM room_categories WHERE (access_rank_min = " + i + " OR access_rank_hideforlower = '0')"); } foreach (DataRow dRow in dTable.Rows) { try { roomAccesName.Add(i + Convert.ToString(dRow[0]), Convert.ToString(dRow[1])); } catch (Exception e) { Out.WriteError("error: " + e.ToString()); } } } Thread.Sleep((int) (0x61a80 + random.Next(0x2710))); roomAccesName.Clear(); } } } }