Compare commits

..

5 commits

Author SHA1 Message Date
Wizou eb52dccfa7 Helper OpenChat to monitor a group/channel without joining (#333)
Some checks failed
Dev build / build (push) Has been cancelled
2025-08-27 00:18:34 +02:00
Wizou a9bbdb9fc4 Try to improve diagnostics/handling of weird email login case (#331) 2025-08-27 00:06:30 +02:00
Wizou 5f411d45f9 API Layer 211.2: StarsTransaction flag posts_search 2025-08-16 13:01:43 +02:00
Wizou e16e39bfba Avoid using obsolete DataCenter info on alt-DC connect 2025-08-09 02:43:43 +02:00
Wizou 7faa3873f8 API Layer 211: Stories Albums, user's pending Stars Rating, SearchPosts + Check Flood, ...
(that might not be the most recent API layer. check https://patreon.com/wizou for the latest layers)
2025-08-02 02:05:49 +02:00
9 changed files with 495 additions and 153 deletions

View file

@ -46,7 +46,7 @@ jobs:
env: env:
JSON: | JSON: |
{ {
"status": "success", "complete": true, "commitMessage": ${{ toJSON(github.event.head_commit.message) }}, "status": "success", "complete": true, "commitMessage": ${{ toJSON(env.RELEASE_NOTES) }},
"message": "{ \"commitId\": \"${{ github.sha }}\", \"buildNumber\": \"${{ env.VERSION }}\", \"repoName\": \"${{ github.repository }}\"}" "message": "{ \"commitId\": \"${{ github.sha }}\", \"buildNumber\": \"${{ env.VERSION }}\", \"repoName\": \"${{ github.repository }}\"}"
} }
run: | run: |

View file

@ -58,7 +58,7 @@ jobs:
env: env:
JSON: | JSON: |
{ {
"status": "success", "complete": true, "commitMessage": ${{ toJSON(github.event.head_commit.message) }}, "status": "success", "complete": true, "commitMessage": ${{ toJSON(env.RELEASE_NOTES) }},
"message": "{ \"commitId\": \"${{ github.sha }}\", \"buildNumber\": \"${{ env.VERSION }}\", \"repoName\": \"${{ github.repository }}\"}" "message": "{ \"commitId\": \"${{ github.sha }}\", \"buildNumber\": \"${{ env.VERSION }}\", \"repoName\": \"${{ github.repository }}\"}"
} }
run: | run: |

View file

@ -1,4 +1,4 @@
[![API Layer](https://img.shields.io/badge/API_Layer-210-blueviolet)](https://corefork.telegram.org/methods) [![API Layer](https://img.shields.io/badge/API_Layer-211-blueviolet)](https://corefork.telegram.org/methods)
[![NuGet version](https://img.shields.io/nuget/v/WTelegramClient?color=00508F)](https://www.nuget.org/packages/WTelegramClient/) [![NuGet version](https://img.shields.io/nuget/v/WTelegramClient?color=00508F)](https://www.nuget.org/packages/WTelegramClient/)
[![NuGet prerelease](https://img.shields.io/nuget/vpre/WTelegramClient?color=C09030&label=dev+nuget)](https://www.nuget.org/packages/WTelegramClient/absoluteLatest) [![NuGet prerelease](https://img.shields.io/nuget/vpre/WTelegramClient?color=C09030&label=dev+nuget)](https://www.nuget.org/packages/WTelegramClient/absoluteLatest)
[![Donate](https://img.shields.io/badge/Help_this_project:-Donate-ff4444)](https://buymeacoffee.com/wizou) [![Donate](https://img.shields.io/badge/Help_this_project:-Donate-ff4444)](https://buymeacoffee.com/wizou)

View file

@ -13,7 +13,6 @@ namespace WTelegram
{ {
partial class Client partial class Client
{ {
#region Client TL Helpers
/// <summary>Used to indicate progression of file download/upload</summary> /// <summary>Used to indicate progression of file download/upload</summary>
/// <param name="transmitted">transmitted bytes</param> /// <param name="transmitted">transmitted bytes</param>
/// <param name="totalSize">total size of file in bytes, or 0 if unknown</param> /// <param name="totalSize">total size of file in bytes, or 0 if unknown</param>
@ -36,9 +35,10 @@ namespace WTelegram
var client = await GetClientForDC(-_dcSession.DcID, true); var client = await GetClientForDC(-_dcSession.DcID, true);
using (stream) using (stream)
{ {
const long SMALL_FILE_MAX_SIZE = 10 << 20;
bool hasLength = stream.CanSeek; bool hasLength = stream.CanSeek;
long transmitted = 0, length = hasLength ? stream.Length : -1; long transmitted = 0, length = hasLength ? stream.Length : -1;
bool isBig = !hasLength || length >= 10 * 1024 * 1024; bool isBig = !hasLength || length > SMALL_FILE_MAX_SIZE;
int file_total_parts = hasLength ? (int)((length - 1) / FilePartSize) + 1 : -1; int file_total_parts = hasLength ? (int)((length - 1) / FilePartSize) + 1 : -1;
long file_id = Helpers.RandomLong(); long file_id = Helpers.RandomLong();
int file_part = 0, read; int file_part = 0, read;
@ -909,6 +909,28 @@ namespace WTelegram
} }
return chat; return chat;
} }
#endregion
/// <summary>Receive updates for a given group/channel until cancellation is requested.</summary>
/// <param name="channel">Group/channel to monitor without joining</param>
/// <param name="ct">Cancel token to stop the monitoring</param>
/// <remarks>After cancelling, you may still receive updates for a few more seconds</remarks>
public async void OpenChat(InputChannel channel, CancellationToken ct)
{
var cts = CancellationTokenSource.CreateLinkedTokenSource(_cts.Token, ct);
try
{
while (!cts.IsCancellationRequested)
{
var diff = await this.Updates_GetChannelDifference(channel, null, 1, 1, true);
var timeout = diff.Timeout * 1000;
await Task.Delay(timeout != 0 ? timeout : 30000, cts.Token);
}
}
catch (Exception ex)
{
if (!cts.IsCancellationRequested)
Console.WriteLine($"An exception occured for OpenChat {channel.channel_id}: {ex.Message}");
}
}
} }
} }

View file

@ -277,9 +277,8 @@ namespace WTelegram
private Session.DCSession GetOrCreateDCSession(int dcId, DcOption.Flags flags) private Session.DCSession GetOrCreateDCSession(int dcId, DcOption.Flags flags)
{ {
if (_session.DCSessions.TryGetValue(dcId, out var dcSession) && dcSession.AuthKey != null) if (_session.DCSessions.TryGetValue(dcId, out var dcSession) && dcSession.Client != null)
if (dcSession.Client != null || dcSession.DataCenter.flags == flags) return dcSession; // we have already a connected session with this DC, use it
return dcSession; // if we have already a session with this DC and we are connected or it is a perfect match, use it
if (dcSession == null && _session.DCSessions.TryGetValue(-dcId, out dcSession) && dcSession.AuthKey != null) if (dcSession == null && _session.DCSessions.TryGetValue(-dcId, out dcSession) && dcSession.AuthKey != null)
{ {
// we have already negociated an AuthKey with this DC // we have already negociated an AuthKey with this DC
@ -295,9 +294,10 @@ namespace WTelegram
dcId = Math.Abs(dcId); dcId = Math.Abs(dcId);
} }
var dcOptions = GetDcOptions(Math.Abs(dcId), flags); var dcOptions = GetDcOptions(Math.Abs(dcId), flags);
var dcOption = dcOptions.FirstOrDefault() ?? throw new WTException($"Could not find adequate dc_option for DC {dcId}"); var dcOption = dcOptions.FirstOrDefault();
dcSession ??= new(); // create new session only if not already existing dcSession ??= new(); // create new session only if not already existing
dcSession.DataCenter = dcOption; if (dcOption != null) dcSession.DataCenter = dcOption;
else if (dcSession.DataCenter == null) throw new WTException($"Could not find adequate dc_option for DC {dcId}");
return _session.DCSessions[dcId] = dcSession; return _session.DCSessions[dcId] = dcSession;
} }
@ -1238,10 +1238,13 @@ namespace WTelegram
if (verified is Account_EmailVerifiedLogin verifiedLogin) // (it should always be) if (verified is Account_EmailVerifiedLogin verifiedLogin) // (it should always be)
sentCodeBase = verifiedLogin.sent_code; sentCodeBase = verifiedLogin.sent_code;
} }
RaiseUpdates(sentCodeBase);
} }
resent: resent:
if (sentCodeBase is Auth_SentCodeSuccess success) if (sentCodeBase is Auth_SentCodeSuccess success)
authorization = success.authorization; authorization = success.authorization;
else if (sentCodeBase is Auth_SentCodePaymentRequired paymentRequired)
throw new WTException("Auth_SentCodePaymentRequired unsupported");
else if (sentCodeBase is Auth_SentCode sentCode) else if (sentCodeBase is Auth_SentCode sentCode)
{ {
phone_code_hash = sentCode.phone_code_hash; phone_code_hash = sentCode.phone_code_hash;
@ -1410,7 +1413,7 @@ namespace WTelegram
public User LoginAlreadyDone(Auth_AuthorizationBase authorization) public User LoginAlreadyDone(Auth_AuthorizationBase authorization)
{ {
if (authorization is not Auth_Authorization { user: User self }) if (authorization is not Auth_Authorization { user: User self })
throw new WTException("Failed to get Authorization: " + authorization.GetType().Name); throw new WTException("Failed to get Authorization: " + authorization?.GetType().Name);
_session.UserId = _dcSession.UserId = self.id; _session.UserId = _dcSession.UserId = self.id;
lock (_session) _session.Save(); lock (_session) _session.Save();
RaiseUpdates(self); RaiseUpdates(self);
@ -1630,6 +1633,16 @@ namespace WTelegram
got503 = true; got503 = true;
goto retry; goto retry;
} }
else if (code == 401 && message == "SESSION_REVOKED" && !IsMainDC) // need to renegociate alt-DC auth
{
lock (_session)
{
_session.DCSessions.Remove(_dcSession.DcID);
if (_session.MainDC != -_dcSession.DcID) _session.DCSessions.Remove(-_dcSession.DcID);
_session.Save();
}
await DisposeAsync();
}
else if (code == 400 && message == "CONNECTION_NOT_INITED") else if (code == 400 && message == "CONNECTION_NOT_INITED")
{ {
await InitConnection(); await InitConnection();

View file

@ -818,6 +818,7 @@ namespace TL
/// <summary>Monthly Active Users (MAU) of this bot (may be absent for small bots).</summary> /// <summary>Monthly Active Users (MAU) of this bot (may be absent for small bots).</summary>
[IfFlag(44)] public int bot_active_users; [IfFlag(44)] public int bot_active_users;
[IfFlag(46)] public long bot_verification_icon; [IfFlag(46)] public long bot_verification_icon;
/// <summary>If set, the user has enabled <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a>, we <em>might</em> need to pay the specified amount of <a href="https://corefork.telegram.org/api/stars">Stars</a> to send them messages, depending on the configured exceptions: check <see cref="UserFull"/>.<c>send_paid_messages_stars</c> or <see cref="SchemaExtensions.Users_GetRequirementsToContact">Users_GetRequirementsToContact</see> to see if the currently logged in user actually has to pay or not, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for the full flow.</summary>
[IfFlag(47)] public long send_paid_messages_stars; [IfFlag(47)] public long send_paid_messages_stars;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
@ -1124,6 +1125,7 @@ namespace TL
/// <summary>Expiration date of the <a href="https://corefork.telegram.org/api/stars#star-subscriptions">Telegram Star subscription »</a> the current user has bought to gain access to this channel.</summary> /// <summary>Expiration date of the <a href="https://corefork.telegram.org/api/stars#star-subscriptions">Telegram Star subscription »</a> the current user has bought to gain access to this channel.</summary>
[IfFlag(43)] public DateTime subscription_until_date; [IfFlag(43)] public DateTime subscription_until_date;
[IfFlag(45)] public long bot_verification_icon; [IfFlag(45)] public long bot_verification_icon;
/// <summary>If set, this supergroup or <a href="https://corefork.telegram.org/api/forum#monoforums">monoforum</a> has enabled <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a>, we <em>might</em> need to pay the specified amount of <a href="https://corefork.telegram.org/api/stars">Stars</a> to send messages to it, depending on the configured exceptions: check <see cref="ChannelFull"/>.<c>send_paid_messages_stars</c> to see if the currently logged in user actually has to pay or not, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for the full flow (only set for the monoforum, not the associated channel).</summary>
[IfFlag(46)] public long send_paid_messages_stars; [IfFlag(46)] public long send_paid_messages_stars;
[IfFlag(50)] public long linked_monoforum_id; [IfFlag(50)] public long linked_monoforum_id;
@ -1491,6 +1493,7 @@ namespace TL
[IfFlag(42)] public StickerSet emojiset; [IfFlag(42)] public StickerSet emojiset;
[IfFlag(49)] public BotVerification bot_verification; [IfFlag(49)] public BotVerification bot_verification;
[IfFlag(50)] public int stargifts_count; [IfFlag(50)] public int stargifts_count;
/// <summary>If set and bigger than 0, this supergroup, <a href="https://corefork.telegram.org/api/forum#monoforums">monoforum</a> or the monoforum associated to this channel has enabled <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a> and we <em>must</em> pay the specified amount of <a href="https://corefork.telegram.org/api/stars">Stars</a> to send messages to it, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for the full flow. <br/>This flag will be set both for the monoforum and for <see cref="ChannelFull"/> of the associated channel). <br/>If set and equal to 0, the monoforum requires payment in general but we were exempted from paying.</summary>
[IfFlag(53)] public long send_paid_messages_stars; [IfFlag(53)] public long send_paid_messages_stars;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
@ -1841,7 +1844,9 @@ namespace TL
[IfFlag(34)] public long effect; [IfFlag(34)] public long effect;
/// <summary>Represents a <a href="https://corefork.telegram.org/api/factcheck">fact-check »</a>.</summary> /// <summary>Represents a <a href="https://corefork.telegram.org/api/factcheck">fact-check »</a>.</summary>
[IfFlag(35)] public FactCheck factcheck; [IfFlag(35)] public FactCheck factcheck;
/// <summary>Used for <a href="https://telegram.org/blog/star-messages-gateway-2-0-and-more#save-even-more-on-user-verification">Telegram Gateway verification messages</a>: if set and the current unixtime is bigger than the specified unixtime, invoke <see cref="SchemaExtensions.Messages_ReportMessagesDelivery">Messages_ReportMessagesDelivery</see> passing the ID and the peer of this message as soon as it is received by the client (optionally batching requests for the same peer).</summary>
[IfFlag(37)] public DateTime report_delivery_until_date; [IfFlag(37)] public DateTime report_delivery_until_date;
/// <summary>The amount of stars the <strong>sender</strong> has paid to send the message, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for more info.</summary>
[IfFlag(38)] public long paid_message_stars; [IfFlag(38)] public long paid_message_stars;
[IfFlag(39)] public SuggestedPost suggested_post; [IfFlag(39)] public SuggestedPost suggested_post;
@ -1965,6 +1970,7 @@ namespace TL
public DateTime date; public DateTime date;
/// <summary>Event connected with the service message</summary> /// <summary>Event connected with the service message</summary>
public MessageAction action; public MessageAction action;
/// <summary><a href="https://corefork.telegram.org/api/reactions">Reactions »</a>.</summary>
[IfFlag(20)] public MessageReactions reactions; [IfFlag(20)] public MessageReactions reactions;
/// <summary>Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.</summary> /// <summary>Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.</summary>
[IfFlag(25)] public int ttl_period; [IfFlag(25)] public int ttl_period;
@ -1981,6 +1987,7 @@ namespace TL
media_unread = 0x20, media_unread = 0x20,
/// <summary>Field <see cref="from_id"/> has a value</summary> /// <summary>Field <see cref="from_id"/> has a value</summary>
has_from_id = 0x100, has_from_id = 0x100,
/// <summary>Whether you can <a href="https://corefork.telegram.org/api/reactions">react to this messages »</a>.</summary>
reactions_are_possible = 0x200, reactions_are_possible = 0x200,
/// <summary>Whether the message is silent</summary> /// <summary>Whether the message is silent</summary>
silent = 0x2000, silent = 0x2000,
@ -2007,6 +2014,7 @@ namespace TL
public override MessageReplyHeaderBase ReplyTo => reply_to; public override MessageReplyHeaderBase ReplyTo => reply_to;
/// <summary>Message date</summary> /// <summary>Message date</summary>
public override DateTime Date => date; public override DateTime Date => date;
/// <summary><a href="https://corefork.telegram.org/api/reactions">Reactions »</a>.</summary>
public override MessageReactions Reactions => reactions; public override MessageReactions Reactions => reactions;
/// <summary>Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.</summary> /// <summary>Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.</summary>
public override int TtlPeriod => ttl_period; public override int TtlPeriod => ttl_period;
@ -2937,10 +2945,14 @@ namespace TL
[IfFlag(1)] public TextWithEntities message; [IfFlag(1)] public TextWithEntities message;
/// <summary>The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.<br/><c>convert_stars</c> will be equal to <c>stars</c> only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than <c>stars</c>.</summary> /// <summary>The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.<br/><c>convert_stars</c> will be equal to <c>stars</c> only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than <c>stars</c>.</summary>
[IfFlag(4)] public long convert_stars; [IfFlag(4)] public long convert_stars;
/// <summary>If set, this gift was <a href="https://corefork.telegram.org/api/gifts#upgrade-a-gift-to-a-collectible-gift">upgraded to a collectible gift</a>, and the corresponding <see cref="MessageActionStarGiftUnique"/> is available at the specified message ID.</summary>
[IfFlag(5)] public int upgrade_msg_id; [IfFlag(5)] public int upgrade_msg_id;
[IfFlag(8)] public long upgrade_stars; [IfFlag(8)] public long upgrade_stars;
/// <summary>Sender of the gift (unset for anonymous gifts).</summary>
[IfFlag(11)] public Peer from_id; [IfFlag(11)] public Peer from_id;
/// <summary>Receiver of the gift.</summary>
[IfFlag(12)] public Peer peer; [IfFlag(12)] public Peer peer;
/// <summary>For channel gifts, ID to use in <see cref="InputSavedStarGiftChat"/>s.</summary>
[IfFlag(12)] public long saved_id; [IfFlag(12)] public long saved_id;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
@ -2955,10 +2967,13 @@ namespace TL
converted = 0x8, converted = 0x8,
/// <summary>Field <see cref="convert_stars"/> has a value</summary> /// <summary>Field <see cref="convert_stars"/> has a value</summary>
has_convert_stars = 0x10, has_convert_stars = 0x10,
/// <summary>This gift was upgraded to a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>.</summary>
upgraded = 0x20, upgraded = 0x20,
/// <summary>Field <see cref="upgrade_stars"/> has a value</summary> /// <summary>Field <see cref="upgrade_stars"/> has a value</summary>
has_upgrade_stars = 0x100, has_upgrade_stars = 0x100,
/// <summary>This gift is not available anymore because a request to refund the payment related to this gift was made, and the money was returned.</summary>
refunded = 0x200, refunded = 0x200,
/// <summary>If set, this gift can be <a href="https://corefork.telegram.org/api/gifts#upgrade-a-gift-to-a-collectible-gift">upgraded to a collectible gift</a>; can only be set for the receiver of a gift.</summary>
can_upgrade = 0x400, can_upgrade = 0x400,
/// <summary>Field <see cref="from_id"/> has a value</summary> /// <summary>Field <see cref="from_id"/> has a value</summary>
has_from_id = 0x800, has_from_id = 0x800,
@ -2966,38 +2981,49 @@ namespace TL
has_peer = 0x1000, has_peer = 0x1000,
} }
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/messageActionStarGiftUnique"/></para></summary> /// <summary>A <a href="https://corefork.telegram.org/api/gifts">gift »</a> was upgraded to a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>. <para>See <a href="https://corefork.telegram.org/constructor/messageActionStarGiftUnique"/></para></summary>
[TLDef(0x2E3AE60E)] [TLDef(0x34F762F3)]
public sealed partial class MessageActionStarGiftUnique : MessageAction public sealed partial class MessageActionStarGiftUnique : MessageAction
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags; public Flags flags;
/// <summary>The collectible gift.</summary>
public StarGiftBase gift; public StarGiftBase gift;
[IfFlag(3)] public DateTime can_export_at; [IfFlag(3)] public DateTime can_export_at;
/// <summary>If set, indicates that the gift can be <a href="https://corefork.telegram.org/api/gifts#transferring-collectible-gifts">transferred »</a> to another user by paying the specified amount of stars.</summary>
[IfFlag(4)] public long transfer_stars; [IfFlag(4)] public long transfer_stars;
/// <summary>Sender of the gift (unset for anonymous gifts).</summary>
[IfFlag(6)] public Peer from_id; [IfFlag(6)] public Peer from_id;
/// <summary>Receiver of the gift.</summary>
[IfFlag(7)] public Peer peer; [IfFlag(7)] public Peer peer;
/// <summary>For channel gifts, ID to use in <see cref="InputSavedStarGiftChat"/>s.</summary>
[IfFlag(7)] public long saved_id; [IfFlag(7)] public long saved_id;
[IfFlag(8)] public long resale_stars; [IfFlag(8)] public StarsAmountBase resale_amount;
/// <summary>If set, indicates that the current gift can't be <a href="https://corefork.telegram.org/api/gifts#transferring-collectible-gifts">transferred »</a> yet: the owner will be able to transfer it at the specified unixtime.</summary>
[IfFlag(9)] public DateTime can_transfer_at; [IfFlag(9)] public DateTime can_transfer_at;
/// <summary>If set, indicates that the current gift can't be <a href="https://corefork.telegram.org/api/gifts#sell-a-collectible-gift">resold »</a> yet: the owner will be able to put it up for sale at the specified unixtime.</summary>
[IfFlag(10)] public DateTime can_resell_at; [IfFlag(10)] public DateTime can_resell_at;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
/// <summary>If set, this collectible was <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">upgraded »</a> to a collectible gift from a previously received or sent (depending on the <c>out</c> flag of the containing <see cref="MessageService"/>) non-collectible gift.</summary>
upgrade = 0x1, upgrade = 0x1,
/// <summary>If set, this collectible was transferred (either to the current user or by the current user to the other user in the private chat, depending on the <c>out</c> flag of the containing <see cref="MessageService"/>).</summary>
transferred = 0x2, transferred = 0x2,
/// <summary>If set, this gift is visible on the user or channel's profile page; can only be set for the receiver of a gift.</summary>
saved = 0x4, saved = 0x4,
/// <summary>Field <see cref="can_export_at"/> has a value</summary> /// <summary>Field <see cref="can_export_at"/> has a value</summary>
has_can_export_at = 0x8, has_can_export_at = 0x8,
/// <summary>Field <see cref="transfer_stars"/> has a value</summary> /// <summary>Field <see cref="transfer_stars"/> has a value</summary>
has_transfer_stars = 0x10, has_transfer_stars = 0x10,
/// <summary>This gift was upgraded to a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a> and then re-downgraded to a regular gift because a request to refund the payment related to the upgrade was made, and the money was returned.</summary>
refunded = 0x20, refunded = 0x20,
/// <summary>Field <see cref="from_id"/> has a value</summary> /// <summary>Field <see cref="from_id"/> has a value</summary>
has_from_id = 0x40, has_from_id = 0x40,
/// <summary>Fields <see cref="peer"/> and <see cref="saved_id"/> have a value</summary> /// <summary>Fields <see cref="peer"/> and <see cref="saved_id"/> have a value</summary>
has_peer = 0x80, has_peer = 0x80,
/// <summary>Field <see cref="resale_stars"/> has a value</summary> /// <summary>Field <see cref="resale_amount"/> has a value</summary>
has_resale_stars = 0x100, has_resale_amount = 0x100,
/// <summary>Field <see cref="can_transfer_at"/> has a value</summary> /// <summary>Field <see cref="can_transfer_at"/> has a value</summary>
has_can_transfer_at = 0x200, has_can_transfer_at = 0x200,
/// <summary>Field <see cref="can_resell_at"/> has a value</summary> /// <summary>Field <see cref="can_resell_at"/> has a value</summary>
@ -3596,6 +3622,7 @@ namespace TL
[IfFlag(13)] public long business_bot_id; [IfFlag(13)] public long business_bot_id;
/// <summary>Contains a <a href="https://corefork.telegram.org/api/links">deep link »</a>, used to open a management menu in the business bot. This flag is set if and only if <c>business_bot_id</c> is set.</summary> /// <summary>Contains a <a href="https://corefork.telegram.org/api/links">deep link »</a>, used to open a management menu in the business bot. This flag is set if and only if <c>business_bot_id</c> is set.</summary>
[IfFlag(13)] public string business_bot_manage_url; [IfFlag(13)] public string business_bot_manage_url;
/// <summary>All users that must <a href="https://corefork.telegram.org/api/paid-messages">pay <em>us</em> »</a> to send us private messages will have this flag set <em>only for us</em>, containing the amount of required stars, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for more info on paid messages.</summary>
[IfFlag(14)] public long charge_paid_message_stars; [IfFlag(14)] public long charge_paid_message_stars;
[IfFlag(15)] public string registration_month; [IfFlag(15)] public string registration_month;
[IfFlag(16)] public string phone_country; [IfFlag(16)] public string phone_country;
@ -3742,7 +3769,7 @@ namespace TL
} }
/// <summary>Extended user info <para>See <a href="https://corefork.telegram.org/constructor/userFull"/></para></summary> /// <summary>Extended user info <para>See <a href="https://corefork.telegram.org/constructor/userFull"/></para></summary>
[TLDef(0x29DE80BE)] [TLDef(0x7E63CE1F)]
public sealed partial class UserFull : IObject public sealed partial class UserFull : IObject
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
@ -3806,9 +3833,12 @@ namespace TL
/// <summary>This bot has an active <a href="https://corefork.telegram.org/api/bots/referrals">referral program »</a></summary> /// <summary>This bot has an active <a href="https://corefork.telegram.org/api/bots/referrals">referral program »</a></summary>
[IfFlag(43)] public StarRefProgram starref_program; [IfFlag(43)] public StarRefProgram starref_program;
[IfFlag(44)] public BotVerification bot_verification; [IfFlag(44)] public BotVerification bot_verification;
/// <summary>If set and bigger than 0, this user has enabled <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a> and we <em>must</em> pay the specified amount of <a href="https://corefork.telegram.org/api/stars">Stars</a> to send messages to them, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for the full flow. <br/>If set and equal to 0, the user requires payment in general but we were exempted from paying <a href="https://corefork.telegram.org/api/paid-messages">for any of the reasons specified in the docs »</a>.</summary>
[IfFlag(46)] public long send_paid_messages_stars; [IfFlag(46)] public long send_paid_messages_stars;
[IfFlag(47)] public DisallowedGiftsSettings disallowed_gifts; [IfFlag(47)] public DisallowedGiftsSettings disallowed_gifts;
[IfFlag(49)] public StarsRating stars_rating; [IfFlag(49)] public StarsRating stars_rating;
[IfFlag(50)] public StarsRating stars_my_pending_rating;
[IfFlag(50)] public DateTime stars_my_pending_rating_date;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
@ -3903,6 +3933,8 @@ namespace TL
display_gifts_button = 0x10000, display_gifts_button = 0x10000,
/// <summary>Field <see cref="stars_rating"/> has a value</summary> /// <summary>Field <see cref="stars_rating"/> has a value</summary>
has_stars_rating = 0x20000, has_stars_rating = 0x20000,
/// <summary>Fields <see cref="stars_my_pending_rating"/> and <see cref="stars_my_pending_rating_date"/> have a value</summary>
has_stars_my_pending_rating = 0x40000,
} }
} }
@ -4056,7 +4088,7 @@ namespace TL
public override IPeerInfo UserOrChat(Peer peer) => peer?.UserOrChat(users, chats); public override IPeerInfo UserOrChat(Peer peer) => peer?.UserOrChat(users, chats);
} }
/// <summary>Incomplete list of messages and auxiliary data. <para>See <a href="https://corefork.telegram.org/constructor/messages.messagesSlice"/></para></summary> /// <summary>Incomplete list of messages and auxiliary data. <para>See <a href="https://corefork.telegram.org/constructor/messages.messagesSlice"/></para></summary>
[TLDef(0x3A54685E)] [TLDef(0x762B263D)]
public sealed partial class Messages_MessagesSlice : Messages_Messages, IPeerResolver public sealed partial class Messages_MessagesSlice : Messages_Messages, IPeerResolver
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
@ -4067,6 +4099,7 @@ namespace TL
[IfFlag(0)] public int next_rate; [IfFlag(0)] public int next_rate;
/// <summary>Indicates the absolute position of <c>messages[0]</c> within the total result set with count <c>count</c>. <br/>This is useful, for example, if the result was fetched using <c>offset_id</c>, and we need to display a <c>progress/total</c> counter (like <c>photo 134 of 200</c>, for all media in a chat, we could simply use <c>photo ${offset_id_offset} of ${count}</c>.</summary> /// <summary>Indicates the absolute position of <c>messages[0]</c> within the total result set with count <c>count</c>. <br/>This is useful, for example, if the result was fetched using <c>offset_id</c>, and we need to display a <c>progress/total</c> counter (like <c>photo 134 of 200</c>, for all media in a chat, we could simply use <c>photo ${offset_id_offset} of ${count}</c>.</summary>
[IfFlag(2)] public int offset_id_offset; [IfFlag(2)] public int offset_id_offset;
[IfFlag(3)] public SearchPostsFlood search_flood;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
@ -4076,6 +4109,8 @@ namespace TL
inexact = 0x2, inexact = 0x2,
/// <summary>Field <see cref="offset_id_offset"/> has a value</summary> /// <summary>Field <see cref="offset_id_offset"/> has a value</summary>
has_offset_id_offset = 0x4, has_offset_id_offset = 0x4,
/// <summary>Field <see cref="search_flood"/> has a value</summary>
has_search_flood = 0x8,
} }
} }
/// <summary>Channel messages <para>See <a href="https://corefork.telegram.org/constructor/messages.channelMessages"/></para></summary> /// <summary>Channel messages <para>See <a href="https://corefork.telegram.org/constructor/messages.channelMessages"/></para></summary>
@ -7163,7 +7198,7 @@ namespace TL
Birthday = 0xD65A11CC, Birthday = 0xD65A11CC,
///<summary>Whether received <a href="https://corefork.telegram.org/api/gifts">gifts</a> will be automatically displayed on our profile</summary> ///<summary>Whether received <a href="https://corefork.telegram.org/api/gifts">gifts</a> will be automatically displayed on our profile</summary>
StarGiftsAutoSave = 0xE1732341, StarGiftsAutoSave = 0xE1732341,
///<summary>See <a href="https://corefork.telegram.org/constructor/inputPrivacyKeyNoPaidMessages"/></summary> ///<summary>Who can send you messages without paying, if <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a> are enabled.</summary>
NoPaidMessages = 0xBDC597B4, NoPaidMessages = 0xBDC597B4,
} }
@ -7194,7 +7229,7 @@ namespace TL
Birthday = 0x2000A518, Birthday = 0x2000A518,
///<summary>Whether received <a href="https://corefork.telegram.org/api/gifts">gifts</a> will be automatically displayed on our profile</summary> ///<summary>Whether received <a href="https://corefork.telegram.org/api/gifts">gifts</a> will be automatically displayed on our profile</summary>
StarGiftsAutoSave = 0x2CA4FDF8, StarGiftsAutoSave = 0x2CA4FDF8,
///<summary>See <a href="https://corefork.telegram.org/constructor/privacyKeyNoPaidMessages"/></summary> ///<summary>Who can send you messages without paying, if <a href="https://corefork.telegram.org/api/paid-messages">paid messages »</a> are enabled.</summary>
NoPaidMessages = 0x17D348D2, NoPaidMessages = 0x17D348D2,
} }
@ -7230,14 +7265,14 @@ namespace TL
[TLDef(0x840649CF)] [TLDef(0x840649CF)]
public sealed partial class InputPrivacyValueAllowChatParticipants : InputPrivacyRule public sealed partial class InputPrivacyValueAllowChatParticipants : InputPrivacyRule
{ {
/// <summary>Allowed chat IDs</summary> /// <summary>Allowed chat IDs (either a <see cref="Chat"/> or a <see cref="Channel">supergroup</see> ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way)).</summary>
public long[] chats; public long[] chats;
} }
/// <summary>Disallow only participants of certain chats <para>See <a href="https://corefork.telegram.org/constructor/inputPrivacyValueDisallowChatParticipants"/></para></summary> /// <summary>Disallow only participants of certain chats <para>See <a href="https://corefork.telegram.org/constructor/inputPrivacyValueDisallowChatParticipants"/></para></summary>
[TLDef(0xE94F0F86)] [TLDef(0xE94F0F86)]
public sealed partial class InputPrivacyValueDisallowChatParticipants : InputPrivacyRule public sealed partial class InputPrivacyValueDisallowChatParticipants : InputPrivacyRule
{ {
/// <summary>Disallowed chat IDs</summary> /// <summary>Disallowed chat IDs (either a <see cref="Chat"/> or a <see cref="Channel">supergroup</see> ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way)).</summary>
public long[] chats; public long[] chats;
} }
/// <summary>Allow only <a href="https://corefork.telegram.org/api/privacy">close friends »</a> <para>See <a href="https://corefork.telegram.org/constructor/inputPrivacyValueAllowCloseFriends"/></para></summary> /// <summary>Allow only <a href="https://corefork.telegram.org/api/privacy">close friends »</a> <para>See <a href="https://corefork.telegram.org/constructor/inputPrivacyValueAllowCloseFriends"/></para></summary>
@ -7285,14 +7320,14 @@ namespace TL
[TLDef(0x6B134E8E)] [TLDef(0x6B134E8E)]
public sealed partial class PrivacyValueAllowChatParticipants : PrivacyRule public sealed partial class PrivacyValueAllowChatParticipants : PrivacyRule
{ {
/// <summary>Allowed chats</summary> /// <summary>Allowed chat IDs (either a <see cref="Chat"/> or a <see cref="Channel">supergroup</see> ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way)).</summary>
public long[] chats; public long[] chats;
} }
/// <summary>Disallow only participants of certain chats <para>See <a href="https://corefork.telegram.org/constructor/privacyValueDisallowChatParticipants"/></para></summary> /// <summary>Disallow only participants of certain chats <para>See <a href="https://corefork.telegram.org/constructor/privacyValueDisallowChatParticipants"/></para></summary>
[TLDef(0x41C87565)] [TLDef(0x41C87565)]
public sealed partial class PrivacyValueDisallowChatParticipants : PrivacyRule public sealed partial class PrivacyValueDisallowChatParticipants : PrivacyRule
{ {
/// <summary>Disallowed chats</summary> /// <summary>Disallowed chats IDs (either a <see cref="Chat"/> or a <see cref="Channel">supergroup</see> ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way)).</summary>
public long[] chats; public long[] chats;
} }
/// <summary>Allow only <a href="https://corefork.telegram.org/api/privacy">close friends »</a> <para>See <a href="https://corefork.telegram.org/constructor/privacyValueAllowCloseFriends"/></para></summary> /// <summary>Allow only <a href="https://corefork.telegram.org/api/privacy">close friends »</a> <para>See <a href="https://corefork.telegram.org/constructor/privacyValueAllowCloseFriends"/></para></summary>
@ -7567,7 +7602,7 @@ namespace TL
public string display_url; public string display_url;
/// <summary><a href="https://corefork.telegram.org/api/offsets#hash-generation">Hash used for caching, for more info click here</a></summary> /// <summary><a href="https://corefork.telegram.org/api/offsets#hash-generation">Hash used for caching, for more info click here</a></summary>
public int hash; public int hash;
/// <summary>Type of the web page. One of the following: <!-- start type --><br/><br/>- <c>video</c><br/>- <c>gif</c><br/>- <c>photo</c><br/>- <c>document</c><br/>- <c>profile</c><br/>- <c>telegram_background</c><br/>- <c>telegram_theme</c><br/>- <c>telegram_story</c><br/>- <c>telegram_channel</c><br/>- <c>telegram_channel_request</c><br/>- <c>telegram_megagroup</c><br/>- <c>telegram_chat</c><br/>- <c>telegram_megagroup_request</c><br/>- <c>telegram_chat_request</c><br/>- <c>telegram_album</c><br/>- <c>telegram_message</c><br/>- <c>telegram_bot</c><br/>- <c>telegram_voicechat</c><br/>- <c>telegram_livestream</c><br/>- <c>telegram_call</c><br/>- <c>telegram_user</c><br/>- <c>telegram_botapp</c><br/>- <c>telegram_channel_boost</c><br/>- <c>telegram_group_boost</c><br/>- <c>telegram_giftcode</c><br/>- <c>telegram_stickerset</c><br/><br/><!-- end type --></summary> /// <summary>Type of the web page. One of the following: <!-- start type --><br/><br/>- <c>video</c><br/>- <c>gif</c><br/>- <c>photo</c><br/>- <c>document</c><br/>- <c>profile</c><br/>- <c>telegram_background</c><br/>- <c>telegram_theme</c><br/>- <c>telegram_story</c><br/>- <c>telegram_channel</c><br/>- <c>telegram_channel_request</c><br/>- <c>telegram_megagroup</c><br/>- <c>telegram_chat</c><br/>- <c>telegram_megagroup_request</c><br/>- <c>telegram_chat_request</c><br/>- <c>telegram_album</c><br/>- <c>telegram_message</c><br/>- <c>telegram_bot</c><br/>- <c>telegram_voicechat</c><br/>- <c>telegram_livestream</c><br/>- <c>telegram_call</c><br/>- <c>telegram_user</c><br/>- <c>telegram_botapp</c><br/>- <c>telegram_channel_boost</c><br/>- <c>telegram_group_boost</c><br/>- <c>telegram_giftcode</c><br/>- <c>telegram_stickerset</c><br/>- <c>telegram_story_album</c><br/>- <c>telegram_collection</c><br/><br/><!-- end type --></summary>
[IfFlag(0)] public string type; [IfFlag(0)] public string type;
/// <summary>Short name of the site (e.g., Google Docs, App Store)</summary> /// <summary>Short name of the site (e.g., Google Docs, App Store)</summary>
[IfFlag(1)] public string site_name; [IfFlag(1)] public string site_name;
@ -14255,6 +14290,12 @@ namespace TL
{ {
public StarGiftBase gift; public StarGiftBase gift;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/webPageAttributeStarGiftCollection"/></para></summary>
[TLDef(0x31CAD303)]
public sealed partial class WebPageAttributeStarGiftCollection : WebPageAttribute
{
public DocumentBase[] icons;
}
/// <summary>How users voted in a poll <para>See <a href="https://corefork.telegram.org/constructor/messages.votesList"/></para></summary> /// <summary>How users voted in a poll <para>See <a href="https://corefork.telegram.org/constructor/messages.votesList"/></para></summary>
[TLDef(0x4899484E)] [TLDef(0x4899484E)]
@ -16190,11 +16231,17 @@ namespace TL
public long stars; public long stars;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputInvoiceStarGiftResale"/></para></summary> /// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputInvoiceStarGiftResale"/></para></summary>
[TLDef(0x63CBC38C)] [TLDef(0xC39F5324)]
public sealed partial class InputInvoiceStarGiftResale : InputInvoice public sealed partial class InputInvoiceStarGiftResale : InputInvoice
{ {
public Flags flags;
public string slug; public string slug;
public InputPeer to_id; public InputPeer to_id;
[Flags] public enum Flags : uint
{
ton = 0x1,
}
} }
/// <summary>Exported <a href="https://corefork.telegram.org/api/links#invoice-links">invoice deep link</a> <para>See <a href="https://corefork.telegram.org/constructor/payments.exportedInvoice"/></para></summary> /// <summary>Exported <a href="https://corefork.telegram.org/api/links#invoice-links">invoice deep link</a> <para>See <a href="https://corefork.telegram.org/constructor/payments.exportedInvoice"/></para></summary>
@ -17433,7 +17480,7 @@ namespace TL
public override int ID => id; public override int ID => id;
} }
/// <summary>Represents a <a href="https://corefork.telegram.org/api/stories">story</a>. <para>See <a href="https://corefork.telegram.org/constructor/storyItem"/></para></summary> /// <summary>Represents a <a href="https://corefork.telegram.org/api/stories">story</a>. <para>See <a href="https://corefork.telegram.org/constructor/storyItem"/></para></summary>
[TLDef(0x79B26A24)] [TLDef(0xEDF164F1)]
public sealed partial class StoryItem : StoryItemBase public sealed partial class StoryItem : StoryItemBase
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
@ -17462,6 +17509,7 @@ namespace TL
[IfFlag(3)] public StoryViews views; [IfFlag(3)] public StoryViews views;
/// <summary>The reaction we sent.</summary> /// <summary>The reaction we sent.</summary>
[IfFlag(15)] public Reaction sent_reaction; [IfFlag(15)] public Reaction sent_reaction;
[IfFlag(19)] public int[] albums;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
@ -17499,6 +17547,8 @@ namespace TL
has_fwd_from = 0x20000, has_fwd_from = 0x20000,
/// <summary>Field <see cref="from_id"/> has a value</summary> /// <summary>Field <see cref="from_id"/> has a value</summary>
has_from_id = 0x40000, has_from_id = 0x40000,
/// <summary>Field <see cref="albums"/> has a value</summary>
has_albums = 0x80000,
} }
/// <summary>ID of the story.</summary> /// <summary>ID of the story.</summary>
@ -19717,6 +19767,7 @@ namespace TL
stargift_resale = 0x400000, stargift_resale = 0x400000,
/// <summary>Fields <see cref="ads_proceeds_from_date"/> and <see cref="ads_proceeds_to_date"/> have a value</summary> /// <summary>Fields <see cref="ads_proceeds_from_date"/> and <see cref="ads_proceeds_to_date"/> have a value</summary>
has_ads_proceeds_from_date = 0x800000, has_ads_proceeds_from_date = 0x800000,
posts_search = 0x1000000,
} }
} }
@ -20154,12 +20205,13 @@ namespace TL
public override string Title => title; public override string Title => title;
public override Peer ReleasedBy => released_by; public override Peer ReleasedBy => released_by;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/starGiftUnique"/></para></summary> /// <summary>Represents a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible star gift, see here »</a> for more info. <para>See <a href="https://corefork.telegram.org/constructor/starGiftUnique"/></para></summary>
[TLDef(0xF63778AE)] [TLDef(0x3A274D50)]
public sealed partial class StarGiftUnique : StarGiftBase public sealed partial class StarGiftUnique : StarGiftBase
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags; public Flags flags;
/// <summary>Identifier of the gift.</summary>
public long id; public long id;
public string title; public string title;
public string slug; public string slug;
@ -20171,7 +20223,7 @@ namespace TL
public int availability_issued; public int availability_issued;
public int availability_total; public int availability_total;
[IfFlag(3)] public string gift_address; [IfFlag(3)] public string gift_address;
[IfFlag(4)] public long resell_stars; [IfFlag(4)] public StarsAmountBase[] resell_amount;
[IfFlag(5)] public Peer released_by; [IfFlag(5)] public Peer released_by;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
@ -20184,13 +20236,15 @@ namespace TL
has_owner_address = 0x4, has_owner_address = 0x4,
/// <summary>Field <see cref="gift_address"/> has a value</summary> /// <summary>Field <see cref="gift_address"/> has a value</summary>
has_gift_address = 0x8, has_gift_address = 0x8,
/// <summary>Field <see cref="resell_stars"/> has a value</summary> /// <summary>Field <see cref="resell_amount"/> has a value</summary>
has_resell_stars = 0x10, has_resell_amount = 0x10,
/// <summary>Field <see cref="released_by"/> has a value</summary> /// <summary>Field <see cref="released_by"/> has a value</summary>
has_released_by = 0x20, has_released_by = 0x20,
require_premium = 0x40, require_premium = 0x40,
resale_ton_only = 0x80,
} }
/// <summary>Identifier of the gift.</summary>
public override long ID => id; public override long ID => id;
public override int AvailabilityTotal => availability_total; public override int AvailabilityTotal => availability_total;
public override string Title => title; public override string Title => title;
@ -20493,45 +20547,62 @@ namespace TL
public string description; public string description;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/type/StarGiftAttribute"/></para> <para>Derived classes: <see cref="StarGiftAttributeModel"/>, <see cref="StarGiftAttributePattern"/>, <see cref="StarGiftAttributeBackdrop"/>, <see cref="StarGiftAttributeOriginalDetails"/></para></summary> /// <summary>An attribute of a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>. <para>See <a href="https://corefork.telegram.org/type/StarGiftAttribute"/></para> <para>Derived classes: <see cref="StarGiftAttributeModel"/>, <see cref="StarGiftAttributePattern"/>, <see cref="StarGiftAttributeBackdrop"/>, <see cref="StarGiftAttributeOriginalDetails"/></para></summary>
public abstract partial class StarGiftAttribute : IObject { } public abstract partial class StarGiftAttribute : IObject { }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeModel"/></para></summary> /// <summary>The model of a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>. <para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeModel"/></para></summary>
[TLDef(0x39D99013)] [TLDef(0x39D99013)]
public sealed partial class StarGiftAttributeModel : StarGiftAttribute public sealed partial class StarGiftAttributeModel : StarGiftAttribute
{ {
/// <summary>Name of the model</summary>
public string name; public string name;
/// <summary>The <a href="https://corefork.telegram.org/api/stickers">sticker</a> representing the upgraded gift</summary>
public DocumentBase document; public DocumentBase document;
/// <summary>The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded.</summary>
public int rarity_permille; public int rarity_permille;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributePattern"/></para></summary> /// <summary>A <a href="https://corefork.telegram.org/api/stickers">sticker</a> applied on the backdrop of a <a href="https://corefork.telegram.org/api/gifts">collectible gift »</a> using a repeating pattern. <para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributePattern"/></para></summary>
[TLDef(0x13ACFF19)] [TLDef(0x13ACFF19)]
public sealed partial class StarGiftAttributePattern : StarGiftAttribute public sealed partial class StarGiftAttributePattern : StarGiftAttribute
{ {
/// <summary>Name of the symbol</summary>
public string name; public string name;
/// <summary>The symbol</summary>
public DocumentBase document; public DocumentBase document;
/// <summary>The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded.</summary>
public int rarity_permille; public int rarity_permille;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeBackdrop"/></para></summary> /// <summary>The backdrop of a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>. <para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeBackdrop"/></para></summary>
[TLDef(0xD93D859C)] [TLDef(0xD93D859C)]
public sealed partial class StarGiftAttributeBackdrop : StarGiftAttribute public sealed partial class StarGiftAttributeBackdrop : StarGiftAttribute
{ {
/// <summary>Name of the backdrop</summary>
public string name; public string name;
/// <summary>Unique ID of the backdrop</summary>
public int backdrop_id; public int backdrop_id;
/// <summary>Color of the center of the backdrop in RGB24 format.</summary>
public int center_color; public int center_color;
/// <summary>Color of the edges of the backdrop in RGB24 format.</summary>
public int edge_color; public int edge_color;
/// <summary>Color of the <see cref="StarGiftAttributePattern"/> applied on the backdrop in RGB24 format.</summary>
public int pattern_color; public int pattern_color;
/// <summary>Color of the text on the backdrop in RGB24 format.</summary>
public int text_color; public int text_color;
/// <summary>The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded.</summary>
public int rarity_permille; public int rarity_permille;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeOriginalDetails"/></para></summary> /// <summary>Info about the sender, receiver and message attached to the original <a href="https://corefork.telegram.org/api/gifts">gift »</a>, before it was upgraded to a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>. <para>See <a href="https://corefork.telegram.org/constructor/starGiftAttributeOriginalDetails"/></para></summary>
[TLDef(0xE0BFF26C)] [TLDef(0xE0BFF26C)]
public sealed partial class StarGiftAttributeOriginalDetails : StarGiftAttribute public sealed partial class StarGiftAttributeOriginalDetails : StarGiftAttribute
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary> /// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags; public Flags flags;
/// <summary>Original sender of the gift, absent if the gift was private.</summary>
[IfFlag(0)] public Peer sender_id; [IfFlag(0)] public Peer sender_id;
/// <summary>Original receiver of the gift.</summary>
public Peer recipient_id; public Peer recipient_id;
/// <summary>When was the gift sent.</summary>
public DateTime date; public DateTime date;
/// <summary>Original message attached to the gift, if present.</summary>
[IfFlag(1)] public TextWithEntities message; [IfFlag(1)] public TextWithEntities message;
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
@ -20543,10 +20614,11 @@ namespace TL
} }
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/payments.starGiftUpgradePreview"/></para></summary> /// <summary>A preview of the possible attributes (chosen randomly) a <a href="https://corefork.telegram.org/api/gifts">gift »</a> can receive after upgrading it to a <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">collectible gift »</a>, see <a href="https://corefork.telegram.org/api/gifts#collectible-gifts">here »</a> for more info. <para>See <a href="https://corefork.telegram.org/constructor/payments.starGiftUpgradePreview"/></para></summary>
[TLDef(0x167BD90B)] [TLDef(0x167BD90B)]
public sealed partial class Payments_StarGiftUpgradePreview : IObject public sealed partial class Payments_StarGiftUpgradePreview : IObject
{ {
/// <summary>Possible gift attributes</summary>
public StarGiftAttribute[] sample_attributes; public StarGiftAttribute[] sample_attributes;
} }
@ -20657,17 +20729,20 @@ namespace TL
/// <summary><para>See <a href="https://corefork.telegram.org/type/InputSavedStarGift"/></para> <para>Derived classes: <see cref="InputSavedStarGiftUser"/>, <see cref="InputSavedStarGiftChat"/>, <see cref="InputSavedStarGiftSlug"/></para></summary> /// <summary><para>See <a href="https://corefork.telegram.org/type/InputSavedStarGift"/></para> <para>Derived classes: <see cref="InputSavedStarGiftUser"/>, <see cref="InputSavedStarGiftChat"/>, <see cref="InputSavedStarGiftSlug"/></para></summary>
public abstract partial class InputSavedStarGift : IObject { } public abstract partial class InputSavedStarGift : IObject { }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftUser"/></para></summary> /// <summary>A gift received in a private chat with another user. <para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftUser"/></para></summary>
[TLDef(0x69279795)] [TLDef(0x69279795)]
public sealed partial class InputSavedStarGiftUser : InputSavedStarGift public sealed partial class InputSavedStarGiftUser : InputSavedStarGift
{ {
/// <summary>ID of the <see cref="MessageService"/> with the <see cref="MessageActionStarGift"/> with the gift.</summary>
public int msg_id; public int msg_id;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftChat"/></para></summary> /// <summary>A gift received by a channel we own. <para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftChat"/></para></summary>
[TLDef(0xF101AA7F)] [TLDef(0xF101AA7F)]
public sealed partial class InputSavedStarGiftChat : InputSavedStarGift public sealed partial class InputSavedStarGiftChat : InputSavedStarGift
{ {
/// <summary>The channel.</summary>
public InputPeer peer; public InputPeer peer;
/// <summary>ID of the gift, must be the <c>saved_id</c> of a <see cref="MessageActionStarGift"/>/<see cref="MessageActionStarGiftUnique"/>.</summary>
public long saved_id; public long saved_id;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftSlug"/></para></summary> /// <summary><para>See <a href="https://corefork.telegram.org/constructor/inputSavedStarGiftSlug"/></para></summary>
@ -20697,23 +20772,25 @@ namespace TL
public InputPeer peer; public InputPeer peer;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/account.paidMessagesRevenue"/></para></summary> /// <summary>Total number of non-refunded <a href="https://corefork.telegram.org/api/stars">Telegram Stars</a> a user has spent on sending us messages either directly or through a channel, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for more info on paid messages. <para>See <a href="https://corefork.telegram.org/constructor/account.paidMessagesRevenue"/></para></summary>
[TLDef(0x1E109708)] [TLDef(0x1E109708)]
public sealed partial class Account_PaidMessagesRevenue : IObject public sealed partial class Account_PaidMessagesRevenue : IObject
{ {
/// <summary>Amount in <a href="https://corefork.telegram.org/api/stars">Stars</a>.</summary>
public long stars_amount; public long stars_amount;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/type/RequirementToContact"/></para> <para>Derived classes: <see cref="RequirementToContactPremium"/>, <see cref="RequirementToContactPaidMessages"/></para></summary> /// <summary>Specifies a requirement that must be satisfied in order to contact a user. <para>See <a href="https://corefork.telegram.org/type/RequirementToContact"/></para> <para>Derived classes: <see cref="RequirementToContactPremium"/>, <see cref="RequirementToContactPaidMessages"/></para></summary>
/// <remarks>a <see langword="null"/> value means <a href="https://corefork.telegram.org/constructor/requirementToContactEmpty">requirementToContactEmpty</a></remarks> /// <remarks>a <see langword="null"/> value means <a href="https://corefork.telegram.org/constructor/requirementToContactEmpty">requirementToContactEmpty</a></remarks>
public abstract partial class RequirementToContact : IObject { } public abstract partial class RequirementToContact : IObject { }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/requirementToContactPremium"/></para></summary> /// <summary>This user requires us to buy a <a href="https://corefork.telegram.org/api/premium">Premium</a> subscription in order to contact them. <para>See <a href="https://corefork.telegram.org/constructor/requirementToContactPremium"/></para></summary>
[TLDef(0xE581E4E9)] [TLDef(0xE581E4E9)]
public sealed partial class RequirementToContactPremium : RequirementToContact { } public sealed partial class RequirementToContactPremium : RequirementToContact { }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/requirementToContactPaidMessages"/></para></summary> /// <summary>This user requires us to pay the specified amount of <a href="https://corefork.telegram.org/api/stars">Telegram Stars</a> to send them a message, see <a href="https://corefork.telegram.org/api/paid-messages">here »</a> for the full flow. <para>See <a href="https://corefork.telegram.org/constructor/requirementToContactPaidMessages"/></para></summary>
[TLDef(0xB4F67E93)] [TLDef(0xB4F67E93)]
public sealed partial class RequirementToContactPaidMessages : RequirementToContact public sealed partial class RequirementToContactPaidMessages : RequirementToContact
{ {
/// <summary>The required amount of <a href="https://corefork.telegram.org/api/stars">Telegram Stars</a>.</summary>
public long stars_amount; public long stars_amount;
} }
@ -20922,6 +20999,7 @@ namespace TL
[TLDef(0x1B0E4F07)] [TLDef(0x1B0E4F07)]
public sealed partial class StarsRating : IObject public sealed partial class StarsRating : IObject
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags; public Flags flags;
public int level; public int level;
public long current_level_stars; public long current_level_stars;
@ -20930,6 +21008,7 @@ namespace TL
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
/// <summary>Field <see cref="next_level_stars"/> has a value</summary>
has_next_level_stars = 0x1, has_next_level_stars = 0x1,
} }
} }
@ -20938,6 +21017,7 @@ namespace TL
[TLDef(0x9D6B13B0)] [TLDef(0x9D6B13B0)]
public sealed partial class StarGiftCollection : IObject public sealed partial class StarGiftCollection : IObject
{ {
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags; public Flags flags;
public int collection_id; public int collection_id;
public string title; public string title;
@ -20947,6 +21027,7 @@ namespace TL
[Flags] public enum Flags : uint [Flags] public enum Flags : uint
{ {
/// <summary>Field <see cref="icon"/> has a value</summary>
has_icon = 0x1, has_icon = 0x1,
} }
} }
@ -20958,4 +21039,52 @@ namespace TL
{ {
public StarGiftCollection[] collections; public StarGiftCollection[] collections;
} }
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/storyAlbum"/></para></summary>
[TLDef(0x9325705A)]
public sealed partial class StoryAlbum : IObject
{
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags;
public int album_id;
public string title;
[IfFlag(0)] public PhotoBase icon_photo;
[IfFlag(1)] public DocumentBase icon_video;
[Flags] public enum Flags : uint
{
/// <summary>Field <see cref="icon_photo"/> has a value</summary>
has_icon_photo = 0x1,
/// <summary>Field <see cref="icon_video"/> has a value</summary>
has_icon_video = 0x2,
}
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/stories.albums"/></para></summary>
/// <remarks>a <see langword="null"/> value means <a href="https://corefork.telegram.org/constructor/stories.albumsNotModified">stories.albumsNotModified</a></remarks>
[TLDef(0xC3987A3A)]
public sealed partial class Stories_Albums : IObject
{
public long hash;
public StoryAlbum[] albums;
}
/// <summary><para>See <a href="https://corefork.telegram.org/constructor/searchPostsFlood"/></para></summary>
[TLDef(0x3E0B5B6A)]
public sealed partial class SearchPostsFlood : IObject
{
/// <summary>Extra bits of information, use <c>flags.HasFlag(...)</c> to test for those</summary>
public Flags flags;
public int total_daily;
public int remains;
[IfFlag(1)] public int wait_till;
public long stars_amount;
[Flags] public enum Flags : uint
{
query_is_free = 0x1,
/// <summary>Field <see cref="wait_till"/> has a value</summary>
has_wait_till = 0x2,
}
}
} }

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@ namespace TL
{ {
public static partial class Layer public static partial class Layer
{ {
public const int Version = 210; // fetched 25/07/2025 14:54:33 public const int Version = 211; // fetched 16/08/2025 00:21:53
internal const int SecretChats = 144; internal const int SecretChats = 144;
internal const int MTProto2 = 73; internal const int MTProto2 = 73;
internal const uint VectorCtor = 0x1CB5C415; internal const uint VectorCtor = 0x1CB5C415;
@ -216,7 +216,7 @@ namespace TL
[0x45D5B021] = typeof(MessageActionGiftStars), [0x45D5B021] = typeof(MessageActionGiftStars),
[0xB00C47A2] = typeof(MessageActionPrizeStars), [0xB00C47A2] = typeof(MessageActionPrizeStars),
[0x4717E8A4] = typeof(MessageActionStarGift), [0x4717E8A4] = typeof(MessageActionStarGift),
[0x2E3AE60E] = typeof(MessageActionStarGiftUnique), [0x34F762F3] = typeof(MessageActionStarGiftUnique),
[0xAC1F1FCD] = typeof(MessageActionPaidMessagesRefunded), [0xAC1F1FCD] = typeof(MessageActionPaidMessagesRefunded),
[0x84B88578] = typeof(MessageActionPaidMessagesPrice), [0x84B88578] = typeof(MessageActionPaidMessagesPrice),
[0x2FFE2F7A] = typeof(MessageActionConferenceCall), [0x2FFE2F7A] = typeof(MessageActionConferenceCall),
@ -254,7 +254,7 @@ namespace TL
[0xF47741F7] = typeof(PeerSettings), [0xF47741F7] = typeof(PeerSettings),
[0xA437C3ED] = typeof(WallPaper), [0xA437C3ED] = typeof(WallPaper),
[0xE0804116] = typeof(WallPaperNoFile), [0xE0804116] = typeof(WallPaperNoFile),
[0x29DE80BE] = typeof(UserFull), [0x7E63CE1F] = typeof(UserFull),
[0x145ADE0B] = typeof(Contact), [0x145ADE0B] = typeof(Contact),
[0xC13E3C50] = typeof(ImportedContact), [0xC13E3C50] = typeof(ImportedContact),
[0x16D9703B] = typeof(ContactStatus), [0x16D9703B] = typeof(ContactStatus),
@ -267,7 +267,7 @@ namespace TL
[0x71E094F3] = typeof(Messages_DialogsSlice), [0x71E094F3] = typeof(Messages_DialogsSlice),
[0xF0E3E596] = typeof(Messages_DialogsNotModified), [0xF0E3E596] = typeof(Messages_DialogsNotModified),
[0x8C718E87] = typeof(Messages_Messages), [0x8C718E87] = typeof(Messages_Messages),
[0x3A54685E] = typeof(Messages_MessagesSlice), [0x762B263D] = typeof(Messages_MessagesSlice),
[0xC776BA4E] = typeof(Messages_ChannelMessages), [0xC776BA4E] = typeof(Messages_ChannelMessages),
[0x74535F21] = typeof(Messages_MessagesNotModified), [0x74535F21] = typeof(Messages_MessagesNotModified),
[0x64FF9FD5] = typeof(Messages_Chats), [0x64FF9FD5] = typeof(Messages_Chats),
@ -1008,6 +1008,7 @@ namespace TL
[0x2E94C3E7] = typeof(WebPageAttributeStory), [0x2E94C3E7] = typeof(WebPageAttributeStory),
[0x50CC03D3] = typeof(WebPageAttributeStickerSet), [0x50CC03D3] = typeof(WebPageAttributeStickerSet),
[0xCF6F6DB8] = typeof(WebPageAttributeUniqueStarGift), [0xCF6F6DB8] = typeof(WebPageAttributeUniqueStarGift),
[0x31CAD303] = typeof(WebPageAttributeStarGiftCollection),
[0x4899484E] = typeof(Messages_VotesList), [0x4899484E] = typeof(Messages_VotesList),
[0xF568028A] = typeof(BankCardOpenUrl), [0xF568028A] = typeof(BankCardOpenUrl),
[0x3E24E573] = typeof(Payments_BankCardData), [0x3E24E573] = typeof(Payments_BankCardData),
@ -1128,7 +1129,7 @@ namespace TL
[0x4A5F5BD9] = typeof(InputInvoiceStarGiftTransfer), [0x4A5F5BD9] = typeof(InputInvoiceStarGiftTransfer),
[0xDABAB2EF] = typeof(InputInvoicePremiumGiftStars), [0xDABAB2EF] = typeof(InputInvoicePremiumGiftStars),
[0xF4997E42] = typeof(InputInvoiceBusinessBotTransferStars), [0xF4997E42] = typeof(InputInvoiceBusinessBotTransferStars),
[0x63CBC38C] = typeof(InputInvoiceStarGiftResale), [0xC39F5324] = typeof(InputInvoiceStarGiftResale),
[0xAED0CBD9] = typeof(Payments_ExportedInvoice), [0xAED0CBD9] = typeof(Payments_ExportedInvoice),
[0xCFB9D957] = typeof(Messages_TranscribedAudio), [0xCFB9D957] = typeof(Messages_TranscribedAudio),
[0x5334759C] = typeof(Help_PremiumPromo), [0x5334759C] = typeof(Help_PremiumPromo),
@ -1213,7 +1214,7 @@ namespace TL
[0x8D595CD6] = typeof(StoryViews), [0x8D595CD6] = typeof(StoryViews),
[0x51E6EE4F] = typeof(StoryItemDeleted), [0x51E6EE4F] = typeof(StoryItemDeleted),
[0xFFADC913] = typeof(StoryItemSkipped), [0xFFADC913] = typeof(StoryItemSkipped),
[0x79B26A24] = typeof(StoryItem), [0xEDF164F1] = typeof(StoryItem),
[0x1158FE3E] = typeof(Stories_AllStoriesNotModified), [0x1158FE3E] = typeof(Stories_AllStoriesNotModified),
[0x6EFC5E81] = typeof(Stories_AllStories), [0x6EFC5E81] = typeof(Stories_AllStories),
[0x63C3DD0A] = typeof(Stories_Stories), [0x63C3DD0A] = typeof(Stories_Stories),
@ -1362,7 +1363,7 @@ namespace TL
[0x94CE852A] = typeof(StarsGiveawayOption), [0x94CE852A] = typeof(StarsGiveawayOption),
[0x54236209] = typeof(StarsGiveawayWinnersOption), [0x54236209] = typeof(StarsGiveawayWinnersOption),
[0x00BCFF5B] = typeof(StarGift), [0x00BCFF5B] = typeof(StarGift),
[0xF63778AE] = typeof(StarGiftUnique), [0x3A274D50] = typeof(StarGiftUnique),
[0xA388A368] = null,//Payments_StarGiftsNotModified [0xA388A368] = null,//Payments_StarGiftsNotModified
[0x2ED82995] = typeof(Payments_StarGifts), [0x2ED82995] = typeof(Payments_StarGifts),
[0x7903E3D9] = typeof(MessageReportOption), [0x7903E3D9] = typeof(MessageReportOption),
@ -1424,6 +1425,10 @@ namespace TL
[0x9D6B13B0] = typeof(StarGiftCollection), [0x9D6B13B0] = typeof(StarGiftCollection),
[0xA0BA4F17] = null,//Payments_StarGiftCollectionsNotModified [0xA0BA4F17] = null,//Payments_StarGiftCollectionsNotModified
[0x8A2932F3] = typeof(Payments_StarGiftCollections), [0x8A2932F3] = typeof(Payments_StarGiftCollections),
[0x9325705A] = typeof(StoryAlbum),
[0x564EDAEB] = null,//Stories_AlbumsNotModified
[0xC3987A3A] = typeof(Stories_Albums),
[0x3E0B5B6A] = typeof(SearchPostsFlood),
// from TL.Secret: // from TL.Secret:
[0x6ABD9782] = typeof(Layer143.DecryptedMessageMediaDocument), [0x6ABD9782] = typeof(Layer143.DecryptedMessageMediaDocument),
[0x020DF5D0] = typeof(Layer101.MessageEntityBlockquote), [0x020DF5D0] = typeof(Layer101.MessageEntityBlockquote),
@ -1558,6 +1563,7 @@ namespace TL
[typeof(RequirementToContact)] = 0x050A9839, //requirementToContactEmpty [typeof(RequirementToContact)] = 0x050A9839, //requirementToContactEmpty
[typeof(Contacts_SponsoredPeers)] = 0xEA32B4B1, //contacts.sponsoredPeersEmpty [typeof(Contacts_SponsoredPeers)] = 0xEA32B4B1, //contacts.sponsoredPeersEmpty
[typeof(Payments_StarGiftCollections)] = 0xA0BA4F17, //payments.starGiftCollectionsNotModified [typeof(Payments_StarGiftCollections)] = 0xA0BA4F17, //payments.starGiftCollectionsNotModified
[typeof(Stories_Albums)] = 0x564EDAEB, //stories.albumsNotModified
[typeof(DecryptedMessageMedia)] = 0x089F5C4A, //decryptedMessageMediaEmpty [typeof(DecryptedMessageMedia)] = 0x089F5C4A, //decryptedMessageMediaEmpty
}; };
} }

View file

@ -13,8 +13,8 @@
<PackageId>WTelegramClient</PackageId> <PackageId>WTelegramClient</PackageId>
<Authors>Wizou</Authors> <Authors>Wizou</Authors>
<VersionPrefix>0.0.0</VersionPrefix> <VersionPrefix>0.0.0</VersionPrefix>
<VersionSuffix>layer.210</VersionSuffix> <VersionSuffix>layer.211</VersionSuffix>
<Description>Telegram Client API (MTProto) library written 100% in C# and .NET Standard | Latest API layer: 210 <Description>Telegram Client API (MTProto) library written 100% in C# and .NET Standard | Latest API layer: 211
Release Notes: Release Notes:
$(ReleaseNotes.Replace("|", "%0D%0A").Replace(" - ","%0D%0A- ").Replace(" ", "%0D%0A%0D%0A"))</Description> $(ReleaseNotes.Replace("|", "%0D%0A").Replace(" - ","%0D%0A- ").Replace(" ", "%0D%0A%0D%0A"))</Description>