API Layer 151: media spoiler flag, personal profile photo, UpdateUser...

This commit is contained in:
Wizou 2022-12-29 22:33:28 +01:00
parent 7fa4051e99
commit 8098f36932
6 changed files with 129 additions and 47 deletions

View file

@ -51,7 +51,7 @@ namespace WTelegramClientTest
case UpdateChatParticipants { participants: ChatParticipants cp }: Console.WriteLine($"{cp.participants.Length} participants in {Chat(cp.chat_id)}"); break;
case UpdateUserStatus uus: Console.WriteLine($"{User(uus.user_id)} is now {uus.status.GetType().Name[10..]}"); break;
case UpdateUserName uun: Console.WriteLine($"{User(uun.user_id)} has changed profile name: {uun.first_name} {uun.last_name}"); break;
case UpdateUserPhoto uup: Console.WriteLine($"{User(uup.user_id)} has changed profile photo"); break;
case UpdateUser uu: Console.WriteLine($"{User(uu.user_id)} has changed infos/photo"); break;
default: Console.WriteLine(update.GetType().Name); break; // there are much more update types than the above example cases
}
}

View file

@ -1,4 +1,4 @@
[![API Layer](https://img.shields.io/badge/API_Layer-150-blueviolet)](https://corefork.telegram.org/methods)
[![API Layer](https://img.shields.io/badge/API_Layer-151-blueviolet)](https://corefork.telegram.org/methods)
[![NuGet version](https://img.shields.io/nuget/v/WTelegramClient?color=00508F)](https://www.nuget.org/packages/WTelegramClient/)
[![Build Status](https://img.shields.io/azure-devops/build/wiz0u/WTelegramClient/7)](https://dev.azure.com/wiz0u/WTelegramClient/_build?definitionId=7)
[![Donate](https://img.shields.io/badge/Help_this_project:-Donate-ff4444)](http://t.me/WTelegramBot?start=donate)

View file

@ -199,6 +199,7 @@ namespace TL
has_stickers = 0x1,
/// <summary>Field <see cref="ttl_seconds"/> has a value</summary>
has_ttl_seconds = 0x2,
spoiler = 0x4,
}
}
/// <summary>Forwarded photo <para>See <a href="https://corefork.telegram.org/constructor/inputMediaPhoto"/></para></summary>
@ -216,6 +217,7 @@ namespace TL
{
/// <summary>Field <see cref="ttl_seconds"/> has a value</summary>
has_ttl_seconds = 0x1,
spoiler = 0x2,
}
}
/// <summary>Map. <para>See <a href="https://corefork.telegram.org/constructor/inputMediaGeoPoint"/></para></summary>
@ -269,6 +271,7 @@ namespace TL
nosound_video = 0x8,
/// <summary>Force the media file to be uploaded as document</summary>
force_file = 0x10,
spoiler = 0x20,
}
}
/// <summary>Forwarded document <para>See <a href="https://corefork.telegram.org/constructor/inputMediaDocument"/></para></summary>
@ -290,6 +293,7 @@ namespace TL
has_ttl_seconds = 0x1,
/// <summary>Field <see cref="query"/> has a value</summary>
has_query = 0x2,
spoiler = 0x4,
}
}
/// <summary>Can be used to send a venue geolocation. <para>See <a href="https://corefork.telegram.org/constructor/inputMediaVenue"/></para></summary>
@ -324,6 +328,7 @@ namespace TL
{
/// <summary>Field <see cref="ttl_seconds"/> has a value</summary>
has_ttl_seconds = 0x1,
spoiler = 0x2,
}
}
/// <summary>Document that will be downloaded by the telegram servers <para>See <a href="https://corefork.telegram.org/constructor/inputMediaDocumentExternal"/></para></summary>
@ -341,6 +346,7 @@ namespace TL
{
/// <summary>Field <see cref="ttl_seconds"/> has a value</summary>
has_ttl_seconds = 0x1,
spoiler = 0x2,
}
}
/// <summary>A game <para>See <a href="https://corefork.telegram.org/constructor/inputMediaGame"/></para></summary>
@ -819,6 +825,7 @@ namespace TL
has_video = 0x1,
/// <summary>Field <see cref="stripped_thumb"/> has a value</summary>
has_stripped_thumb = 0x2,
personal = 0x4,
}
}
@ -1345,6 +1352,7 @@ namespace TL
/// <summary>Can we delete this channel?</summary>
can_delete_channel = 0x1,
antispam = 0x2,
participants_hidden = 0x4,
}
/// <summary>ID of the channel</summary>
@ -1708,6 +1716,7 @@ namespace TL
has_photo = 0x1,
/// <summary>Field <see cref="ttl_seconds"/> has a value</summary>
has_ttl_seconds = 0x4,
spoiler = 0x8,
}
}
/// <summary>Attached map. <para>See <a href="https://corefork.telegram.org/constructor/messageMediaGeo"/></para></summary>
@ -1754,6 +1763,7 @@ namespace TL
has_ttl_seconds = 0x4,
/// <summary>Whether this is a normal sticker, if not set this is a premium sticker and a premium sticker animation must be played.</summary>
nopremium = 0x8,
spoiler = 0x10,
}
}
/// <summary>Preview of webpage <para>See <a href="https://corefork.telegram.org/constructor/messageMediaWebPage"/></para></summary>
@ -2194,6 +2204,15 @@ namespace TL
has_hidden = 0x8,
}
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/messageActionSuggestProfilePhoto"/></para></summary>
[TLDef(0x57DE635E)]
public class MessageActionSuggestProfilePhoto : MessageAction
{
public PhotoBase photo;
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/messageActionAttachMenuBotAllowed"/></para></summary>
[TLDef(0xE7E75F97)]
public class MessageActionAttachMenuBotAllowed : MessageAction { }
/// <summary>Chat info. <para>See <a href="https://corefork.telegram.org/type/Dialog"/></para> <para>Derived classes: <see cref="Dialog"/>, <see cref="DialogFolder"/></para></summary>
public abstract class DialogBase : IObject
@ -2738,7 +2757,7 @@ namespace TL
}
/// <summary>Extended user info <para>See <a href="https://corefork.telegram.org/constructor/userFull"/></para></summary>
[TLDef(0xC4B1FC3F)]
[TLDef(0xF8D32AED)]
public class UserFull : IObject
{
/// <summary>Flags, see <a href="https://corefork.telegram.org/mtproto/TL-combinators#conditional-fields">TL conditional fields</a></summary>
@ -2749,8 +2768,10 @@ namespace TL
[IfFlag(1)] public string about;
/// <summary>Peer settings</summary>
public PeerSettings settings;
[IfFlag(21)] public PhotoBase personal_photo;
/// <summary>Profile photo</summary>
[IfFlag(2)] public PhotoBase profile_photo;
[IfFlag(22)] public PhotoBase fallback_photo;
/// <summary>Notification settings</summary>
public PeerNotifySettings notify_settings;
/// <summary>For bots, info about the bot (bot commands, etc)</summary>
@ -2812,6 +2833,10 @@ namespace TL
has_premium_gifts = 0x80000,
/// <summary>Whether this user doesn't allow sending voice messages in a private chat with them</summary>
voice_messages_forbidden = 0x100000,
/// <summary>Field <see cref="personal_photo"/> has a value</summary>
has_personal_photo = 0x200000,
/// <summary>Field <see cref="fallback_photo"/> has a value</summary>
has_fallback_photo = 0x400000,
}
}
@ -3167,11 +3192,9 @@ namespace TL
public int pts_count;
}
/// <summary>The user is preparing a message; typing, recording, uploading, etc. This update is valid for 6 seconds. If no further updates of this kind are received after 6 seconds, it should be considered that the user stopped doing whatever they were doing <para>See <a href="https://corefork.telegram.org/constructor/updateUserTyping"/></para></summary>
[TLDef(0xC01E857F)]
public class UpdateUserTyping : Update
[TLDef(0xC01E857F, inheritBefore = true)]
public class UpdateUserTyping : UpdateUser
{
/// <summary>User id</summary>
public long user_id;
/// <summary>Action type</summary>
public SendMessageAction action;
}
@ -3192,39 +3215,22 @@ namespace TL
public ChatParticipantsBase participants;
}
/// <summary>Contact status update. <para>See <a href="https://corefork.telegram.org/constructor/updateUserStatus"/></para></summary>
[TLDef(0xE5BDF8DE)]
public class UpdateUserStatus : Update
[TLDef(0xE5BDF8DE, inheritBefore = true)]
public class UpdateUserStatus : UpdateUser
{
/// <summary>User identifier</summary>
public long user_id;
/// <summary>New status</summary>
public UserStatus status;
}
/// <summary>Changes the user's first name, last name and username. <para>See <a href="https://corefork.telegram.org/constructor/updateUserName"/></para></summary>
[TLDef(0xA7848924)]
public class UpdateUserName : Update
[TLDef(0xA7848924, inheritBefore = true)]
public class UpdateUserName : UpdateUser
{
/// <summary>User identifier</summary>
public long user_id;
/// <summary>New first name. Corresponds to the new value of <strong>real_first_name</strong> field of the <see cref="UserFull"/>.</summary>
public string first_name;
/// <summary>New last name. Corresponds to the new value of <strong>real_last_name</strong> field of the <see cref="UserFull"/>.</summary>
public string last_name;
public Username[] usernames;
}
/// <summary>Change of contact's profile photo. <para>See <a href="https://corefork.telegram.org/constructor/updateUserPhoto"/></para></summary>
[TLDef(0xF227868C)]
public class UpdateUserPhoto : Update
{
/// <summary>User identifier</summary>
public long user_id;
/// <summary>Date of photo update.</summary>
public DateTime date;
/// <summary>New profile photo</summary>
public UserProfilePhoto photo;
/// <summary>(<see langword="true"/>), if one of the previously used photos is set a profile photo.</summary>
public bool previous;
}
/// <summary>New encrypted message. <para>See <a href="https://corefork.telegram.org/constructor/updateNewEncryptedMessage"/></para></summary>
[TLDef(0x12BCBD9A)]
public class UpdateNewEncryptedMessage : Update
@ -3334,11 +3340,9 @@ namespace TL
public PrivacyRule[] rules;
}
/// <summary>A user's phone number was changed <para>See <a href="https://corefork.telegram.org/constructor/updateUserPhone"/></para></summary>
[TLDef(0x05492A13)]
public class UpdateUserPhone : Update
[TLDef(0x05492A13, inheritBefore = true)]
public class UpdateUserPhone : UpdateUser
{
/// <summary>User ID</summary>
public long user_id;
/// <summary>New phone number</summary>
public string phone;
}
@ -4341,11 +4345,9 @@ namespace TL
[TLDef(0xFB4C496C)]
public class UpdateReadFeaturedEmojiStickers : Update { }
/// <summary>The <a href="https://corefork.telegram.org/api/emoji-status">emoji status</a> of a certain user has changed <para>See <a href="https://corefork.telegram.org/constructor/updateUserEmojiStatus"/></para></summary>
[TLDef(0x28373599)]
public class UpdateUserEmojiStatus : Update
[TLDef(0x28373599, inheritBefore = true)]
public class UpdateUserEmojiStatus : UpdateUser
{
/// <summary>User ID</summary>
public long user_id;
/// <summary>New <a href="https://corefork.telegram.org/api/emoji-status">emoji status</a></summary>
public EmojiStatus emoji_status;
}
@ -4406,6 +4408,12 @@ namespace TL
has_order = 0x1,
}
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/updateUser"/></para></summary>
[TLDef(0x20529438)]
public class UpdateUser : Update
{
public long user_id;
}
/// <summary>Updates state. <para>See <a href="https://corefork.telegram.org/constructor/updates.state"/></para></summary>
[TLDef(0xA56C2A3E)]
@ -5791,6 +5799,7 @@ namespace TL
{
/// <summary>Whether this custom emoji can be sent by non-Premium users</summary>
free = 0x1,
text_color = 0x2,
}
}
@ -6629,6 +6638,7 @@ namespace TL
selective = 0x4,
/// <summary>Field <see cref="placeholder"/> has a value</summary>
has_placeholder = 0x8,
persistent = 0x10,
}
}
/// <summary>Bot or inline keyboard <para>See <a href="https://corefork.telegram.org/constructor/replyInlineMarkup"/></para></summary>
@ -8187,6 +8197,14 @@ namespace TL
/// <summary>Stickerset</summary>
public override StickerSet Set => set;
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/stickerSetNoCovered"/></para></summary>
[TLDef(0x77B15D1C)]
public class StickerSetNoCovered : StickerSetCoveredBase
{
public StickerSet set;
public override StickerSet Set => set;
}
/// <summary>Position on a photo where a mask should be placed when <a href="https://corefork.telegram.org/api/stickers#attached-stickers">attaching stickers to media »</a> <para>See <a href="https://corefork.telegram.org/constructor/maskCoords"/></para></summary>
[TLDef(0xAED6DBB2)]
@ -13450,6 +13468,7 @@ namespace TL
inactive = 0x1,
/// <summary>True, if the bot supports the <a href="https://corefork.telegram.org/api/bots/webapps#settings-button-pressed">"settings_button_pressed" event »</a></summary>
has_settings = 0x2,
request_write_access = 0x4,
}
}

View file

@ -3255,9 +3255,10 @@ namespace TL
/// <summary>Enable or disable <a href="https://corefork.telegram.org/api/bots/attach">web bot attachment menu »</a> <para>See <a href="https://corefork.telegram.org/method/messages.toggleBotInAttachMenu"/></para></summary>
/// <param name="bot">Bot ID</param>
/// <param name="enabled">Toggle</param>
public static Task<bool> Messages_ToggleBotInAttachMenu(this Client client, InputUserBase bot, bool enabled)
public static Task<bool> Messages_ToggleBotInAttachMenu(this Client client, InputUserBase bot, bool enabled, bool write_allowed = false)
=> client.Invoke(new Messages_ToggleBotInAttachMenu
{
flags = (Messages_ToggleBotInAttachMenu.Flags)(write_allowed ? 0x1 : 0),
bot = bot,
enabled = enabled,
});
@ -3495,9 +3496,10 @@ namespace TL
/// <summary>Installs a previously uploaded photo as a profile photo. <para>See <a href="https://corefork.telegram.org/method/photos.updateProfilePhoto"/></para> <para>Possible <see cref="RpcException"/> codes: 400 (<a href="https://corefork.telegram.org/method/photos.updateProfilePhoto#possible-errors">details</a>)</para></summary>
/// <param name="id">Input photo</param>
public static Task<Photos_Photo> Photos_UpdateProfilePhoto(this Client client, InputPhoto id)
public static Task<Photos_Photo> Photos_UpdateProfilePhoto(this Client client, InputPhoto id, bool fallback = false)
=> client.Invoke(new Photos_UpdateProfilePhoto
{
flags = (Photos_UpdateProfilePhoto.Flags)(fallback ? 0x1 : 0),
id = id,
});
@ -3505,10 +3507,10 @@ namespace TL
/// <param name="file">File saved in parts by means of <see cref="Upload_SaveFilePart">Upload_SaveFilePart</see> method</param>
/// <param name="video"><a href="https://corefork.telegram.org/api/files#animated-profile-pictures">Animated profile picture</a> video</param>
/// <param name="video_start_ts">Floating point UNIX timestamp in seconds, indicating the frame of the video that should be used as static preview.</param>
public static Task<Photos_Photo> Photos_UploadProfilePhoto(this Client client, InputFileBase file = null, InputFileBase video = null, double? video_start_ts = null)
public static Task<Photos_Photo> Photos_UploadProfilePhoto(this Client client, InputFileBase file = null, InputFileBase video = null, double? video_start_ts = null, bool fallback = false)
=> client.Invoke(new Photos_UploadProfilePhoto
{
flags = (Photos_UploadProfilePhoto.Flags)((file != null ? 0x1 : 0) | (video != null ? 0x2 : 0) | (video_start_ts != null ? 0x4 : 0)),
flags = (Photos_UploadProfilePhoto.Flags)((file != null ? 0x1 : 0) | (video != null ? 0x2 : 0) | (video_start_ts != null ? 0x4 : 0) | (fallback ? 0x8 : 0)),
file = file,
video = video,
video_start_ts = video_start_ts.GetValueOrDefault(),
@ -3536,6 +3538,17 @@ namespace TL
limit = limit,
});
/// <summary><para>See <a href="https://corefork.telegram.org/method/photos.uploadContactProfilePhoto"/></para></summary>
public static Task<Photos_Photo> Photos_UploadContactProfilePhoto(this Client client, InputUserBase user_id, InputFileBase file = null, InputFileBase video = null, double? video_start_ts = null, bool suggest = false, bool save = false)
=> client.Invoke(new Photos_UploadContactProfilePhoto
{
flags = (Photos_UploadContactProfilePhoto.Flags)((file != null ? 0x1 : 0) | (video != null ? 0x2 : 0) | (video_start_ts != null ? 0x4 : 0) | (suggest ? 0x8 : 0) | (save ? 0x10 : 0)),
user_id = user_id,
file = file,
video = video,
video_start_ts = video_start_ts.GetValueOrDefault(),
});
/// <summary>Saves a part of file for further sending to one of the methods. <para>See <a href="https://corefork.telegram.org/method/upload.saveFilePart"/> [bots: ✓]</para> <para>Possible <see cref="RpcException"/> codes: 400 (<a href="https://corefork.telegram.org/method/upload.saveFilePart#possible-errors">details</a>)</para></summary>
/// <param name="file_id">Random file identifier created by the client</param>
/// <param name="file_part">Numerical order of a part</param>
@ -4360,6 +4373,14 @@ namespace TL
msg_id = msg_id,
});
/// <summary><para>See <a href="https://corefork.telegram.org/method/channels.toggleParticipantsHidden"/></para></summary>
public static Task<UpdatesBase> Channels_ToggleParticipantsHidden(this Client client, InputChannelBase channel, bool enabled)
=> client.Invoke(new Channels_ToggleParticipantsHidden
{
channel = channel,
enabled = enabled,
});
/// <summary>Sends a custom request; for bots only <para>See <a href="https://corefork.telegram.org/method/bots.sendCustomRequest"/> [bots: ✓]</para> <para>Possible <see cref="RpcException"/> codes: 400,403 (<a href="https://corefork.telegram.org/method/bots.sendCustomRequest#possible-errors">details</a>)</para></summary>
/// <param name="custom_method">The method name</param>
/// <param name="params_">JSON-serialized method parameters</param>
@ -7790,11 +7811,17 @@ namespace TL.Methods
public InputUserBase bot;
}
[TLDef(0x1AEE33AF)]
[TLDef(0x69F59D69)]
public class Messages_ToggleBotInAttachMenu : IMethod<bool>
{
public Flags flags;
public InputUserBase bot;
public bool enabled;
[Flags] public enum Flags : uint
{
write_allowed = 0x1,
}
}
[TLDef(0x178B480B)]
@ -7983,10 +8010,16 @@ namespace TL.Methods
}
}
[TLDef(0x72D4742C)]
[TLDef(0x1C3D5956)]
public class Photos_UpdateProfilePhoto : IMethod<Photos_Photo>
{
public Flags flags;
public InputPhoto id;
[Flags] public enum Flags : uint
{
fallback = 0x1,
}
}
[TLDef(0x89F30F69)]
@ -8002,6 +8035,7 @@ namespace TL.Methods
has_file = 0x1,
has_video = 0x2,
has_video_start_ts = 0x4,
fallback = 0x8,
}
}
@ -8020,6 +8054,25 @@ namespace TL.Methods
public int limit;
}
[TLDef(0xB91A83BF)]
public class Photos_UploadContactProfilePhoto : IMethod<Photos_Photo>
{
public Flags flags;
public InputUserBase user_id;
[IfFlag(0)] public InputFileBase file;
[IfFlag(1)] public InputFileBase video;
[IfFlag(2)] public double video_start_ts;
[Flags] public enum Flags : uint
{
has_file = 0x1,
has_video = 0x2,
has_video_start_ts = 0x4,
suggest = 0x8,
save = 0x10,
}
}
[TLDef(0xB304A621)]
public class Upload_SaveFilePart : IMethod<bool>
{
@ -8657,6 +8710,13 @@ namespace TL.Methods
public int msg_id;
}
[TLDef(0x6A6E7854)]
public class Channels_ToggleParticipantsHidden : IMethod<UpdatesBase>
{
public InputChannelBase channel;
public bool enabled;
}
[TLDef(0xAA2769ED)]
public class Bots_SendCustomRequest : IMethod<DataJSON>
{

View file

@ -6,7 +6,7 @@ namespace TL
{
public static class Layer
{
public const int Version = 150; // fetched 07/12/2022 12:23:35
public const int Version = 151; // fetched 29/12/2022 21:30:31
internal const int SecretChats = 144;
internal const int MTProto2 = 73;
internal const uint VectorCtor = 0x1CB5C415;
@ -65,7 +65,7 @@ namespace TL
[0x37982646] = typeof(IpPortSecret),
[0x4679B65F] = typeof(AccessPointRule),
[0x5A592A6C] = typeof(Help_ConfigSimple),
// from TL.Schema:
// from TL.SchemaExtensions:
[0x3FEDD339] = typeof(True),
[0xC4B9F9BB] = typeof(Error),
[0x56730BCC] = null,//Null
@ -193,6 +193,8 @@ namespace TL
[0xABA0F5C6] = typeof(MessageActionGiftPremium),
[0x0D999256] = typeof(MessageActionTopicCreate),
[0xC0944820] = typeof(MessageActionTopicEdit),
[0x57DE635E] = typeof(MessageActionSuggestProfilePhoto),
[0xE7E75F97] = typeof(MessageActionAttachMenuBotAllowed),
[0xD58A08C6] = typeof(Dialog),
[0x71BD134C] = typeof(DialogFolder),
[0x2331B22D] = typeof(PhotoEmpty),
@ -219,7 +221,7 @@ namespace TL
[0xA518110D] = typeof(PeerSettings),
[0xA437C3ED] = typeof(WallPaper),
[0xE0804116] = typeof(WallPaperNoFile),
[0xC4B1FC3F] = typeof(UserFull),
[0xF8D32AED] = typeof(UserFull),
[0x145ADE0B] = typeof(Contact),
[0xC13E3C50] = typeof(ImportedContact),
[0x16D9703B] = typeof(ContactStatus),
@ -264,7 +266,6 @@ namespace TL
[0x07761198] = typeof(UpdateChatParticipants),
[0xE5BDF8DE] = typeof(UpdateUserStatus),
[0xA7848924] = typeof(UpdateUserName),
[0xF227868C] = typeof(UpdateUserPhoto),
[0x12BCBD9A] = typeof(UpdateNewEncryptedMessage),
[0x1710F156] = typeof(UpdateEncryptedChatTyping),
[0xB4A2E88D] = typeof(UpdateEncryption),
@ -365,6 +366,7 @@ namespace TL
[0x5A73A98C] = typeof(UpdateMessageExtendedMedia),
[0x192EFBE3] = typeof(UpdateChannelPinnedTopic),
[0xFE198602] = typeof(UpdateChannelPinnedTopics),
[0x20529438] = typeof(UpdateUser),
[0xA56C2A3E] = typeof(Updates_State),
[0x5D75A138] = typeof(Updates_DifferenceEmpty),
[0x00F49CA0] = typeof(Updates_Difference),
@ -622,6 +624,7 @@ namespace TL
[0x6410A5D2] = typeof(StickerSetCovered),
[0x3407E51B] = typeof(StickerSetMultiCovered),
[0x40D13C0E] = typeof(StickerSetFullCovered),
[0x77B15D1C] = typeof(StickerSetNoCovered),
[0xAED6DBB2] = typeof(MaskCoords),
[0x4A992157] = typeof(InputStickeredMediaPhoto),
[0x0438865B] = typeof(InputStickeredMediaDocument),

View file

@ -13,7 +13,7 @@
<PackageId>WTelegramClient</PackageId>
<Version>0.0.0</Version>
<Authors>Wizou</Authors>
<Description>Telegram Client API (MTProto) library written 100% in C# and .NET Standard | Latest API layer: 150&#10;&#10;Release Notes:&#10;$(ReleaseNotes.Replace("|", "%0D%0A").Replace(" - ","%0D%0A- ").Replace(" ", "%0D%0A%0D%0A"))</Description>
<Description>Telegram Client API (MTProto) library written 100% in C# and .NET Standard | Latest API layer: 151&#10;&#10;Release Notes:&#10;$(ReleaseNotes.Replace("|", "%0D%0A").Replace(" - ","%0D%0A- ").Replace(" ", "%0D%0A%0D%0A"))</Description>
<Copyright>Copyright © Olivier Marcoux 2021-2022</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/wiz0u/WTelegramClient</PackageProjectUrl>