Gifts: Support selling in profile

This commit is contained in:
zubiden 2025-05-14 19:02:27 +03:00 committed by Alexander Zinchuk
parent 5c2e5dfcb4
commit 92cdf9feb5
65 changed files with 1669 additions and 365 deletions

View File

@ -95,6 +95,9 @@ export interface GramJsAppConfig extends LimitsConfig {
freeze_since_date?: number;
freeze_until_date?: number;
freeze_appeal_url?: string;
stars_stargift_resale_amount_max?: number;
stars_stargift_resale_amount_min?: number;
stars_stargift_resale_commission_permille?: number;
}
function buildEmojiSounds(appConfig: GramJsAppConfig) {
@ -191,5 +194,8 @@ export function buildAppConfig(json: GramJs.TypeJSONValue, hash: number): ApiApp
freezeSinceDate: appConfig.freeze_since_date,
freezeUntilDate: appConfig.freeze_until_date,
freezeAppealUrl: appConfig.freeze_appeal_url,
starsStargiftResaleAmountMin: appConfig.stars_stargift_resale_amount_min,
starsStargiftResaleAmountMax: appConfig.stars_stargift_resale_amount_max,
starsStargiftResaleCommissionPermille: appConfig.stars_stargift_resale_commission_permille,
};
}

View File

@ -102,7 +102,8 @@ export function buildApiGroupCall(groupCall: GramJs.TypeGroupCall): ApiGroupCall
}
export function getGroupCallId(groupCall: GramJs.TypeInputGroupCall) {
return groupCall.id.toString();
if (groupCall instanceof GramJs.InputGroupCall) return groupCall.id.toString();
return undefined;
}
export function buildPhoneCall(call: GramJs.TypePhoneCall): ApiPhoneCall {

View File

@ -18,7 +18,7 @@ export function buildApiStarGift(starGift: GramJs.TypeStarGift): ApiStarGift {
if (starGift instanceof GramJs.StarGiftUnique) {
const {
id, num, ownerId, ownerName, title, attributes, availabilityIssued, availabilityTotal, slug, ownerAddress,
giftAddress,
giftAddress, resellStars,
} = starGift;
return {
@ -34,12 +34,13 @@ export function buildApiStarGift(starGift: GramJs.TypeStarGift): ApiStarGift {
issuedCount: availabilityIssued,
slug,
giftAddress,
resellPriceInStars: resellStars?.toJSNumber(),
};
}
const {
id, limited, stars, availabilityRemains, availabilityTotal, convertStars, firstSaleDate, lastSaleDate, soldOut,
birthday, upgradeStars,
birthday, upgradeStars, resellMinStars, title,
} = starGift;
addDocumentToLocalDb(starGift.sticker);
@ -60,6 +61,8 @@ export function buildApiStarGift(starGift: GramJs.TypeStarGift): ApiStarGift {
isSoldOut: soldOut,
isBirthday: birthday,
upgradeStars: upgradeStars?.toJSNumber(),
title,
resellMinStars: resellMinStars?.toJSNumber(),
};
}
@ -132,7 +135,7 @@ export function buildApiStarGiftAttribute(attribute: GramJs.TypeStarGiftAttribut
export function buildApiSavedStarGift(userStarGift: GramJs.SavedStarGift, peerId: string): ApiSavedStarGift {
const {
gift, date, convertStars, fromId, message, msgId, nameHidden, unsaved, upgradeStars, transferStars, canUpgrade,
savedId, canExportAt, pinnedToTop,
savedId, canExportAt, pinnedToTop, canResellAt, canTransferAt,
} = userStarGift;
const inputGift: ApiInputSavedStarGift | undefined = savedId && peerId
@ -154,6 +157,8 @@ export function buildApiSavedStarGift(userStarGift: GramJs.SavedStarGift, peerId
inputGift,
savedId: savedId?.toString(),
canExportAt,
canResellAt,
canTransferAt,
isPinned: pinnedToTop,
};
}

View File

@ -187,6 +187,9 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess
}
if (action instanceof GramJs.MessageActionGroupCall) {
const { call, duration } = action;
if (!(call instanceof GramJs.InputGroupCall)) {
return UNSUPPORTED_ACTION;
}
return {
mediaType: 'action',
type: 'groupCall',
@ -199,6 +202,9 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess
}
if (action instanceof GramJs.MessageActionInviteToGroupCall) {
const { call, users } = action;
if (!(call instanceof GramJs.InputGroupCall)) {
return UNSUPPORTED_ACTION;
}
return {
mediaType: 'action',
type: 'inviteToGroupCall',
@ -211,6 +217,9 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess
}
if (action instanceof GramJs.MessageActionGroupCallScheduled) {
const { call, scheduleDate } = action;
if (!(call instanceof GramJs.InputGroupCall)) {
return UNSUPPORTED_ACTION;
}
return {
mediaType: 'action',
type: 'groupCallScheduled',
@ -393,6 +402,7 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess
if (action instanceof GramJs.MessageActionStarGiftUnique) {
const {
upgrade, transferred, saved, refunded, gift, canExportAt, transferStars, fromId, peer, savedId,
resaleStars,
} = action;
const starGift = buildApiStarGift(gift);
@ -411,6 +421,7 @@ export function buildApiMessageAction(action: GramJs.TypeMessageAction): ApiMess
fromId: fromId && getApiChatIdFromMtpPeer(fromId),
peerId: peer && getApiChatIdFromMtpPeer(peer),
savedId: savedId && buildApiPeerId(savedId, 'user'),
resaleStars: resaleStars?.toJSNumber(),
};
}
if (action instanceof GramJs.MessageActionPaidMessagesPrice) {

View File

@ -536,6 +536,7 @@ export function buildApiStarsTransaction(transaction: GramJs.StarsTransaction):
const {
date, id, peer, stars, description, photo, title, refund, extendedMedia, failed, msgId, pending, gift, reaction,
subscriptionPeriod, stargift, giveawayPostId, starrefCommissionPermille, stargiftUpgrade, paidMessages,
stargiftResale,
} = transaction;
if (photo) {
@ -567,6 +568,7 @@ export function buildApiStarsTransaction(transaction: GramJs.StarsTransaction):
giveawayPostId,
starRefCommision,
isGiftUpgrade: stargiftUpgrade,
isGiftResale: stargiftResale,
paidMessages,
};
}

View File

@ -687,6 +687,16 @@ export function buildInputInvoice(invoice: ApiRequestInputInvoice) {
});
}
case 'stargiftResale': {
const {
peer, slug,
} = invoice;
return new GramJs.InputInvoiceStarGiftResale({
toId: buildInputPeer(peer.id, peer.accessHash),
slug,
});
}
case 'stargift': {
const {
peer, shouldHideName, giftId, message, shouldUpgrade,

View File

@ -543,6 +543,8 @@ async function getFullChatInfo(chatId: string): Promise<FullChatData | undefined
const userStatusesById = buildApiUserStatuses(result.users);
const chats = result.chats.map((chat) => buildApiChatFromPreview(chat)).filter(Boolean);
const groupCall = call instanceof GramJs.InputGroupCall ? call : undefined;
return {
fullInfo: {
...(chatPhoto instanceof GramJs.Photo && { profilePhoto: buildApiPhoto(chatPhoto) }),
@ -552,7 +554,7 @@ async function getFullChatInfo(chatId: string): Promise<FullChatData | undefined
canViewMembers: true,
botCommands,
inviteLink,
groupCallId: call?.id.toString(),
groupCallId: groupCall?.id.toString(),
enabledReactions: buildApiChatReactions(availableReactions),
reactionsLimit,
requestsPending,
@ -563,11 +565,11 @@ async function getFullChatInfo(chatId: string): Promise<FullChatData | undefined
},
chats,
userStatusesById,
groupCall: call ? {
groupCall: groupCall ? {
chatId,
isLoaded: false,
id: call.id.toString(),
accessHash: call.accessHash.toString(),
id: groupCall.id.toString(),
accessHash: groupCall.accessHash.toString(),
connectionState: 'disconnected',
participantsCount: 0,
version: 0,
@ -678,6 +680,8 @@ async function getFullChannelInfo(
...adminStatusesById,
};
const groupCall = call instanceof GramJs.InputGroupCall ? call : undefined;
return {
fullInfo: {
...(chatPhoto instanceof GramJs.Photo && { profilePhoto: buildApiPhoto(chatPhoto) }),
@ -700,7 +704,7 @@ async function getFullChannelInfo(
members,
kickedMembers,
adminMembersById: adminMembers ? buildCollectionByKey(adminMembers, 'userId') : undefined,
groupCallId: call ? String(call.id) : undefined,
groupCallId: groupCall ? String(groupCall.id) : undefined,
linkedChatId: linkedChatId ? buildApiPeerId(linkedChatId, 'channel') : undefined,
botCommands,
enabledReactions: buildApiChatReactions(availableReactions),
@ -725,11 +729,11 @@ async function getFullChannelInfo(
},
chats,
userStatusesById: statusesById,
groupCall: call ? {
groupCall: groupCall ? {
chatId: id,
isLoaded: false,
id: call.id.toString(),
accessHash: call?.accessHash.toString(),
id: groupCall.id.toString(),
accessHash: groupCall?.accessHash.toString(),
participants: {},
version: 0,
participantsCount: 0,

View File

@ -331,6 +331,21 @@ export function toggleSavedGiftPinned({
});
}
export function updateStarGiftPrice({
inputSavedGift,
price,
}: {
inputSavedGift: ApiRequestInputSavedStarGift;
price: number;
}) {
return invokeRequest(new GramJs.payments.UpdateStarGiftPrice({
stargift: buildInputSavedStarGift(inputSavedGift),
resellStars: bigInt(price),
}), {
shouldReturnTrue: true,
});
}
export async function fetchStarGiftWithdrawalUrl({
inputGift,
password,

View File

@ -241,13 +241,14 @@ export function updater(update: Update) {
});
}
} else if (action instanceof GramJs.MessageActionGroupCall) {
if (!action.duration && action.call) {
const groupCall = action.call instanceof GramJs.InputGroupCall ? action.call : undefined;
if (!action.duration && groupCall) {
sendApiUpdate({
'@type': 'updateGroupCallChatId',
chatId: message.chatId,
call: {
id: action.call.id.toString(),
accessHash: action.call.accessHash.toString(),
id: groupCall.id.toString(),
accessHash: groupCall.accessHash.toString(),
},
});
}
@ -905,11 +906,14 @@ export function updater(update: Update) {
presentation: Boolean(update.presentation),
});
} else if (update instanceof GramJs.UpdateGroupCallParticipants) {
sendApiUpdate({
'@type': 'updateGroupCallParticipants',
groupCallId: getGroupCallId(update.call),
participants: update.participants.map(buildApiGroupCallParticipant),
});
const groupCallId = getGroupCallId(update.call);
if (groupCallId) {
sendApiUpdate({
'@type': 'updateGroupCallParticipants',
groupCallId,
participants: update.participants.map(buildApiGroupCallParticipant),
});
}
} else if (update instanceof GramJs.UpdatePendingJoinRequests) {
sendApiUpdate({
'@type': 'updatePendingJoinRequests',

View File

@ -254,6 +254,7 @@ export interface ApiMessageActionStarGiftUnique extends ActionMediaType {
fromId?: string;
peerId?: string;
savedId?: string;
resaleStars?: number;
}
export interface ApiMessageActionChannelJoined extends ActionMediaType {

View File

@ -246,6 +246,9 @@ export interface ApiAppConfig {
freezeSinceDate?: number;
freezeUntilDate?: number;
freezeAppealUrl?: string;
starsStargiftResaleAmountMin?: number;
starsStargiftResaleAmountMax?: number;
starsStargiftResaleCommissionPermille?: number;
}
export interface ApiConfig {

View File

@ -360,6 +360,12 @@ export type ApiInputInvoiceStarGift = {
shouldUpgrade?: true;
};
export type ApiInputInvoiceStarGiftResale = {
type: 'stargiftResale';
slug: string;
peerId: string;
};
export type ApiInputInvoiceStarsGiveaway = {
type: 'starsgiveaway';
chatId: string;
@ -395,7 +401,7 @@ export type ApiInputInvoiceStarGiftTransfer = {
export type ApiInputInvoice = ApiInputInvoiceMessage | ApiInputInvoiceSlug | ApiInputInvoiceGiveaway
| ApiInputInvoiceGiftCode | ApiInputInvoicePremiumGiftStars | ApiInputInvoiceStars | ApiInputInvoiceStarsGift
| ApiInputInvoiceStarsGiveaway | ApiInputInvoiceStarGift | ApiInputInvoiceChatInviteSubscription
| ApiInputInvoiceStarGiftUpgrade | ApiInputInvoiceStarGiftTransfer;
| ApiInputInvoiceStarGiftUpgrade | ApiInputInvoiceStarGiftTransfer | ApiInputInvoiceStarGiftResale;
/* Used for Invoice request */
export type ApiRequestInputInvoiceMessage = {
@ -441,6 +447,12 @@ export type ApiRequestInputInvoiceStarGift = {
shouldUpgrade?: true;
};
export type ApiRequestInputInvoiceStarGiftResale = {
type: 'stargiftResale';
slug: string;
peer: ApiPeer;
};
export type ApiRequestInputInvoiceChatInviteSubscription = {
type: 'chatInviteSubscription';
hash: string;
@ -461,4 +473,5 @@ export type ApiRequestInputInvoiceStarGiftTransfer = {
export type ApiRequestInputInvoice = ApiRequestInputInvoiceMessage | ApiRequestInputInvoiceSlug
| ApiRequestInputInvoiceGiveaway | ApiRequestInputInvoiceStars | ApiRequestInputInvoiceStarsGiveaway
| ApiRequestInputInvoiceChatInviteSubscription | ApiRequestInputInvoiceStarGift | ApiRequestInputInvoiceStarGiftUpgrade
| ApiRequestInputInvoiceStarGiftTransfer | ApiRequestInputInvoicePremiumGiftStars;
| ApiRequestInputInvoiceStarGiftTransfer | ApiRequestInputInvoicePremiumGiftStars
| ApiRequestInputInvoiceStarGiftResale;

View File

@ -16,6 +16,8 @@ export interface ApiStarGiftRegular {
lastSaleDate?: number;
isBirthday?: true;
upgradeStars?: number;
resellMinStars?: number;
title?: string;
}
export interface ApiStarGiftUnique {
@ -31,6 +33,7 @@ export interface ApiStarGiftUnique {
attributes: ApiStarGiftAttribute[];
slug: string;
giftAddress?: string;
resellPriceInStars?: number;
}
export type ApiStarGift = ApiStarGiftRegular | ApiStarGiftUnique;
@ -85,6 +88,8 @@ export interface ApiSavedStarGift {
alreadyPaidUpgradeStars?: number;
transferStars?: number;
canExportAt?: number;
canTransferAt?: number;
canResellAt?: number;
isPinned?: boolean;
isConverted?: boolean; // Local field, used for Action Message
upgradeMsgId?: number; // Local field, used for Action Message
@ -180,6 +185,7 @@ export interface ApiStarsTransaction {
subscriptionPeriod?: number;
starRefCommision?: number;
isGiftUpgrade?: true;
isGiftResale?: true;
paidMessages?: number;
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M27.3 12.375h.3c1.2 0 2.1-.9 2.1-2.1s-.9-2.1-2.1-2.1-2.1.9-2.1 2.1c0 .5.1.9.4 1.2h-4.5l-4.4-4.4c.3-.2.5-.4.6-.7.2-.3.2-.6.2-1q0-.9-.6-1.5t-1.5-.6-1.5.6-.6 1.5c0 .3.1.7.2 1 .2.3.4.5.6.7l-1.6 1.9-5.7-5.6c-.5-.5-1.3-.5-1.8 0s-.5 1.3 0 1.8l20.9 20.9c.5.5 1.3.5 1.8 0s.5-1.3 0-1.8l-2.3-2.3c.1-.2.2-.4.2-.7zm-12.4-1.2 1-1 4.7 4.8h3.5l-.7 4.7zM8.5 20.675l-.9-5.8h1.7c.7 0 1-.8.5-1.3l-2-2.1h-2c.3-.5.5-1.1.3-1.8-.2-.6-.7-1.2-1.5-1.4-1.4-.4-2.6.7-2.6 2 0 1.2.9 2.1 2.1 2.1h.3l1.4 8.9c.2 1.3 1.3 2.2 2.6 2.2h9.5c.7 0 1-.8.5-1.3l-1.5-1.5zM24.2 25.575H7.6c-.8 0-1.4.6-1.4 1.4s.6 1.4 1.4 1.4h16.6c.8 0 1.4-.6 1.4-1.4s-.6-1.4-1.4-1.4"/></svg>

After

Width:  |  Height:  |  Size: 724 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M24.2 25.2H7.6c-.8 0-1.4.6-1.4 1.4S6.8 28 7.6 28h16.6c.8 0 1.4-.6 1.4-1.4s-.6-1.4-1.4-1.4M27.7 7.8c-1.2 0-2.1.9-2.1 2.1 0 .5.1.9.4 1.2h-4.5l-4.4-4.4c.3-.2.5-.4.6-.7.2-.3.2-.6.2-1q0-.9-.6-1.5c-.4-.3-.8-.5-1.4-.5q-.9 0-1.5.6t-.6 1.5c0 .3.1.7.2 1 .2.3.4.5.6.7l-4.3 4.4H5.8c.2-.3.4-.8.4-1.2 0-1.2-.9-2.1-2.1-2.1S2 8.8 2 9.9 2.9 12 4.1 12h.3l1.4 8.9c.2 1.3 1.3 2.2 2.6 2.2h15c1.3 0 2.4-.9 2.6-2.2l1.3-8.9h.3c1.2 0 2.1-.9 2.1-2.1s-.9-2.1-2-2.1m-4.5 12.5H8.5l-.9-5.8h3.5l4.7-4.8 4.7 4.8H24z"/></svg>

After

Width:  |  Height:  |  Size: 588 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M4.913 4.3c-.176.088-.36.239-.489.403-.328.416-.345.767-.056 1.18.087.123 5.013 5.075 10.948 11.003 7.525 7.517 10.853 10.807 10.999 10.873.449.203 1.016-.053 1.352-.612.219-.364.223-.58.017-.933-.097-.167-.881-.989-2.101-2.208l-1.945-1.94.541-.421c1.383-1.075 2.717-2.535 3.748-4.099.467-.707.607-1.112.607-1.747-.001-.752-.172-1.219-.708-1.945-1.745-2.359-4.068-4.26-6.479-5.304-1.772-.768-3.364-1.093-5.347-1.096-1.903-.003-3.553.325-5.211 1.036l-.507.219-2.168-2.165c-2.564-2.56-2.565-2.56-3.201-2.243zm12.234 5.408c2.828.313 5.405 1.641 7.567 3.897.757.789 1.568 1.827 1.612 2.06.043.223-.079.456-.611 1.188-.883 1.215-2.033 2.407-3.091 3.2l-.569.427-1.515-1.512.211-.383a5.246 5.246 0 0 0 .649-2.559c.003-.693-.052-1.047-.264-1.707-.551-1.708-1.869-2.977-3.669-3.528-.451-.137-.541-.147-1.467-.147-.921 0-1.019.009-1.467.145-.264.08-.712.261-.995.403l-.516.259-.521-.524c-.288-.288-.512-.535-.499-.548.013-.012.288-.105.611-.207a12.92 12.92 0 0 1 2.16-.461c.572-.064 1.812-.067 2.373-.004zM6.901 10.916c-.944.796-2.3 2.291-2.944 3.245a3.726 3.726 0 0 0-.36.747c-.128.383-.14.481-.119.985.031.692.14.98.667 1.764 3.153 4.692 7.885 7.252 12.72 6.884 1.207-.091 2.701-.405 3.481-.731l.204-.087-1.751-1.745-.293.079c-.804.212-1.245.259-2.48.261-1.309.001-1.6-.031-2.616-.292-2.713-.695-5.163-2.473-7.125-5.173-.532-.732-.653-.965-.611-1.188.073-.391 1.664-2.221 2.631-3.028.257-.215.504-.423.547-.461.068-.06-.029-.179-.692-.843-.425-.425-.787-.773-.804-.773-.019 0-.223.16-.455.356zm9.766 1.964c1.212.255 2.2 1.251 2.46 2.48a3.405 3.405 0 0 1-.088 1.621l-.115.369-4.26-4.257.175-.072c.513-.213 1.221-.268 1.828-.141zm-5.783 1.375c-.305.805-.376 2.015-.169 2.919a5.446 5.446 0 0 0 4.112 4.112c.904.207 2.113.136 2.919-.169.14-.053.131-.065-.788-.985-.86-.861-.944-.931-1.121-.931-.303 0-.985-.195-1.347-.384-.487-.255-1.091-.877-1.335-1.376-.191-.391-.352-.984-.353-1.307-.001-.137-.141-.301-.932-1.091-.92-.919-.932-.928-.985-.788z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M2.765 2.19c-.208.103-.52.206-.623.412-.415.513-.415.924-.104 1.438.104.103 6.02 5.96 13.08 13.051 9.03 8.94 12.975 12.846 13.183 12.846.52.205 1.246-.103 1.66-.72.312-.41.312-.72 0-1.13-.103-.206-1.037-1.13-2.49-2.57l-2.284-2.26.623-.514c1.66-1.233 3.218-2.98 4.463-4.83.52-.822.727-1.336.727-2.055 0-.925-.208-1.439-.83-2.26-2.077-2.775-4.88-5.036-7.786-6.27-2.076-.924-4.048-1.335-6.436-1.335-2.284 0-4.256.41-6.228 1.233l-.52.103-2.594-2.467C3.49 1.78 3.49 1.78 2.765 2.19M17.4 8.562q5.138.615 9.032 4.624c.934.925 1.868 2.158 1.972 2.467 0 .308-.104.513-.727 1.438-1.038 1.439-2.387 2.877-3.737 3.802l-.726.514-1.765-1.747.207-.41c.52-.926.83-1.953.727-2.98 0-.823-.104-1.234-.311-2.056-.623-2.056-2.284-3.494-4.36-4.213-.52-.206-.623-.206-1.765-.206s-1.246 0-1.765.206c-.311.102-.83.308-1.142.513l-.622.103-.623-.617-.623-.616s.311-.103.727-.206c.83-.205 1.66-.41 2.595-.513.727-.206 2.18-.206 2.906-.103M5.152 10c-1.142.924-2.803 2.671-3.53 3.802-.207.308-.31.616-.414.925C1 15.138 1 15.24 1 15.858c0 .822.208 1.13.83 2.055 3.737 5.55 9.447 8.632 15.26 8.119 1.453-.103 3.218-.514 4.152-.823l.208-.102-2.076-2.056-.312.103c-.934.206-1.453.308-3.01.308s-1.869 0-3.114-.308c-3.218-.822-6.229-2.98-8.512-6.166-.623-.822-.83-1.13-.727-1.438.104-.514 1.972-2.672 3.114-3.597a5 5 0 0 0 .623-.514c.104-.103 0-.205-.83-1.027-.52-.412-.935-.823-.935-.823s-.311.206-.519.412m11.627 2.363c1.453.308 2.595 1.439 2.906 2.98.104.617.104 1.336-.104 1.953l-.104.41-5.086-5.035.208-.102a3.16 3.16 0 0 1 2.18-.206m-6.955 1.541c-.312 1.028-.416 2.467-.104 3.495.519 2.466 2.491 4.316 4.879 4.83 1.038.205 2.491.205 3.529-.206.208-.103.208-.103-.934-1.13-1.038-1.028-1.142-1.131-1.35-1.131-.311 0-1.142-.206-1.66-.411-.623-.308-1.35-1.028-1.558-1.644-.207-.514-.415-1.13-.415-1.542 0-.205-.207-.308-1.142-1.336-1.142-1.027-1.142-1.027-1.245-.925"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M15.093 7.467c-4.001.269-7.715 2.347-10.539 5.897-.605.761-.799 1.073-.959 1.548-.127.379-.139.479-.117.981.031.692.14.98.667 1.764 3.153 4.692 7.885 7.252 12.72 6.884 3.104-.236 5.764-1.428 8.275-3.709 1.348-1.224 2.987-3.331 3.275-4.207.213-.651.148-1.485-.165-2.109-.296-.591-1.261-1.777-2.22-2.729-3.103-3.083-6.92-4.591-10.936-4.32zm2.827 2.346c2.488.436 4.833 1.745 6.793 3.792.757.789 1.568 1.827 1.612 2.06.043.223-.079.456-.611 1.188-2.193 3.017-4.92 4.831-8.115 5.396-.539.095-2.661.095-3.2 0-3.195-.565-5.921-2.379-8.115-5.396-.532-.732-.653-.965-.611-1.188.044-.233.855-1.271 1.612-2.06 2.187-2.284 4.781-3.608 7.673-3.919.573-.061 2.311.013 2.96.127zm-2.88.862c-.455.075-1.283.377-1.72.628a5.616 5.616 0 0 0-2.143 2.263c-1.8 3.611.799 7.829 4.823 7.829 1.675 0 3.171-.719 4.224-2.029 1.821-2.268 1.484-5.635-.752-7.505-.715-.597-1.691-1.051-2.565-1.191-.413-.065-1.455-.063-1.867.005zm1.543 2.184c.931.155 1.86.868 2.287 1.755.433.899.433 1.872.001 2.773-.283.589-.895 1.215-1.452 1.484a3.26 3.26 0 0 1-2.837 0c-.557-.269-1.169-.895-1.452-1.484-.604-1.259-.364-2.645.625-3.629.791-.784 1.727-1.083 2.828-.899z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M16.35 21.8c1.6 0 3-.6 4.2-1.7 1.2-1.2 1.7-2.6 1.7-4.2s-.6-3-1.7-4.2-2.5-1.7-4.2-1.7-3 .6-4.2 1.7-1.7 2.5-1.7 4.2.6 3 1.7 4.2 2.6 1.7 4.2 1.7m0-2.4c-1 0-1.8-.3-2.5-1s-1-1.5-1-2.5.3-1.8 1-2.5 1.5-1 2.5-1 1.8.3 2.5 1 1 1.5 1 2.5-.3 1.8-1 2.5c-.6.7-1.5 1-2.5 1m0 6.4c-3.2 0-6.1-.9-8.8-2.7-2.4-1.6-4.2-3.8-5.4-6.4q-.3-.75 0-1.5c1.2-2.7 3-4.8 5.4-6.4 2.7-1.9 5.6-2.8 8.8-2.8s6.1.9 8.8 2.7c2.4 1.6 4.2 3.8 5.4 6.4q.3.75 0 1.5c-1.2 2.7-3 4.8-5.4 6.4-2.7 1.9-5.6 2.8-8.8 2.8m0-2.7c2.5 0 4.8-.7 6.8-2 1.7-1.1 3.1-2.5 4.2-4.3.4-.6.4-1.4 0-2-1.1-1.7-2.5-3.2-4.2-4.3-2.1-1.3-4.4-2-6.8-2s-4.8.7-6.8 2c-1.8 1.2-3.2 2.6-4.2 4.4-.4.6-.4 1.4 0 2 1.1 1.7 2.5 3.2 4.2 4.3 2.1 1.3 4.3 1.9 6.8 1.9"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 781 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M18.196 6.821a4.935 4.935 0 0 1 6.979 6.979l-3.08 3.081a4.935 4.935 0 0 1-6.979 0 1.6 1.6 0 1 0-2.263 2.263 8.134 8.134 0 0 0 11.504 0l3.08-3.08c3.177-3.177 3.177-8.327 0-11.504s-8.328-3.177-11.504 0l-1.54 1.54a1.6 1.6 0 1 0 2.263 2.263l1.54-1.54zm-4.392 18.358A4.935 4.935 0 0 1 6.825 18.2l3.081-3.081a4.935 4.935 0 0 1 6.979 0 1.6 1.6 0 1 0 2.263-2.263 8.134 8.134 0 0 0-11.504 0l-3.08 3.081c-3.177 3.177-3.177 8.327 0 11.504s8.327 3.177 11.504 0l1.54-1.54a1.6 1.6 0 1 0-2.263-2.263l-1.54 1.54z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M12.954 10.3c1.992 0 3.984.8 5.577 2.3.498.5.498 1.4 0 1.9s-1.394.5-1.892 0c-.996-1-2.29-1.5-3.685-1.5-1.394 0-2.689.5-3.684 1.5l-3.087 3.1c-1.992 2-1.992 5.3 0 7.3s5.278 2.1 7.27.1l1.593-1.6c.498-.5 1.394-.5 1.892 0 .298.3.398.6.398 1s-.1.7-.398 1l-1.494 1.5a7.85 7.85 0 0 1-11.154 0C2.796 25.4 2 23.4 2 21.3s.797-4.1 2.29-5.6l3.088-3.1c1.593-1.5 3.585-2.3 5.576-2.3M21.221 2c2.091 0 3.983.8 5.477 2.3 3.087 3.1 3.087 8.1-.1 11.1l-3.186 3.2c-3.087 3-8.067 2.9-11.055-.1-.497-.5-.497-1.4 0-1.9.3-.3.698-.4.997-.4.398 0 .697.1.996.4.995 1 2.29 1.5 3.684 1.5s2.689-.5 3.685-1.5l3.087-3.1c1.991-2 1.991-5.3 0-7.3-.996-.9-2.29-1.5-3.685-1.5-1.294 0-2.59.5-3.585 1.5l-1.494 1.5c-.498.5-1.394.5-1.892 0s-.498-1.4 0-1.9l1.495-1.5A7.82 7.82 0 0 1 21.22 2"/></svg>

Before

Width:  |  Height:  |  Size: 577 B

After

Width:  |  Height:  |  Size: 851 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M14.925 29c-.3 0-.6-.1-1-.2q-.45-.15-.9-.6l-9.3-9.3c-.3-.3-.4-.5-.6-.9s-.1-.6-.1-.9.1-.6.2-1q.15-.45.6-.9l11.4-11.4c.2-.2.5-.4.8-.6.3-.1.7-.2 1-.2h9.3c.7 0 1.3.3 1.8.8s.8 1.1.8 1.8v9.3c0 .3-.1.7-.2 1s-.3.6-.6.8l-11.4 11.5q-.45.45-.9.6c-.3.1-.6.2-.9.2m0-2.6 11.5-11.5V5.6h-9.3l-11.5 11.5zm8.2-15.6c.5 0 1-.2 1.4-.6.3-.4.5-.8.5-1.4s-.2-1-.6-1.4-.8-.6-1.4-.6c-.5 0-1 .2-1.4.6s-.6.8-.6 1.4.2 1 .6 1.4c.5.4.9.6 1.5.6"/></svg>

After

Width:  |  Height:  |  Size: 516 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M14.925 29c-.3 0-.6-.1-1-.2s-.6-.3-.9-.6l-9.3-9.3c-.3-.3-.4-.5-.6-.9s-.1-.6-.1-.9.1-.6.2-1 .3-.6.6-.9l11.4-11.4c.2-.2.5-.4.8-.6.3-.1.7-.2 1-.2h9.3c.7 0 1.3.3 1.8.8s.8 1.1.8 1.8v9.3c0 .3-.1.7-.2 1s-.3.6-.6.8l-11.4 11.5q-.45.45-.9.6c-.3.1-.6.2-.9.2m8.2-18.2c.5 0 1-.2 1.4-.6.3-.4.5-.8.5-1.4s-.2-1-.6-1.4-.8-.6-1.4-.6c-.5 0-1 .2-1.4.6s-.6.8-.6 1.4.2 1 .6 1.4c.5.4.9.6 1.5.6"/></svg>

After

Width:  |  Height:  |  Size: 475 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="m29 23.875-3.8-3.8 3-3c.2-.2.4-.5.6-.8s.2-.6.2-1v-9.3c0-.7-.3-1.3-.8-1.8s-1.1-.8-1.8-.8H17c-.3 0-.7.1-1 .2s-.6.3-.8.6l-3 2.9-3.7-3.7c-.5-.5-1.4-.5-1.9 0s-.5 1.4 0 1.9l20.4 20.4c.6.5 1.4.5 2 .1.5-.5.5-1.4 0-1.9m-11.9-17.9h9.3v9.3l-3 3-9.3-9.3zM18.7 22.875l-3.9 3.9-9.3-9.3 3.9-3.9c.6-.5.6-1.3.1-1.8s-1.3-.5-1.8 0l-3.9 3.9c-.3.3-.4.6-.6.9-.1.3-.2.6-.2 1 0 .3.1.6.2 1q.15.45.6.9l9.3 9.3q.45.45.9.6c.3.1.6.2 1 .2s.6-.1 1-.2q.45-.15.9-.6l3.9-3.9c.5-.5.5-1.3 0-1.8-.7-.7-1.5-.7-2.1-.2"/><path fill="#000" d="M24.5 10.575c.3-.4.5-.8.5-1.4 0-.5-.2-1-.6-1.4s-.8-.6-1.4-.6-1 .2-1.4.6-.6.8-.6 1.4c0 .5.2 1 .6 1.4s.8.6 1.4.6q.9 0 1.5-.6"/></svg>

After

Width:  |  Height:  |  Size: 729 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path fill="#000" d="M3.8 15.675c-.3.3-.4.6-.6.9-.1.3-.2.6-.2 1 0 .3.1.6.2 1q.15.45.6.9l9.3 9.3q.45.45.9.6c.3.1.6.2 1 .2.3 0 .6-.1 1-.2q.45-.15.9-.6l5.7-5.7-13.1-13.1zM29.1 23.875l-3.7-3.7 2.9-2.9c.2-.2.4-.5.6-.8.1-.3.2-.6.2-1v-9.4c0-.7-.3-1.3-.8-1.8s-1.1-.8-1.8-.8h-9.4c-.3 0-.7.1-1 .2s-.6.3-.8.6l-2.9 2.9-3.8-3.8c-.5-.5-1.4-.5-1.9 0-.6.5-.6 1.4 0 1.9l20.4 20.5c.5.5 1.4.5 1.9 0 .6-.6.6-1.4.1-1.9m-7.3-16c.4-.4.8-.6 1.4-.6.5 0 1 .2 1.4.6s.5.9.5 1.4-.2 1-.6 1.4-.8.6-1.4.6c-.5 0-1-.2-1.4-.6s-.6-.8-.6-1.4c.1-.5.3-1 .7-1.4"/></svg>

After

Width:  |  Height:  |  Size: 605 B

View File

@ -1485,6 +1485,7 @@
"GiftInfoWear" = "Wear";
"GiftInfoTakeOff" = "Take Off";
"GiftInfoTransfer" = "Transfer";
"GiftInfoUnlist" = "Unlist";
"GiftTransferTitle" = "Transfer";
"GiftTransferTON" = "Send via Blockchain";
"GiftTransferTONBlocked" = "unlocks in {time}";
@ -1953,5 +1954,25 @@
"ApiMessageActionPaidMessagesRefundedIncoming" = "{user} refunded **{stars}** to you";
"NotificationTitleNotSupportedInFrozenAccount" = "Your account is frozen";
"NotificationMessageNotSupportedInFrozenAccount" = "This action is not available";
"NotificationGiftIsSale" = "{gift} is now for sale!";
"NotificationGiftIsUnlist" = "{gift} is removed from sale.";
"GiftRibbonSale" = "sale";
"ButtonBuyGift" = "Buy for {stars}";
"GiftInfoBuyGift" = "{user} is selling this gift and you can buy it.";
"StarsGiftBought"= "You bought gift!";
"ButtonSellGift" = "Sell for {stars}";
"GiftSellTitle" = "Sell Gift";
"Sell" = "Sell";
"InputPlaceholderGiftResalePrice" = "Enter Price";
"DescriptionComposerGiftResalePrice" = "You will receive **{stars}**.";
"DescriptionComposerGiftMinimumPrice" = "Minimum price is **{stars}**.";
"ApiMessageMessageActionResaleStarGiftUniqueOutgoing" = "You paid {stars} for {gift}";
"ApiMessageMessageActionResaleStarGiftUniqueIncoming" = "You received {stars} from selling {gift}";
"ModalStarsBalanceBarDescription" = "Your balance is **{stars}**";
"NotificationGiftCanResellAt" = "You will be able to resell this gift on {date}.";
"NotificationGiftCanTransferAt" = "You can transfer this gift after {date}.";
"StarGiftSaleTransaction" = "Gift Purchase";
"StarGiftPurchaseTransaction" = "Gift Sale";
"GiftBuyConfirmDescription" = "Do you want to buy **{gift}** for **{stars}**?";
"ComposerTitleForwardFrom" = "From: **{users}**";
"ContextMenuItemMention" = "Mention";

View File

@ -8,6 +8,7 @@ export { default as PaidReactionModal } from '../components/modals/paidReaction/
export { default as GiftModal } from '../components/modals/gift/GiftModal';
export { default as GiftRecipientPicker } from '../components/modals/gift/recipient/GiftRecipientPicker';
export { default as GiftInfoModal } from '../components/modals/gift/info/GiftInfoModal';
export { default as GiftResalePriceComposerModal } from '../components/modals/gift/resale/GiftResalePriceComposerModal';
export { default as GiftUpgradeModal } from '../components/modals/gift/upgrade/GiftUpgradeModal';
export { default as GiftStatusInfoModal } from '../components/modals/gift/status/GiftStatusInfoModal';
export { default as GiftWithdrawModal } from '../components/modals/gift/withdraw/GiftWithdrawModal';

View File

@ -7,9 +7,12 @@ import type {
import { DEFAULT_STATUS_ICON_ID, TME_LINK_PREFIX } from '../../../config';
import { copyTextToClipboard } from '../../../util/clipboard';
import { formatDateAtTime } from '../../../util/dates/dateFormat';
import { getServerTime } from '../../../util/serverTime';
import useLang from '../../../hooks/useLang';
import useLastCallback from '../../../hooks/useLastCallback';
import useOldLang from '../../../hooks/useOldLang';
import MenuItem from '../../ui/MenuItem';
@ -32,13 +35,17 @@ const GiftMenuItems = ({
showNotification,
openChatWithDraft,
openGiftTransferModal,
openGiftResalePriceComposerModal,
openGiftStatusInfoModal,
setEmojiStatus,
toggleSavedGiftPinned,
changeGiftVisibility,
updateStarGiftPrice,
closeGiftInfoModal,
} = getActions();
const lang = useLang();
const oldLang = useOldLang();
const isSavedGift = typeGift && 'gift' in typeGift;
const savedGift = isSavedGift ? typeGift : undefined;
@ -62,6 +69,7 @@ const GiftMenuItems = ({
const isGiftUnique = gift && gift.type === 'starGiftUnique';
const canTakeOff = isGiftUnique && currenUniqueEmojiStatusSlug === gift.slug;
const canWear = userCollectibleStatus && !canTakeOff;
const giftResalePrice = isGiftUnique ? gift.resellPriceInStars : undefined;
const hasPinOptions = canManage && savedGift && !savedGift.isUnsaved && isGiftUnique;
@ -84,10 +92,48 @@ const GiftMenuItems = ({
});
const handleTransfer = useLastCallback(() => {
if (savedGift?.gift.type !== 'starGiftUnique') return;
if (!savedGift || savedGift?.gift.type !== 'starGiftUnique') return;
if (savedGift.canTransferAt && savedGift.canTransferAt > getServerTime()) {
showNotification({
message: {
key: 'NotificationGiftCanTransferAt',
variables: { date: formatDateAtTime(oldLang, savedGift.canTransferAt * 1000) },
},
});
return;
}
openGiftTransferModal({ gift: savedGift });
});
const handleSell = useLastCallback(() => {
if (!savedGift) return;
if (savedGift.canResellAt && savedGift.canResellAt > getServerTime()) {
showNotification({
message: {
key: 'NotificationGiftCanResellAt',
variables: { date: formatDateAtTime(oldLang, savedGift.canResellAt * 1000) },
},
});
return;
}
openGiftResalePriceComposerModal({ peerId, gift: savedGift });
});
const handleUnsell = useLastCallback(() => {
if (!savedGift || savedGift.gift.type !== 'starGiftUnique' || !savedGift.inputGift) return;
closeGiftInfoModal();
updateStarGiftPrice({ gift: savedGift.inputGift, price: 0 });
showNotification({
icon: 'unlist-outline',
message: {
key: 'NotificationGiftIsUnlist',
variables: { gift: lang('GiftUnique', { title: savedGift.gift.title, number: savedGift.gift.number }) },
},
});
});
const handleWear = useLastCallback(() => {
if (gift?.type !== 'starGiftUnique' || !userCollectibleStatus) return;
openGiftStatusInfoModal({ emojiStatus: userCollectibleStatus });
@ -123,18 +169,28 @@ const GiftMenuItems = ({
{lang('GiftInfoTransfer')}
</MenuItem>
)}
{canManage && isGiftUnique && !giftResalePrice && (
<MenuItem icon="sell-outline" onClick={handleSell}>
{lang('Sell')}
</MenuItem>
)}
{canManage && isGiftUnique && giftResalePrice && (
<MenuItem icon="unlist-outline" onClick={handleUnsell}>
{lang('GiftInfoUnlist')}
</MenuItem>
)}
{canManage && savedGift && (
<MenuItem icon={savedGift.isUnsaved ? 'eye-outline' : 'eye-crossed-outline'} onClick={handleTriggerVisibility}>
{lang(savedGift.isUnsaved ? 'GiftActionShow' : 'GiftActionHide')}
</MenuItem>
)}
{canWear && (
<MenuItem icon="crown-wear" onClick={handleWear}>
<MenuItem icon="crown-wear-outline" onClick={handleWear}>
{lang('GiftInfoWear')}
</MenuItem>
)}
{canTakeOff && (
<MenuItem icon="crown-take-off" onClick={handleTakeOff}>
<MenuItem icon="crown-take-off-outline" onClick={handleTakeOff}>
{lang('GiftInfoTakeOff')}
</MenuItem>
)}

View File

@ -14,6 +14,7 @@ const COLORS = {
red: [['#FF5B54', '#ED1C26'], ['#653633', '#532224']],
blue: [['#6ED2FF', '#34A4FC'], ['#344F5A', '#152E42']],
purple: [['#E367D7', '#757BF6'], ['#E367D7', '#757BF6']],
green: [['#52D553', '#4BB121'], ['#52D553', '#4BB121']],
} as const;
type ColorKey = keyof typeof COLORS;

View File

@ -1,4 +1,4 @@
.header {
.root {
display: flex;
justify-content: center;
align-items: center;

View File

@ -0,0 +1,60 @@
import React, { memo, useMemo } from '../../../lib/teact/teact';
import type {
ApiPeer, ApiStarGiftUnique,
} from '../../../api/types';
import { getGiftAttributes } from '../helpers/gifts';
import { REM } from '../helpers/mediaDimensions';
import AnimatedIconFromSticker from '../AnimatedIconFromSticker';
import Avatar from '../Avatar';
import Icon from '../icons/Icon';
import RadialPatternBackground from '../profile/RadialPatternBackground';
import styles from './GiftTransferPreview.module.scss';
type OwnProps = {
peer: ApiPeer;
gift: ApiStarGiftUnique;
};
const AVATAR_SIZE = 4 * REM;
const GIFT_STICKER_SIZE = 3 * REM;
const GiftTransferPreview = ({
peer,
gift,
}: OwnProps) => {
const giftAttributes = useMemo(() => {
return getGiftAttributes(gift);
}, [gift]);
if (!giftAttributes) return undefined;
return (
<div className={styles.root}>
<div className={styles.giftPreview}>
<RadialPatternBackground
className={styles.backdrop}
backgroundColors={[giftAttributes.backdrop!.centerColor, giftAttributes.backdrop!.edgeColor]}
patternColor={giftAttributes.backdrop?.patternColor}
patternIcon={giftAttributes.pattern?.sticker}
/>
<AnimatedIconFromSticker
className={styles.sticker}
size={GIFT_STICKER_SIZE}
sticker={giftAttributes.model?.sticker}
/>
</div>
<Icon name="next" className={styles.arrow} />
<Avatar
peer={peer}
size={AVATAR_SIZE}
className={styles.avatar}
/>
</div>
);
};
export default memo(GiftTransferPreview);

View File

@ -66,11 +66,22 @@ const SavedGift = ({
const canManage = peerId === currentUserId || hasAdminRights;
const totalIssued = getTotalGiftAvailability(gift.gift);
const ribbonText = gift.isPinned && gift.gift.type === 'starGiftUnique'
? lang('GiftSavedNumber', { number: gift.gift.number })
: totalIssued
? lang('ActionStarGiftLimitedRibbon', { total: formatIntegerCompact(lang, totalIssued) })
: undefined;
const starGift = gift.gift;
const starGiftUnique = starGift.type === 'starGiftUnique' ? starGift : undefined;
const ribbonText = (() => {
if (starGiftUnique?.resellPriceInStars) {
return lang('GiftRibbonSale');
}
if (gift.isPinned && starGiftUnique) {
return lang('GiftSavedNumber', { number: starGiftUnique.number });
}
if (totalIssued) {
return lang('ActionStarGiftLimitedRibbon', { total: formatIntegerCompact(lang, totalIssued) });
}
return undefined;
})();
const ribbonColor = starGiftUnique?.resellPriceInStars ? 'green' : 'blue';
const {
isContextMenuOpen, contextMenuAnchor,
@ -150,7 +161,7 @@ const SavedGift = ({
)}
{ribbonText && (
<GiftRibbon
color="blue"
color={ribbonColor}
text={ribbonText}
/>
)}

View File

@ -597,7 +597,7 @@ const ActionMessageText = ({
case 'starGiftUnique': {
const {
isTransferred, isUpgrade, savedId, peerId, fromId,
isTransferred, isUpgrade, savedId, peerId, fromId, resaleStars, gift,
} = action;
const isToChannel = Boolean(peerId && savedId);
@ -606,6 +606,19 @@ const ActionMessageText = ({
const fromTitle = (fromPeer && getPeerTitle(lang, fromPeer)) || userFallbackText;
const fromLink = renderPeerLink(fromPeer?.id, fromTitle, asPreview);
if (resaleStars) {
return lang(
isOutgoing
? 'ApiMessageMessageActionResaleStarGiftUniqueOutgoing'
: 'ApiMessageMessageActionResaleStarGiftUniqueIncoming',
{
gift: lang('GiftUnique', { title: gift.title, number: gift.number }),
stars: renderStrong(formatStarsAsText(lang, resaleStars)),
},
{ withNodes: true },
);
}
if (isToChannel) {
const channelPeer = selectPeer(global, peerId!);
const isYou = fromPeer?.id === currentUserId;

View File

@ -19,6 +19,7 @@ import FrozenAccountModal from './frozenAccount/FrozenAccountModal.async';
import PremiumGiftModal from './gift/GiftModal.async';
import GiftInfoModal from './gift/info/GiftInfoModal.async';
import GiftRecipientPicker from './gift/recipient/GiftRecipientPicker.async';
import GiftResalePriceComposerModal from './gift/resale/GiftResalePriceComposerModal.async';
import GiftStatusInfoModal from './gift/status/GiftStatusInfoModal.async';
import GiftTransferModal from './gift/transfer/GiftTransferModal.async';
import GiftUpgradeModal from './gift/upgrade/GiftUpgradeModal.async';
@ -69,6 +70,7 @@ type ModalKey = keyof Pick<TabState,
'isGiftRecipientPickerOpen' |
'isWebAppsCloseConfirmationModalOpen' |
'giftInfoModal' |
'giftResalePriceComposerModal' |
'suggestedStatusModal' |
'emojiStatusAccessModal' |
'locationAccessModal' |
@ -120,6 +122,7 @@ const MODALS: ModalRegistry = {
isGiftRecipientPickerOpen: GiftRecipientPicker,
isWebAppsCloseConfirmationModalOpen: WebAppsCloseConfirmationModal,
giftInfoModal: GiftInfoModal,
giftResalePriceComposerModal: GiftResalePriceComposerModal,
suggestedStatusModal: SuggestedStatusModal,
emojiStatusAccessModal: EmojiStatusAccessModal,
locationAccessModal: LocationAccessModal,

View File

@ -32,6 +32,8 @@ type OwnProps = {
hasBackdrop?: boolean;
onClose: NoneToVoidFunction;
onButtonClick?: NoneToVoidFunction;
withBalanceBar?: boolean;
isLowStackPriority?: true;
};
const TableInfoModal = ({
@ -47,6 +49,8 @@ const TableInfoModal = ({
hasBackdrop,
onClose,
onButtonClick,
withBalanceBar,
isLowStackPriority,
}: OwnProps) => {
const { openChat } = getActions();
const handleOpenChat = useLastCallback((peerId: string) => {
@ -66,6 +70,8 @@ const TableInfoModal = ({
className={className}
contentClassName={styles.content}
onClose={onClose}
withBalanceBar={withBalanceBar}
isLowStackPriority={isLowStackPriority}
>
{headerAvatarPeer && (
<Avatar peer={headerAvatarPeer} size="jumbo" className={styles.avatar} />

View File

@ -19,6 +19,17 @@
z-index: -1;
}
.amount {
display: flex;
gap: 0.25rem;
font-size: 1.125rem;
font-weight: var(--font-weight-medium);
line-height: 1.325;
margin-bottom: 0.125rem;
align-items: center;
color: white;
}
.sticker {
margin-top: 2rem;
}

View File

@ -2,14 +2,20 @@ import React, { memo, useMemo } from '../../../lib/teact/teact';
import type {
ApiStarGiftAttributeBackdrop, ApiStarGiftAttributeModel, ApiStarGiftAttributePattern,
ApiStarsAmount,
} from '../../../api/types';
import {
formatStarsTransactionAmount,
} from '../../../global/helpers/payments';
import buildClassName from '../../../util/buildClassName';
import buildStyle from '../../../util/buildStyle';
import { useTransitionActiveKey } from '../../../hooks/animations/useTransitionActiveKey';
import useLang from '../../../hooks/useLang';
import AnimatedIconFromSticker from '../../common/AnimatedIconFromSticker';
import StarIcon from '../../common/icons/StarIcon';
import RadialPatternBackground from '../../common/profile/RadialPatternBackground';
import Transition from '../../ui/Transition';
@ -22,6 +28,7 @@ type OwnProps = {
title?: string;
subtitle?: string;
className?: string;
resellPrice?: ApiStarsAmount;
};
const STICKER_SIZE = 120;
@ -33,7 +40,9 @@ const UniqueGiftHeader = ({
title,
subtitle,
className,
resellPrice,
}: OwnProps) => {
const lang = useLang();
const activeKey = useTransitionActiveKey([modelAttribute, backdropAttribute, patternAttribute]);
const subtitleColor = backdropAttribute?.textColor;
@ -73,6 +82,14 @@ const UniqueGiftHeader = ({
{subtitle}
</p>
)}
{resellPrice && (
<p className={styles.amount}>
<span>
{formatStarsTransactionAmount(lang, resellPrice)}
</span>
<StarIcon type="gold" size="middle" />
</p>
)}
</div>
);
};

View File

@ -18,6 +18,63 @@
color: var(--color-error);
}
.headerSplitButton {
display: flex;
flex-direction: row;
position: absolute;
right: 0.375rem;
}
.headerButton,
.giftResalePriceContainer {
height: 1.75rem;
width: fit-content;
font-size: 1rem;
font-weight: var(--font-weight-medium);
outline: none !important;
align-items: center;
display: flex;
justify-content: center;
color: white;
border-radius: 1rem;
background-color: rgba(0, 0, 0, 0.2);
backdrop-filter: blur(25px);
pointer-events: auto;
padding: 0.25rem;
padding-inline: 0.625rem;
}
.giftResalePriceContainer {
font-size: 0.75rem;
}
.giftResalePriceStar {
margin-inline-start: 0 !important;
}
.headerButton {
position: relative;
cursor: var(--custom-cursor, pointer);
flex-shrink: 0;
overflow: hidden;
transition: background-color 0.15s;
&:hover {
background-color: rgba(0, 0, 0, 0.1);
}
}
.left {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
.right {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
}
.description {
text-align: center;
color: var(--_color-description, var(--color-text));

View File

@ -1,10 +1,11 @@
import type { FC, TeactNode } from '../../../../lib/teact/teact';
import React, { memo, useMemo } from '../../../../lib/teact/teact';
import React, { memo, useMemo, useState } from '../../../../lib/teact/teact';
import { getActions, getGlobal, withGlobal } from '../../../../global';
import type {
ApiEmojiStatusType,
ApiPeer,
ApiUser,
} from '../../../../api/types';
import type { TabState } from '../../../../global/types';
@ -31,6 +32,7 @@ import AnimatedIconFromSticker from '../../../common/AnimatedIconFromSticker';
import Avatar from '../../../common/Avatar';
import BadgeButton from '../../../common/BadgeButton';
import GiftMenuItems from '../../../common/gift/GiftMenuItems';
import GiftTransferPreview from '../../../common/gift/GiftTransferPreview';
import Icon from '../../../common/icons/Icon';
import SafeLink from '../../../common/SafeLink';
import Button from '../../../ui/Button';
@ -55,6 +57,7 @@ type StateProps = {
currentUserEmojiStatus?: ApiEmojiStatusType;
collectibleEmojiStatuses?: ApiEmojiStatusType[];
tonExplorerUrl?: string;
currentUser?: ApiUser;
};
const STICKER_SIZE = 120;
@ -69,6 +72,7 @@ const GiftInfoModal = ({
currentUserEmojiStatus,
collectibleEmojiStatuses,
tonExplorerUrl,
currentUser,
}: OwnProps & StateProps) => {
const {
closeGiftInfoModal,
@ -78,12 +82,14 @@ const GiftInfoModal = ({
focusMessage,
openGiftUpgradeModal,
showNotification,
buyStarGift,
} = getActions();
const [isConvertConfirmOpen, openConvertConfirm, closeConvertConfirm] = useFlag();
const lang = useLang();
const oldLang = useOldLang();
const [isConfirmModalOpen, setIsConfirmModalOpen] = useState<boolean>(false);
const isOpen = Boolean(modal);
const renderingModal = useCurrentOrPrev(modal);
@ -106,12 +112,24 @@ const GiftInfoModal = ({
const hasConvertOption = canConvertDifference > 0 && Boolean(savedGift?.starsToConvert);
const isGiftUnique = gift && gift.type === 'starGiftUnique';
const uniqueGift = isGiftUnique ? gift : undefined;
const canFocusUpgrade = Boolean(savedGift?.upgradeMsgId);
const canManage = !canFocusUpgrade && savedGift?.inputGift && (
isTargetChat ? hasAdminRights : renderingTargetPeer?.id === currentUserId
);
const resellPriceInStars = isGiftUnique ? gift.resellPriceInStars : undefined;
const canBuyGift = !canManage && Boolean(resellPriceInStars);
const giftOwnerTitle = (() => {
if (!isGiftUnique) return undefined;
const { ownerName, ownerId } = gift;
const global = getGlobal(); // Peer titles do not need to be reactive
const owner = ownerId ? selectPeer(global, ownerId) : undefined;
return owner ? getPeerTitle(lang, owner) : ownerName;
})();
const handleClose = useLastCallback(() => {
closeGiftInfoModal();
});
@ -142,26 +160,57 @@ const GiftInfoModal = ({
openGiftUpgradeModal({ giftId: savedGift.gift.id, gift: savedGift });
});
const handleBuyGift = useLastCallback(() => {
if (!savedGift || gift?.type !== 'starGiftUnique' || !gift.resellPriceInStars) return;
setIsConfirmModalOpen(true);
});
const closeConfirmModal = useLastCallback(() => {
setIsConfirmModalOpen(false);
});
const handleConfirmBuyGift = useLastCallback(() => {
if (!savedGift || gift?.type !== 'starGiftUnique' || !gift.resellPriceInStars) return;
closeConfirmModal();
buyStarGift({ slug: gift.slug, stars: gift.resellPriceInStars });
});
const giftAttributes = useMemo(() => {
return gift && getGiftAttributes(gift);
}, [gift]);
const SettingsMenuButton: FC<{ onTrigger: () => void; isMenuOpen?: boolean }> = useMemo(() => {
return ({ onTrigger, isMenuOpen }) => (
<Button
round
size="smaller"
color="translucent-white"
className={isMenuOpen ? 'active' : ''}
return ({ onTrigger }) => (
<div
className={buildClassName(
styles.headerButton,
styles.left,
)}
tabIndex={0}
role="button"
aria-haspopup="menu"
aria-label={lang('AriaMoreButton')}
onClick={onTrigger}
ariaLabel={lang('AriaMoreButton')}
>
<Icon name="more" />
</Button>
<Icon
name="more"
className={styles.icon}
/>
</div>
);
}, [lang]);
const renderFooterButton = useLastCallback(() => {
if (canBuyGift) {
return (
<Button noForcedUpperCase size="smaller" onClick={handleBuyGift}>
{lang('ButtonBuyGift', {
stars: formatStarsAsIcon(lang, resellPriceInStars!, { asFont: true }),
}, { withNodes: true })}
</Button>
);
}
if (canFocusUpgrade) {
return (
<Button size="smaller" onClick={handleFocusUpgraded}>
@ -312,17 +361,36 @@ const GiftInfoModal = ({
<div
className={styles.modalHeader}
>
<Button
className={styles.modalCloseButton}
round
color="translucent-white"
size="smaller"
ariaLabel={lang('Close')}
onClick={handleClose}
>
<Icon name="close" />
</Button>
{isOpen && uniqueGiftContextMenu}
{Boolean(canManage && resellPriceInStars) && (
<div className={styles.giftResalePriceContainer}>
{formatStarsAsIcon(lang, resellPriceInStars!, {
asFont: true,
className: styles.giftResalePriceStar,
})}
</div>
)}
<div className={styles.headerSplitButton}>
{isOpen && uniqueGiftContextMenu}
<div
className={buildClassName(
styles.headerButton,
styles.right,
)}
tabIndex={0}
role="button"
aria-haspopup="menu"
aria-label={lang('Close')}
onClick={handleClose}
>
<Icon
name="close"
className={buildClassName(
styles.icon,
styles.moreIcon,
)}
/>
</div>
</div>
</div>
);
@ -574,7 +642,7 @@ const GiftInfoModal = ({
const footer = (
<div className={styles.footer}>
{(canManage || tonLink) && (
{(canManage || tonLink || canBuyGift) && (
<div className={styles.footerDescription}>
{tonLink && (
<div>
@ -596,11 +664,18 @@ const GiftInfoModal = ({
})}
</div>
)}
{isVisibleForMe && (
{!canBuyGift && isVisibleForMe && (
<div>
{lang('GiftInfoSenderHidden')}
</div>
)}
{canBuyGift && giftOwnerTitle && (
<div>
{lang('GiftInfoBuyGift', {
user: giftOwnerTitle,
}, { withNodes: true })}
</div>
)}
</div>
)}
{renderFooterButton()}
@ -617,8 +692,9 @@ const GiftInfoModal = ({
typeGift, savedGift, renderingTargetPeer, giftSticker, lang,
canManage, hasConvertOption, isSender, oldLang, tonExplorerUrl,
gift, giftAttributes, renderFooterButton, isTargetChat,
SettingsMenuButton, isOpen, isGiftUnique, renderingModal,
SettingsMenuButton, isGiftUnique, renderingModal,
collectibleEmojiStatuses, currentUserEmojiStatus, saleDateInfo,
canBuyGift, giftOwnerTitle, isOpen, resellPriceInStars,
]);
return (
@ -632,7 +708,35 @@ const GiftInfoModal = ({
footer={modalData?.footer}
className={styles.modal}
onClose={handleClose}
withBalanceBar={Boolean(canBuyGift)}
isLowStackPriority
/>
{uniqueGift && currentUser && resellPriceInStars && (
<ConfirmDialog
isOpen={isConfirmModalOpen}
noDefaultTitle
onClose={closeConfirmModal}
confirmLabel={lang('ButtonBuyGift', {
stars: formatStarsAsIcon(lang, resellPriceInStars!, { asFont: true }),
}, { withNodes: true })}
confirmHandler={handleConfirmBuyGift}
>
<GiftTransferPreview
peer={currentUser}
gift={uniqueGift}
/>
<p>
{lang('GiftBuyConfirmDescription', {
gift: lang('GiftUnique', { title: uniqueGift.title, number: uniqueGift.number }),
stars: formatStarsAsText(lang, resellPriceInStars),
}, {
withNodes: true,
withMarkdown: true,
})}
</p>
</ConfirmDialog>
)}
{savedGift && (
<ConfirmDialog
isOpen={isConvertConfirmOpen}
@ -691,6 +795,7 @@ export default memo(withGlobal<OwnProps>(
hasAdminRights,
currentUserEmojiStatus,
collectibleEmojiStatuses,
currentUser,
};
},
)(GiftInfoModal));

View File

@ -0,0 +1,18 @@
import type { FC } from '../../../../lib/teact/teact';
import React from '../../../../lib/teact/teact';
import type { OwnProps } from './GiftResalePriceComposerModal';
import { Bundles } from '../../../../util/moduleLoader';
import useModuleLoader from '../../../../hooks/useModuleLoader';
const GiftResalePriceComposerModalAsync: FC<OwnProps> = (props) => {
const { modal } = props;
const GiftResalePriceComposerModal = useModuleLoader(Bundles.Stars, 'GiftResalePriceComposerModal', !modal);
// eslint-disable-next-line react/jsx-props-no-spreading
return GiftResalePriceComposerModal ? <GiftResalePriceComposerModal {...props} /> : undefined;
};
export default GiftResalePriceComposerModalAsync;

View File

@ -0,0 +1,19 @@
.descriptionContainer {
color: var(--color-text-secondary);
font-size: 0.875rem;
margin-bottom: 2rem;
margin-inline: 1rem;
display: flex;
}
.descriptionPrice {
margin-left: auto;
}
.inputPrice {
margin-top: 0.5rem;
:global(.input-group) {
margin-bottom: 0.25rem;
}
}

View File

@ -0,0 +1,158 @@
import React, {
memo, useState,
} from '../../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../../global';
import type { TabState } from '../../../../global/types';
import { formatCurrencyAsString } from '../../../../util/formatCurrency';
import { formatStarsAsIcon, formatStarsAsText } from '../../../../util/localization/format';
import useCurrentOrPrev from '../../../../hooks/useCurrentOrPrev';
import useLang from '../../../../hooks/useLang';
import useLastCallback from '../../../../hooks/useLastCallback';
import Button from '../../../ui/Button';
import InputText from '../../../ui/InputText';
import Modal from '../../../ui/Modal';
import styles from './GiftResalePriceComposerModal.module.scss';
export type OwnProps = {
modal: TabState['giftResalePriceComposerModal'];
};
export type StateProps = {
starsStargiftResaleCommissionPermille?: number;
starsStargiftResaleAmountMin: number;
starsStargiftResaleAmountMax?: number;
starsUsdWithdrawRate?: number;
};
const GiftResalePriceComposerModal = ({
modal, starsStargiftResaleCommissionPermille,
starsStargiftResaleAmountMin, starsStargiftResaleAmountMax, starsUsdWithdrawRate,
}: OwnProps & StateProps) => {
const {
closeGiftResalePriceComposerModal,
closeGiftInfoModal,
updateStarGiftPrice,
showNotification,
} = getActions();
const isOpen = Boolean(modal);
const [price, setPrice] = useState<number | undefined>(undefined);
const renderingModal = useCurrentOrPrev(modal);
const { gift: typeGift } = renderingModal || {};
const isSavedGift = typeGift && 'gift' in typeGift;
const savedGift = isSavedGift ? typeGift : undefined;
const hasPrice = Boolean(price);
const lang = useLang();
const handleChangePrice = useLastCallback((e) => {
const value = e.target.value;
const number = parseFloat(value);
const result = value === '' || Number.isNaN(number) ? undefined
: starsStargiftResaleAmountMax ? Math.min(number, starsStargiftResaleAmountMax) : number;
setPrice(result);
});
const handleClose = useLastCallback(() => {
closeGiftResalePriceComposerModal();
});
const handleSellGift = useLastCallback(() => {
if (!savedGift || savedGift.gift.type !== 'starGiftUnique' || !savedGift.inputGift || !price) return;
closeGiftResalePriceComposerModal();
closeGiftInfoModal();
updateStarGiftPrice({ gift: savedGift.inputGift, price });
showNotification({
icon: 'sell-outline',
message: {
key: 'NotificationGiftIsSale',
variables: {
gift: lang('GiftUnique', { title: savedGift.gift.title, number: savedGift.gift.number }),
},
},
});
});
const commission = starsStargiftResaleCommissionPermille;
const isPriceCorrect = hasPrice && price > starsStargiftResaleAmountMin;
return (
<Modal
isOpen={isOpen}
title={lang('GiftSellTitle')}
hasCloseButton
isSlim
onClose={handleClose}
>
<div className={styles.inputPrice}>
<InputText
label={lang('InputPlaceholderGiftResalePrice')}
onChange={handleChangePrice}
value={price?.toString()}
inputMode="numeric"
tabIndex={0}
teactExperimentControlled
/>
</div>
<div className={styles.descriptionContainer}>
<span>
{!isPriceCorrect && commission && lang('DescriptionComposerGiftMinimumPrice', {
stars: formatStarsAsText(lang, starsStargiftResaleAmountMin),
}, {
withMarkdown: true,
withNodes: true,
})}
{isPriceCorrect && lang('DescriptionComposerGiftResalePrice',
{
stars: formatStarsAsText(lang, commission ? Number((price * (commission)).toFixed()) : price),
},
{
withMarkdown: true,
withNodes: true,
})}
</span>
{isPriceCorrect && starsUsdWithdrawRate && (
<span className={styles.descriptionPrice}>
{`${formatCurrencyAsString(
price * starsUsdWithdrawRate,
'USD',
lang.code,
)}`}
</span>
)}
</div>
<Button noForcedUpperCase disabled={!isPriceCorrect} size="smaller" onClick={handleSellGift}>
{isPriceCorrect && lang('ButtonSellGift', {
stars: formatStarsAsIcon(lang, price, { asFont: true }),
}, { withNodes: true })}
{!isPriceCorrect && lang('Sell')}
</Button>
</Modal>
);
};
export default memo(withGlobal<OwnProps>(
(global): StateProps => {
const configPermille = global.appConfig?.starsStargiftResaleCommissionPermille;
const starsStargiftResaleCommissionPermille = configPermille ? (configPermille / 1000) : undefined;
const starsStargiftResaleAmountMin = global.appConfig?.starsStargiftResaleAmountMin || 0;
const starsStargiftResaleAmountMax = global.appConfig?.starsStargiftResaleAmountMax;
const starsUsdWithdrawRateX1000 = global.appConfig?.starsUsdWithdrawRateX1000;
const starsUsdWithdrawRate = starsUsdWithdrawRateX1000 ? starsUsdWithdrawRateX1000 / 1000 : 1;
return {
starsStargiftResaleCommissionPermille,
starsStargiftResaleAmountMin,
starsStargiftResaleAmountMax,
starsUsdWithdrawRate,
};
},
)(GiftResalePriceComposerModal));

View File

@ -14,7 +14,6 @@ import { unique } from '../../../../util/iteratees';
import { formatStarsAsIcon, formatStarsAsText } from '../../../../util/localization/format';
import { MEMO_EMPTY_ARRAY } from '../../../../util/memo';
import { getGiftAttributes } from '../../../common/helpers/gifts';
import { REM } from '../../../common/helpers/mediaDimensions';
import sortChatIds from '../../../common/helpers/sortChatIds';
import useCurrentOrPrev from '../../../../hooks/useCurrentOrPrev';
@ -23,16 +22,11 @@ import useLang from '../../../../hooks/useLang';
import useLastCallback from '../../../../hooks/useLastCallback';
import usePeerSearch from '../../../../hooks/usePeerSearch';
import AnimatedIconFromSticker from '../../../common/AnimatedIconFromSticker';
import Avatar from '../../../common/Avatar';
import Icon from '../../../common/icons/Icon';
import GiftTransferPreview from '../../../common/gift/GiftTransferPreview';
import PeerPicker from '../../../common/pickers/PeerPicker';
import PickerModal from '../../../common/pickers/PickerModal';
import RadialPatternBackground from '../../../common/profile/RadialPatternBackground';
import ConfirmDialog from '../../../ui/ConfirmDialog';
import styles from './GiftTransferModal.module.scss';
export type OwnProps = {
modal: TabState['giftTransferModal'];
};
@ -44,9 +38,6 @@ type StateProps = {
type Categories = 'withdraw';
const AVATAR_SIZE = 4 * REM;
const GIFT_STICKER_SIZE = 3 * REM;
const GiftTransferModal = ({
modal, contactIds, currentUserId,
}: OwnProps & StateProps) => {
@ -175,27 +166,12 @@ const GiftTransferModal = ({
) : lang('GiftTransferConfirmButtonFree')}
confirmHandler={handleTransfer}
>
<div className={styles.header}>
<div className={styles.giftPreview}>
<RadialPatternBackground
className={styles.backdrop}
backgroundColors={[giftAttributes.backdrop!.centerColor, giftAttributes.backdrop!.edgeColor]}
patternColor={giftAttributes.backdrop?.patternColor}
patternIcon={giftAttributes.pattern?.sticker}
/>
<AnimatedIconFromSticker
className={styles.sticker}
size={GIFT_STICKER_SIZE}
sticker={giftAttributes.model?.sticker}
/>
</div>
<Icon name="next" className={styles.arrow} />
<Avatar
{renderingSelectedPeer && (
<GiftTransferPreview
peer={renderingSelectedPeer}
size={AVATAR_SIZE}
className={styles.avatar}
gift={uniqueGift}
/>
</div>
)}
<p>
{renderingModal?.gift.transferStars
? lang('GiftTransferConfirmDescription', {

View File

@ -18,6 +18,13 @@ export function getTransactionTitle(oldLang: OldLangFn, lang: LangFn, transactio
},
);
}
if (transaction.isGiftResale) {
return isNegativeStarsAmount(transaction.stars)
? lang('StarGiftSaleTransaction')
: lang('StarGiftPurchaseTransaction');
}
if (transaction.starRefCommision) {
return oldLang('StarTransactionCommission', formatPercent(transaction.starRefCommision));
}

View File

@ -80,7 +80,11 @@ const StarsTransactionItem = ({ transaction, className }: OwnProps) => {
}
if (transaction.isGiftUpgrade && transaction.starGift?.type === 'starGiftUnique') {
description = transaction.starGift.title;
description = lang('GiftUnique', { title: transaction.starGift.title, number: transaction.starGift.number });
}
if (transaction.isGiftResale && transaction.starGift?.type === 'starGiftUnique') {
description = lang('GiftUnique', { title: transaction.starGift.title, number: transaction.starGift.number });
}
if (transaction.photo) {

View File

@ -85,7 +85,7 @@ const StarsTransactionModal: FC<OwnProps & StateProps> = ({
}
const {
giveawayPostId, photo, stars, isGiftUpgrade, starGift,
giveawayPostId, photo, stars, isGiftUpgrade, starGift, isGiftResale,
} = transaction;
const gift = transaction?.starGift;
@ -131,6 +131,7 @@ const StarsTransactionModal: FC<OwnProps & StateProps> = ({
modelAttribute={giftAttributes!.model!}
title={gift.title}
subtitle={lang('GiftInfoCollectible', { number: gift.number })}
resellPrice={transaction.stars}
/>
</div>
);
@ -194,7 +195,7 @@ const StarsTransactionModal: FC<OwnProps & StateProps> = ({
const tableData: TableData = [];
if (transaction && !transaction.paidMessages) {
if (transaction && !transaction.paidMessages && !isGiftResale) {
tableData.push([
oldLang('StarsTransaction.StarRefReason.Title'),
oldLang('StarsTransaction.StarRefReason.Program'),
@ -208,12 +209,21 @@ const StarsTransactionModal: FC<OwnProps & StateProps> = ({
]);
}
if (isGiftResale) {
tableData.push([
oldLang('StarGiftReason'),
isNegativeStarsAmount(transaction.stars)
? lang('StarGiftSaleTransaction')
: lang('StarGiftPurchaseTransaction'),
]);
}
let peerLabel;
if (isGiftUpgrade) {
peerLabel = oldLang('Stars.Transaction.GiftFrom');
} else if (isNegativeStarsAmount(stars) || transaction.isMyGift) {
peerLabel = oldLang('Stars.Transaction.To');
} else if (transaction.starRefCommision && !transaction.paidMessages) {
} else if (transaction.starRefCommision && !transaction.paidMessages && !isGiftResale) {
peerLabel = oldLang('StarsTransaction.StarRefReason.Miniapp');
} else if (peerId) {
peerLabel = oldLang('Star.Transaction.From');

View File

@ -54,6 +54,16 @@
align-items: center;
}
&.with-balance-bar {
.modal-container {
top: 5.5rem;
}
.modal-dialog {
margin-top: 0;
max-height: calc(100vh - 7.5rem);
}
}
.modal-backdrop {
position: fixed;
top: 0;

View File

@ -17,6 +17,7 @@ import useShowTransition from '../../hooks/useShowTransition';
import Icon from '../common/icons/Icon';
import Button, { type OwnProps as ButtonProps } from './Button';
import ModalStarBalanceBar from './ModalStarBalanceBar';
import Portal from './Portal';
import './Modal.scss';
@ -46,6 +47,7 @@ export type OwnProps = {
onClose: () => void;
onCloseAnimationEnd?: () => void;
onEnter?: () => void;
withBalanceBar?: Boolean;
};
const Modal: FC<OwnProps> = ({
@ -70,6 +72,7 @@ const Modal: FC<OwnProps> = ({
onClose,
onCloseAnimationEnd,
onEnter,
withBalanceBar,
}) => {
const {
ref: modalRef,
@ -167,6 +170,7 @@ const Modal: FC<OwnProps> = ({
noBackdrop && 'transparent-backdrop',
isSlim && 'slim',
isLowStackPriority && 'low-priority',
withBalanceBar && 'with-balance-bar',
);
return (
@ -177,6 +181,11 @@ const Modal: FC<OwnProps> = ({
tabIndex={-1}
role="dialog"
>
{withBalanceBar && (
<ModalStarBalanceBar
isModalOpen={isOpen}
/>
)}
<div className="modal-container">
<div className="modal-backdrop" onClick={!noBackdropClose ? onClose : undefined} />
<div className="modal-dialog" ref={dialogRef} style={dialogStyle}>

View File

@ -0,0 +1,46 @@
.root {
position: absolute;
top: 0rem;
left: 50%;
background-color: var(--color-background);
color: var(--color-text);
display: flex;
flex-direction: column;
align-items: center;
padding: 0.5rem 1.25rem;
border-radius: 2rem;
font-size: 0.875rem;
white-space: nowrap;
z-index: var(--z-modal);
:global(.confirm) & {
z-index: var(--z-modal-confirm);
}
:global(.low-priority) & {
z-index: var(--z-modal-low-priority);
}
transform: translate(-50%, -1rem);
transition: transform 0.2s ease, opacity 0.2s ease;
:global(body:not(.no-page-transitions)) .dots {
transition: none;
transform: none !important;
}
&:not(:global(.open)) {
transform: translate(-50%, 0);
}
&:not(:global(.closing)) {
transform: translate(-50%, 1rem);
}
}
.starIcon {
margin-inline-start: 0.125rem !important;
}

View File

@ -0,0 +1,88 @@
import React, {
memo,
} from '../../lib/teact/teact';
import { getActions, withGlobal } from '../../global';
import type { ApiStarsAmount } from '../../api/types';
import { formatStarsAmount } from '../../global/helpers/payments';
import buildClassName from '../../util/buildClassName';
import { formatStarsAsIcon } from '../../util/localization/format';
import useLang from '../../hooks/useLang';
import useLastCallback from '../../hooks/useLastCallback';
import useShowTransition from '../../hooks/useShowTransition';
import Link from './Link';
import styles from './ModalStarBalanceBar.module.scss';
export type OwnProps = {
onCloseAnimationEnd?: () => void;
isModalOpen?: true;
};
export type StateProps = {
starBalance?: ApiStarsAmount;
};
function ModalStarBalanceBar({
starBalance,
isModalOpen,
onCloseAnimationEnd,
}: StateProps & OwnProps) {
const {
openStarsBalanceModal,
} = getActions();
const lang = useLang();
const isOpen = isModalOpen ? Boolean(starBalance) : false;
const {
ref,
shouldRender,
} = useShowTransition({
isOpen,
onCloseAnimationEnd,
withShouldRender: true,
});
const handleGetMoreStars = useLastCallback(() => {
openStarsBalanceModal({});
});
if (!shouldRender || !starBalance) {
return undefined;
}
return (
<div
className={buildClassName(styles.root)}
ref={ref}
>
<div>
{lang('ModalStarsBalanceBarDescription', {
stars: formatStarsAsIcon(lang, formatStarsAmount(lang, starBalance), { className: styles.starIcon }),
}, {
withNodes: true,
withMarkdown: true,
})}
</div>
<div>
<Link isPrimary onClick={handleGetMoreStars}>{lang('GetMoreStarsLinkText')}</Link>
</div>
</div>
);
}
export default memo(withGlobal(
(global): StateProps => {
const {
stars,
} = global;
return {
starBalance: stars?.balance,
};
},
)(ModalStarBalanceBar));

View File

@ -1,5 +1,6 @@
import type {
ApiInputInvoice, ApiInputInvoicePremiumGiftStars, ApiInputInvoiceStarGift, ApiRequestInputInvoice,
ApiInputInvoice, ApiInputInvoicePremiumGiftStars, ApiInputInvoiceStarGift, ApiInputInvoiceStarGiftResale,
ApiRequestInputInvoice,
} from '../../../api/types';
import type { ApiCredentials } from '../../../components/payment/PaymentModal';
import type { RegularLangFnParameters } from '../../../util/localization';
@ -143,6 +144,20 @@ addActionHandler('sendStarGift', (global, actions, payload): ActionReturnType =>
payInputStarInvoice(global, inputInvoice, gift.stars, tabId);
});
addActionHandler('buyStarGift', (global, actions, payload): ActionReturnType => {
const {
slug, stars, tabId = getCurrentTabId(),
} = payload;
const inputInvoice: ApiInputInvoiceStarGiftResale = {
type: 'stargiftResale',
slug,
peerId: global.currentUserId!,
};
payInputStarInvoice(global, inputInvoice, stars, tabId);
});
addActionHandler('sendPremiumGiftByStars', (global, actions, payload): ActionReturnType => {
const {
userId, months, amount, message, tabId = getCurrentTabId(),
@ -1184,6 +1199,7 @@ addActionHandler('processStarGiftWithdrawal', async (global, actions, payload):
function handlePaymentFormError(error: string, tabId: number) {
if (error === 'SLUG_INVALID') {
// eslint-disable-next-line eslint-multitab-tt/no-getactions-in-actions
getActions().showNotification({
message: {
key: 'PaymentInvoiceNotFound',
@ -1193,5 +1209,6 @@ function handlePaymentFormError(error: string, tabId: number) {
return;
}
// eslint-disable-next-line eslint-multitab-tt/no-getactions-in-actions
getActions().showDialog({ data: { message: error, hasErrorKey: true }, tabId });
}

View File

@ -1,5 +1,6 @@
import type { ApiSavedStarGift, ApiStarGiftUnique } from '../../../api/types';
import type { StarGiftCategory } from '../../../types';
import type { ActionReturnType } from '../../types';
import { getCurrentTabId } from '../../../util/establishMultitabRole';
import { buildCollectionByKey } from '../../../util/iteratees';
@ -144,12 +145,13 @@ addActionHandler('loadPeerSavedGifts', async (global, actions, payload): Promise
const peer = selectPeer(global, peerId);
if (!peer) return;
global = getGlobal();
const currentGifts = selectPeerSavedGifts(global, peerId, tabId);
const localNextOffset = currentGifts?.nextOffset;
if (!shouldRefresh && currentGifts && !localNextOffset) return; // Already loaded all
global = getGlobal();
const fetchingFilter = selectGiftProfileFilter(global, peerId, tabId);
const result = await callApi('fetchSavedStarGifts', {
@ -171,6 +173,18 @@ addActionHandler('loadPeerSavedGifts', async (global, actions, payload): Promise
setGlobal(global);
});
addActionHandler('reloadPeerSavedGifts', (global, actions, payload): ActionReturnType => {
const {
peerId,
} = payload;
Object.values(global.byTabId).forEach((tabState) => {
if (selectPeerSavedGifts(global, peerId, tabState.id)) {
actions.loadPeerSavedGifts({ peerId, shouldRefresh: true, tabId: tabState.id });
}
});
});
addActionHandler('loadStarsSubscriptions', async (global): Promise<void> => {
const subscriptions = global.stars?.subscriptions;
const offset = subscriptions?.nextOffset;
@ -347,3 +361,24 @@ addActionHandler('toggleSavedGiftPinned', async (global, actions, payload): Prom
}
});
});
addActionHandler('updateStarGiftPrice', async (global, actions, payload): Promise<void> => {
const {
gift, price,
} = payload;
const requestSavedGift = getRequestInputSavedStarGift(global, gift);
if (!requestSavedGift) {
return;
}
const result = await callApi('updateStarGiftPrice', {
inputSavedGift: requestSavedGift,
price,
});
if (!result) return;
actions.reloadPeerSavedGifts({ peerId: global.currentUserId! });
});

View File

@ -151,6 +151,25 @@ addActionHandler('apiUpdate', (global, actions, update): ActionReturnType => {
}
}
if (inputInvoice?.type === 'stargiftResale') {
const starGiftModalState = selectTabState(global, tabId).giftInfoModal;
if (starGiftModalState) {
actions.showNotification({
message: {
key: 'StarsGiftBought',
},
tabId,
});
if (starGiftModalState.peerId) {
actions.reloadPeerSavedGifts({ peerId: starGiftModalState.peerId });
}
actions.reloadPeerSavedGifts({ peerId: inputInvoice.peerId });
actions.requestConfetti({ withStars: true, tabId });
actions.closeGiftInfoModal({ tabId });
}
}
break;
}

View File

@ -265,8 +265,23 @@ addActionHandler('openGiftInfoModal', (global, actions, payload): ActionReturnTy
}, tabId);
});
addActionHandler('openGiftResalePriceComposerModal', (global, actions, payload): ActionReturnType => {
const {
gift, peerId, tabId = getCurrentTabId(),
} = payload;
return updateTabState(global, {
giftResalePriceComposerModal: {
peerId,
gift,
},
}, tabId);
});
addTabStateResetterAction('closeGiftInfoModal', 'giftInfoModal');
addTabStateResetterAction('closeGiftResalePriceComposerModal', 'giftResalePriceComposerModal');
addTabStateResetterAction('closeGiftUpgradeModal', 'giftUpgradeModal');
addActionHandler('openGiftWithdrawModal', (global, actions, payload): ActionReturnType => {

View File

@ -21,6 +21,22 @@ export function getRequestInputInvoice<T extends GlobalState>(
): ApiRequestInputInvoice | undefined {
if (inputInvoice.type === 'slug') return inputInvoice;
if (inputInvoice.type === 'stargiftResale') {
const {
slug,
peerId,
} = inputInvoice;
const peer = selectPeer(global, peerId);
if (!peer) return undefined;
return {
type: 'stargiftResale',
slug,
peer,
};
}
if (inputInvoice.type === 'stargift') {
const {
peerId, shouldHideName, giftId, message, shouldUpgrade,

View File

@ -2406,6 +2406,10 @@ export interface ActionPayloads {
} & WithTabId;
closeGiftModal: WithTabId | undefined;
sendStarGift: StarGiftInfo & WithTabId;
buyStarGift: {
slug: string;
stars: number;
} & WithTabId;
sendPremiumGiftByStars: {
userId: string;
months: number;
@ -2423,7 +2427,12 @@ export interface ActionPayloads {
} | {
gift: ApiStarGift;
}) & WithTabId;
openGiftResalePriceComposerModal: ({
peerId: string;
gift: ApiSavedStarGift;
}) & WithTabId;
closeGiftInfoModal: WithTabId | undefined;
closeGiftResalePriceComposerModal: WithTabId | undefined;
openGiftUpgradeModal: {
giftId: string;
@ -2465,6 +2474,9 @@ export interface ActionPayloads {
peerId: string;
shouldRefresh?: boolean;
} & WithTabId;
reloadPeerSavedGifts: {
peerId: string;
};
changeGiftVisibility: {
gift: ApiInputSavedStarGift;
shouldUnsave?: boolean;
@ -2477,6 +2489,11 @@ export interface ActionPayloads {
gift: ApiSavedStarGift;
} & WithTabId;
updateStarGiftPrice: {
gift: ApiInputSavedStarGift;
price: number;
} & WithTabId;
openStarsGiftModal: ({
chatId?: string;
forUserId?: string;

View File

@ -764,6 +764,11 @@ export type TabState = {
gift: ApiSavedStarGift | ApiStarGift;
};
giftResalePriceComposerModal?: {
peerId?: string;
gift: ApiSavedStarGift | ApiStarGift;
};
giftTransferModal?: {
gift: ApiSavedStarGift;
};

View File

@ -12,5 +12,5 @@ for (const tl of Object.values(Api)) {
}
}
export const LAYER = 201;
export const LAYER = 203;
export { tlobjects };

View File

@ -69,7 +69,7 @@ namespace Api {
export type TypeChatPhoto = ChatPhotoEmpty | ChatPhoto;
export type TypeMessage = MessageEmpty | Message | MessageService;
export type TypeMessageMedia = MessageMediaEmpty | MessageMediaPhoto | MessageMediaGeo | MessageMediaContact | MessageMediaUnsupported | MessageMediaDocument | MessageMediaWebPage | MessageMediaVenue | MessageMediaGame | MessageMediaInvoice | MessageMediaGeoLive | MessageMediaPoll | MessageMediaDice | MessageMediaStory | MessageMediaGiveaway | MessageMediaGiveawayResults | MessageMediaPaidMedia;
export type TypeMessageAction = MessageActionEmpty | MessageActionChatCreate | MessageActionChatEditTitle | MessageActionChatEditPhoto | MessageActionChatDeletePhoto | MessageActionChatAddUser | MessageActionChatDeleteUser | MessageActionChatJoinedByLink | MessageActionChannelCreate | MessageActionChatMigrateTo | MessageActionChannelMigrateFrom | MessageActionPinMessage | MessageActionHistoryClear | MessageActionGameScore | MessageActionPaymentSentMe | MessageActionPaymentSent | MessageActionPhoneCall | MessageActionScreenshotTaken | MessageActionCustomAction | MessageActionBotAllowed | MessageActionSecureValuesSentMe | MessageActionSecureValuesSent | MessageActionContactSignUp | MessageActionGeoProximityReached | MessageActionGroupCall | MessageActionInviteToGroupCall | MessageActionSetMessagesTTL | MessageActionGroupCallScheduled | MessageActionSetChatTheme | MessageActionChatJoinedByRequest | MessageActionWebViewDataSentMe | MessageActionWebViewDataSent | MessageActionGiftPremium | MessageActionTopicCreate | MessageActionTopicEdit | MessageActionSuggestProfilePhoto | MessageActionRequestedPeer | MessageActionSetChatWallPaper | MessageActionGiftCode | MessageActionGiveawayLaunch | MessageActionGiveawayResults | MessageActionBoostApply | MessageActionRequestedPeerSentMe | MessageActionPaymentRefunded | MessageActionGiftStars | MessageActionPrizeStars | MessageActionStarGift | MessageActionStarGiftUnique | MessageActionPaidMessagesRefunded | MessageActionPaidMessagesPrice;
export type TypeMessageAction = MessageActionEmpty | MessageActionChatCreate | MessageActionChatEditTitle | MessageActionChatEditPhoto | MessageActionChatDeletePhoto | MessageActionChatAddUser | MessageActionChatDeleteUser | MessageActionChatJoinedByLink | MessageActionChannelCreate | MessageActionChatMigrateTo | MessageActionChannelMigrateFrom | MessageActionPinMessage | MessageActionHistoryClear | MessageActionGameScore | MessageActionPaymentSentMe | MessageActionPaymentSent | MessageActionPhoneCall | MessageActionScreenshotTaken | MessageActionCustomAction | MessageActionBotAllowed | MessageActionSecureValuesSentMe | MessageActionSecureValuesSent | MessageActionContactSignUp | MessageActionGeoProximityReached | MessageActionGroupCall | MessageActionInviteToGroupCall | MessageActionSetMessagesTTL | MessageActionGroupCallScheduled | MessageActionSetChatTheme | MessageActionChatJoinedByRequest | MessageActionWebViewDataSentMe | MessageActionWebViewDataSent | MessageActionGiftPremium | MessageActionTopicCreate | MessageActionTopicEdit | MessageActionSuggestProfilePhoto | MessageActionRequestedPeer | MessageActionSetChatWallPaper | MessageActionGiftCode | MessageActionGiveawayLaunch | MessageActionGiveawayResults | MessageActionBoostApply | MessageActionRequestedPeerSentMe | MessageActionPaymentRefunded | MessageActionGiftStars | MessageActionPrizeStars | MessageActionStarGift | MessageActionStarGiftUnique | MessageActionPaidMessagesRefunded | MessageActionPaidMessagesPrice | MessageActionConferenceCall;
export type TypeDialog = Dialog | DialogFolder;
export type TypePhoto = PhotoEmpty | Photo;
export type TypePhotoSize = PhotoSizeEmpty | PhotoSize | PhotoCachedSize | PhotoStrippedSize | PhotoSizeProgressive | PhotoPathSize;
@ -85,7 +85,7 @@ namespace Api {
export type TypeImportedContact = ImportedContact;
export type TypeContactStatus = ContactStatus;
export type TypeMessagesFilter = InputMessagesFilterEmpty | InputMessagesFilterPhotos | InputMessagesFilterVideo | InputMessagesFilterPhotoVideo | InputMessagesFilterDocument | InputMessagesFilterUrl | InputMessagesFilterGif | InputMessagesFilterVoice | InputMessagesFilterMusic | InputMessagesFilterChatPhotos | InputMessagesFilterPhoneCalls | InputMessagesFilterRoundVoice | InputMessagesFilterRoundVideo | InputMessagesFilterMyMentions | InputMessagesFilterGeo | InputMessagesFilterContacts | InputMessagesFilterPinned;
export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage | UpdateNewStoryReaction | UpdateBroadcastRevenueTransactions | UpdateStarsBalance | UpdateBusinessBotCallbackQuery | UpdateStarsRevenueStatus | UpdateBotPurchasedPaidMedia | UpdatePaidReactionPrivacy | UpdateSentPhoneCode;
export type TypeUpdate = UpdateNewMessage | UpdateMessageID | UpdateDeleteMessages | UpdateUserTyping | UpdateChatUserTyping | UpdateChatParticipants | UpdateUserStatus | UpdateUserName | UpdateNewAuthorization | UpdateNewEncryptedMessage | UpdateEncryptedChatTyping | UpdateEncryption | UpdateEncryptedMessagesRead | UpdateChatParticipantAdd | UpdateChatParticipantDelete | UpdateDcOptions | UpdateNotifySettings | UpdateServiceNotification | UpdatePrivacy | UpdateUserPhone | UpdateReadHistoryInbox | UpdateReadHistoryOutbox | UpdateWebPage | UpdateReadMessagesContents | UpdateChannelTooLong | UpdateChannel | UpdateNewChannelMessage | UpdateReadChannelInbox | UpdateDeleteChannelMessages | UpdateChannelMessageViews | UpdateChatParticipantAdmin | UpdateNewStickerSet | UpdateStickerSetsOrder | UpdateStickerSets | UpdateSavedGifs | UpdateBotInlineQuery | UpdateBotInlineSend | UpdateEditChannelMessage | UpdateBotCallbackQuery | UpdateEditMessage | UpdateInlineBotCallbackQuery | UpdateReadChannelOutbox | UpdateDraftMessage | UpdateReadFeaturedStickers | UpdateRecentStickers | UpdateConfig | UpdatePtsChanged | UpdateChannelWebPage | UpdateDialogPinned | UpdatePinnedDialogs | UpdateBotWebhookJSON | UpdateBotWebhookJSONQuery | UpdateBotShippingQuery | UpdateBotPrecheckoutQuery | UpdatePhoneCall | UpdateLangPackTooLong | UpdateLangPack | UpdateFavedStickers | UpdateChannelReadMessagesContents | UpdateContactsReset | UpdateChannelAvailableMessages | UpdateDialogUnreadMark | UpdateMessagePoll | UpdateChatDefaultBannedRights | UpdateFolderPeers | UpdatePeerSettings | UpdatePeerLocated | UpdateNewScheduledMessage | UpdateDeleteScheduledMessages | UpdateTheme | UpdateGeoLiveViewed | UpdateLoginToken | UpdateMessagePollVote | UpdateDialogFilter | UpdateDialogFilterOrder | UpdateDialogFilters | UpdatePhoneCallSignalingData | UpdateChannelMessageForwards | UpdateReadChannelDiscussionInbox | UpdateReadChannelDiscussionOutbox | UpdatePeerBlocked | UpdateChannelUserTyping | UpdatePinnedMessages | UpdatePinnedChannelMessages | UpdateChat | UpdateGroupCallParticipants | UpdateGroupCall | UpdatePeerHistoryTTL | UpdateChatParticipant | UpdateChannelParticipant | UpdateBotStopped | UpdateGroupCallConnection | UpdateBotCommands | UpdatePendingJoinRequests | UpdateBotChatInviteRequester | UpdateMessageReactions | UpdateAttachMenuBots | UpdateWebViewResultSent | UpdateBotMenuButton | UpdateSavedRingtones | UpdateTranscribedAudio | UpdateReadFeaturedEmojiStickers | UpdateUserEmojiStatus | UpdateRecentEmojiStatuses | UpdateRecentReactions | UpdateMoveStickerSetToTop | UpdateMessageExtendedMedia | UpdateChannelPinnedTopic | UpdateChannelPinnedTopics | UpdateUser | UpdateAutoSaveSettings | UpdateStory | UpdateReadStories | UpdateStoryID | UpdateStoriesStealthMode | UpdateSentStoryReaction | UpdateBotChatBoost | UpdateChannelViewForumAsMessages | UpdatePeerWallpaper | UpdateBotMessageReaction | UpdateBotMessageReactions | UpdateSavedDialogPinned | UpdatePinnedSavedDialogs | UpdateSavedReactionTags | UpdateSmsJob | UpdateQuickReplies | UpdateNewQuickReply | UpdateDeleteQuickReply | UpdateQuickReplyMessage | UpdateDeleteQuickReplyMessages | UpdateBotBusinessConnect | UpdateBotNewBusinessMessage | UpdateBotEditBusinessMessage | UpdateBotDeleteBusinessMessage | UpdateNewStoryReaction | UpdateBroadcastRevenueTransactions | UpdateStarsBalance | UpdateBusinessBotCallbackQuery | UpdateStarsRevenueStatus | UpdateBotPurchasedPaidMedia | UpdatePaidReactionPrivacy | UpdateSentPhoneCode | UpdateGroupCallChainBlocks;
export type TypeUpdates = UpdatesTooLong | UpdateShortMessage | UpdateShortChatMessage | UpdateShort | UpdatesCombined | Updates | UpdateShortSentMessage;
export type TypeDcOption = DcOption;
export type TypeConfig = Config;
@ -144,7 +144,7 @@ namespace Api {
export type TypeHighScore = HighScore;
export type TypeRichText = TextEmpty | TextPlain | TextBold | TextItalic | TextUnderline | TextStrike | TextFixed | TextUrl | TextEmail | TextConcat | TextSubscript | TextSuperscript | TextMarked | TextPhone | TextImage | TextAnchor;
export type TypePageBlock = PageBlockUnsupported | PageBlockTitle | PageBlockSubtitle | PageBlockAuthorDate | PageBlockHeader | PageBlockSubheader | PageBlockParagraph | PageBlockPreformatted | PageBlockFooter | PageBlockDivider | PageBlockAnchor | PageBlockList | PageBlockBlockquote | PageBlockPullquote | PageBlockPhoto | PageBlockVideo | PageBlockCover | PageBlockEmbed | PageBlockEmbedPost | PageBlockCollage | PageBlockSlideshow | PageBlockChannel | PageBlockAudio | PageBlockKicker | PageBlockTable | PageBlockOrderedList | PageBlockDetails | PageBlockRelatedArticles | PageBlockMap;
export type TypePhoneCallDiscardReason = PhoneCallDiscardReasonMissed | PhoneCallDiscardReasonDisconnect | PhoneCallDiscardReasonHangup | PhoneCallDiscardReasonBusy;
export type TypePhoneCallDiscardReason = PhoneCallDiscardReasonMissed | PhoneCallDiscardReasonDisconnect | PhoneCallDiscardReasonHangup | PhoneCallDiscardReasonBusy | PhoneCallDiscardReasonMigrateConferenceCall;
export type TypeDataJSON = DataJSON;
export type TypeLabeledPrice = LabeledPrice;
export type TypeInvoice = Invoice;
@ -167,7 +167,7 @@ namespace Api {
export type TypeLangPackString = LangPackString | LangPackStringPluralized | LangPackStringDeleted;
export type TypeLangPackDifference = LangPackDifference;
export type TypeLangPackLanguage = LangPackLanguage;
export type TypeChannelAdminLogEventAction = ChannelAdminLogEventActionChangeTitle | ChannelAdminLogEventActionChangeAbout | ChannelAdminLogEventActionChangeUsername | ChannelAdminLogEventActionChangePhoto | ChannelAdminLogEventActionToggleInvites | ChannelAdminLogEventActionToggleSignatures | ChannelAdminLogEventActionUpdatePinned | ChannelAdminLogEventActionEditMessage | ChannelAdminLogEventActionDeleteMessage | ChannelAdminLogEventActionParticipantJoin | ChannelAdminLogEventActionParticipantLeave | ChannelAdminLogEventActionParticipantInvite | ChannelAdminLogEventActionParticipantToggleBan | ChannelAdminLogEventActionParticipantToggleAdmin | ChannelAdminLogEventActionChangeStickerSet | ChannelAdminLogEventActionTogglePreHistoryHidden | ChannelAdminLogEventActionDefaultBannedRights | ChannelAdminLogEventActionStopPoll | ChannelAdminLogEventActionChangeLinkedChat | ChannelAdminLogEventActionChangeLocation | ChannelAdminLogEventActionToggleSlowMode | ChannelAdminLogEventActionStartGroupCall | ChannelAdminLogEventActionDiscardGroupCall | ChannelAdminLogEventActionParticipantMute | ChannelAdminLogEventActionParticipantUnmute | ChannelAdminLogEventActionToggleGroupCallSetting | ChannelAdminLogEventActionParticipantJoinByInvite | ChannelAdminLogEventActionExportedInviteDelete | ChannelAdminLogEventActionExportedInviteRevoke | ChannelAdminLogEventActionExportedInviteEdit | ChannelAdminLogEventActionParticipantVolume | ChannelAdminLogEventActionChangeHistoryTTL | ChannelAdminLogEventActionParticipantJoinByRequest | ChannelAdminLogEventActionToggleNoForwards | ChannelAdminLogEventActionSendMessage | ChannelAdminLogEventActionChangeAvailableReactions | ChannelAdminLogEventActionChangeUsernames | ChannelAdminLogEventActionToggleForum | ChannelAdminLogEventActionCreateTopic | ChannelAdminLogEventActionEditTopic | ChannelAdminLogEventActionDeleteTopic | ChannelAdminLogEventActionPinTopic | ChannelAdminLogEventActionToggleAntiSpam | ChannelAdminLogEventActionChangePeerColor | ChannelAdminLogEventActionChangeProfilePeerColor | ChannelAdminLogEventActionChangeWallpaper | ChannelAdminLogEventActionChangeEmojiStatus | ChannelAdminLogEventActionChangeEmojiStickerSet | ChannelAdminLogEventActionToggleSignatureProfiles | ChannelAdminLogEventActionParticipantSubExtend;
export type TypeChannelAdminLogEventAction = ChannelAdminLogEventActionChangeTitle | ChannelAdminLogEventActionChangeAbout | ChannelAdminLogEventActionChangeUsername | ChannelAdminLogEventActionChangePhoto | ChannelAdminLogEventActionToggleInvites | ChannelAdminLogEventActionToggleSignatures | ChannelAdminLogEventActionUpdatePinned | ChannelAdminLogEventActionEditMessage | ChannelAdminLogEventActionDeleteMessage | ChannelAdminLogEventActionParticipantJoin | ChannelAdminLogEventActionParticipantLeave | ChannelAdminLogEventActionParticipantInvite | ChannelAdminLogEventActionParticipantToggleBan | ChannelAdminLogEventActionParticipantToggleAdmin | ChannelAdminLogEventActionChangeStickerSet | ChannelAdminLogEventActionTogglePreHistoryHidden | ChannelAdminLogEventActionDefaultBannedRights | ChannelAdminLogEventActionStopPoll | ChannelAdminLogEventActionChangeLinkedChat | ChannelAdminLogEventActionChangeLocation | ChannelAdminLogEventActionToggleSlowMode | ChannelAdminLogEventActionStartGroupCall | ChannelAdminLogEventActionDiscardGroupCall | ChannelAdminLogEventActionParticipantMute | ChannelAdminLogEventActionParticipantUnmute | ChannelAdminLogEventActionToggleGroupCallSetting | ChannelAdminLogEventActionParticipantJoinByInvite | ChannelAdminLogEventActionExportedInviteDelete | ChannelAdminLogEventActionExportedInviteRevoke | ChannelAdminLogEventActionExportedInviteEdit | ChannelAdminLogEventActionParticipantVolume | ChannelAdminLogEventActionChangeHistoryTTL | ChannelAdminLogEventActionParticipantJoinByRequest | ChannelAdminLogEventActionToggleNoForwards | ChannelAdminLogEventActionSendMessage | ChannelAdminLogEventActionChangeAvailableReactions | ChannelAdminLogEventActionChangeUsernames | ChannelAdminLogEventActionToggleForum | ChannelAdminLogEventActionCreateTopic | ChannelAdminLogEventActionEditTopic | ChannelAdminLogEventActionDeleteTopic | ChannelAdminLogEventActionPinTopic | ChannelAdminLogEventActionToggleAntiSpam | ChannelAdminLogEventActionChangePeerColor | ChannelAdminLogEventActionChangeProfilePeerColor | ChannelAdminLogEventActionChangeWallpaper | ChannelAdminLogEventActionChangeEmojiStatus | ChannelAdminLogEventActionChangeEmojiStickerSet | ChannelAdminLogEventActionToggleSignatureProfiles | ChannelAdminLogEventActionParticipantSubExtend | ChannelAdminLogEventActionToggleAutotranslation;
export type TypeChannelAdminLogEvent = ChannelAdminLogEvent;
export type TypeChannelAdminLogEventsFilter = ChannelAdminLogEventsFilter;
export type TypePopularContact = PopularContact;
@ -251,7 +251,7 @@ namespace Api {
export type TypeMessageReplies = MessageReplies;
export type TypePeerBlocked = PeerBlocked;
export type TypeGroupCall = GroupCallDiscarded | GroupCall;
export type TypeInputGroupCall = InputGroupCall;
export type TypeInputGroupCall = InputGroupCall | InputGroupCallSlug | InputGroupCallInviteMessage;
export type TypeGroupCallParticipant = GroupCallParticipant;
export type TypeInlineQueryPeerType = InlineQueryPeerTypeSameBotPM | InlineQueryPeerTypePM | InlineQueryPeerTypeChat | InlineQueryPeerTypeMegagroup | InlineQueryPeerTypeBroadcast | InlineQueryPeerTypeBotPM;
export type TypeChatInviteImporter = ChatInviteImporter;
@ -277,7 +277,7 @@ namespace Api {
export type TypeBotMenuButton = BotMenuButtonDefault | BotMenuButtonCommands | BotMenuButton;
export type TypeNotificationSound = NotificationSoundDefault | NotificationSoundNone | NotificationSoundLocal | NotificationSoundRingtone;
export type TypeAttachMenuPeerType = AttachMenuPeerTypeSameBotPM | AttachMenuPeerTypeBotPM | AttachMenuPeerTypePM | AttachMenuPeerTypeChat | AttachMenuPeerTypeBroadcast;
export type TypeInputInvoice = InputInvoiceMessage | InputInvoiceSlug | InputInvoicePremiumGiftCode | InputInvoiceStars | InputInvoiceChatInviteSubscription | InputInvoiceStarGift | InputInvoiceStarGiftUpgrade | InputInvoiceStarGiftTransfer | InputInvoicePremiumGiftStars | InputInvoiceBusinessBotTransferStars;
export type TypeInputInvoice = InputInvoiceMessage | InputInvoiceSlug | InputInvoicePremiumGiftCode | InputInvoiceStars | InputInvoiceChatInviteSubscription | InputInvoiceStarGift | InputInvoiceStarGiftUpgrade | InputInvoiceStarGiftTransfer | InputInvoicePremiumGiftStars | InputInvoiceBusinessBotTransferStars | InputInvoiceStarGiftResale;
export type TypeInputStorePaymentPurpose = InputStorePaymentPremiumSubscription | InputStorePaymentGiftPremium | InputStorePaymentPremiumGiftCode | InputStorePaymentPremiumGiveaway | InputStorePaymentStarsTopup | InputStorePaymentStarsGift | InputStorePaymentStarsGiveaway | InputStorePaymentAuthCode;
export type TypePaymentFormMethod = PaymentFormMethod;
export type TypeEmojiStatus = EmojiStatusEmpty | EmojiStatus | EmojiStatusCollectible | InputEmojiStatusCollectible;
@ -386,12 +386,15 @@ namespace Api {
export type TypeBotVerification = BotVerification;
export type TypeStarGiftAttribute = StarGiftAttributeModel | StarGiftAttributePattern | StarGiftAttributeBackdrop | StarGiftAttributeOriginalDetails;
export type TypeSavedStarGift = SavedStarGift;
export type TypeInputSavedStarGift = InputSavedStarGiftUser | InputSavedStarGiftChat;
export type TypeInputSavedStarGift = InputSavedStarGiftUser | InputSavedStarGiftChat | InputSavedStarGiftSlug;
export type TypePaidReactionPrivacy = PaidReactionPrivacyDefault | PaidReactionPrivacyAnonymous | PaidReactionPrivacyPeer;
export type TypeRequirementToContact = RequirementToContactEmpty | RequirementToContactPremium | RequirementToContactPaidMessages;
export type TypeBusinessBotRights = BusinessBotRights;
export type TypeDisallowedGiftsSettings = DisallowedGiftsSettings;
export type TypeSponsoredPeer = SponsoredPeer;
export type TypeStarGiftAttributeId = StarGiftAttributeIdModel | StarGiftAttributeIdPattern | StarGiftAttributeIdBackdrop;
export type TypeStarGiftAttributeCounter = StarGiftAttributeCounter;
export type TypePendingSuggestion = PendingSuggestion;
export type TypeResPQ = ResPQ;
export type TypeP_Q_inner_data = PQInnerData | PQInnerDataDc | PQInnerDataTemp | PQInnerDataTempDc;
export type TypeServer_DH_Params = ServerDHParamsFail | ServerDHParamsOk;
@ -606,6 +609,7 @@ namespace Api {
export type TypeUniqueStarGift = payments.UniqueStarGift;
export type TypeSavedStarGifts = payments.SavedStarGifts;
export type TypeStarGiftWithdrawalUrl = payments.StarGiftWithdrawalUrl;
export type TypeResaleStarGifts = payments.ResaleStarGifts;
}
export namespace phone {
@ -659,6 +663,7 @@ namespace Api {
export type TypePeerStories = stories.PeerStories;
export type TypeStoryReactionsList = stories.StoryReactionsList;
export type TypeFoundStories = stories.FoundStories;
export type TypeCanSendStoryCount = stories.CanSendStoryCount;
}
export namespace premium {
@ -1704,6 +1709,7 @@ namespace Api {
storiesHiddenMin?: true;
storiesUnavailable?: true;
signatureProfiles?: true;
autotranslation?: true;
id: long;
accessHash?: long;
title: string;
@ -1751,6 +1757,7 @@ namespace Api {
storiesHiddenMin?: true;
storiesUnavailable?: true;
signatureProfiles?: true;
autotranslation?: true;
id: long;
accessHash?: long;
title: string;
@ -3187,6 +3194,9 @@ namespace Api {
fromId?: Api.TypePeer;
peer?: Api.TypePeer;
savedId?: long;
resaleStars?: long;
canTransferAt?: int;
canResellAt?: int;
}> {
// flags: Api.Type;
upgrade?: true;
@ -3199,10 +3209,12 @@ namespace Api {
fromId?: Api.TypePeer;
peer?: Api.TypePeer;
savedId?: long;
resaleStars?: long;
canTransferAt?: int;
canResellAt?: int;
CONSTRUCTOR_ID: 2900347777;
SUBCLASS_OF_ID: 2256589094;
className: 'MessageActionStarGiftUnique';
static fromReader(reader: Reader): MessageActionStarGiftUnique;
}
export class MessageActionPaidMessagesRefunded extends VirtualClass<{
@ -3227,6 +3239,24 @@ namespace Api {
static fromReader(reader: Reader): MessageActionPaidMessagesPrice;
}
export class MessageActionConferenceCall extends VirtualClass<{
// flags: Api.Type;
missed?: true;
active?: true;
video?: true;
callId: long;
duration?: int;
otherParticipants?: Api.TypePeer[];
}> {
// flags: Api.Type;
missed?: true;
active?: true;
video?: true;
callId: long;
duration?: int;
otherParticipants?: Api.TypePeer[];
static fromReader(reader: Reader): MessageActionConferenceCall;
}
export class Dialog extends VirtualClass<{
// flags: Api.Type;
pinned?: true;
@ -5911,6 +5941,18 @@ namespace Api {
static fromReader(reader: Reader): UpdateSentPhoneCode;
}
export class UpdateGroupCallChainBlocks extends VirtualClass<{
call: Api.TypeInputGroupCall;
subChainId: int;
blocks: bytes[];
nextOffset: int;
}> {
call: Api.TypeInputGroupCall;
subChainId: int;
blocks: bytes[];
nextOffset: int;
static fromReader(reader: Reader): UpdateGroupCallChainBlocks;
}
export class UpdatesTooLong extends VirtualClass<void> {
CONSTRUCTOR_ID: 3809980286;
SUBCLASS_OF_ID: 2331323052;
@ -9858,6 +9900,12 @@ namespace Api {
static fromReader(reader: Reader): PhoneCallDiscardReasonBusy;
}
export class PhoneCallDiscardReasonMigrateConferenceCall extends VirtualClass<{
slug: string;
}> {
slug: string;
static fromReader(reader: Reader): PhoneCallDiscardReasonMigrateConferenceCall;
}
export class DataJSON extends VirtualClass<{
data: string;
}> {
@ -10192,7 +10240,6 @@ namespace Api {
participantId: long;
protocol: Api.TypePhoneCallProtocol;
receiveDate?: int;
conferenceCall?: Api.TypeInputGroupCall;
}> {
// flags: Api.Type;
video?: true;
@ -10220,7 +10267,6 @@ namespace Api {
participantId: long;
gAHash: bytes;
protocol: Api.TypePhoneCallProtocol;
conferenceCall?: Api.TypeInputGroupCall;
}> {
// flags: Api.Type;
video?: true;
@ -10248,7 +10294,6 @@ namespace Api {
participantId: long;
gB: bytes;
protocol: Api.TypePhoneCallProtocol;
conferenceCall?: Api.TypeInputGroupCall;
}> {
// flags: Api.Type;
video?: true;
@ -10270,6 +10315,7 @@ namespace Api {
// flags: Api.Type;
p2pAllowed?: true;
video?: true;
conferenceSupported?: true;
id: long;
accessHash: long;
date: int;
@ -10281,11 +10327,11 @@ namespace Api {
connections: Api.TypePhoneConnection[];
startDate: int;
customParameters?: Api.TypeDataJSON;
conferenceCall?: Api.TypeInputGroupCall;
}> {
// flags: Api.Type;
p2pAllowed?: true;
video?: true;
conferenceSupported?: true;
id: long;
accessHash: long;
date: int;
@ -10312,7 +10358,6 @@ namespace Api {
id: long;
reason?: Api.TypePhoneCallDiscardReason;
duration?: int;
conferenceCall?: Api.TypeInputGroupCall;
}> {
// flags: Api.Type;
needRating?: true;
@ -11062,6 +11107,12 @@ namespace Api {
static fromReader(reader: Reader): ChannelAdminLogEventActionParticipantSubExtend;
}
export class ChannelAdminLogEventActionToggleAutotranslation extends VirtualClass<{
newValue: Bool;
}> {
newValue: Bool;
static fromReader(reader: Reader): ChannelAdminLogEventActionToggleAutotranslation;
}
export class ChannelAdminLogEvent extends VirtualClass<{
id: long;
date: int;
@ -13195,6 +13246,8 @@ namespace Api {
recordVideoActive?: true;
rtmpStream?: true;
listenersHidden?: true;
conference?: true;
creator?: true;
id: long;
accessHash: long;
participantsCount: int;
@ -13205,7 +13258,7 @@ namespace Api {
unmutedVideoCount?: int;
unmutedVideoLimit: int;
version: int;
conferenceFromCall?: long;
inviteLink?: string;
}> {
// flags: Api.Type;
joinMuted?: true;
@ -13216,6 +13269,8 @@ namespace Api {
recordVideoActive?: true;
rtmpStream?: true;
listenersHidden?: true;
conference?: true;
creator?: true;
id: long;
accessHash: long;
participantsCount: int;
@ -13227,10 +13282,10 @@ namespace Api {
unmutedVideoLimit: int;
version: int;
conferenceFromCall?: long;
inviteLink?: string;
CONSTRUCTOR_ID: 3455636451;
SUBCLASS_OF_ID: 548729632;
className: 'GroupCall';
static fromReader(reader: Reader): GroupCall;
}
export class InputGroupCall extends VirtualClass<{
@ -13245,6 +13300,18 @@ namespace Api {
static fromReader(reader: Reader): InputGroupCall;
}
export class InputGroupCallSlug extends VirtualClass<{
slug: string;
}> {
slug: string;
static fromReader(reader: Reader): InputGroupCallSlug;
}
export class InputGroupCallInviteMessage extends VirtualClass<{
msgId: int;
}> {
msgId: int;
static fromReader(reader: Reader): InputGroupCallInviteMessage;
}
export class GroupCallParticipant extends VirtualClass<{
// flags: Api.Type;
muted?: true;
@ -13979,6 +14046,14 @@ namespace Api {
static fromReader(reader: Reader): InputInvoiceBusinessBotTransferStars;
}
export class InputInvoiceStarGiftResale extends VirtualClass<{
slug: string;
toId: Api.TypeInputPeer;
}> {
slug: string;
toId: Api.TypeInputPeer;
static fromReader(reader: Reader): InputInvoiceStarGiftResale;
}
export class InputStorePaymentPremiumSubscription extends VirtualClass<{
// flags: Api.Type;
restore?: true;
@ -16228,6 +16303,8 @@ namespace Api {
gift?: true;
reaction?: true;
stargiftUpgrade?: true;
businessTransfer?: true;
stargiftResale?: true;
id: string;
stars: Api.TypeStarsAmount;
date: int;
@ -16257,6 +16334,8 @@ namespace Api {
gift?: true;
reaction?: true;
stargiftUpgrade?: true;
businessTransfer?: true;
stargiftResale?: true;
id: string;
stars: Api.TypeStarsAmount;
date: int;
@ -16498,10 +16577,13 @@ namespace Api {
stars: long;
availabilityRemains?: int;
availabilityTotal?: int;
availabilityResale?: long;
convertStars: long;
firstSaleDate?: int;
lastSaleDate?: int;
upgradeStars?: long;
resellMinStars?: long;
title?: string;
}> {
// flags: Api.Type;
limited?: true;
@ -16512,14 +16594,16 @@ namespace Api {
stars: long;
availabilityRemains?: int;
availabilityTotal?: int;
availabilityResale?: long;
convertStars: long;
firstSaleDate?: int;
lastSaleDate?: int;
upgradeStars?: long;
resellMinStars?: long;
title?: string;
CONSTRUCTOR_ID: 46953416;
SUBCLASS_OF_ID: 3273414923;
className: 'StarGift';
static fromReader(reader: Reader): StarGift;
}
export class StarGiftUnique extends VirtualClass<{
@ -16535,6 +16619,7 @@ namespace Api {
availabilityIssued: int;
availabilityTotal: int;
giftAddress?: string;
resellStars?: long;
}> {
// flags: Api.Type;
id: long;
@ -16548,10 +16633,10 @@ namespace Api {
availabilityIssued: int;
availabilityTotal: int;
giftAddress?: string;
resellStars?: long;
CONSTRUCTOR_ID: 1549979985;
SUBCLASS_OF_ID: 3273414923;
className: 'StarGiftUnique';
static fromReader(reader: Reader): StarGiftUnique;
}
export class MessageReportOption extends VirtualClass<{
@ -16739,6 +16824,7 @@ namespace Api {
}
export class StarGiftAttributeBackdrop extends VirtualClass<{
name: string;
backdropId: int;
centerColor: int;
edgeColor: int;
patternColor: int;
@ -16746,6 +16832,7 @@ namespace Api {
rarityPermille: int;
}> {
name: string;
backdropId: int;
centerColor: int;
edgeColor: int;
patternColor: int;
@ -16792,6 +16879,8 @@ namespace Api {
upgradeStars?: long;
canExportAt?: int;
transferStars?: long;
canTransferAt?: int;
canResellAt?: int;
}> {
// flags: Api.Type;
nameHidden?: true;
@ -16809,10 +16898,11 @@ namespace Api {
upgradeStars?: long;
canExportAt?: int;
transferStars?: long;
canTransferAt?: int;
canResellAt?: int;
CONSTRUCTOR_ID: 1616305061;
SUBCLASS_OF_ID: 2385198100;
className: 'SavedStarGift';
static fromReader(reader: Reader): SavedStarGift;
}
export class InputSavedStarGiftUser extends VirtualClass<{
@ -16837,6 +16927,12 @@ namespace Api {
static fromReader(reader: Reader): InputSavedStarGiftChat;
}
export class InputSavedStarGiftSlug extends VirtualClass<{
slug: string;
}> {
slug: string;
static fromReader(reader: Reader): InputSavedStarGiftSlug;
}
export class PaidReactionPrivacyDefault extends VirtualClass<void> {
CONSTRUCTOR_ID: 543872158;
SUBCLASS_OF_ID: 1708619318;
@ -16959,6 +17055,44 @@ namespace Api {
static fromReader(reader: Reader): SponsoredPeer;
}
export class StarGiftAttributeIdModel extends VirtualClass<{
documentId: long;
}> {
documentId: long;
static fromReader(reader: Reader): StarGiftAttributeIdModel;
}
export class StarGiftAttributeIdPattern extends VirtualClass<{
documentId: long;
}> {
documentId: long;
static fromReader(reader: Reader): StarGiftAttributeIdPattern;
}
export class StarGiftAttributeIdBackdrop extends VirtualClass<{
backdropId: int;
}> {
backdropId: int;
static fromReader(reader: Reader): StarGiftAttributeIdBackdrop;
}
export class StarGiftAttributeCounter extends VirtualClass<{
attribute: Api.TypeStarGiftAttributeId;
count: int;
}> {
attribute: Api.TypeStarGiftAttributeId;
count: int;
static fromReader(reader: Reader): StarGiftAttributeCounter;
}
export class PendingSuggestion extends VirtualClass<{
suggestion: string;
title: Api.TypeTextWithEntities;
description: Api.TypeTextWithEntities;
url: string;
}> {
suggestion: string;
title: Api.TypeTextWithEntities;
description: Api.TypeTextWithEntities;
url: string;
static fromReader(reader: Reader): PendingSuggestion;
}
export class ResPQ extends VirtualClass<{
nonce: int128;
serverNonce: int128;
@ -19745,24 +19879,29 @@ namespace Api {
// flags: Api.Type;
proxy?: true;
expires: int;
peer: Api.TypePeer;
chats: Api.TypeChat[];
users: Api.TypeUser[];
peer?: Api.TypePeer;
psaType?: string;
psaMessage?: string;
pendingSuggestions: string[];
dismissedSuggestions: string[];
customPendingSuggestion?: Api.TypePendingSuggestion;
chats: Api.TypeChat[];
users: Api.TypeUser[];
}> {
// flags: Api.Type;
proxy?: true;
expires: int;
peer: Api.TypePeer;
chats: Api.TypeChat[];
users: Api.TypeUser[];
peer?: Api.TypePeer;
psaType?: string;
psaMessage?: string;
pendingSuggestions: string[];
dismissedSuggestions: string[];
customPendingSuggestion?: Api.TypePendingSuggestion;
chats: Api.TypeChat[];
users: Api.TypeUser[];
CONSTRUCTOR_ID: 2352576831;
SUBCLASS_OF_ID: 2639877442;
className: 'PromoData';
static fromReader(reader: Reader): PromoData;
}
export class CountryCode extends VirtualClass<{
@ -20922,6 +21061,28 @@ namespace Api {
static fromReader(reader: Reader): StarGiftWithdrawalUrl;
}
export class ResaleStarGifts extends VirtualClass<{
// flags: Api.Type;
count: int;
gifts: Api.TypeStarGift[];
nextOffset?: string;
attributes?: Api.TypeStarGiftAttribute[];
attributesHash?: long;
chats: Api.TypeChat[];
counters?: Api.TypeStarGiftAttributeCounter[];
users: Api.TypeUser[];
}> {
// flags: Api.Type;
count: int;
gifts: Api.TypeStarGift[];
nextOffset?: string;
attributes?: Api.TypeStarGiftAttribute[];
attributesHash?: long;
chats: Api.TypeChat[];
counters?: Api.TypeStarGiftAttributeCounter[];
users: Api.TypeUser[];
static fromReader(reader: Reader): ResaleStarGifts;
}
}
export namespace phone {
@ -21531,6 +21692,12 @@ namespace Api {
static fromReader(reader: Reader): FoundStories;
}
export class CanSendStoryCount extends VirtualClass<{
countRemains: int;
}> {
countRemains: int;
static fromReader(reader: Reader): CanSendStoryCount;
}
}
export namespace premium {
@ -25991,6 +26158,13 @@ namespace Api {
channel: Api.TypeInputChannel;
sendPaidMessagesStars: long;
}
export class ToggleAutotranslation extends Request<Partial<{
channel: Api.TypeInputChannel;
enabled: Bool;
}>, Api.TypeUpdates> {
channel: Api.TypeInputChannel;
enabled: Bool;
}
}
export namespace bots {
@ -26607,6 +26781,32 @@ namespace Api {
}>, Bool> {
purpose: Api.TypeInputStorePaymentPurpose;
}
export class GetResaleStarGifts extends Request<Partial<{
// flags: Api.Type;
sortByPrice?: true;
sortByNum?: true;
attributesHash?: long;
giftId: long;
attributes?: Api.TypeStarGiftAttributeId[];
offset: string;
limit: int;
}>, payments.TypeResaleStarGifts> {
// flags: Api.Type;
sortByPrice?: true;
sortByNum?: true;
attributesHash?: long;
giftId: long;
attributes?: Api.TypeStarGiftAttributeId[];
offset: string;
limit: int;
}
export class UpdateStarGiftPrice extends Request<Partial<{
stargift: Api.TypeInputSavedStarGift;
resellStars: long;
}>, Api.TypeUpdates> {
stargift: Api.TypeInputSavedStarGift;
resellStars: long;
}
}
export namespace stickers {
@ -26713,7 +26913,6 @@ namespace Api {
// flags: Api.Type;
video?: true;
userId: Api.TypeInputUser;
conferenceCall?: Api.TypeInputGroupCall;
randomId: int;
gAHash: bytes;
protocol: Api.TypePhoneCallProtocol;
@ -26721,7 +26920,6 @@ namespace Api {
// flags: Api.Type;
video?: true;
userId: Api.TypeInputUser;
conferenceCall?: Api.TypeInputGroupCall;
randomId: int;
gAHash: bytes;
protocol: Api.TypePhoneCallProtocol;
@ -26815,7 +27013,8 @@ namespace Api {
call: Api.TypeInputGroupCall;
joinAs: Api.TypeInputPeer;
inviteHash?: string;
keyFingerprint?: long;
publicKey?: int256;
block?: bytes;
params: Api.TypeDataJSON;
}>, Api.TypeUpdates> {
// flags: Api.Type;
@ -26824,7 +27023,8 @@ namespace Api {
call: Api.TypeInputGroupCall;
joinAs: Api.TypeInputPeer;
inviteHash?: string;
keyFingerprint?: long;
publicKey?: int256;
block?: bytes;
params: Api.TypeDataJSON;
}
export class LeaveGroupCall extends Request<Partial<{
@ -26992,11 +27192,72 @@ namespace Api {
file: Api.TypeInputFile;
}
export class CreateConferenceCall extends Request<Partial<{
peer: Api.TypeInputPhoneCall;
keyFingerprint: long;
}>, phone.TypePhoneCall> {
peer: Api.TypeInputPhoneCall;
keyFingerprint: long;
// flags: Api.Type;
muted?: true;
videoStopped?: true;
join?: true;
randomId: int;
publicKey?: int256;
block?: bytes;
params?: Api.TypeDataJSON;
}>, Api.TypeUpdates> {
// flags: Api.Type;
muted?: true;
videoStopped?: true;
join?: true;
randomId: int;
publicKey?: int256;
block?: bytes;
params?: Api.TypeDataJSON;
}
export class DeleteConferenceCallParticipants extends Request<Partial<{
// flags: Api.Type;
onlyLeft?: true;
kick?: true;
call: Api.TypeInputGroupCall;
ids: long[];
block: bytes;
}>, Api.TypeUpdates> {
// flags: Api.Type;
onlyLeft?: true;
kick?: true;
call: Api.TypeInputGroupCall;
ids: long[];
block: bytes;
}
export class SendConferenceCallBroadcast extends Request<Partial<{
call: Api.TypeInputGroupCall;
block: bytes;
}>, Api.TypeUpdates> {
call: Api.TypeInputGroupCall;
block: bytes;
}
export class InviteConferenceCallParticipant extends Request<Partial<{
// flags: Api.Type;
video?: true;
call: Api.TypeInputGroupCall;
userId: Api.TypeInputUser;
}>, Api.TypeUpdates> {
// flags: Api.Type;
video?: true;
call: Api.TypeInputGroupCall;
userId: Api.TypeInputUser;
}
export class DeclineConferenceCallInvite extends Request<Partial<{
msgId: int;
}>, Api.TypeUpdates> {
msgId: int;
}
export class GetGroupCallChainBlocks extends Request<Partial<{
call: Api.TypeInputGroupCall;
subChainId: int;
offset: int;
limit: int;
}>, Api.TypeUpdates> {
call: Api.TypeInputGroupCall;
subChainId: int;
offset: int;
limit: int;
}
}
@ -27228,7 +27489,7 @@ namespace Api {
export namespace stories {
export class CanSendStory extends Request<Partial<{
peer: Api.TypeInputPeer;
}>, Bool> {
}>, stories.TypeCanSendStoryCount> {
peer: Api.TypeInputPeer;
}
export class SendStory extends Request<Partial<{
@ -27564,11 +27825,11 @@ namespace Api {
| photos.UpdateProfilePhoto | photos.UploadProfilePhoto | photos.DeletePhotos | photos.GetUserPhotos | photos.UploadContactProfilePhoto
| upload.SaveFilePart | upload.GetFile | upload.SaveBigFilePart | upload.GetWebFile | upload.GetCdnFile | upload.ReuploadCdnFile | upload.GetCdnFileHashes | upload.GetFileHashes
| help.GetConfig | help.GetNearestDc | help.GetAppUpdate | help.GetInviteText | help.GetSupport | help.SetBotUpdatesStatus | help.GetCdnConfig | help.GetRecentMeUrls | help.GetTermsOfServiceUpdate | help.AcceptTermsOfService | help.GetDeepLinkInfo | help.GetAppConfig | help.SaveAppLog | help.GetPassportConfig | help.GetSupportName | help.GetUserInfo | help.EditUserInfo | help.GetPromoData | help.HidePromoData | help.DismissSuggestion | help.GetCountriesList | help.GetPremiumPromo | help.GetPeerColors | help.GetPeerProfileColors | help.GetTimezonesList
| channels.ReadHistory | channels.DeleteMessages | channels.ReportSpam | channels.GetMessages | channels.GetParticipants | channels.GetParticipant | channels.GetChannels | channels.GetFullChannel | channels.CreateChannel | channels.EditAdmin | channels.EditTitle | channels.EditPhoto | channels.CheckUsername | channels.UpdateUsername | channels.JoinChannel | channels.LeaveChannel | channels.InviteToChannel | channels.DeleteChannel | channels.ExportMessageLink | channels.ToggleSignatures | channels.GetAdminedPublicChannels | channels.EditBanned | channels.GetAdminLog | channels.SetStickers | channels.ReadMessageContents | channels.DeleteHistory | channels.TogglePreHistoryHidden | channels.GetLeftChannels | channels.GetGroupsForDiscussion | channels.SetDiscussionGroup | channels.EditCreator | channels.EditLocation | channels.ToggleSlowMode | channels.GetInactiveChannels | channels.ConvertToGigagroup | channels.GetSendAs | channels.DeleteParticipantHistory | channels.ToggleJoinToSend | channels.ToggleJoinRequest | channels.ReorderUsernames | channels.ToggleUsername | channels.DeactivateAllUsernames | channels.ToggleForum | channels.CreateForumTopic | channels.GetForumTopics | channels.GetForumTopicsByID | channels.EditForumTopic | channels.UpdatePinnedForumTopic | channels.DeleteTopicHistory | channels.ReorderPinnedForumTopics | channels.ToggleAntiSpam | channels.ReportAntiSpamFalsePositive | channels.ToggleParticipantsHidden | channels.UpdateColor | channels.ToggleViewForumAsMessages | channels.GetChannelRecommendations | channels.UpdateEmojiStatus | channels.SetBoostsToUnblockRestrictions | channels.SetEmojiStickers | channels.RestrictSponsoredMessages | channels.SearchPosts | channels.UpdatePaidMessagesPrice
| channels.ReadHistory | channels.DeleteMessages | channels.ReportSpam | channels.GetMessages | channels.GetParticipants | channels.GetParticipant | channels.GetChannels | channels.GetFullChannel | channels.CreateChannel | channels.EditAdmin | channels.EditTitle | channels.EditPhoto | channels.CheckUsername | channels.UpdateUsername | channels.JoinChannel | channels.LeaveChannel | channels.InviteToChannel | channels.DeleteChannel | channels.ExportMessageLink | channels.ToggleSignatures | channels.GetAdminedPublicChannels | channels.EditBanned | channels.GetAdminLog | channels.SetStickers | channels.ReadMessageContents | channels.DeleteHistory | channels.TogglePreHistoryHidden | channels.GetLeftChannels | channels.GetGroupsForDiscussion | channels.SetDiscussionGroup | channels.EditCreator | channels.EditLocation | channels.ToggleSlowMode | channels.GetInactiveChannels | channels.ConvertToGigagroup | channels.GetSendAs | channels.DeleteParticipantHistory | channels.ToggleJoinToSend | channels.ToggleJoinRequest | channels.ReorderUsernames | channels.ToggleUsername | channels.DeactivateAllUsernames | channels.ToggleForum | channels.CreateForumTopic | channels.GetForumTopics | channels.GetForumTopicsByID | channels.EditForumTopic | channels.UpdatePinnedForumTopic | channels.DeleteTopicHistory | channels.ReorderPinnedForumTopics | channels.ToggleAntiSpam | channels.ReportAntiSpamFalsePositive | channels.ToggleParticipantsHidden | channels.UpdateColor | channels.ToggleViewForumAsMessages | channels.GetChannelRecommendations | channels.UpdateEmojiStatus | channels.SetBoostsToUnblockRestrictions | channels.SetEmojiStickers | channels.RestrictSponsoredMessages | channels.SearchPosts | channels.UpdatePaidMessagesPrice | channels.ToggleAutotranslation
| bots.SendCustomRequest | bots.AnswerWebhookJSONQuery | bots.SetBotCommands | bots.ResetBotCommands | bots.GetBotCommands | bots.SetBotMenuButton | bots.GetBotMenuButton | bots.SetBotBroadcastDefaultAdminRights | bots.SetBotGroupDefaultAdminRights | bots.SetBotInfo | bots.GetBotInfo | bots.ReorderUsernames | bots.ToggleUsername | bots.CanSendMessage | bots.AllowSendMessage | bots.InvokeWebViewCustomMethod | bots.GetPopularAppBots | bots.AddPreviewMedia | bots.EditPreviewMedia | bots.DeletePreviewMedia | bots.ReorderPreviewMedias | bots.GetPreviewInfo | bots.GetPreviewMedias | bots.UpdateUserEmojiStatus | bots.ToggleUserEmojiStatusPermission | bots.CheckDownloadFileParams | bots.GetAdminedBots | bots.UpdateStarRefProgram | bots.SetCustomVerification | bots.GetBotRecommendations
| payments.GetPaymentForm | payments.GetPaymentReceipt | payments.ValidateRequestedInfo | payments.SendPaymentForm | payments.GetSavedInfo | payments.ClearSavedInfo | payments.GetBankCardData | payments.ExportInvoice | payments.AssignAppStoreTransaction | payments.AssignPlayMarketTransaction | payments.GetPremiumGiftCodeOptions | payments.CheckGiftCode | payments.ApplyGiftCode | payments.GetGiveawayInfo | payments.LaunchPrepaidGiveaway | payments.GetStarsTopupOptions | payments.GetStarsStatus | payments.GetStarsTransactions | payments.SendStarsForm | payments.RefundStarsCharge | payments.GetStarsRevenueStats | payments.GetStarsRevenueWithdrawalUrl | payments.GetStarsRevenueAdsAccountUrl | payments.GetStarsTransactionsByID | payments.GetStarsGiftOptions | payments.GetStarsSubscriptions | payments.ChangeStarsSubscription | payments.FulfillStarsSubscription | payments.GetStarsGiveawayOptions | payments.GetStarGifts | payments.SaveStarGift | payments.ConvertStarGift | payments.BotCancelStarsSubscription | payments.GetConnectedStarRefBots | payments.GetConnectedStarRefBot | payments.GetSuggestedStarRefBots | payments.ConnectStarRefBot | payments.EditConnectedStarRefBot | payments.GetStarGiftUpgradePreview | payments.UpgradeStarGift | payments.TransferStarGift | payments.GetUniqueStarGift | payments.GetSavedStarGifts | payments.GetSavedStarGift | payments.GetStarGiftWithdrawalUrl | payments.ToggleChatStarGiftNotifications | payments.ToggleStarGiftsPinnedToTop | payments.CanPurchaseStore
| payments.GetPaymentForm | payments.GetPaymentReceipt | payments.ValidateRequestedInfo | payments.SendPaymentForm | payments.GetSavedInfo | payments.ClearSavedInfo | payments.GetBankCardData | payments.ExportInvoice | payments.AssignAppStoreTransaction | payments.AssignPlayMarketTransaction | payments.GetPremiumGiftCodeOptions | payments.CheckGiftCode | payments.ApplyGiftCode | payments.GetGiveawayInfo | payments.LaunchPrepaidGiveaway | payments.GetStarsTopupOptions | payments.GetStarsStatus | payments.GetStarsTransactions | payments.SendStarsForm | payments.RefundStarsCharge | payments.GetStarsRevenueStats | payments.GetStarsRevenueWithdrawalUrl | payments.GetStarsRevenueAdsAccountUrl | payments.GetStarsTransactionsByID | payments.GetStarsGiftOptions | payments.GetStarsSubscriptions | payments.ChangeStarsSubscription | payments.FulfillStarsSubscription | payments.GetStarsGiveawayOptions | payments.GetStarGifts | payments.SaveStarGift | payments.ConvertStarGift | payments.BotCancelStarsSubscription | payments.GetConnectedStarRefBots | payments.GetConnectedStarRefBot | payments.GetSuggestedStarRefBots | payments.ConnectStarRefBot | payments.EditConnectedStarRefBot | payments.GetStarGiftUpgradePreview | payments.UpgradeStarGift | payments.TransferStarGift | payments.GetUniqueStarGift | payments.GetSavedStarGifts | payments.GetSavedStarGift | payments.GetStarGiftWithdrawalUrl | payments.ToggleChatStarGiftNotifications | payments.ToggleStarGiftsPinnedToTop | payments.CanPurchaseStore | payments.GetResaleStarGifts | payments.UpdateStarGiftPrice
| stickers.CreateStickerSet | stickers.RemoveStickerFromSet | stickers.ChangeStickerPosition | stickers.AddStickerToSet | stickers.SetStickerSetThumb | stickers.CheckShortName | stickers.SuggestShortName | stickers.ChangeSticker | stickers.RenameStickerSet | stickers.DeleteStickerSet | stickers.ReplaceSticker
| phone.GetCallConfig | phone.RequestCall | phone.AcceptCall | phone.ConfirmCall | phone.ReceivedCall | phone.DiscardCall | phone.SetCallRating | phone.SaveCallDebug | phone.SendSignalingData | phone.CreateGroupCall | phone.JoinGroupCall | phone.LeaveGroupCall | phone.InviteToGroupCall | phone.DiscardGroupCall | phone.ToggleGroupCallSettings | phone.GetGroupCall | phone.GetGroupParticipants | phone.CheckGroupCall | phone.ToggleGroupCallRecord | phone.EditGroupCallParticipant | phone.EditGroupCallTitle | phone.GetGroupCallJoinAs | phone.ExportGroupCallInvite | phone.ToggleGroupCallStartSubscription | phone.StartScheduledGroupCall | phone.SaveDefaultGroupCallJoinAs | phone.JoinGroupCallPresentation | phone.LeaveGroupCallPresentation | phone.GetGroupCallStreamChannels | phone.GetGroupCallStreamRtmpUrl | phone.SaveCallLog | phone.CreateConferenceCall
| phone.GetCallConfig | phone.RequestCall | phone.AcceptCall | phone.ConfirmCall | phone.ReceivedCall | phone.DiscardCall | phone.SetCallRating | phone.SaveCallDebug | phone.SendSignalingData | phone.CreateGroupCall | phone.JoinGroupCall | phone.LeaveGroupCall | phone.InviteToGroupCall | phone.DiscardGroupCall | phone.ToggleGroupCallSettings | phone.GetGroupCall | phone.GetGroupParticipants | phone.CheckGroupCall | phone.ToggleGroupCallRecord | phone.EditGroupCallParticipant | phone.EditGroupCallTitle | phone.GetGroupCallJoinAs | phone.ExportGroupCallInvite | phone.ToggleGroupCallStartSubscription | phone.StartScheduledGroupCall | phone.SaveDefaultGroupCallJoinAs | phone.JoinGroupCallPresentation | phone.LeaveGroupCallPresentation | phone.GetGroupCallStreamChannels | phone.GetGroupCallStreamRtmpUrl | phone.SaveCallLog | phone.CreateConferenceCall | phone.DeleteConferenceCallParticipants | phone.SendConferenceCallBroadcast | phone.InviteConferenceCallParticipant | phone.DeclineConferenceCallInvite | phone.GetGroupCallChainBlocks
| langpack.GetLangPack | langpack.GetStrings | langpack.GetDifference | langpack.GetLanguages | langpack.GetLanguage
| folders.EditPeerFolders
| stats.GetBroadcastStats | stats.LoadAsyncGraph | stats.GetMegagroupStats | stats.GetMessagePublicForwards | stats.GetMessageStats | stats.GetStoryStats | stats.GetStoryPublicForwards | stats.GetBroadcastRevenueStats | stats.GetBroadcastRevenueWithdrawalUrl | stats.GetBroadcastRevenueTransactions

View File

@ -80,7 +80,7 @@ userStatusLastMonth#65899777 flags:# by_me:flags.0?true = UserStatus;
chatEmpty#29562865 id:long = Chat;
chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;
chatForbidden#6592a1a7 id:long title:string = Chat;
channel#7482147e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector<RestrictionReason> admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector<Username> stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long = Chat;
channel#7482147e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector<RestrictionReason> admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector<Username> stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long = Chat;
channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat;
chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector<BotInfo> pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector<long> available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull;
channelFull#52d6806b flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true paid_media_allowed:flags2.14?true can_view_stars_revenue:flags2.15?true paid_reactions_available:flags2.16?true stargifts_available:flags2.19?true paid_messages_available:flags2.20?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector<string> groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector<long> default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet bot_verification:flags2.17?BotVerification stargifts_count:flags2.18?int = ChatFull;
@ -158,9 +158,10 @@ messageActionPaymentRefunded#41b3e202 flags:# peer:Peer currency:string total_am
messageActionGiftStars#45d5b021 flags:# currency:string amount:long stars:long crypto_currency:flags.0?string crypto_amount:flags.0?long transaction_id:flags.1?string = MessageAction;
messageActionPrizeStars#b00c47a2 flags:# unclaimed:flags.0?true stars:long transaction_id:string boost_peer:Peer giveaway_msg_id:int = MessageAction;
messageActionStarGift#4717e8a4 flags:# name_hidden:flags.0?true saved:flags.2?true converted:flags.3?true upgraded:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true gift:StarGift message:flags.1?TextWithEntities convert_stars:flags.4?long upgrade_msg_id:flags.5?int upgrade_stars:flags.8?long from_id:flags.11?Peer peer:flags.12?Peer saved_id:flags.12?long = MessageAction;
messageActionStarGiftUnique#acdfcb81 flags:# upgrade:flags.0?true transferred:flags.1?true saved:flags.2?true refunded:flags.5?true gift:StarGift can_export_at:flags.3?int transfer_stars:flags.4?long from_id:flags.6?Peer peer:flags.7?Peer saved_id:flags.7?long = MessageAction;
messageActionStarGiftUnique#2e3ae60e flags:# upgrade:flags.0?true transferred:flags.1?true saved:flags.2?true refunded:flags.5?true gift:StarGift can_export_at:flags.3?int transfer_stars:flags.4?long from_id:flags.6?Peer peer:flags.7?Peer saved_id:flags.7?long resale_stars:flags.8?long can_transfer_at:flags.9?int can_resell_at:flags.10?int = MessageAction;
messageActionPaidMessagesRefunded#ac1f1fcd count:int stars:long = MessageAction;
messageActionPaidMessagesPrice#bcd71419 stars:long = MessageAction;
messageActionConferenceCall#2ffe2f7a flags:# missed:flags.0?true active:flags.1?true video:flags.4?true call_id:long duration:flags.2?int other_participants:flags.3?Vector<Peer> = MessageAction;
dialog#d58a08c6 flags:# pinned:flags.2?true unread_mark:flags.3?true view_forum_as_messages:flags.6?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int ttl_period:flags.5?int = Dialog;
dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
photoEmpty#2331b22d id:long = Photo;
@ -378,6 +379,7 @@ updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update;
updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Update;
updatePaidReactionPrivacy#8b725fce private:PaidReactionPrivacy = Update;
updateSentPhoneCode#504aa18f sent_code:auth.SentCode = Update;
updateGroupCallChainBlocks#a477288f call:InputGroupCall sub_chain_id:int blocks:Vector<bytes> next_offset:int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;
updates.difference#f49ca0 new_messages:Vector<Message> new_encrypted_messages:Vector<EncryptedMessage> other_updates:Vector<Update> chats:Vector<Chat> users:Vector<User> state:updates.State = updates.Difference;
@ -750,6 +752,7 @@ phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;
phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;
phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;
phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;
phoneCallDiscardReasonMigrateConferenceCall#9fbbf1f7 slug:string = PhoneCallDiscardReason;
dataJSON#7d748d04 data:string = DataJSON;
labeledPrice#cb296bf8 label:string amount:long = LabeledPrice;
invoice#49ee584 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true recurring:flags.9?true currency:string prices:Vector<LabeledPrice> max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector<long> terms_url:flags.10?string subscription_period:flags.11?int = Invoice;
@ -782,11 +785,11 @@ shippingOption#b6213cdf id:string title:string prices:Vector<LabeledPrice> = Shi
inputStickerSetItem#32da9e9c flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords keywords:flags.1?string = InputStickerSetItem;
inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;
phoneCallEmpty#5366c915 id:long = PhoneCall;
phoneCallWaiting#eed42858 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallRequested#45361c63 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallAccepted#22fd7181 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCall#3ba5940c flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int custom_parameters:flags.7?DataJSON conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallDiscarded#f9d25503 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallWaiting#c5226f17 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;
phoneCallRequested#14b0ed0c flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCallAccepted#3660c311 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCall#30535af5 flags:# p2p_allowed:flags.5?true video:flags.6?true conference_supported:flags.8?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int custom_parameters:flags.7?DataJSON = PhoneCall;
phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;
phoneConnection#9cc123c7 flags:# tcp:flags.0?true id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;
phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection;
phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector<string> = PhoneCallProtocol;
@ -850,6 +853,7 @@ channelAdminLogEventActionChangeEmojiStatus#3ea9feb1 prev_value:EmojiStatus new_
channelAdminLogEventActionChangeEmojiStickerSet#46d840ab prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction;
channelAdminLogEventActionToggleSignatureProfiles#60a79c79 new_value:Bool = ChannelAdminLogEventAction;
channelAdminLogEventActionParticipantSubExtend#64642db3 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;
channelAdminLogEventActionToggleAutotranslation#c517f77e new_value:Bool = ChannelAdminLogEventAction;
channelAdminLogEvent#1fad68cd id:long date:int user_id:long action:ChannelAdminLogEventAction = ChannelAdminLogEvent;
channels.adminLogResults#ed8af74d events:Vector<ChannelAdminLogEvent> chats:Vector<Chat> users:Vector<User> = channels.AdminLogResults;
channelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true group_call:flags.14?true invites:flags.15?true send:flags.16?true forums:flags.17?true sub_extend:flags.18?true = ChannelAdminLogEventsFilter;
@ -1020,7 +1024,7 @@ statsGraphError#bedc9822 error:string = StatsGraph;
statsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph;
stats.broadcastStats#396ca5fc period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev reactions_per_post:StatsAbsValueAndPrev views_per_story:StatsAbsValueAndPrev shares_per_story:StatsAbsValueAndPrev reactions_per_story:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph reactions_by_emotion_graph:StatsGraph story_interactions_graph:StatsGraph story_reactions_by_emotion_graph:StatsGraph recent_posts_interactions:Vector<PostInteractionCounters> = stats.BroadcastStats;
help.promoDataEmpty#98f6ac75 expires:int = help.PromoData;
help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector<Chat> users:Vector<User> psa_type:flags.1?string psa_message:flags.2?string = help.PromoData;
help.promoData#8a4d87a flags:# proxy:flags.0?true expires:int peer:flags.3?Peer psa_type:flags.1?string psa_message:flags.2?string pending_suggestions:Vector<string> dismissed_suggestions:Vector<string> custom_pending_suggestion:flags.4?PendingSuggestion chats:Vector<Chat> users:Vector<User> = help.PromoData;
videoSize#de33b094 flags:# type:string w:int h:int size:int video_start_ts:flags.0?double = VideoSize;
videoSizeEmojiMarkup#f85c413c emoji_id:long background_colors:Vector<int> = VideoSize;
videoSizeStickerMarkup#da082fe stickerset:InputStickerSet sticker_id:long background_colors:Vector<int> = VideoSize;
@ -1042,8 +1046,10 @@ messageReplies#83d60fc2 flags:# comments:flags.0?true replies:int replies_pts:in
peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;
stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats;
groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall;
groupCall#cdf8d3e3 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int conference_from_call:flags.14?long = GroupCall;
groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall;
inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall;
inputGroupCallSlug#fe06823f slug:string = InputGroupCall;
inputGroupCallInviteMessage#8c10603f msg_id:int = InputGroupCall;
groupCallParticipant#eba636fe flags:# muted:flags.0?true left:flags.1?true can_self_unmute:flags.2?true just_joined:flags.4?true versioned:flags.5?true min:flags.8?true muted_by_you:flags.9?true volume_by_admin:flags.10?true self:flags.12?true video_joined:flags.15?true peer:Peer date:int active_date:flags.3?int source:int volume:flags.7?int about:flags.11?string raise_hand_rating:flags.13?long video:flags.6?GroupCallParticipantVideo presentation:flags.14?GroupCallParticipantVideo = GroupCallParticipant;
phone.groupCall#9e727aad call:GroupCall participants:Vector<GroupCallParticipant> participants_next_offset:string chats:Vector<Chat> users:Vector<User> = phone.GroupCall;
phone.groupParticipants#f47751b6 count:int participants:Vector<GroupCallParticipant> next_offset:string chats:Vector<Chat> users:Vector<User> version:int = phone.GroupParticipants;
@ -1134,6 +1140,7 @@ inputInvoiceStarGiftUpgrade#4d818d5d flags:# keep_original_details:flags.0?true
inputInvoiceStarGiftTransfer#4a5f5bd9 stargift:InputSavedStarGift to_id:InputPeer = InputInvoice;
inputInvoicePremiumGiftStars#dabab2ef flags:# user_id:InputUser months:int message:flags.0?TextWithEntities = InputInvoice;
inputInvoiceBusinessBotTransferStars#f4997e42 bot:InputUser stars:long = InputInvoice;
inputInvoiceStarGiftResale#63cbc38c slug:string to_id:InputPeer = InputInvoice;
payments.exportedInvoice#aed0cbd9 url:string = payments.ExportedInvoice;
messages.transcribedAudio#cfb9d957 flags:# pending:flags.0?true transcription_id:long text:string trial_remains_num:flags.1?int trial_remains_until_date:flags.1?int = messages.TranscribedAudio;
help.premiumPromo#5334759c status_text:string status_entities:Vector<MessageEntity> video_sections:Vector<string> videos:Vector<Document> period_options:Vector<PremiumSubscriptionOption> users:Vector<User> = help.PremiumPromo;
@ -1354,7 +1361,7 @@ starsTransactionPeer#d80da15d peer:Peer = StarsTransactionPeer;
starsTransactionPeerAds#60682812 = StarsTransactionPeer;
starsTransactionPeerAPI#f9677aad = StarsTransactionPeer;
starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption;
starsTransaction#a39fd94a flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true stargift_upgrade:flags.18?true id:string stars:StarsAmount date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int starref_commission_permille:flags.16?int starref_peer:flags.17?Peer starref_amount:flags.17?StarsAmount paid_messages:flags.19?int premium_gift_months:flags.20?int = StarsTransaction;
starsTransaction#a39fd94a flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true stargift_upgrade:flags.18?true business_transfer:flags.21?true stargift_resale:flags.22?true id:string stars:StarsAmount date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int starref_commission_permille:flags.16?int starref_peer:flags.17?Peer starref_amount:flags.17?StarsAmount paid_messages:flags.19?int premium_gift_months:flags.20?int = StarsTransaction;
payments.starsStatus#6c9ce8ed flags:# balance:StarsAmount subscriptions:flags.1?Vector<StarsSubscription> subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector<StarsTransaction> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.StarsStatus;
foundStory#e87acbc0 peer:Peer story:StoryItem = FoundStory;
stories.foundStories#e2de7737 flags:# count:int stories:Vector<FoundStory> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = stories.FoundStories;
@ -1373,8 +1380,8 @@ starsSubscription#2e6eab1a flags:# canceled:flags.0?true can_refulfill:flags.1?t
messageReactor#4ba3a95a flags:# top:flags.0?true my:flags.1?true anonymous:flags.2?true peer_id:flags.3?Peer count:int = MessageReactor;
starsGiveawayOption#94ce852a flags:# extended:flags.0?true default:flags.1?true stars:long yearly_boosts:int store_product:flags.2?string currency:string amount:long winners:Vector<StarsGiveawayWinnersOption> = StarsGiveawayOption;
starsGiveawayWinnersOption#54236209 flags:# default:flags.0?true users:int per_user_stars:long = StarsGiveawayWinnersOption;
starGift#2cc73c8 flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int upgrade_stars:flags.3?long = StarGift;
starGiftUnique#5c62d151 flags:# id:long title:string slug:string num:int owner_id:flags.0?Peer owner_name:flags.1?string owner_address:flags.2?string attributes:Vector<StarGiftAttribute> availability_issued:int availability_total:int gift_address:flags.3?string = StarGift;
starGift#c62aca28 flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int availability_resale:flags.4?long convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int upgrade_stars:flags.3?long resell_min_stars:flags.4?long title:flags.5?string = StarGift;
starGiftUnique#6411db89 flags:# id:long title:string slug:string num:int owner_id:flags.0?Peer owner_name:flags.1?string owner_address:flags.2?string attributes:Vector<StarGiftAttribute> availability_issued:int availability_total:int gift_address:flags.3?string resell_stars:flags.4?long = StarGift;
payments.starGiftsNotModified#a388a368 = payments.StarGifts;
payments.starGifts#901689ea hash:int gifts:Vector<StarGift> = payments.StarGifts;
messageReportOption#7903e3d9 text:string option:bytes = MessageReportOption;
@ -1395,17 +1402,18 @@ botVerifierSettings#b0cd6617 flags:# can_modify_custom_description:flags.1?true
botVerification#f93cd45c bot_id:long icon:long description:string = BotVerification;
starGiftAttributeModel#39d99013 name:string document:Document rarity_permille:int = StarGiftAttribute;
starGiftAttributePattern#13acff19 name:string document:Document rarity_permille:int = StarGiftAttribute;
starGiftAttributeBackdrop#94271762 name:string center_color:int edge_color:int pattern_color:int text_color:int rarity_permille:int = StarGiftAttribute;
starGiftAttributeBackdrop#d93d859c name:string backdrop_id:int center_color:int edge_color:int pattern_color:int text_color:int rarity_permille:int = StarGiftAttribute;
starGiftAttributeOriginalDetails#e0bff26c flags:# sender_id:flags.0?Peer recipient_id:Peer date:int message:flags.1?TextWithEntities = StarGiftAttribute;
payments.starGiftUpgradePreview#167bd90b sample_attributes:Vector<StarGiftAttribute> = payments.StarGiftUpgradePreview;
users.users#62d706b8 users:Vector<User> = users.Users;
users.usersSlice#315a4974 count:int users:Vector<User> = users.Users;
payments.uniqueStarGift#caa2f60b gift:StarGift users:Vector<User> = payments.UniqueStarGift;
messages.webPagePreview#b53e8b21 media:MessageMedia users:Vector<User> = messages.WebPagePreview;
savedStarGift#6056dba5 flags:# name_hidden:flags.0?true unsaved:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true pinned_to_top:flags.12?true from_id:flags.1?Peer date:int gift:StarGift message:flags.2?TextWithEntities msg_id:flags.3?int saved_id:flags.11?long convert_stars:flags.4?long upgrade_stars:flags.6?long can_export_at:flags.7?int transfer_stars:flags.8?long = SavedStarGift;
savedStarGift#dfda0499 flags:# name_hidden:flags.0?true unsaved:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true pinned_to_top:flags.12?true from_id:flags.1?Peer date:int gift:StarGift message:flags.2?TextWithEntities msg_id:flags.3?int saved_id:flags.11?long convert_stars:flags.4?long upgrade_stars:flags.6?long can_export_at:flags.7?int transfer_stars:flags.8?long can_transfer_at:flags.13?int can_resell_at:flags.14?int = SavedStarGift;
payments.savedStarGifts#95f389b1 flags:# count:int chat_notifications_enabled:flags.1?Bool gifts:Vector<SavedStarGift> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.SavedStarGifts;
inputSavedStarGiftUser#69279795 msg_id:int = InputSavedStarGift;
inputSavedStarGiftChat#f101aa7f peer:InputPeer saved_id:long = InputSavedStarGift;
inputSavedStarGiftSlug#2085c238 slug:string = InputSavedStarGift;
payments.starGiftWithdrawalUrl#84aa3a9c url:string = payments.StarGiftWithdrawalUrl;
paidReactionPrivacyDefault#206ad49e = PaidReactionPrivacy;
paidReactionPrivacyAnonymous#1f0c1ad9 = PaidReactionPrivacy;
@ -1419,6 +1427,13 @@ disallowedGiftsSettings#71f276c4 flags:# disallow_unlimited_stargifts:flags.0?tr
sponsoredPeer#c69708d3 flags:# random_id:bytes peer:Peer sponsor_info:flags.0?string additional_info:flags.1?string = SponsoredPeer;
contacts.sponsoredPeersEmpty#ea32b4b1 = contacts.SponsoredPeers;
contacts.sponsoredPeers#eb032884 peers:Vector<SponsoredPeer> chats:Vector<Chat> users:Vector<User> = contacts.SponsoredPeers;
starGiftAttributeIdModel#48aaae3c document_id:long = StarGiftAttributeId;
starGiftAttributeIdPattern#4a162433 document_id:long = StarGiftAttributeId;
starGiftAttributeIdBackdrop#1f01c757 backdrop_id:int = StarGiftAttributeId;
starGiftAttributeCounter#2eb1b658 attribute:StarGiftAttributeId count:int = StarGiftAttributeCounter;
payments.resaleStarGifts#947a12df flags:# count:int gifts:Vector<StarGift> next_offset:flags.0?string attributes:flags.1?Vector<StarGiftAttribute> attributes_hash:flags.1?long chats:Vector<Chat> counters:flags.2?Vector<StarGiftAttributeCounter> users:Vector<User> = payments.ResaleStarGifts;
stories.canSendStoryCount#c387c04e count_remains:int = stories.CanSendStoryCount;
pendingSuggestion#e7e82e12 suggestion:string title:TextWithEntities description:TextWithEntities url:string = PendingSuggestion;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X;
@ -1750,7 +1765,8 @@ payments.getUniqueStarGift#a1974d72 slug:string = payments.UniqueStarGift;
payments.getSavedStarGifts#23830de9 flags:# exclude_unsaved:flags.0?true exclude_saved:flags.1?true exclude_unlimited:flags.2?true exclude_limited:flags.3?true exclude_unique:flags.4?true sort_by_value:flags.5?true peer:InputPeer offset:string limit:int = payments.SavedStarGifts;
payments.getStarGiftWithdrawalUrl#d06e93a8 stargift:InputSavedStarGift password:InputCheckPasswordSRP = payments.StarGiftWithdrawalUrl;
payments.toggleStarGiftsPinnedToTop#1513e7b0 peer:InputPeer stargift:Vector<InputSavedStarGift> = Bool;
phone.requestCall#a6c4600c flags:# video:flags.0?true user_id:InputUser conference_call:flags.1?InputGroupCall random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
payments.updateStarGiftPrice#3baea4e1 stargift:InputSavedStarGift resell_stars:long = Updates;
phone.requestCall#42ff96ed flags:# video:flags.0?true user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
phone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
phone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall;
phone.receivedCall#17d54f61 peer:InputPhoneCall = Bool;
@ -1759,7 +1775,7 @@ phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhon
phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool;
phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool;
phone.createGroupCall#48cdc6d8 flags:# rtmp_stream:flags.2?true peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates;
phone.joinGroupCall#d61e1df3 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string key_fingerprint:flags.3?long params:DataJSON = Updates;
phone.joinGroupCall#8fb53057 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string public_key:flags.3?int256 block:flags.3?bytes params:DataJSON = Updates;
phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates;
phone.discardGroupCall#7a777135 call:InputGroupCall = Updates;
phone.getGroupCall#41845db call:InputGroupCall limit:int = phone.GroupCall;

View File

@ -319,6 +319,7 @@
"payments.getUniqueStarGift",
"payments.getStarGiftWithdrawalUrl",
"payments.toggleStarGiftsPinnedToTop",
"payments.updateStarGiftPrice",
"langpack.getLangPack",
"langpack.getStrings",
"langpack.getLanguages",

View File

@ -99,7 +99,7 @@ userStatusLastMonth#65899777 flags:# by_me:flags.0?true = UserStatus;
chatEmpty#29562865 id:long = Chat;
chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;
chatForbidden#6592a1a7 id:long title:string = Chat;
channel#7482147e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector<RestrictionReason> admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector<Username> stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long = Chat;
channel#7482147e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector<RestrictionReason> admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector<Username> stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long = Chat;
channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat;
chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector<BotInfo> pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector<long> available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull;
@ -184,9 +184,10 @@ messageActionPaymentRefunded#41b3e202 flags:# peer:Peer currency:string total_am
messageActionGiftStars#45d5b021 flags:# currency:string amount:long stars:long crypto_currency:flags.0?string crypto_amount:flags.0?long transaction_id:flags.1?string = MessageAction;
messageActionPrizeStars#b00c47a2 flags:# unclaimed:flags.0?true stars:long transaction_id:string boost_peer:Peer giveaway_msg_id:int = MessageAction;
messageActionStarGift#4717e8a4 flags:# name_hidden:flags.0?true saved:flags.2?true converted:flags.3?true upgraded:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true gift:StarGift message:flags.1?TextWithEntities convert_stars:flags.4?long upgrade_msg_id:flags.5?int upgrade_stars:flags.8?long from_id:flags.11?Peer peer:flags.12?Peer saved_id:flags.12?long = MessageAction;
messageActionStarGiftUnique#acdfcb81 flags:# upgrade:flags.0?true transferred:flags.1?true saved:flags.2?true refunded:flags.5?true gift:StarGift can_export_at:flags.3?int transfer_stars:flags.4?long from_id:flags.6?Peer peer:flags.7?Peer saved_id:flags.7?long = MessageAction;
messageActionStarGiftUnique#2e3ae60e flags:# upgrade:flags.0?true transferred:flags.1?true saved:flags.2?true refunded:flags.5?true gift:StarGift can_export_at:flags.3?int transfer_stars:flags.4?long from_id:flags.6?Peer peer:flags.7?Peer saved_id:flags.7?long resale_stars:flags.8?long can_transfer_at:flags.9?int can_resell_at:flags.10?int = MessageAction;
messageActionPaidMessagesRefunded#ac1f1fcd count:int stars:long = MessageAction;
messageActionPaidMessagesPrice#bcd71419 stars:long = MessageAction;
messageActionConferenceCall#2ffe2f7a flags:# missed:flags.0?true active:flags.1?true video:flags.4?true call_id:long duration:flags.2?int other_participants:flags.3?Vector<Peer> = MessageAction;
dialog#d58a08c6 flags:# pinned:flags.2?true unread_mark:flags.3?true view_forum_as_messages:flags.6?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int ttl_period:flags.5?int = Dialog;
dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
@ -431,6 +432,7 @@ updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update;
updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Update;
updatePaidReactionPrivacy#8b725fce private:PaidReactionPrivacy = Update;
updateSentPhoneCode#504aa18f sent_code:auth.SentCode = Update;
updateGroupCallChainBlocks#a477288f call:InputGroupCall sub_chain_id:int blocks:Vector<bytes> next_offset:int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -901,6 +903,7 @@ phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;
phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;
phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;
phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;
phoneCallDiscardReasonMigrateConferenceCall#9fbbf1f7 slug:string = PhoneCallDiscardReason;
dataJSON#7d748d04 data:string = DataJSON;
@ -955,11 +958,11 @@ inputStickerSetItem#32da9e9c flags:# document:InputDocument emoji:string mask_co
inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;
phoneCallEmpty#5366c915 id:long = PhoneCall;
phoneCallWaiting#eed42858 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallRequested#45361c63 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallAccepted#22fd7181 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCall#3ba5940c flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int custom_parameters:flags.7?DataJSON conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallDiscarded#f9d25503 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int conference_call:flags.8?InputGroupCall = PhoneCall;
phoneCallWaiting#c5226f17 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;
phoneCallRequested#14b0ed0c flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCallAccepted#3660c311 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCall#30535af5 flags:# p2p_allowed:flags.5?true video:flags.6?true conference_supported:flags.8?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int custom_parameters:flags.7?DataJSON = PhoneCall;
phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;
phoneConnection#9cc123c7 flags:# tcp:flags.0?true id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;
phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection;
@ -1033,6 +1036,7 @@ channelAdminLogEventActionChangeEmojiStatus#3ea9feb1 prev_value:EmojiStatus new_
channelAdminLogEventActionChangeEmojiStickerSet#46d840ab prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction;
channelAdminLogEventActionToggleSignatureProfiles#60a79c79 new_value:Bool = ChannelAdminLogEventAction;
channelAdminLogEventActionParticipantSubExtend#64642db3 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;
channelAdminLogEventActionToggleAutotranslation#c517f77e new_value:Bool = ChannelAdminLogEventAction;
channelAdminLogEvent#1fad68cd id:long date:int user_id:long action:ChannelAdminLogEventAction = ChannelAdminLogEvent;
@ -1300,7 +1304,7 @@ statsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph
stats.broadcastStats#396ca5fc period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev reactions_per_post:StatsAbsValueAndPrev views_per_story:StatsAbsValueAndPrev shares_per_story:StatsAbsValueAndPrev reactions_per_story:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph reactions_by_emotion_graph:StatsGraph story_interactions_graph:StatsGraph story_reactions_by_emotion_graph:StatsGraph recent_posts_interactions:Vector<PostInteractionCounters> = stats.BroadcastStats;
help.promoDataEmpty#98f6ac75 expires:int = help.PromoData;
help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector<Chat> users:Vector<User> psa_type:flags.1?string psa_message:flags.2?string = help.PromoData;
help.promoData#8a4d87a flags:# proxy:flags.0?true expires:int peer:flags.3?Peer psa_type:flags.1?string psa_message:flags.2?string pending_suggestions:Vector<string> dismissed_suggestions:Vector<string> custom_pending_suggestion:flags.4?PendingSuggestion chats:Vector<Chat> users:Vector<User> = help.PromoData;
videoSize#de33b094 flags:# type:string w:int h:int size:int video_start_ts:flags.0?double = VideoSize;
videoSizeEmojiMarkup#f85c413c emoji_id:long background_colors:Vector<int> = VideoSize;
@ -1339,9 +1343,11 @@ peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;
stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats;
groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall;
groupCall#cdf8d3e3 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int conference_from_call:flags.14?long = GroupCall;
groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall;
inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall;
inputGroupCallSlug#fe06823f slug:string = InputGroupCall;
inputGroupCallInviteMessage#8c10603f msg_id:int = InputGroupCall;
groupCallParticipant#eba636fe flags:# muted:flags.0?true left:flags.1?true can_self_unmute:flags.2?true just_joined:flags.4?true versioned:flags.5?true min:flags.8?true muted_by_you:flags.9?true volume_by_admin:flags.10?true self:flags.12?true video_joined:flags.15?true peer:Peer date:int active_date:flags.3?int source:int volume:flags.7?int about:flags.11?string raise_hand_rating:flags.13?long video:flags.6?GroupCallParticipantVideo presentation:flags.14?GroupCallParticipantVideo = GroupCallParticipant;
@ -1485,6 +1491,7 @@ inputInvoiceStarGiftUpgrade#4d818d5d flags:# keep_original_details:flags.0?true
inputInvoiceStarGiftTransfer#4a5f5bd9 stargift:InputSavedStarGift to_id:InputPeer = InputInvoice;
inputInvoicePremiumGiftStars#dabab2ef flags:# user_id:InputUser months:int message:flags.0?TextWithEntities = InputInvoice;
inputInvoiceBusinessBotTransferStars#f4997e42 bot:InputUser stars:long = InputInvoice;
inputInvoiceStarGiftResale#63cbc38c slug:string to_id:InputPeer = InputInvoice;
payments.exportedInvoice#aed0cbd9 url:string = payments.ExportedInvoice;
@ -1844,7 +1851,7 @@ starsTransactionPeerAPI#f9677aad = StarsTransactionPeer;
starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption;
starsTransaction#a39fd94a flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true stargift_upgrade:flags.18?true id:string stars:StarsAmount date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int starref_commission_permille:flags.16?int starref_peer:flags.17?Peer starref_amount:flags.17?StarsAmount paid_messages:flags.19?int premium_gift_months:flags.20?int = StarsTransaction;
starsTransaction#a39fd94a flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true stargift_upgrade:flags.18?true business_transfer:flags.21?true stargift_resale:flags.22?true id:string stars:StarsAmount date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector<MessageMedia> subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int starref_commission_permille:flags.16?int starref_peer:flags.17?Peer starref_amount:flags.17?StarsAmount paid_messages:flags.19?int premium_gift_months:flags.20?int = StarsTransaction;
payments.starsStatus#6c9ce8ed flags:# balance:StarsAmount subscriptions:flags.1?Vector<StarsSubscription> subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector<StarsTransaction> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.StarsStatus;
@ -1882,8 +1889,8 @@ starsGiveawayOption#94ce852a flags:# extended:flags.0?true default:flags.1?true
starsGiveawayWinnersOption#54236209 flags:# default:flags.0?true users:int per_user_stars:long = StarsGiveawayWinnersOption;
starGift#2cc73c8 flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int upgrade_stars:flags.3?long = StarGift;
starGiftUnique#5c62d151 flags:# id:long title:string slug:string num:int owner_id:flags.0?Peer owner_name:flags.1?string owner_address:flags.2?string attributes:Vector<StarGiftAttribute> availability_issued:int availability_total:int gift_address:flags.3?string = StarGift;
starGift#c62aca28 flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int availability_resale:flags.4?long convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int upgrade_stars:flags.3?long resell_min_stars:flags.4?long title:flags.5?string = StarGift;
starGiftUnique#6411db89 flags:# id:long title:string slug:string num:int owner_id:flags.0?Peer owner_name:flags.1?string owner_address:flags.2?string attributes:Vector<StarGiftAttribute> availability_issued:int availability_total:int gift_address:flags.3?string resell_stars:flags.4?long = StarGift;
payments.starGiftsNotModified#a388a368 = payments.StarGifts;
payments.starGifts#901689ea hash:int gifts:Vector<StarGift> = payments.StarGifts;
@ -1919,7 +1926,7 @@ botVerification#f93cd45c bot_id:long icon:long description:string = BotVerificat
starGiftAttributeModel#39d99013 name:string document:Document rarity_permille:int = StarGiftAttribute;
starGiftAttributePattern#13acff19 name:string document:Document rarity_permille:int = StarGiftAttribute;
starGiftAttributeBackdrop#94271762 name:string center_color:int edge_color:int pattern_color:int text_color:int rarity_permille:int = StarGiftAttribute;
starGiftAttributeBackdrop#d93d859c name:string backdrop_id:int center_color:int edge_color:int pattern_color:int text_color:int rarity_permille:int = StarGiftAttribute;
starGiftAttributeOriginalDetails#e0bff26c flags:# sender_id:flags.0?Peer recipient_id:Peer date:int message:flags.1?TextWithEntities = StarGiftAttribute;
payments.starGiftUpgradePreview#167bd90b sample_attributes:Vector<StarGiftAttribute> = payments.StarGiftUpgradePreview;
@ -1931,12 +1938,13 @@ payments.uniqueStarGift#caa2f60b gift:StarGift users:Vector<User> = payments.Uni
messages.webPagePreview#b53e8b21 media:MessageMedia users:Vector<User> = messages.WebPagePreview;
savedStarGift#6056dba5 flags:# name_hidden:flags.0?true unsaved:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true pinned_to_top:flags.12?true from_id:flags.1?Peer date:int gift:StarGift message:flags.2?TextWithEntities msg_id:flags.3?int saved_id:flags.11?long convert_stars:flags.4?long upgrade_stars:flags.6?long can_export_at:flags.7?int transfer_stars:flags.8?long = SavedStarGift;
savedStarGift#dfda0499 flags:# name_hidden:flags.0?true unsaved:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true pinned_to_top:flags.12?true from_id:flags.1?Peer date:int gift:StarGift message:flags.2?TextWithEntities msg_id:flags.3?int saved_id:flags.11?long convert_stars:flags.4?long upgrade_stars:flags.6?long can_export_at:flags.7?int transfer_stars:flags.8?long can_transfer_at:flags.13?int can_resell_at:flags.14?int = SavedStarGift;
payments.savedStarGifts#95f389b1 flags:# count:int chat_notifications_enabled:flags.1?Bool gifts:Vector<SavedStarGift> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.SavedStarGifts;
inputSavedStarGiftUser#69279795 msg_id:int = InputSavedStarGift;
inputSavedStarGiftChat#f101aa7f peer:InputPeer saved_id:long = InputSavedStarGift;
inputSavedStarGiftSlug#2085c238 slug:string = InputSavedStarGift;
payments.starGiftWithdrawalUrl#84aa3a9c url:string = payments.StarGiftWithdrawalUrl;
@ -1959,6 +1967,18 @@ sponsoredPeer#c69708d3 flags:# random_id:bytes peer:Peer sponsor_info:flags.0?st
contacts.sponsoredPeersEmpty#ea32b4b1 = contacts.SponsoredPeers;
contacts.sponsoredPeers#eb032884 peers:Vector<SponsoredPeer> chats:Vector<Chat> users:Vector<User> = contacts.SponsoredPeers;
starGiftAttributeIdModel#48aaae3c document_id:long = StarGiftAttributeId;
starGiftAttributeIdPattern#4a162433 document_id:long = StarGiftAttributeId;
starGiftAttributeIdBackdrop#1f01c757 backdrop_id:int = StarGiftAttributeId;
starGiftAttributeCounter#2eb1b658 attribute:StarGiftAttributeId count:int = StarGiftAttributeCounter;
payments.resaleStarGifts#947a12df flags:# count:int gifts:Vector<StarGift> next_offset:flags.0?string attributes:flags.1?Vector<StarGiftAttribute> attributes_hash:flags.1?long chats:Vector<Chat> counters:flags.2?Vector<StarGiftAttributeCounter> users:Vector<User> = payments.ResaleStarGifts;
stories.canSendStoryCount#c387c04e count_remains:int = stories.CanSendStoryCount;
pendingSuggestion#e7e82e12 suggestion:string title:TextWithEntities description:TextWithEntities url:string = PendingSuggestion;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -2479,6 +2499,7 @@ channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerS
channels.restrictSponsoredMessages#9ae91519 channel:InputChannel restricted:Bool = Updates;
channels.searchPosts#d19f987b hashtag:string offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
channels.updatePaidMessagesPrice#fc84653f channel:InputChannel send_paid_messages_stars:long = Updates;
channels.toggleAutotranslation#167fc0a1 channel:InputChannel enabled:Bool = Updates;
bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON;
bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool;
@ -2559,6 +2580,8 @@ payments.getStarGiftWithdrawalUrl#d06e93a8 stargift:InputSavedStarGift password:
payments.toggleChatStarGiftNotifications#60eaefa1 flags:# enabled:flags.0?true peer:InputPeer = Bool;
payments.toggleStarGiftsPinnedToTop#1513e7b0 peer:InputPeer stargift:Vector<InputSavedStarGift> = Bool;
payments.canPurchaseStore#4fdc5ea7 purpose:InputStorePaymentPurpose = Bool;
payments.getResaleStarGifts#7a5fa236 flags:# sort_by_price:flags.1?true sort_by_num:flags.2?true attributes_hash:flags.0?long gift_id:long attributes:flags.3?Vector<StarGiftAttributeId> offset:string limit:int = payments.ResaleStarGifts;
payments.updateStarGiftPrice#3baea4e1 stargift:InputSavedStarGift resell_stars:long = Updates;
stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true emojis:flags.5?true text_color:flags.6?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector<InputStickerSetItem> software:flags.3?string = messages.StickerSet;
stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet;
@ -2573,7 +2596,7 @@ stickers.deleteStickerSet#87704394 stickerset:InputStickerSet = Bool;
stickers.replaceSticker#4696459a sticker:InputDocument new_sticker:InputStickerSetItem = messages.StickerSet;
phone.getCallConfig#55451fa9 = DataJSON;
phone.requestCall#a6c4600c flags:# video:flags.0?true user_id:InputUser conference_call:flags.1?InputGroupCall random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
phone.requestCall#42ff96ed flags:# video:flags.0?true user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
phone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall;
phone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall;
phone.receivedCall#17d54f61 peer:InputPhoneCall = Bool;
@ -2582,7 +2605,7 @@ phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhon
phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool;
phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool;
phone.createGroupCall#48cdc6d8 flags:# rtmp_stream:flags.2?true peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates;
phone.joinGroupCall#d61e1df3 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string key_fingerprint:flags.3?long params:DataJSON = Updates;
phone.joinGroupCall#8fb53057 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string public_key:flags.3?int256 block:flags.3?bytes params:DataJSON = Updates;
phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates;
phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector<InputUser> = Updates;
phone.discardGroupCall#7a777135 call:InputGroupCall = Updates;
@ -2603,7 +2626,12 @@ phone.leaveGroupCallPresentation#1c50d144 call:InputGroupCall = Updates;
phone.getGroupCallStreamChannels#1ab21940 call:InputGroupCall = phone.GroupCallStreamChannels;
phone.getGroupCallStreamRtmpUrl#deb3abbf peer:InputPeer revoke:Bool = phone.GroupCallStreamRtmpUrl;
phone.saveCallLog#41248786 peer:InputPhoneCall file:InputFile = Bool;
phone.createConferenceCall#dfc909ab peer:InputPhoneCall key_fingerprint:long = phone.PhoneCall;
phone.createConferenceCall#7d0444bb flags:# muted:flags.0?true video_stopped:flags.2?true join:flags.3?true random_id:int public_key:flags.3?int256 block:flags.3?bytes params:flags.3?DataJSON = Updates;
phone.deleteConferenceCallParticipants#8ca60525 flags:# only_left:flags.0?true kick:flags.1?true call:InputGroupCall ids:Vector<long> block:bytes = Updates;
phone.sendConferenceCallBroadcast#c6701900 call:InputGroupCall block:bytes = Updates;
phone.inviteConferenceCallParticipant#bcf22685 flags:# video:flags.0?true call:InputGroupCall user_id:InputUser = Updates;
phone.declineConferenceCallInvite#3c479971 msg_id:int = Updates;
phone.getGroupCallChainBlocks#ee9f88a6 call:InputGroupCall sub_chain_id:int offset:int limit:int = Updates;
langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference;
langpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector<string> = Vector<LangPackString>;
@ -2636,7 +2664,7 @@ chatlists.hideChatlistUpdates#66e486fb chatlist:InputChatlist = Bool;
chatlists.getLeaveChatlistSuggestions#fdbcd714 chatlist:InputChatlist = Vector<Peer>;
chatlists.leaveChatlist#74fae13a chatlist:InputChatlist peers:Vector<InputPeer> = Updates;
stories.canSendStory#c7dfdfdd peer:InputPeer = Bool;
stories.canSendStory#30eb63f0 peer:InputPeer = stories.CanSendStoryCount;
stories.sendStory#e4e6694b flags:# pinned:flags.2?true noforwards:flags.4?true fwd_modified:flags.7?true peer:InputPeer media:InputMedia media_areas:flags.5?Vector<MediaArea> caption:flags.0?string entities:flags.1?Vector<MessageEntity> privacy_rules:Vector<InputPrivacyRule> random_id:long period:flags.3?int fwd_from_id:flags.6?InputPeer fwd_from_story:flags.6?int = Updates;
stories.editStory#b583ba46 flags:# peer:InputPeer id:int media:flags.0?InputMedia media_areas:flags.3?Vector<MediaArea> caption:flags.1?string entities:flags.1?Vector<MessageEntity> privacy_rules:flags.2?Vector<InputPrivacyRule> = Updates;
stories.deleteStories#ae59db5f peer:InputPeer id:Vector<int> = Vector<int>;

View File

@ -94,202 +94,208 @@ $icons-map: (
"comments": "\f139",
"copy-media": "\f13a",
"copy": "\f13b",
"crown-take-off": "\f13c",
"crown-wear": "\f13d",
"darkmode": "\f13e",
"data": "\f13f",
"delete-filled": "\f140",
"delete-left": "\f141",
"delete-user": "\f142",
"delete": "\f143",
"diamond": "\f144",
"document": "\f145",
"double-badge": "\f146",
"down": "\f147",
"download": "\f148",
"eats": "\f149",
"edit": "\f14a",
"email": "\f14b",
"enter": "\f14c",
"expand-modal": "\f14d",
"expand": "\f14e",
"eye-crossed-outline": "\f14f",
"eye-crossed": "\f150",
"eye-outline": "\f151",
"eye": "\f152",
"favorite-filled": "\f153",
"favorite": "\f154",
"file-badge": "\f155",
"flag": "\f156",
"folder-badge": "\f157",
"folder": "\f158",
"fontsize": "\f159",
"forums": "\f15a",
"forward": "\f15b",
"fragment": "\f15c",
"frozen-time": "\f15d",
"fullscreen": "\f15e",
"gifs": "\f15f",
"gift": "\f160",
"group-filled": "\f161",
"group": "\f162",
"grouped-disable": "\f163",
"grouped": "\f164",
"hand-stop": "\f165",
"hashtag": "\f166",
"heart-outline": "\f167",
"heart": "\f168",
"help": "\f169",
"info-filled": "\f16a",
"info": "\f16b",
"install": "\f16c",
"italic": "\f16d",
"key": "\f16e",
"keyboard": "\f16f",
"lamp": "\f170",
"language": "\f171",
"large-pause": "\f172",
"large-play": "\f173",
"link-badge": "\f174",
"link-broken": "\f175",
"link": "\f176",
"location": "\f177",
"lock-badge": "\f178",
"lock": "\f179",
"logout": "\f17a",
"loop": "\f17b",
"mention": "\f17c",
"message-failed": "\f17d",
"message-pending": "\f17e",
"message-read": "\f17f",
"message-succeeded": "\f180",
"message": "\f181",
"microphone-alt": "\f182",
"microphone": "\f183",
"monospace": "\f184",
"more-circle": "\f185",
"more": "\f186",
"move-caption-down": "\f187",
"move-caption-up": "\f188",
"mute": "\f189",
"muted": "\f18a",
"my-notes": "\f18b",
"new-chat-filled": "\f18c",
"next": "\f18d",
"nochannel": "\f18e",
"noise-suppression": "\f18f",
"non-contacts": "\f190",
"one-filled": "\f191",
"open-in-new-tab": "\f192",
"password-off": "\f193",
"pause": "\f194",
"permissions": "\f195",
"phone-discard-outline": "\f196",
"phone-discard": "\f197",
"phone": "\f198",
"photo": "\f199",
"pin-badge": "\f19a",
"pin-list": "\f19b",
"pin": "\f19c",
"pinned-chat": "\f19d",
"pinned-message": "\f19e",
"pip": "\f19f",
"play-story": "\f1a0",
"play": "\f1a1",
"poll": "\f1a2",
"previous": "\f1a3",
"privacy-policy": "\f1a4",
"proof-of-ownership": "\f1a5",
"quote-text": "\f1a6",
"quote": "\f1a7",
"radial-badge": "\f1a8",
"readchats": "\f1a9",
"recent": "\f1aa",
"reload": "\f1ab",
"remove-quote": "\f1ac",
"remove": "\f1ad",
"reopen-topic": "\f1ae",
"replace": "\f1af",
"replies": "\f1b0",
"reply-filled": "\f1b1",
"reply": "\f1b2",
"revenue-split": "\f1b3",
"revote": "\f1b4",
"save-story": "\f1b5",
"saved-messages": "\f1b6",
"schedule": "\f1b7",
"search": "\f1b8",
"select": "\f1b9",
"send-outline": "\f1ba",
"send": "\f1bb",
"settings-filled": "\f1bc",
"settings": "\f1bd",
"share-filled": "\f1be",
"share-screen-outlined": "\f1bf",
"share-screen-stop": "\f1c0",
"share-screen": "\f1c1",
"show-message": "\f1c2",
"sidebar": "\f1c3",
"skip-next": "\f1c4",
"skip-previous": "\f1c5",
"smallscreen": "\f1c6",
"smile": "\f1c7",
"sort": "\f1c8",
"speaker-muted-story": "\f1c9",
"speaker-outline": "\f1ca",
"speaker-story": "\f1cb",
"speaker": "\f1cc",
"spoiler-disable": "\f1cd",
"spoiler": "\f1ce",
"sport": "\f1cf",
"star": "\f1d0",
"stars-lock": "\f1d1",
"stats": "\f1d2",
"stealth-future": "\f1d3",
"stealth-past": "\f1d4",
"stickers": "\f1d5",
"stop-raising-hand": "\f1d6",
"stop": "\f1d7",
"story-caption": "\f1d8",
"story-expired": "\f1d9",
"story-priority": "\f1da",
"story-reply": "\f1db",
"strikethrough": "\f1dc",
"tag-add": "\f1dd",
"tag-crossed": "\f1de",
"tag-filter": "\f1df",
"tag-name": "\f1e0",
"tag": "\f1e1",
"timer": "\f1e2",
"toncoin": "\f1e3",
"trade": "\f1e4",
"transcribe": "\f1e5",
"truck": "\f1e6",
"unarchive": "\f1e7",
"underlined": "\f1e8",
"unique-profile": "\f1e9",
"unlock-badge": "\f1ea",
"unlock": "\f1eb",
"unmute": "\f1ec",
"unpin": "\f1ed",
"unread": "\f1ee",
"up": "\f1ef",
"user-filled": "\f1f0",
"user-online": "\f1f1",
"user": "\f1f2",
"video-outlined": "\f1f3",
"video-stop": "\f1f4",
"video": "\f1f5",
"view-once": "\f1f6",
"voice-chat": "\f1f7",
"volume-1": "\f1f8",
"volume-2": "\f1f9",
"volume-3": "\f1fa",
"web": "\f1fb",
"webapp": "\f1fc",
"word-wrap": "\f1fd",
"zoom-in": "\f1fe",
"zoom-out": "\f1ff",
"crown-take-off-outline": "\f13c",
"crown-take-off": "\f13d",
"crown-wear-outline": "\f13e",
"crown-wear": "\f13f",
"darkmode": "\f140",
"data": "\f141",
"delete-filled": "\f142",
"delete-left": "\f143",
"delete-user": "\f144",
"delete": "\f145",
"diamond": "\f146",
"document": "\f147",
"double-badge": "\f148",
"down": "\f149",
"download": "\f14a",
"eats": "\f14b",
"edit": "\f14c",
"email": "\f14d",
"enter": "\f14e",
"expand-modal": "\f14f",
"expand": "\f150",
"eye-crossed-outline": "\f151",
"eye-crossed": "\f152",
"eye-outline": "\f153",
"eye": "\f154",
"favorite-filled": "\f155",
"favorite": "\f156",
"file-badge": "\f157",
"flag": "\f158",
"folder-badge": "\f159",
"folder": "\f15a",
"fontsize": "\f15b",
"forums": "\f15c",
"forward": "\f15d",
"fragment": "\f15e",
"frozen-time": "\f15f",
"fullscreen": "\f160",
"gifs": "\f161",
"gift": "\f162",
"group-filled": "\f163",
"group": "\f164",
"grouped-disable": "\f165",
"grouped": "\f166",
"hand-stop": "\f167",
"hashtag": "\f168",
"heart-outline": "\f169",
"heart": "\f16a",
"help": "\f16b",
"info-filled": "\f16c",
"info": "\f16d",
"install": "\f16e",
"italic": "\f16f",
"key": "\f170",
"keyboard": "\f171",
"lamp": "\f172",
"language": "\f173",
"large-pause": "\f174",
"large-play": "\f175",
"link-badge": "\f176",
"link-broken": "\f177",
"link": "\f178",
"location": "\f179",
"lock-badge": "\f17a",
"lock": "\f17b",
"logout": "\f17c",
"loop": "\f17d",
"mention": "\f17e",
"message-failed": "\f17f",
"message-pending": "\f180",
"message-read": "\f181",
"message-succeeded": "\f182",
"message": "\f183",
"microphone-alt": "\f184",
"microphone": "\f185",
"monospace": "\f186",
"more-circle": "\f187",
"more": "\f188",
"move-caption-down": "\f189",
"move-caption-up": "\f18a",
"mute": "\f18b",
"muted": "\f18c",
"my-notes": "\f18d",
"new-chat-filled": "\f18e",
"next": "\f18f",
"nochannel": "\f190",
"noise-suppression": "\f191",
"non-contacts": "\f192",
"one-filled": "\f193",
"open-in-new-tab": "\f194",
"password-off": "\f195",
"pause": "\f196",
"permissions": "\f197",
"phone-discard-outline": "\f198",
"phone-discard": "\f199",
"phone": "\f19a",
"photo": "\f19b",
"pin-badge": "\f19c",
"pin-list": "\f19d",
"pin": "\f19e",
"pinned-chat": "\f19f",
"pinned-message": "\f1a0",
"pip": "\f1a1",
"play-story": "\f1a2",
"play": "\f1a3",
"poll": "\f1a4",
"previous": "\f1a5",
"privacy-policy": "\f1a6",
"proof-of-ownership": "\f1a7",
"quote-text": "\f1a8",
"quote": "\f1a9",
"radial-badge": "\f1aa",
"readchats": "\f1ab",
"recent": "\f1ac",
"reload": "\f1ad",
"remove-quote": "\f1ae",
"remove": "\f1af",
"reopen-topic": "\f1b0",
"replace": "\f1b1",
"replies": "\f1b2",
"reply-filled": "\f1b3",
"reply": "\f1b4",
"revenue-split": "\f1b5",
"revote": "\f1b6",
"save-story": "\f1b7",
"saved-messages": "\f1b8",
"schedule": "\f1b9",
"search": "\f1ba",
"select": "\f1bb",
"sell-outline": "\f1bc",
"sell": "\f1bd",
"send-outline": "\f1be",
"send": "\f1bf",
"settings-filled": "\f1c0",
"settings": "\f1c1",
"share-filled": "\f1c2",
"share-screen-outlined": "\f1c3",
"share-screen-stop": "\f1c4",
"share-screen": "\f1c5",
"show-message": "\f1c6",
"sidebar": "\f1c7",
"skip-next": "\f1c8",
"skip-previous": "\f1c9",
"smallscreen": "\f1ca",
"smile": "\f1cb",
"sort": "\f1cc",
"speaker-muted-story": "\f1cd",
"speaker-outline": "\f1ce",
"speaker-story": "\f1cf",
"speaker": "\f1d0",
"spoiler-disable": "\f1d1",
"spoiler": "\f1d2",
"sport": "\f1d3",
"star": "\f1d4",
"stars-lock": "\f1d5",
"stats": "\f1d6",
"stealth-future": "\f1d7",
"stealth-past": "\f1d8",
"stickers": "\f1d9",
"stop-raising-hand": "\f1da",
"stop": "\f1db",
"story-caption": "\f1dc",
"story-expired": "\f1dd",
"story-priority": "\f1de",
"story-reply": "\f1df",
"strikethrough": "\f1e0",
"tag-add": "\f1e1",
"tag-crossed": "\f1e2",
"tag-filter": "\f1e3",
"tag-name": "\f1e4",
"tag": "\f1e5",
"timer": "\f1e6",
"toncoin": "\f1e7",
"trade": "\f1e8",
"transcribe": "\f1e9",
"truck": "\f1ea",
"unarchive": "\f1eb",
"underlined": "\f1ec",
"unique-profile": "\f1ed",
"unlist-outline": "\f1ee",
"unlist": "\f1ef",
"unlock-badge": "\f1f0",
"unlock": "\f1f1",
"unmute": "\f1f2",
"unpin": "\f1f3",
"unread": "\f1f4",
"up": "\f1f5",
"user-filled": "\f1f6",
"user-online": "\f1f7",
"user": "\f1f8",
"video-outlined": "\f1f9",
"video-stop": "\f1fa",
"video": "\f1fb",
"view-once": "\f1fc",
"voice-chat": "\f1fd",
"volume-1": "\f1fe",
"volume-2": "\f1ff",
"volume-3": "\f200",
"web": "\f201",
"webapp": "\f202",
"word-wrap": "\f203",
"zoom-in": "\f204",
"zoom-out": "\f205",
);
.icon-active-sessions::before {
@ -469,9 +475,15 @@ $icons-map: (
.icon-copy::before {
content: map.get($icons-map, "copy");
}
.icon-crown-take-off-outline::before {
content: map.get($icons-map, "crown-take-off-outline");
}
.icon-crown-take-off::before {
content: map.get($icons-map, "crown-take-off");
}
.icon-crown-wear-outline::before {
content: map.get($icons-map, "crown-wear-outline");
}
.icon-crown-wear::before {
content: map.get($icons-map, "crown-wear");
}
@ -847,6 +859,12 @@ $icons-map: (
.icon-select::before {
content: map.get($icons-map, "select");
}
.icon-sell-outline::before {
content: map.get($icons-map, "sell-outline");
}
.icon-sell::before {
content: map.get($icons-map, "sell");
}
.icon-send-outline::before {
content: map.get($icons-map, "send-outline");
}
@ -991,6 +1009,12 @@ $icons-map: (
.icon-unique-profile::before {
content: map.get($icons-map, "unique-profile");
}
.icon-unlist-outline::before {
content: map.get($icons-map, "unlist-outline");
}
.icon-unlist::before {
content: map.get($icons-map, "unlist");
}
.icon-unlock-badge::before {
content: map.get($icons-map, "unlock-badge");
}

Binary file not shown.

Binary file not shown.

View File

@ -58,7 +58,9 @@ export type FontIconName =
| 'comments'
| 'copy-media'
| 'copy'
| 'crown-take-off-outline'
| 'crown-take-off'
| 'crown-wear-outline'
| 'crown-wear'
| 'darkmode'
| 'data'
@ -184,6 +186,8 @@ export type FontIconName =
| 'schedule'
| 'search'
| 'select'
| 'sell-outline'
| 'sell'
| 'send-outline'
| 'send'
| 'settings-filled'
@ -232,6 +236,8 @@ export type FontIconName =
| 'unarchive'
| 'underlined'
| 'unique-profile'
| 'unlist-outline'
| 'unlist'
| 'unlock-badge'
| 'unlock'
| 'unmute'

View File

@ -1235,6 +1235,7 @@ export interface LangPair {
'GiftInfoWear': undefined;
'GiftInfoTakeOff': undefined;
'GiftInfoTransfer': undefined;
'GiftInfoUnlist': undefined;
'GiftTransferTitle': undefined;
'GiftTransferTON': undefined;
'GiftTransferConfirmButtonFree': undefined;
@ -1502,6 +1503,13 @@ export interface LangPair {
'ActionPaidMessageGroupPriceFree': undefined;
'NotificationTitleNotSupportedInFrozenAccount': undefined;
'NotificationMessageNotSupportedInFrozenAccount': undefined;
'GiftRibbonSale': undefined;
'StarsGiftBought': undefined;
'GiftSellTitle': undefined;
'Sell': undefined;
'InputPlaceholderGiftResalePrice': undefined;
'StarGiftSaleTransaction': undefined;
'StarGiftPurchaseTransaction': undefined;
'ContextMenuItemMention': undefined;
}
@ -2411,6 +2419,48 @@ export interface LangPairWithVariables<V extends unknown = LangVariable> {
'user': V;
'stars': V;
};
'NotificationGiftIsSale': {
'gift': V;
};
'NotificationGiftIsUnlist': {
'gift': V;
};
'ButtonBuyGift': {
'stars': V;
};
'GiftInfoBuyGift': {
'user': V;
};
'ButtonSellGift': {
'stars': V;
};
'DescriptionComposerGiftResalePrice': {
'stars': V;
};
'DescriptionComposerGiftMinimumPrice': {
'stars': V;
};
'ApiMessageMessageActionResaleStarGiftUniqueOutgoing': {
'stars': V;
'gift': V;
};
'ApiMessageMessageActionResaleStarGiftUniqueIncoming': {
'stars': V;
'gift': V;
};
'ModalStarsBalanceBarDescription': {
'stars': V;
};
'NotificationGiftCanResellAt': {
'date': V;
};
'NotificationGiftCanTransferAt': {
'date': V;
};
'GiftBuyConfirmDescription': {
'gift': V;
'stars': V;
};
'ComposerTitleForwardFrom': {
'users': V;
};

View File

@ -12,7 +12,7 @@ export function formatStarsAsText(lang: LangFn, amount: number) {
return lang('StarsAmountText', { amount }, { pluralValue: amount });
}
export function formatStarsAsIcon(lang: LangFn, amount: number, options?: {
export function formatStarsAsIcon(lang: LangFn, amount: number | string, options?: {
asFont?: boolean; className?: string; containerClassName?: string; }) {
const { asFont, className, containerClassName } = options || {};
const icon = asFont