using System; using System.Collections.Generic; using System.Linq; using System.Text; using Holo; using System.Data; using System.Net; using System.Net.Sockets; using System.Threading; using Holo.Managers; using Ion.Storage; using Holo.Virtual.Rooms; namespace Holo.Source.Managers { public static class navigatorManager { //public List<>; public static Dictionary guestRooms; public static Dictionary roomsInsideCatagories; public static Dictionary type; public static Dictionary parent; public static Dictionary name; public static Dictionary roomAccesName; public static Dictionary roomAccesParent; private static Thread randomizerThread; private static Thread roomAccesSort; private static Thread reNewRooms; private static Thread updateInRooms; private static string Rooms; private static Random random = new Random(); /// /// Initializes the navigtor /// public static void Init() { type = new Dictionary(); parent = new Dictionary(); name = new Dictionary(); roomAccesName = new Dictionary(); roomAccesParent = new Dictionary(); roomsInsideCatagories = new Dictionary(); guestRooms = new Dictionary(); DataTable dTable; using (DatabaseClient dbClient = frmMain.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 (DatabaseClient dbClient = frmMain.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 (DatabaseClient dbClient = frmMain.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(roomAcces); roomAccesSort = new Thread(roomAccesThread); roomAccesSort.Priority = ThreadPriority.BelowNormal; roomAccesSort.Start(); ThreadStart guestRoomRefresh = new ThreadStart(reNewRoomsThread); reNewRooms = new Thread(guestRoomRefresh); reNewRooms.Priority = ThreadPriority.BelowNormal; reNewRooms.Name = "Updates guestrooms catagories"; reNewRooms.Start(); ThreadStart randoms = new ThreadStart(randomRooms); randomizerThread = new Thread(randoms); randomizerThread.Priority = ThreadPriority.Lowest; randomizerThread.Name = "Update Random Rooms"; randomizerThread.Start(); ThreadStart guestRoomsInroom = new ThreadStart(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); } /// /// returns the name of the catagory with the given ID /// public static string getName(int id) { return name[id]; } /// /// hets the type of thr room with the given id /// public static int getType(int id) { return type[id]; } /// /// returns the ID of the parent /// public static int getParent(int id) { return parent[id]; } /// /// Gets the name of the acces rank returns "" if the user hasn't got the rank to acces it /// /// Rank of the user /// ID of room /// Name of the room public static string getNameAcces(int rank, int id) { if (roomAccesName.ContainsKey(rank.ToString() + id.ToString())) return roomAccesName[rank.ToString() + id.ToString()]; else return ""; } /// /// Gets a Parent of the Database, or from the local collection /// /// Rank of the user /// Index of the catalogus /// public static DataColumn getAccesParent(int rank, int cataid) { if (roomAccesParent.ContainsKey(rank.ToString() + cataid.ToString())) { return roomAccesParent[rank.ToString() + cataid.ToString()]; } else { DataColumn dCol; using (DatabaseClient dbClient = frmMain.dbManager.GetClient()) { dCol = dbClient.getColumn("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; } } /// /// gets a new guestroom which havn't been queried yet /// /// the query name /// Does it need an update or not (only true in thread updateGuestrooms) /// public static DataTable getGuestroomQuery(string query, bool update) { if (!update) { if (guestRooms.ContainsKey(query)) { return guestRooms[query]; } else { DataTable dTable; using (DatabaseClient dbClient = frmMain.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Add(query, dTable); return guestRooms[query]; } } else { if (guestRooms.ContainsKey(query)) { DataTable dTable; using (DatabaseClient dbClient = frmMain.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Remove(query); guestRooms.Add(query, dTable); return guestRooms[query]; } else { DataTable dTable; using (DatabaseClient dbClient = frmMain.dbManager.GetClient()) { dTable = dbClient.getTable(query); } guestRooms.Add(query, dTable); return guestRooms[query]; } } } public static string getRandomRooms() { return Rooms; } /// /// refreshes room acces every 40 seconds /// private static void roomAcces() { DataTable dTable; while (true) { lock (roomAccesName) { roomAccesName.Clear(); for (int i = 0; i <= 7; i++) { using (DatabaseClient dbClient = frmMain.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 { } } } } Thread.Sleep(400000 + random.Next(10000)); } } /// /// refreshes random rooms every 30 seconds /// private static void randomRooms() { DataRow dRow; int i; while (true) { i = 0; Rooms = ""; while (i < 3) { using (DatabaseClient dbClient = frmMain.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT id,name,owner,description,state,visitors_now,visitors_max FROM rooms WHERE owner != '' ORDER BY RAND() LIMIT 1"); } Rooms += 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(30000); } } 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(1000)); } toRenew.Clear(); Thread.Sleep(30000 + random.Next(10000)); } } 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) //{ // //getGuestRoomCatagoryID(s, true); //} roomToRenew.Clear(); Thread.Sleep(20000 + random.Next(5000)); } } } }