diff --git a/EXAMPLES.md b/EXAMPLES.md index 01af4f1..6a0ce0e 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -15,15 +15,18 @@ Remember that these are just simple example codes that you should adjust to your ```csharp using var client = new WTelegram.Client(Environment.GetEnvironmentVariable); await client.LoginUserIfNeeded(); -var resolved = await client.Contacts_ResolveUsername("USERNAME"); -await client.SendMessageAsync(resolved.users[resolved.peer.ID], "Hello!"); +var resolved = await client.Contacts_ResolveUsername("username"); +await client.SendMessageAsync(resolved, "Hello!"); ``` +*Note: This also works if the @username points to a chat, but you must join the chat before posting there. +You can check `resolved` properties to ensure it's a user or a chat. If the username is invalid/unused, the API call raises an exception.* ### Send a message to someone by phone number ```csharp using var client = new WTelegram.Client(Environment.GetEnvironmentVariable); await client.LoginUserIfNeeded(); var contacts = await client.Contacts_ImportContacts(new[] { new InputPhoneContact { phone = "+PHONENUMBER" } }); -await client.SendMessageAsync(contacts.users[contacts.imported[0].user_id], "Hello!"); +if (contacts.imported.Length > 0) + await client.SendMessageAsync(contacts.users[contacts.imported[0].user_id], "Hello!"); ``` *Note: To prevent spam, Telegram may restrict your ability to add new phone numbers.* @@ -95,7 +98,7 @@ For a simple Chat: (see Terminology in [ReadMe](README.md#Terminology-in-Telegra using var client = new WTelegram.Client(Environment.GetEnvironmentVariable); await client.LoginUserIfNeeded(); var chatFull = await client.Messages_GetFullChat(1234567890); // the chat we want -foreach (var user in chatFull.users) +foreach (var (id, user) in chatFull.users) Console.WriteLine(user); ``` @@ -108,7 +111,7 @@ var channel = (Channel)chats.chats[1234567890]; // the channel we want for (int offset = 0; ;) { var participants = await client.Channels_GetParticipants(channel, null, offset, 1000, 0); - foreach (var user in participants.users) + foreach (var (id, user) in participants.users) Console.WriteLine(user); offset += participants.participants.Length; if (offset >= participants.count) break; diff --git a/src/Helpers.TL.cs b/src/Helpers.TL.cs index f743660..d88ca10 100644 --- a/src/Helpers.TL.cs +++ b/src/Helpers.TL.cs @@ -99,6 +99,55 @@ namespace TL protected override InputUserBase ToInputUser() => new InputUser { user_id = id, access_hash = access_hash }; } + partial class Peer { public abstract long ID { get; } } + partial class PeerUser { public override long ID => user_id; public override string ToString() => "user " + user_id; } + partial class PeerChat { public override long ID => chat_id; public override string ToString() => "chat " + chat_id; } + partial class PeerChannel { public override long ID => channel_id; public override string ToString() => "channel " + channel_id; } + + partial class Contacts_ResolvedPeer + { + public static implicit operator InputPeer(Contacts_ResolvedPeer resolved) => resolved.UserOrChat.ToInputPeer(); + public UserBase User => peer is PeerUser pu ? users[pu.user_id] : null; + public ChatBase Chat => peer is PeerChat or PeerChannel ? chats[peer.ID] : null; + public IPeerInfo UserOrChat => peer switch + { + PeerUser pu => users[pu.user_id], + PeerChat pc => chats[pc.chat_id], + PeerChannel pch => chats[pch.channel_id], + _ => null + }; + } + + partial class DialogBase + { + public abstract Peer Peer { get; } + public abstract int TopMessage { get; } + } + partial class Dialog + { + public override Peer Peer => peer; + public override int TopMessage => top_message; + } + partial class DialogFolder + { + public override Peer Peer => peer; + public override int TopMessage => top_message; + } + + partial class Messages_Dialogs + { + /// Find the matching User/Chat object for a dialog + /// The dialog which peer we want details on + /// a UserBase or ChatBase derived instance + public IPeerInfo GetUserOrChat(DialogBase dialog) => dialog.Peer switch + { + PeerUser pu => users[pu.user_id], + PeerChat pc => chats[pc.chat_id], + PeerChannel pch => chats[pch.channel_id], + _ => null, + }; + } + partial class MessageBase { public abstract int ID { get; } @@ -263,41 +312,6 @@ namespace TL public static implicit operator InputStickerSetID(StickerSet stickerSet) => new() { id = stickerSet.id, access_hash = stickerSet.access_hash }; } - partial class Peer { public abstract long ID { get; } } - partial class PeerUser { public override long ID => user_id; public override string ToString() => "user " + user_id; } - partial class PeerChat { public override long ID => chat_id; public override string ToString() => "chat " + chat_id; } - partial class PeerChannel { public override long ID => channel_id; public override string ToString() => "channel " + channel_id; } - - partial class DialogBase - { - public abstract Peer Peer { get; } - public abstract int TopMessage { get; } - } - partial class Dialog - { - public override Peer Peer => peer; - public override int TopMessage => top_message; - } - partial class DialogFolder - { - public override Peer Peer => peer; - public override int TopMessage => top_message; - } - - partial class Messages_Dialogs - { - /// Find the matching User/Chat object for a dialog - /// The dialog which peer we want details on - /// a UserBase or ChatBase derived instance - public IPeerInfo GetUserOrChat(DialogBase dialog) => dialog.Peer switch - { - PeerUser pu => users[pu.user_id], - PeerChat pc => chats[pc.chat_id], - PeerChannel pch => chats[pch.channel_id], - _ => null, - }; - } - partial class JsonObjectValue { public override string ToString() => $"{HttpUtility.JavaScriptStringEncode(key, true)}:{value}"; } partial class JsonNull { public override string ToString() => "null"; } partial class JsonBool { public override string ToString() => value ? "true" : "false"; }