using System; using System.Threading; using Holo.Managers; using Holo.Socketservers; using Microsoft.VisualBasic; using Holo.Source.Managers; using Ion.Storage; using Holo.GameConnectionSystem; using Holo.Source.GameConnectionSystem; using Holo.Source.Managers.User; namespace Holo { public class Eucalypt { public static Thread serverMonitor = new Thread(new ThreadStart(monitorServer)); public delegate void commonDelegate(); private static DateTime lastTimeOnline = DateTime.Now; private static string dbHost; private static uint dbPort; public static string dbUsername; public static string dbPassword; public static string dbName; public static string showPackets; public static string autoClean; private static uint dbMaxConnections; private static uint dbMinPoolSize; private static uint dbMaxPoolSize; public static bool remoteConnection = false; public static DatabaseManager dbManager; public static Ion.Storage.Database database; /// /// Starts up Holograph Emulator codename "Eucalypt". /// private static void Main() { Console.WindowWidth = Console.LargestWindowWidth - 75; Console.CursorVisible = false; Console.Title = "HabboStoryEMU r35 ... Démarage ..."; Out.Clean(); LoadConfiguration(); Boot(); } private static void LoadConfiguration() { string sqlConfigLocation = IO.workingDirectory + @"\config\config.ini"; if (System.IO.File.Exists(sqlConfigLocation) == false) { Out.WriteError("Lo sentimos, pero no se ha encontrado el archivo de configuración."); Shutdown(); return; } dbHost = IO.readINI("mysql", "host", sqlConfigLocation); dbPort = uint.Parse(IO.readINI("mysql", "port", sqlConfigLocation)); dbUsername = IO.readINI("mysql", "username", sqlConfigLocation); dbPassword = IO.readINI("mysql", "password", sqlConfigLocation); dbName = IO.readINI("mysql", "database", sqlConfigLocation); showPackets = IO.readINI("options", "showpackets", sqlConfigLocation); autoClean = IO.readINI("options", "autoclean", sqlConfigLocation); dbMaxConnections = uint.Parse(IO.readINI("stability", "clientamount", sqlConfigLocation)); dbMinPoolSize = uint.Parse(IO.readINI("stability", "minpoolsize", sqlConfigLocation)); dbMaxPoolSize = uint.Parse(IO.readINI("stability", "maxpoolsize", sqlConfigLocation)); } private static void Boot() { int gamePort; int gameMaxConnections; int musPort; string musHost; int remotePort; string lang; ThreadPool.SetMaxThreads(200, 300); Out.WriteAlert("Connexion a la base de donnée . . ."); dbManager = new DatabaseManager(dbHost, dbPort, dbUsername, dbPassword, dbName, dbMinPoolSize, dbMaxPoolSize); dbManager.SetClientAmount(dbMaxConnections); dbManager.StartMonitor(); try { gamePort = int.Parse(Config.getTableEntry("server_game_port")); gameMaxConnections = int.Parse(Config.getTableEntry("server_game_maxconnections")); musPort = int.Parse(Config.getTableEntry("server_mus_port")); musHost = Config.getTableEntry("server_mus_host"); remotePort = int.Parse(Config.getTableEntry("server_remote_port")); } catch { Out.WriteError("No es posible la conexión a la DB. Tambien puede ser que este dañada."); Shutdown(); return; } if (Config.getTableEntry("lang") == "") { Out.WriteError("No ha sido encontrado un lenguaje por defecto. Se ha cargado la predeterminada."); lang = "es"; } else lang = Config.getTableEntry("lang"); Out.WriteLine("La base de donnée a été chargée . . . [ 100 % ]."); Out.WriteBlank(); stringManager.Init(lang, false); stringManager.initFilter(false); catalogueManager.Init(false); Out.WriteBlank(); modeldataManager.Init(false); FuserightManager.Init(false); navigatorManager.Init(); recyclerManager.Init(false); rankManager.Init(false); Config.Init(false); userManager.Init(); eventManager.Init(); gameSocketServer.SetupSocket(); if (musSocketServer.Init(musPort, musHost) == false) { Out.WriteAlert("No fue posible establecer la conexión MUS."); Config.musOnline = false; } else Config.musOnline = true; if(remotePort != 0) remoteSocketServer.Init(remotePort); resetDynamics(); Out.WriteLine("\n .: INFOS :.\nLe Lido est fixée a 80 % avec commandes Faites :commandes !\nLa barre de connectée, Rollers & les Animaux sont fixés\nMerci a Killian\nLe serveur est lancée \"HabboEMU\", Prêt !"); Out.WritePlain(""); serverMonitor.Priority = ThreadPriority.Lowest; serverMonitor.Start(); } public static void Shutdown() { try { gameSocketServer.Destroy(); } catch { } if (serverMonitor.IsAlive) serverMonitor.Abort(); Out.WriteLine("Se ha apagado correctamente el sistema. Presione una tecla para continuar."); Console.ReadKey(true); Environment.Exit(2); } private static void resetDynamics() { using (DatabaseClient dbClient = dbManager.GetClient()) { dbClient.runQuery("UPDATE system SET onlinecount = '0', connections_accepted = '0', activerooms = '0'"); dbClient.runQuery("UPDATE users SET ticket_sso = '', online = '0'"); dbClient.runQuery("UPDATE rooms SET visitors_now = '0'"); dbClient.runQuery("UPDATE cms_system SET hotel_status = '1'"); if (bool.Parse(autoClean) != false) { dbClient.runQuery("TRUNCATE `messenger_log`"); dbClient.runQuery("TRUNCATE `poll`"); dbClient.runQuery("TRUNCATE `poll_answers`"); dbClient.runQuery("TRUNCATE `poll_questions`"); dbClient.runQuery("TRUNCATE `poll_results`"); dbClient.runQuery("TRUNCATE `system_chatlog`"); dbClient.runQuery("TRUNCATE `events`"); } } } private static string OnlineTime(DateTime startGame) { TimeSpan timeOnline = (startGame - DateTime.Now); string timeOn2 = timeOnline.ToString(); string[] OnlineTime = timeOn2.Replace("-", "").Split('.'); return OnlineTime[0]; } private static void monitorServer() { while (true) { int onlineCount = userManager.userCount; int roomCount = roomManager.roomCount; int acceptedConnections = gameSocketServer.acceptedConnections; long memUsage = GC.GetTotalMemory(false) / 2048; Console.Title = "Habbo Story EMU r35 - Il y a " + onlineCount + " connectés ; " + roomCount + " aparts ouverts .Uilise " + (memUsage - 350) + "KB de RAM. En ligne > " + OnlineTime(lastTimeOnline); using (DatabaseClient dbClient = dbManager.GetClient()) { string lastRefreshOnline = dbClient.getString("SELECT lastRefreshOnline FROM system"); if (lastRefreshOnline == "0") { dbClient.runQuery("UPDATE users SET timeOnline = '00:00:00', dateOnline = '00'"); dbClient.runQuery("UPDATE system SET lastRefreshOnline = '" + DateTime.Now + "'"); dbClient.runQuery("UPDATE users SET timeOnline = '00:00:00', dateOnline = '00'"); dbClient.runQuery("UPDATE system SET lastRefreshOnline = '" + DateTime.Now + "'"); } dbClient.runQuery("UPDATE system SET onlinecount = '" + onlineCount + "', activerooms = '" + roomCount + "', connections_accepted = '" + acceptedConnections + "', serverOnlineTime = '" + OnlineTime(lastTimeOnline) + "'"); } if (remoteConnection) remoteSocketServer.replyConnection.sendData("RMSS" + Convert.ToChar(2) + onlineCount + Convert.ToChar(2) + roomCount + Convert.ToChar(2) + (memUsage - 350)); Thread.Sleep(4000); } } } }