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);
}
}
}