diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index a6d2f51..e11fb0c 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -239,6 +239,24 @@ namespace TLSharp.Core await _sender.Recieve(request); return request.messages; + } + + public async Task> GetFile(long volume_id, int local_id, long secret, int offset, int limit) + { + var request = new GetFileRequest(new InputFileLocationConstructor(volume_id, local_id, secret), offset, limit); + await _sender.Send(request); + await _sender.Recieve(request); + + return Tuple.Create(request.type, request.bytes); + } + + public async Task> GetDialogs(int offset, int limit, int max_id = -1) + { + var request = new GetDialogsRequest(offset, max_id, limit); + await _sender.Send(request); + await _sender.Recieve(request); + + return request.dialogs; } private bool validateNumber(string number) diff --git a/TLSharp.Tests/TLSharpTests.cs b/TLSharp.Tests/TLSharpTests.cs index fe09cb9..83394a3 100644 --- a/TLSharp.Tests/TLSharpTests.cs +++ b/TLSharp.Tests/TLSharpTests.cs @@ -165,7 +165,6 @@ namespace TLSharp.Tests var res = await client.ImportContactByPhoneNumber(NumberToSendMessage); Assert.IsNotNull(res); - const string testFile = "TEST"; var file = File.ReadAllBytes("../../data/cat.jpg"); @@ -178,6 +177,55 @@ namespace TLSharp.Tests Assert.IsTrue(state); } + [TestMethod] + public async Task GetFile() + { + // Get uploaded file from last message (ie: cat.jpg) + + var store = new FileSessionStore(); + var client = new TelegramClient(store, "session", apiId, apiHash); + await client.Connect(); + Assert.IsTrue(client.IsUserAuthorized()); + + var res = await client.ImportContactByPhoneNumber(NumberToSendMessage); + Assert.IsNotNull(res); + + // Get last message + var hist = await client.GetMessagesHistoryForContact(res.Value, 0, 1); + Assert.AreEqual(1, hist.Count); + + var message = (MessageConstructor) hist[0]; + Assert.AreEqual(typeof(MessageMediaPhotoConstructor), message.media.GetType()); + + var media = (MessageMediaPhotoConstructor) message.media; + Assert.AreEqual(typeof(PhotoConstructor), media.photo.GetType()); + + var photo = (PhotoConstructor) media.photo; + Assert.AreEqual(3, photo.sizes.Count); + Assert.AreEqual(typeof(PhotoSizeConstructor), photo.sizes[2].GetType()); + + var photoSize = (PhotoSizeConstructor) photo.sizes[2]; + Assert.AreEqual(typeof(FileLocationConstructor), photoSize.location.GetType()); + + var fileLocation = (FileLocationConstructor) photoSize.location; + var file = await client.GetFile(fileLocation.volume_id, fileLocation.local_id, fileLocation.secret, 0, photoSize.size + 1024); + storage_FileType type = file.Item1; + byte[] bytes = file.Item2; + + string name = "../../data/get_file."; + if (type.GetType() == typeof(Storage_fileJpegConstructor)) + name += "jpg"; + else if (type.GetType() == typeof(Storage_fileGifConstructor)) + name += "gif"; + else if (type.GetType() == typeof(Storage_filePngConstructor)) + name += "png"; + + using (var fileStream = new FileStream(name, FileMode.Create, FileAccess.Write)) + { + fileStream.Write(bytes, 4, photoSize.size); // The first 4 bytes seem to be the error code + } + } + [TestMethod] public async Task TestConnection() {