Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.68 KB | None | 0 0
  1. public abstract class DofusMitm : AbstractMitm
  2.     {
  3.         protected ISerializer Serializer;
  4.         protected IMessageMap MessageMap;
  5.         private Func<FrameParser> _createNewFrameParser;
  6.  
  7.         public uint InstanceId { get; set; }
  8.  
  9.         protected DofusMitm(int localPort, string remoteHostname, int remotePort) : base(localPort, remoteHostname,
  10.             remotePort)
  11.         {
  12.             Serializer = ServiceLocator.Container.Resolve<ISerializer>();
  13.             MessageMap = ServiceLocator.Container.Resolve<IMessageMap>();
  14.             _createNewFrameParser = () => ServiceLocator.Container.Resolve<FrameParser>();
  15.         }
  16.  
  17.         public abstract bool OnClientMessage(int messageId, DofusReader messageData); // if returns true : forward message
  18.         public abstract bool OnServerMessage(int messageId, DofusReader messageData); // if returns true : forward message
  19.  
  20.         public override void OnClientData(TcpClient client, byte[] buffer, int size) => _onDofusData(Origin.Client, buffer, size, OnClientMessage, Server.GetStream());
  21.         public override void OnServerData(TcpClient server, byte[] buffer, int size) => _onDofusData(Origin.Remote, buffer, size, OnServerMessage, Client.GetStream());
  22.  
  23.         public void SendMessageTo<T>(TcpClient dst, T message, Origin origin)
  24.         {
  25.             try
  26.             {
  27.                 var messageId = MessageMap.GetIdFrom(message);
  28.                 var messageData = new DofusWriter();
  29.                 Serializer.Serialize(message, messageData);
  30.  
  31.                 ++InstanceId;
  32.  
  33.                 dst.GetStream().Write(FrameHelpers.Pack(messageId, messageData.GetData(),origin,
  34.                     origin == Origin.Client ? InstanceId : 0));
  35.  
  36.                 var to = origin == Origin.Client ? Origin.Remote : Origin.Client;
  37.                 Console.WriteLine($"{typeof(T).Name} successfully sent to {to}");
  38.             }
  39.             catch (Exception e)
  40.             {
  41.                 Console.WriteLine(e);
  42.             }
  43.         }
  44.  
  45.         private void _onDofusData(Origin origin, byte[] buffer, int size, Func<int, DofusReader, bool> onMessage, NetworkStream toWrite)
  46.         {
  47.             var frameParser = _createNewFrameParser();
  48.             Console.WriteLine($"{size} bytes received from {origin}, trying to parse frame...");
  49.             try
  50.             {
  51.                 using (var reader = new DofusReader(new MemoryStream(buffer, 0, size)))
  52.                 {
  53.                     while (frameParser.TryParse(reader, origin))
  54.                     {
  55.                         if (frameParser.InstanceId.Value != 0) InstanceId = InstanceId;
  56.                         Console.WriteLine($"Frame successfully parsed ! MessageId : {frameParser.MessageId.Value}, Data length : {frameParser.Length}");
  57.                         using (var dataReader = new DofusReader(new MemoryStream(frameParser.Data)))
  58.                         {
  59.                             var shouldForward = onMessage(frameParser.MessageId.Value, dataReader);
  60.                             if (!shouldForward)
  61.                             {
  62.                                 frameParser = _createNewFrameParser();
  63.                                 continue;
  64.                             }
  65.  
  66.                             toWrite.Write(origin == Origin.Client
  67.                                 ? FrameHelpers.Pack(frameParser.MessageId.Value, frameParser.Data, origin, InstanceId)
  68.                                 : FrameHelpers.Pack(frameParser.MessageId.Value, frameParser.Data));
  69.                         }
  70.                     }
  71.                 }
  72.             }
  73.             catch (Exception e)
  74.             {
  75.                 Console.WriteLine(e);
  76.             }
  77.         }
  78.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement