From 98f014a49d5a4490b06e409d26573de914ca812e Mon Sep 17 00:00:00 2001 From: steavy29 Date: Thu, 8 Sep 2016 14:35:25 +0300 Subject: [PATCH 1/2] Implemented CreateChat. Fixed MessageServiceConstructor - migrated it from api layer level 16 to 23. --- TLSharp.Core/MTProto/TL.cs | 38 ++++++++++++------------------ TLSharp.Core/TelegramClient.cs | 28 +++++++++++++++++++++++ TLSharp.Tests/TLSharpTests.cs | 42 ++++++++++++++++++++++++++++------ 3 files changed, 77 insertions(+), 31 deletions(-) diff --git a/TLSharp.Core/MTProto/TL.cs b/TLSharp.Core/MTProto/TL.cs index 6e98dd7..70bca44 100644 --- a/TLSharp.Core/MTProto/TL.cs +++ b/TLSharp.Core/MTProto/TL.cs @@ -351,7 +351,7 @@ namespace TLSharp.Core.MTProto {0x83e5de54, typeof (MessageEmptyConstructor)}, {0x567699B3, typeof (MessageConstructor)}, {0xa367e716, typeof (MessageForwardedConstructor)}, - {0x9f8d60bb, typeof (MessageServiceConstructor)}, + {0x1d86f70e, typeof (MessageServiceConstructor)}, {0x3ded6320, typeof (MessageMediaEmptyConstructor)}, {0xc8c45a2a, typeof (MessageMediaPhotoConstructor)}, {0xa2d24290, typeof (MessageMediaVideoConstructor)}, @@ -967,10 +967,9 @@ namespace TLSharp.Core.MTProto media); } - public static Message messageService(int id, int from_id, Peer to_id, bool output, bool unread, int date, - MessageAction action) + public static Message messageService(int flags, int id, int from_id, Peer to_id, int date, MessageAction action) { - return new MessageServiceConstructor(id, from_id, to_id, output, unread, date, action); + return new MessageServiceConstructor(flags, id, from_id, to_id, date, action); } public static MessageMedia messageMediaEmpty() @@ -5394,34 +5393,27 @@ namespace TLSharp.Core.MTProto } - public class MessageServiceConstructor : Message + public class MessageServiceConstructor : Message // messageService#1d86f70e flags:int id:int from_id:int to_id:Peer date:int action:MessageAction = Message; { + public int flags; public int id; public int from_id; public Peer to_id; - public bool output; - public bool unread; public int date; public MessageAction action; - public MessageServiceConstructor() - { + public MessageServiceConstructor() { } - } - - public MessageServiceConstructor(int id, int from_id, Peer to_id, bool output, bool unread, int date, - MessageAction action) + public MessageServiceConstructor(int flags, int id, int from_id, Peer to_id, int date, MessageAction action) { + this.flags = flags; this.id = id; this.from_id = from_id; this.to_id = to_id; - this.output = output; - this.unread = unread; this.date = date; this.action = action; } - public override Constructor Constructor { get { return Constructor.messageService; } @@ -5429,31 +5421,29 @@ namespace TLSharp.Core.MTProto public override void Write(BinaryWriter writer) { - writer.Write(0x9f8d60bb); + writer.Write(0x1d86f70e); + writer.Write(this.flags); writer.Write(this.id); writer.Write(this.from_id); this.to_id.Write(writer); - writer.Write(this.output ? 0x997275b5 : 0xbc799737); - writer.Write(this.unread ? 0x997275b5 : 0xbc799737); writer.Write(this.date); this.action.Write(writer); } public override void Read(BinaryReader reader) { + this.flags = reader.ReadInt32(); this.id = reader.ReadInt32(); this.from_id = reader.ReadInt32(); this.to_id = TL.Parse(reader); - this.output = reader.ReadUInt32() == 0x997275b5; - this.unread = reader.ReadUInt32() == 0x997275b5; this.date = reader.ReadInt32(); this.action = TL.Parse(reader); } public override string ToString() { - return String.Format("(messageService id:{0} from_id:{1} to_id:{2} out:{3} unread:{4} date:{5} action:{6})", id, - from_id, to_id, output, unread, date, action); + return String.Format("(messageService flags:{0} id:{1} from_id:{2} to_id:{3} date:{4} action:{5})", + flags, id, from_id, to_id, date, action); } } @@ -7146,7 +7136,7 @@ namespace TLSharp.Core.MTProto } public override void Read(BinaryReader reader) - { + { if (reader.ReadUInt32() == 0x7007b451) { this.user = new UserSelfConstructor(); diff --git a/TLSharp.Core/TelegramClient.cs b/TLSharp.Core/TelegramClient.cs index 8c71f32..fab29ed 100644 --- a/TLSharp.Core/TelegramClient.cs +++ b/TLSharp.Core/TelegramClient.cs @@ -294,5 +294,33 @@ namespace TLSharp.Core }; } + public async Task CreateChat(string title, List userPhonesToInvite) + { + var userIdsToInvite = new List(); + foreach (var userPhone in userPhonesToInvite) + { + var uid = await ImportContactByPhoneNumber(userPhone); + if (!uid.HasValue) + throw new InvalidOperationException($"Failed to retrieve contact {userPhone}"); + + userIdsToInvite.Add(uid.Value); + } + + return await CreateChat(title, userIdsToInvite); + } + + public async Task CreateChat(string title, List userIdsToInvite) + { + var request = new CreateChatRequest(userIdsToInvite.Select(uid => new InputUserContactConstructor(uid)).ToList(), title); + + await _sender.Send(request); + await _sender.Receive(request); + + var serviceMessage = request.message.message as MessageServiceConstructor; + var peerChat = serviceMessage.to_id as PeerChatConstructor; + + var createdChatId = peerChat.chat_id; + return request.message.chats.OfType().Single(c => c.id == createdChatId); + } } } diff --git a/TLSharp.Tests/TLSharpTests.cs b/TLSharp.Tests/TLSharpTests.cs index 50fb819..edb7e8d 100644 --- a/TLSharp.Tests/TLSharpTests.cs +++ b/TLSharp.Tests/TLSharpTests.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Configuration; +using System.Diagnostics; using System.IO; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -201,17 +203,17 @@ namespace TLSharp.Tests Assert.AreEqual(1, hist.Count); var message = (MessageConstructor) hist[0]; - Assert.AreEqual(typeof(MessageMediaPhotoConstructor), message.media.GetType()); + Assert.AreEqual(typeof (MessageMediaPhotoConstructor), message.media.GetType()); var media = (MessageMediaPhotoConstructor) message.media; - Assert.AreEqual(typeof(PhotoConstructor), media.photo.GetType()); + 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()); + Assert.AreEqual(typeof (PhotoSizeConstructor), photo.sizes[2].GetType()); var photoSize = (PhotoSizeConstructor) photo.sizes[2]; - Assert.AreEqual(typeof(FileLocationConstructor), photoSize.location.GetType()); + 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); @@ -219,11 +221,11 @@ namespace TLSharp.Tests byte[] bytes = file.Item2; string name = "../../data/get_file."; - if (type.GetType() == typeof(Storage_fileJpegConstructor)) + if (type.GetType() == typeof (Storage_fileJpegConstructor)) name += "jpg"; - else if (type.GetType() == typeof(Storage_fileGifConstructor)) + else if (type.GetType() == typeof (Storage_fileGifConstructor)) name += "gif"; - else if (type.GetType() == typeof(Storage_filePngConstructor)) + else if (type.GetType() == typeof (Storage_filePngConstructor)) name += "png"; using (var fileStream = new FileStream(name, FileMode.Create, FileAccess.Write)) @@ -269,5 +271,31 @@ namespace TLSharp.Tests Assert.IsNotNull(userFull); } + + [TestMethod] + public async Task CreateChatRequest() + { + var store = new FileSessionStore(); + var client = new TelegramClient(store, "session", apiId, apiHash); + await client.Connect(); + + if (!client.IsUserAuthorized()) + { + var hash = await client.SendCodeRequest(NumberToAuthenticate); + + var code = ""; // you can change code in debugger + Debugger.Break(); + + await client.MakeAuth(NumberToAuthenticate, hash, code); + } + + Assert.IsTrue(client.IsUserAuthorized()); + + var chatName = Guid.NewGuid().ToString(); + var chat = await client.CreateChat(chatName, new List {NumberToSendMessage}); + + Assert.AreEqual(chatName, chat.title); + Assert.AreEqual(2, chat.participants_count); + } } } From ccf200840412f0ec6aa7f7505d52a79ea7011234 Mon Sep 17 00:00:00 2001 From: steavy29 Date: Fri, 9 Sep 2016 19:56:47 +0300 Subject: [PATCH 2/2] Added implementation of AddChatUser/DeleteChatUser/LeaveChat --- README.md | 64 ++++++++++++++++++++++++++++++- TLSharp.Core/TLSharp.Core.csproj | 4 +- TLSharp.Core/TelegramClient.cs | 33 +++++++++++++--- TLSharp.Tests/TLSharpTests.cs | 65 +++++++++++++++++++++++++++++--- 4 files changed, 151 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 4be845f..bb898b6 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,12 @@ Currently supported methods: - [Get Contact by Username](#get-contact-by-username) - [Send Message to Contact](#send-message-to-contact) - [Send Media to Contact](#send-media-to-contact) - - [Get Messages History for a Contact](#get-messages-history) + - [Get Messages History](#get-messages-history) + - [Get UserFull](#get-userfull) + - [Create Chat](#create-chat) + - [Add Chat user](#add-chat-user) + - [Delete Chat user](#delete-chat-user) + - [Leave Chat](#leave-chat) ####IsPhoneRegistered Check if phone number registered to Telegram. @@ -179,7 +184,7 @@ var hist = await client.GetMessagesHistoryForContact(userId, offset, limit); **Returns**: **List\**, message history -####Get UserFull Request +####Get UserFull Returns user's full information for specified userId. _Example_: @@ -192,6 +197,61 @@ var userFull = await client.GetUserFull(userId); **Returns**: **UserFull**, User's information +####Create Chat +Creates a new chat. + +_Example_: + +``` +var statedMessage = await client.CreateChat(title, new List { userId1, userId2 }); +``` + +* title - **string**, chat name +* userIdsToInvite - **List**, list of userIds to invite to chat. Current user will be automatically added to this chat. + +**Returns**: **Messages_statedMessageConstructor**, Message that contains information about created chat. + +####Add Chat user +Adds a user to a chat and sends a service message on it. + +_Example_: + +``` +var statedMessage = await client.AddChatUser(chatId, userId); +``` + +* chatId - **int**, Chat ID +* userId - **int**, User ID to be added + +**Returns**: **Messages_statedMessageConstructor**, Message that contains information about modified chat. + +####Delete Chat user +Deletes a user from a chat and sends a service message on it. + +_Example_: + +``` +var statedMessage = await client.DeleteChatUser(chatId, userId); +``` + +* chatId - **int**, Chat ID +* userId - **int**, User ID to be deleted + +**Returns**: **Messages_statedMessageConstructor**, Message that contains information about modified chat. + +####Leave Chat +Leaves the chat by deleting currently authenticated user from it. + +_Example_: + +``` +var statedMessage = await client.LeaveChat(chatId); +``` + +* chatId - **int**, Chat ID + +**Returns**: **Messages_statedMessageConstructor**, Message that contains information about modified chat. + ## Contributing Contributing is highly appreciated! diff --git a/TLSharp.Core/TLSharp.Core.csproj b/TLSharp.Core/TLSharp.Core.csproj index 66a2d8f..f52c911 100644 --- a/TLSharp.Core/TLSharp.Core.csproj +++ b/TLSharp.Core/TLSharp.Core.csproj @@ -90,8 +90,8 @@ - - + +