diff --git a/EXAMPLES.md b/EXAMPLES.md
index 69f928e..45b5c7a 100644
--- a/EXAMPLES.md
+++ b/EXAMPLES.md
@@ -228,10 +228,8 @@ var chat = chats.chats[ChatId];
```
After the above code, once you [have obtained](https://github.com/wiz0u/WTelegramClient/blob/master/FAQ.md#access-hash) an `InputUser` or `User`, you can:
```csharp
-// • Directly add the user to a simple Chat:
-await client.Messages_AddChatUser(ChatId, user, int.MaxValue);
-// • Directly add the user to a Channel/group:
-await client.Channels_InviteToChannel((Channel)chat, new[] { user });
+// • Directly add the user to a Chat/Channel/group:
+await client.AddChatUser(chat, user);
// You may get exception USER_PRIVACY_RESTRICTED if the user has denied the right to be added to a chat
// or exception USER_NOT_MUTUAL_CONTACT if the user left the chat previously and you want to add him again
@@ -247,10 +245,8 @@ await client.SendMessageAsync(user, "Join our group with this link: " + invite.l
await client.Messages_EditExportedChatInvite(chat, invite.link, revoked: true);
await client.Messages_DeleteExportedChatInvite(chat, invite.link);
-// • Remove the user from a simple Chat:
-await client.Messages_DeleteChatUser(ChatId, user);
-// • Remove the user from a Channel/group:
-await client.Channels_EditBanned((Channel)chat, user, new ChatBannedRights { flags = ChatBannedRights.Flags.view_messages });
+// • Remove the user from a Chat/Channel/Group:
+await client.DeleteChatUser(ChatId, user);
```
diff --git a/src/Client.cs b/src/Client.cs
index ae9528a..b1c5f50 100644
--- a/src/Client.cs
+++ b/src/Client.cs
@@ -1523,12 +1523,78 @@ namespace WTelegram
}
}
+ public Task AddChatUser(InputPeer peer, InputUserBase user, int fwd_limit = int.MaxValue) => peer switch
+ {
+ InputPeerChat chat => this.Messages_AddChatUser(chat.chat_id, user, fwd_limit),
+ InputPeerChannel channel => this.Channels_InviteToChannel(channel, new[] { user }),
+ _ => throw new ArgumentException("This method works on Chat & Channel only"),
+ };
+
+ public Task DeleteChatUser(InputPeer peer, InputUser user, bool revoke_history = true) => peer switch
+ {
+ InputPeerChat chat => this.Messages_DeleteChatUser(chat.chat_id, user, revoke_history),
+ InputPeerChannel channel => this.Channels_EditBanned(channel, user, new ChatBannedRights { flags = ChatBannedRights.Flags.view_messages }),
+ _ => throw new ArgumentException("This method works on Chat & Channel only"),
+ };
+
+ public Task LeaveChat(InputPeer peer, bool revoke_history = true) => peer switch
+ {
+ InputPeerChat chat => this.Messages_DeleteChatUser(chat.chat_id, InputUser.Self, revoke_history),
+ InputPeerChannel channel => this.Channels_LeaveChannel(channel),
+ _ => throw new ArgumentException("This method works on Chat & Channel only"),
+ };
+
+ public async Task EditChatAdmin(InputPeer peer, InputUserBase user, bool is_admin)
+ {
+ switch (peer)
+ {
+ case InputPeerChat chat:
+ await this.Messages_EditChatAdmin(chat.chat_id, user, is_admin);
+ return new Updates { date = DateTime.UtcNow, users = new(), updates = Array.Empty(),
+ chats = (await this.Messages_GetChats(new[] { chat.chat_id })).chats };
+ case InputPeerChannel channel:
+ return await this.Channels_EditAdmin(channel, user,
+ new ChatAdminRights { flags = is_admin ? (ChatAdminRights.Flags)0x8BF : 0 }, null);
+ default:
+ throw new ArgumentException("This method works on Chat & Channel only");
+ }
+ }
+
+ public Task EditChatPhoto(InputPeer peer, InputChatPhotoBase photo) => peer switch
+ {
+ InputPeerChat chat => this.Messages_EditChatPhoto(chat.chat_id, photo),
+ InputPeerChannel channel => this.Channels_EditPhoto(channel, photo),
+ _ => throw new ArgumentException("This method works on Chat & Channel only"),
+ };
+
+ public Task EditChatTitle(InputPeer peer, string title) => peer switch
+ {
+ InputPeerChat chat => this.Messages_EditChatTitle(chat.chat_id, title),
+ InputPeerChannel channel => this.Channels_EditTitle(channel, title),
+ _ => throw new ArgumentException("This method works on Chat & Channel only"),
+ };
+
public Task GetFullChat(InputPeer peer) => peer switch
{
InputPeerChat chat => this.Messages_GetFullChat(chat.chat_id),
InputPeerChannel channel => this.Channels_GetFullChannel(channel),
_ => throw new ArgumentException("This method works on Chat & Channel only"),
};
+
+ public async Task DeleteChat(InputPeer peer)
+ {
+ switch (peer)
+ {
+ case InputPeerChat chat:
+ await this.Messages_DeleteChat(chat.chat_id);
+ return new Updates { date = DateTime.UtcNow, users = new(), updates = Array.Empty(),
+ chats = (await this.Messages_GetChats(new[] { chat.chat_id })).chats };
+ case InputPeerChannel channel:
+ return await this.Channels_DeleteChannel(channel);
+ default:
+ throw new ArgumentException("This method works on Chat & Channel only");
+ }
+ }
#endregion
}
}
diff --git a/src/Encryption.cs b/src/Encryption.cs
index 284a38f..d115b4f 100644
--- a/src/Encryption.cs
+++ b/src/Encryption.cs
@@ -224,7 +224,7 @@ namespace WTelegram
}
[TLDef(0x7A19CB76)] //RSA_public_key#7a19cb76 n:bytes e:bytes = RSAPublicKey
- public partial class RSAPublicKey : IObject { public byte[] n, e; }
+ public class RSAPublicKey : IObject { public byte[] n, e; }
public static void LoadPublicKey(string pem)
{
diff --git a/src/TL.cs b/src/TL.cs
index 4e177b0..ccc711c 100644
--- a/src/TL.cs
+++ b/src/TL.cs
@@ -370,7 +370,7 @@ namespace TL
// Below TL types are commented "parsed manually" from https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/Resources/tl/mtproto.tl
[TLDef(0xF35C6D01)] //rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult
- public partial class RpcResult : IObject
+ public class RpcResult : IObject
{
public long req_msg_id;
public object result;
@@ -378,7 +378,7 @@ namespace TL
[System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006")]
[TLDef(0x5BB8E511)] //message#5bb8e511 msg_id:long seqno:int bytes:int body:Object = Message
- public partial class _Message
+ public class _Message
{
public long msg_id;
public int seqno;
@@ -387,10 +387,10 @@ namespace TL
}
[TLDef(0x73F1F8DC)] //msg_container#73f1f8dc messages:vector<%Message> = MessageContainer
- public partial class MsgContainer : IObject { public _Message[] messages; }
+ public class MsgContainer : IObject { public _Message[] messages; }
[TLDef(0xE06046B2)] //msg_copy#e06046b2 orig_message:Message = MessageCopy
- public partial class MsgCopy : IObject { public _Message orig_message; }
+ public class MsgCopy : IObject { public _Message orig_message; }
[TLDef(0x3072CFA1)] //gzip_packed#3072cfa1 packed_data:bytes = Object
- public partial class GzipPacked : IObject { public byte[] packed_data; }
+ public class GzipPacked : IObject { public byte[] packed_data; }
}