using System; using System.Collections.Generic; using SnowLight.Communication; using SnowLight.Util; using SnowLight.Game.Sessions; using SnowLight.Config; using System.IO; using System.Text; namespace SnowLight.Communication.Incoming { public delegate void ProcessRequestCallback(Session Client, ClientMessage Message); public static class DataRouter { private static Dictionary mCallbacks; private static List mCallbacksWithoutAuthentication; public static void Initialize() { mCallbacks = new Dictionary(); mCallbacksWithoutAuthentication = new List(); } public static bool RegisterHandler(uint MessageId, ProcessRequestCallback Callback, bool PermitedUnauthenticated = false) { if (MessageId < 0 || Callback == null) { return false; } if (mCallbacks.ContainsKey(MessageId)) { return false; } mCallbacks.Add(MessageId, Callback); if (PermitedUnauthenticated) { mCallbacksWithoutAuthentication.Add(MessageId); } return true; } public static void HandleData(Session Session, ClientMessage Message) { if (Session == null || Session.Stopped || Message == null) { return; } if (!mCallbacks.ContainsKey(Message.Id)) { Output.WriteLine("Packet Error: " + Message.Id + " (" + Constants.DefaultEncoding.GetString(Base64Encoding.EncodeUint32(Message.Id, 2)) + "), no hay ningún controlador adecuado.", OutputLevel.Warning); FileStream errWriter = new System.IO.FileStream(@"Logs\Packets_Error.ini", System.IO.FileMode.Append, System.IO.FileAccess.Write); byte[] Msg = ASCIIEncoding.ASCII.GetBytes("Packet Error:\r\n" + Output.FormatTimestamp() +"Packet -> " + Message.Id + " (" + Constants.DefaultEncoding.GetString(Base64Encoding.EncodeUint32(Message.Id, 2)) + ")" + "\r\n\r\n"); errWriter.Write(Msg, 0, Msg.Length); errWriter.Dispose(); Output.WriteLine("Error guardado con éxito entre los Logs", OutputLevel.Warning); return; } if (!Session.Authenticated && !mCallbacksWithoutAuthentication.Contains(Message.Id)) { return; } mCallbacks[Message.Id].Invoke(Session, Message); } } }