using System; using System.Collections.Generic; using System.Security.Permissions; using System.Net; using SnowLight.Communication.Incoming; using SnowLight.Config; using SnowLight.Network; using SnowLight.Storage; //using SnowLight.Plugins; using SnowLight.Util; using SnowLight.Game; using SnowLight.Game.Sessions; using SnowLight.Game.Misc; using SnowLight.Game.Handlers; using SnowLight.Game.Moderation; using SnowLight.Game.Messenger; using SnowLight.Game.Characters; using SnowLight.Game.Catalog; using SnowLight.Game.Items; using SnowLight.Game.Navigation; using SnowLight.Game.Rooms; using SnowLight.Game.Advertisements; using SnowLight.Game.Rights; using SnowLight.Game.Bots; using SnowLight.Game.Infobus; using SnowLight.Game.Achievements; using SnowLight.Game.Recycler; using SnowLight.Game.Pets; using SnowLight.Game.Music; using SnowLight.Game.Rooms.Trading; using System.Windows.Forms; using System.Threading; using System.Timers; using System.IO; using System.Text; namespace SnowLight { public static class Program { private static bool mAlive; private static SnowTcpListener mServer; internal static DateTime ServerStarted; /// /// Should be used by all non-worker threads to check if they should remain alive, allowing for safe termination. /// public static bool Alive { get { return (!Environment.HasShutdownStarted && mAlive); } } [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)] public static void Main(string[] args) { Console.Title = "Iniciando SnowLight V3..."; mAlive = true; DateTime InitStart = DateTime.Now; ConfigManager.Initialize(Constants.DataFileDirectory + "\\Config.ini"); // Set up basic output, configuration, etc Output.InitializeStream(true, OutputLevel.DebugInformation); Output.WriteLine("Iniciando SnowLight V3..."); Output.SetVerbosityLevel((OutputLevel)1); // Process args foreach (string arg in args) { Output.WriteLine("Command line argument: " + arg); Input.ProcessInput(arg.Split(' ')); } try { // Initialize and test database Output.WriteLine("Iniciando MySQL manager..."); SqlDatabaseManager.Initialize(); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Output.WriteLine("Reseteando contadores y estadísticas..."); PerformDatabaseCleanup(MySqlClient); Output.WriteLine("Iniciando componentes y características de los juegos..."); // Core DataRouter.Initialize(); // Sessions, characters Handshake.Initialize(); GlobalHandler.Initialize(); SessionManager.Initialize(); CharacterInfoLoader.Initialize(); RightsManager.Initialize(MySqlClient); SingleSignOnAuthenticator.Initialize(); // Room management and navigator RoomManager.Initialize(MySqlClient); RoomInfoLoader.Initialize(); RoomHandler.Initialize(); RoomItemHandler.Initialize(); Navigator.Initialize(MySqlClient); // Help and moderation HelpTool.Initialize(MySqlClient); ModerationPresets.Initialize(MySqlClient); ModerationTicketManager.Initialize(MySqlClient); ModerationHandler.Initialize(); ModerationBanManager.Initialize(MySqlClient); // Catalog, pets and items ItemDefinitionManager.Initialize(MySqlClient); CatalogManager.Initialize(MySqlClient); CatalogPurchaseHandler.Initialize(); Inventory.Initialize(); ItemEventDispatcher.Initialize(); PetDataManager.Initialize(MySqlClient); // Messenger MessengerHandler.Initialize(); // Achievements and quests AchievementManager.Initialize(MySqlClient); QuestManager.Initialize(MySqlClient); // Misc/extras CrossdomainPolicy.Initialize("SnowSystem\\crossdomain.xml"); InfobusManager.Initialize(); ActivityPointsWorker.Initialize(); BotManager.Initialize(MySqlClient); InterstitialManager.Initialize(MySqlClient); ChatEmotions.Initialize(); EffectsCacheWorker.Initialize(); RecyclerManager.Initialize(MySqlClient); DrinkSetManager.Initialize(MySqlClient); SongManager.Initialize(); TradeHandler.Initialize(); // Polish/misc WarningSurpressors.Initialize(); RandomGenerator.Initialize(); } } catch (Exception) { HandleFatalError("Error al Iniciar iniciar SnowLight V3."); } // Initialize network components Output.WriteLine("Iniciado en el puerto: " + (int)ConfigManager.GetValue("net.bind.port") + "..."); // Controlador de Comandos del Hotel Output.WriteLine("Iniciando controlador de comandos del Hotel..."); ConfigManager.InitializeCommands(Constants.DataFileDirectory + "\\Commands.ini"); // Controlador del sistema Customization! Output.WriteLine("Iniciando controlador del sistema Customization!..."); ConfigManager.InitializeCustomization(Constants.DataFileDirectory + "\\Customization!.ini"); // Controlador de elementos Visuales Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Output.WriteLine("Iniciando controlador de estilos visuales..."); // Optimizador y Reparador de Bases de Datos Output.WriteLine("Optimizando y Reparando Base de Datos..."); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.ExecuteNonQuery("OPTIMIZE TABLE `accounts`, `achievements`, `avatar_effects`, `badges`, `badge_definitions`, `bans`, `bots`, `bots_speech`, `bot_responses`, `catalog`, `catalog_items`, `catalog_subscriptions`, `characters`, `crossdomain`, `drink_sets`, `favorites`, `flat_categories`, `help_categories`, `help_topics`, `ignores`, `interstitials`, `items`, `item_definitions`, `messenger_friendships`, `moderation_action_log`, `moderation_chatlogs`, `moderation_presets`, `moderation_preset_action_categories`, `moderation_preset_action_messages`, `moderation_tickets`, `navigator_event_search_categories`, `navigator_frontpage`, `new_items`, `pets`, `pet_races`, `pet_tricks`, `quests`, `recycler_rewards`, `rights`, `rooms`, `room_models`, `room_rights`, `room_visits`, `server_statistics`, `songs`, `static_objects`, `tags`, `user_achievements`, `user_quests`, `user_subscriptions`, `vouchers`, `wardrobe`"); MySqlClient.ExecuteNonQuery("REPAIR TABLE `accounts`, `achievements`, `avatar_effects`, `badges`, `badge_definitions`, `bans`, `bots`, `bots_speech`, `bot_responses`, `catalog`, `catalog_items`, `catalog_subscriptions`, `characters`, `crossdomain`, `drink_sets`, `favorites`, `flat_categories`, `help_categories`, `help_topics`, `ignores`, `interstitials`, `items`, `item_definitions`, `messenger_friendships`, `moderation_action_log`, `moderation_chatlogs`, `moderation_presets`, `moderation_preset_action_categories`, `moderation_preset_action_messages`, `moderation_tickets`, `navigator_event_search_categories`, `navigator_frontpage`, `new_items`, `pets`, `pet_races`, `pet_tricks`, `quests`, `recycler_rewards`, `rights`, `rooms`, `room_models`, `room_rights`, `room_visits`, `server_statistics`, `songs`, `static_objects`, `tags`, `user_achievements`, `user_quests`, `user_subscriptions`, `vouchers`, `wardrobe`"); } // Resetear Baldosas BattleBall Output.WriteLine("Reseteando Baldosas BattleBall y Efectos Asignados..."); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { MySqlClient.ExecuteNonQuery("UPDATE Items SET tile = '0'"); MySqlClient.ExecuteNonQuery("UPDATE Characters SET bb_color = '0'"); } mServer = new SnowTcpListener(new IPEndPoint(IPAddress.Any, (int)ConfigManager.GetValue("net.bind.port")), (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback( SessionManager.HandleIncomingConnection)); // Init complete TimeSpan TimeSpent = DateTime.Now - InitStart; Output.WriteLine("El servidor se ha iniciado correctamente ( " + Math.Round(TimeSpent.TotalSeconds, 2) + " segundos). Preparado para recibir conexions.", OutputLevel.Notification); Output.WriteLine("Si tienes alguna duda sobre los comandos, escribe ayuda", OutputLevel.Notification); Output.WriteLine("Presiona <> para poder introducir un comando en el Emulador", OutputLevel.Notification); FileStream erroWriter = new System.IO.FileStream(@"Logs\Initialize.ini", System.IO.FileMode.Append, System.IO.FileAccess.Write); byte[] Msge = ASCIIEncoding.ASCII.GetBytes(Output.FormatTimestamp() + "SnowLight V3 Iniciado Correctamente\r\n\r\n"); erroWriter.Write(Msge, 0, Msge.Length); erroWriter.Dispose(); if ((int)ConfigManager.GetValue("beep.on") == 1) { Console.Beep(); } Input.Listen(); // This will make the main thread process console while Program.Alive. } private static void PerformDatabaseCleanup(SqlDatabaseClient MySqlClient) { MySqlClient.ExecuteNonQuery("UPDATE rooms SET current_users = 0"); MySqlClient.SetParameter("timestamp", UnixTimestamp.GetCurrent()); MySqlClient.ExecuteNonQuery("UPDATE room_visits SET timestamp_left = @timestamp WHERE timestamp_left = 0"); } public static void HandleFatalError(string Message) { Output.WriteLine(Message, OutputLevel.CriticalError); Output.WriteLine("No se pudo iniciar el Servidor", OutputLevel.CriticalError); FileStream errWriter = new System.IO.FileStream(@"Logs\Initialize_Error.ini", System.IO.FileMode.Append, System.IO.FileAccess.Write); byte[] Msg = ASCIIEncoding.ASCII.GetBytes(Output.FormatTimestamp() + "Error al Inicia SnowLight V3\r\n\r\n"); errWriter.Write(Msg, 0, Msg.Length); errWriter.Dispose(); Output.WriteLine("Excepción guardada entre los Logs", OutputLevel.Warning); Console.ReadKey(true); Stop(); } private static string mColdTitle; public static void repeat() { ServerStarted = DateTime.Now; TimeSpan Uptime = DateTime.Now - ServerStarted;; mColdTitle = "ElectronEmulator | Tiempo Online: " + Uptime.Seconds + " Segundos, " + Uptime.Minutes + " Minutos, " + Uptime.Hours + " Horas y " + Uptime.Days + " Días"; Thread.Sleep(3000); } public static void Stop() { Output.WriteLine("Cerrando SnowLight V3..."); mAlive = false; // Will destroy any threads looping for Program.Alive. SqlDatabaseManager.Uninitialize(); mServer.Dispose(); mServer = null; Output.WriteLine("¡Adios!"); Environment.Exit(0); } } }