From 7e18b68d72ed5017067adda90d8917f1a53f8278 Mon Sep 17 00:00:00 2001 From: ra0o0f Date: Sun, 17 Jan 2016 12:46:44 +0330 Subject: [PATCH] UploadFile and SendMediaMessage --- .../Requests/Message_SendMediaRequest.cs | 53 +++++++++++++++++ .../Requests/Upload_SaveFilePartRequest.cs | 53 +++++++++++++++++ TLSharp.Core/TLSharp.Core.csproj | 2 + TLSharp.Core/TelegramClient.cs | 58 +++++++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 TLSharp.Core/Requests/Message_SendMediaRequest.cs create mode 100644 TLSharp.Core/Requests/Upload_SaveFilePartRequest.cs diff --git a/TLSharp.Core/Requests/Message_SendMediaRequest.cs b/TLSharp.Core/Requests/Message_SendMediaRequest.cs new file mode 100644 index 0000000..e3b7bad --- /dev/null +++ b/TLSharp.Core/Requests/Message_SendMediaRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TLSharp.Core.MTProto; +using TLSharp.Core.Utils; + +namespace TLSharp.Core.Requests +{ + //messages.sendMedia#a3c85d76 peer:InputPeer media:InputMedia random_id:long = messages.StatedMessage; + public class Message_SendMediaRequest : MTProtoRequest + { + InputPeer inputPeer; + InputMedia inputMedia; + + public messages_StatedMessage StatedMessage { get; set; } + + public Message_SendMediaRequest(InputPeer inputPeer, InputMedia inputMedia) + { + this.inputPeer = inputPeer; + this.inputMedia = inputMedia; + } + + public override void OnSend(BinaryWriter writer) + { + writer.Write(0xa3c85d76); + inputPeer.Write(writer); + inputMedia.Write(writer); + long random_id = Helpers.GenerateRandomLong(); + writer.Write(random_id); + } + + public override void OnResponse(BinaryReader reader) + { + var code = reader.ReadUInt32(); + + if (code != 0xd07ae726 && code != 0xa9af2881) + throw new InvalidOperationException($"Expected Tl messages_StatedMessage type"); + + StatedMessage = TL.Parse(reader); + } + + public override void OnException(Exception exception) + { + throw new NotImplementedException(); + } + + public override bool Confirmed => true; + public override bool Responded { get; } + } +} diff --git a/TLSharp.Core/Requests/Upload_SaveFilePartRequest.cs b/TLSharp.Core/Requests/Upload_SaveFilePartRequest.cs new file mode 100644 index 0000000..9060006 --- /dev/null +++ b/TLSharp.Core/Requests/Upload_SaveFilePartRequest.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TLSharp.Core.MTProto; + +namespace TLSharp.Core.Requests +{ + //upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool; + public class Upload_SaveFilePartRequest : MTProtoRequest + { + long file_id; + int file_part; + byte[] bytes; + + public bool Done { get; set; } + + public Upload_SaveFilePartRequest(long file_id, int file_part, byte[] bytes) + { + this.file_id = file_id; + this.file_part = file_part; + this.bytes = bytes; + } + + public override void OnResponse(BinaryReader reader) + { + var code = reader.ReadUInt32(); + + if (code != 0xbc799737 && code != 0x997275b5) + throw new InvalidOperationException($"Expected Tl Bool type"); + + Done = code == 0x997275b5 ? true : false; + } + + public override void OnSend(BinaryWriter writer) + { + writer.Write(0xb304a621); + writer.Write(file_id); + writer.Write(file_part); + Serializers.Bytes.write(writer, bytes); + } + + public override void OnException(Exception exception) + { + throw new NotImplementedException(); + } + + public override bool Confirmed => true; + public override bool Responded { get; } + } +} diff --git a/TLSharp.Core/TLSharp.Core.csproj b/TLSharp.Core/TLSharp.Core.csproj index fd4c3db..2ccc605 100644 --- a/TLSharp.Core/TLSharp.Core.csproj +++ b/TLSharp.Core/TLSharp.Core.csproj @@ -76,6 +76,8 @@ + + diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index add4c2b..44e1252 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using System.Threading.Tasks; using TLSharp.Core.Auth; using TLSharp.Core.MTProto; @@ -96,6 +97,63 @@ namespace TLSharp.Core return request.user; } + + + public async Task UploadFile(string name, byte[] data) + { + var partSize = 65536; + + var file_id = DateTime.Now.Ticks; + + var partedData = new Dictionary(); + var parts = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(data.Length) / Convert.ToDouble(partSize))); + var remainBytes = data.Length; + for (int i = 0; i < parts; i++) + { + partedData.Add(i, data + .Skip(i * partSize) + .Take(remainBytes < partSize ? remainBytes : partSize) + .ToArray()); + + remainBytes -= partSize; + } + + for(int i =0;i SendMediaMessage(InputPeer inputPeer, InputMedia inputMedia) + { + var request = new Message_SendMediaRequest(inputPeer, inputMedia); + await _sender.Send(request); + await _sender.Recieve(request); + + return request.StatedMessage; + } + public async Task ImportContact(string phoneNumber) { var request = new ImportContactRequest(new InputPhoneContactConstructor(0, phoneNumber, "My Test Name", string.Empty));