From a4a5ae4a2ec803afa3bf80a6508b9d3f924751ad Mon Sep 17 00:00:00 2001 From: Paulo Rogerio Panhoto Date: Thu, 28 Dec 2017 18:15:13 -0200 Subject: [PATCH] First update event attempt. --- TLSharp.Core/Network/MtProtoSender.cs | 69 +++++++++++++++++++-------- TLSharp.Core/TelegramClient.cs | 10 ++++ 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/TLSharp.Core/Network/MtProtoSender.cs b/TLSharp.Core/Network/MtProtoSender.cs index 795e878..9ce0594 100644 --- a/TLSharp.Core/Network/MtProtoSender.cs +++ b/TLSharp.Core/Network/MtProtoSender.cs @@ -21,6 +21,10 @@ namespace TLSharp.Core.Network private TcpTransport _transport; private Session _session; + public delegate void HandleUpdates (TeleSharp.TL.TLAbsUpdates updates); + + public event HandleUpdates UpdatesEvent; + public List needConfirmation = new List(); public MtProtoSender(TcpTransport transport, Session session) @@ -141,7 +145,7 @@ namespace TLSharp.Core.Network using (var messageStream = new MemoryStream(result.Item1, false)) using (var messageReader = new BinaryReader(messageStream)) { - processMessage(result.Item2, result.Item3, messageReader, request); + await processMessage(result.Item2, result.Item3, messageReader, request); } } @@ -161,7 +165,7 @@ namespace TLSharp.Core.Network await Receive(pingRequest); } - private bool processMessage(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) + private async Task processMessage(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { // TODO: check salt // TODO: check sessionid @@ -176,7 +180,7 @@ namespace TLSharp.Core.Network { case 0x73f1f8dc: // container //logger.debug("MSG container"); - return HandleContainer(messageId, sequence, messageReader, request); + return await HandleContainer(messageId, sequence, messageReader, request); case 0x7abe77ec: // ping //logger.debug("MSG ping"); return HandlePing(messageId, sequence, messageReader); @@ -206,46 +210,71 @@ namespace TLSharp.Core.Network return HandleRpcResult(messageId, sequence, messageReader, request); case 0x3072cfa1: // gzip_packed //logger.debug("MSG gzip_packed"); - return HandleGzipPacked(messageId, sequence, messageReader, request); + return await HandleGzipPacked(messageId, sequence, messageReader, request); case 0xe317af7e: case 0xd3f45784: case 0x2b2fbd4e: case 0x78d4dec1: case 0x725b04c3: case 0x74ae4240: - return HandleUpdate(messageId, sequence, messageReader); + return await HandleUpdate(messageId, sequence, messageReader, request); default: //logger.debug("unknown message: {0}", code); return false; } } - private bool HandleUpdate(ulong messageId, int sequence, BinaryReader messageReader) + private async Task HandleUpdate(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { - return false; - - /* try { - UpdatesEvent(TL.Parse(messageReader)); - return true; + var update = ParseUpdate (messageId, messageReader); + if (update != null && UpdatesEvent != null) + UpdatesEvent(update); + await Receive (request); } - catch (Exception e) + catch { - logger.warning("update processing exception: {0}", e); - return false; } - */ + return false; } - private bool HandleGzipPacked(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) + private TeleSharp.TL.TLAbsUpdates ParseUpdate(ulong messageId, BinaryReader messageReader) + { + switch (messageId) + { + case 0xe317af7e: + return DecodeUpdate(messageReader); + case 0xd3f45784: + return DecodeUpdate (messageReader); + case 0x2b2fbd4e: + return DecodeUpdate (messageReader); + case 0x78d4dec1: + return DecodeUpdate (messageReader); + case 0x725b04c3: + return DecodeUpdate (messageReader); + case 0x74ae4240: + return DecodeUpdate (messageReader); + default: + return null; + } + } + + private TeleSharp.TL.TLAbsUpdates DecodeUpdate(BinaryReader messageReader) where T: TeleSharp.TL.TLAbsUpdates, new() + { + var update = new T (); + update.DeserializeBody (messageReader); + return update; + } + + private async Task HandleGzipPacked(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { uint code = messageReader.ReadUInt32(); byte[] packedData = GZipStream.UncompressBuffer(Serializers.Bytes.read(messageReader)); using (MemoryStream packedStream = new MemoryStream(packedData, false)) using (BinaryReader compressedReader = new BinaryReader(packedStream)) { - processMessage(messageId, sequence, compressedReader, request); + await processMessage(messageId, sequence, compressedReader, request); } return true; @@ -496,7 +525,7 @@ namespace TLSharp.Core.Network return false; } - private bool HandleContainer(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) + private async Task HandleContainer(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { uint code = messageReader.ReadUInt32(); int size = messageReader.ReadInt32(); @@ -508,12 +537,12 @@ namespace TLSharp.Core.Network long beginPosition = messageReader.BaseStream.Position; try { - if (!processMessage(innerMessageId, sequence, messageReader, request)) + if (!await processMessage(innerMessageId, sequence, messageReader, request)) { messageReader.BaseStream.Position = beginPosition + innerLength; } } - catch (Exception e) + catch (Exception) { // logger.error("failed to process message in contailer: {0}", e); messageReader.BaseStream.Position = beginPosition + innerLength; diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index eae8b59..86e248c 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -30,6 +30,10 @@ namespace TLSharp.Core private List dcOptions; private TcpClientConnectionHandler _handler; + public delegate void UpdatesEvent (TelegramClient source, TLAbsUpdates updates); + + public event UpdatesEvent Updates; + public Session Session { get { return _session; } } public TelegramClient(int apiId, string apiHash, @@ -59,6 +63,7 @@ namespace TLSharp.Core } _sender = new MtProtoSender(_transport, _session); + _sender.UpdatesEvent += _sender_UpdatesEvent; //set-up layer var config = new TLRequestGetConfig(); @@ -108,6 +113,11 @@ namespace TLSharp.Core } } + private void _sender_UpdatesEvent (TLAbsUpdates updates) + { + Updates (this, updates); + } + private async Task RequestWithDcMigration(TLMethod request) { var completed = false;