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); + } } }