From 8b2f2271422bd1870a680abc0dd9998397591e15 Mon Sep 17 00:00:00 2001 From: Eugene Timokhov Date: Mon, 7 Nov 2016 02:40:19 +0300 Subject: [PATCH] Added possibility to do ping request (SendPingAsync method) --- README.md | 1 + TLSharp.Core/Network/MtProtoSender.cs | 25 +++++++++++++++-- TLSharp.Core/Requests/PingRequest.cs | 39 +++++++++++++++++++++++++++ TLSharp.Core/TLSharp.Core.csproj | 1 + TLSharp.Core/TelegramClient.cs | 7 ++++- 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 TLSharp.Core/Requests/PingRequest.cs diff --git a/README.md b/README.md index b8e8b11..8cdba23 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ For your convenience TLSharp have wrappers for several Telegram API methods. You 1. SendUploadedDocument 1. GetFile 1. UploadFile +1. SendPingAsync **What if you can't find needed method at the list?** diff --git a/TLSharp.Core/Network/MtProtoSender.cs b/TLSharp.Core/Network/MtProtoSender.cs index 9cb7061..352e527 100644 --- a/TLSharp.Core/Network/MtProtoSender.cs +++ b/TLSharp.Core/Network/MtProtoSender.cs @@ -148,6 +148,19 @@ namespace TLSharp.Core.Network return null; } + public async Task SendPingAsync() + { + var pingRequest = new PingRequest(); + using (var memory = new MemoryStream()) + using (var writer = new BinaryWriter(memory)) + { + pingRequest.SerializeBody(writer); + await Send(memory.ToArray(), pingRequest); + } + + await Receive(pingRequest); + } + private bool processMessage(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { // TODO: check salt @@ -169,7 +182,7 @@ namespace TLSharp.Core.Network return HandlePing(messageId, sequence, messageReader); case 0x347773c5: // pong //logger.debug("MSG pong"); - return HandlePong(messageId, sequence, messageReader); + return HandlePong(messageId, sequence, messageReader, request); case 0xae500895: // future_salts //logger.debug("MSG future_salts"); return HandleFutureSalts(messageId, sequence, messageReader); @@ -455,8 +468,16 @@ namespace TLSharp.Core.Network return true; } - private bool HandlePong(ulong messageId, int sequence, BinaryReader messageReader) + private bool HandlePong(ulong messageId, int sequence, BinaryReader messageReader, TeleSharp.TL.TLMethod request) { + uint code = messageReader.ReadUInt32(); + ulong msgId = messageReader.ReadUInt64(); + + if (msgId == (ulong)request.MessageId) + { + request.ConfirmReceived = true; + } + return false; } diff --git a/TLSharp.Core/Requests/PingRequest.cs b/TLSharp.Core/Requests/PingRequest.cs new file mode 100644 index 0000000..48aa61b --- /dev/null +++ b/TLSharp.Core/Requests/PingRequest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.IO; +using TeleSharp.TL; +using TLSharp.Core.Utils; + +namespace TLSharp.Core.Requests +{ + public class PingRequest : TeleSharp.TL.TLMethod + { + public PingRequest() + { + } + + public override void SerializeBody(BinaryWriter writer) + { + writer.Write(Constructor); + writer.Write(Helpers.GenerateRandomLong()); + } + + public override void DeserializeBody(BinaryReader reader) + { + throw new NotImplementedException(); + } + + public override void deserializeResponse(BinaryReader stream) + { + throw new NotImplementedException(); + } + + public override int Constructor + { + get + { + return 0x7abe77ec; + } + } + } +} diff --git a/TLSharp.Core/TLSharp.Core.csproj b/TLSharp.Core/TLSharp.Core.csproj index 0b8ac8d..fbef942 100644 --- a/TLSharp.Core/TLSharp.Core.csproj +++ b/TLSharp.Core/TLSharp.Core.csproj @@ -63,6 +63,7 @@ + diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index 49a78ae..ea4dd8c 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -174,7 +174,7 @@ namespace TLSharp.Core { await _sender.Send(methodToExecute); await _sender.Receive(methodToExecute); - + var result = methodToExecute.GetType().GetProperty("Response").GetValue(methodToExecute); return (T)result; @@ -292,6 +292,11 @@ namespace TLSharp.Core return result; } + public async Task SendPingAsync() + { + await _sender.SendPingAsync(); + } + private void OnUserAuthenticated(TLUser TLUser) { _session.TLUser = TLUser;