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"; }