From 92cdf9feb53fea17eb3395b7385ef860e600e3b3 Mon Sep 17 00:00:00 2001 From: zubiden <19638254+zubiden@users.noreply.github.com> Date: Wed, 14 May 2025 19:02:27 +0300 Subject: [PATCH] Gifts: Support selling in profile --- src/api/gramjs/apiBuilders/appConfig.ts | 6 + src/api/gramjs/apiBuilders/calls.ts | 3 +- src/api/gramjs/apiBuilders/gifts.ts | 11 +- src/api/gramjs/apiBuilders/messageActions.ts | 11 + src/api/gramjs/apiBuilders/payments.ts | 2 + src/api/gramjs/gramjsBuilders/index.ts | 10 + src/api/gramjs/methods/chats.ts | 20 +- src/api/gramjs/methods/stars.ts | 15 + src/api/gramjs/updates/mtpUpdateHandler.ts | 20 +- src/api/types/messageActions.ts | 1 + src/api/types/misc.ts | 3 + src/api/types/payments.ts | 17 +- src/api/types/stars.ts | 6 + .../font-icons/crown-take-off-outline.svg | 1 + src/assets/font-icons/crown-wear-outline.svg | 1 + src/assets/font-icons/eye-crossed-outline.svg | 2 +- src/assets/font-icons/eye-outline.svg | 2 +- src/assets/font-icons/link-badge.svg | 2 +- src/assets/font-icons/sell-outline.svg | 1 + src/assets/font-icons/sell.svg | 1 + src/assets/font-icons/unlist-outline.svg | 1 + src/assets/font-icons/unlist.svg | 1 + src/assets/localization/fallback.strings | 21 + src/bundles/stars.ts | 1 + src/components/common/gift/GiftMenuItems.tsx | 62 ++- src/components/common/gift/GiftRibbon.tsx | 1 + .../gift/GiftTransferPreview.module.scss} | 2 +- .../common/gift/GiftTransferPreview.tsx | 60 +++ src/components/common/gift/SavedGift.tsx | 23 +- .../middle/message/ActionMessageText.tsx | 15 +- src/components/modals/ModalContainer.tsx | 3 + .../modals/common/TableInfoModal.tsx | 6 + .../modals/gift/UniqueGiftHeader.module.scss | 11 + .../modals/gift/UniqueGiftHeader.tsx | 17 + .../gift/info/GiftInfoModal.module.scss | 57 +++ .../modals/gift/info/GiftInfoModal.tsx | 153 ++++++- .../GiftResalePriceComposerModal.async.tsx | 18 + .../GiftResalePriceComposerModal.module.scss | 19 + .../resale/GiftResalePriceComposerModal.tsx | 158 +++++++ .../gift/transfer/GiftTransferModal.tsx | 34 +- .../modals/stars/helpers/transaction.ts | 7 + .../transaction/StarsTransactionItem.tsx | 6 +- .../transaction/StarsTransactionModal.tsx | 16 +- src/components/ui/Modal.scss | 10 + src/components/ui/Modal.tsx | 9 + .../ui/ModalStarBalanceBar.module.scss | 46 ++ src/components/ui/ModalStarBalanceBar.tsx | 88 ++++ src/global/actions/api/payments.ts | 19 +- src/global/actions/api/stars.ts | 37 +- src/global/actions/apiUpdaters/payments.ts | 19 + src/global/actions/ui/stars.ts | 15 + src/global/helpers/payments.ts | 16 + src/global/types/actions.ts | 17 + src/global/types/tabState.ts | 5 + src/lib/gramjs/tl/AllTLObjects.ts | 2 +- src/lib/gramjs/tl/api.d.ts | 337 ++++++++++++-- src/lib/gramjs/tl/apiTl.ts | 48 +- src/lib/gramjs/tl/static/api.json | 1 + src/lib/gramjs/tl/static/api.tl | 64 ++- src/styles/icons.scss | 416 +++++++++--------- src/styles/icons.woff | Bin 32860 -> 33560 bytes src/styles/icons.woff2 | Bin 27460 -> 28064 bytes src/types/icons/font.ts | 6 + src/types/language.d.ts | 50 +++ src/util/localization/format.tsx | 2 +- 65 files changed, 1669 insertions(+), 365 deletions(-) create mode 100644 src/assets/font-icons/crown-take-off-outline.svg create mode 100644 src/assets/font-icons/crown-wear-outline.svg create mode 100644 src/assets/font-icons/sell-outline.svg create mode 100644 src/assets/font-icons/sell.svg create mode 100644 src/assets/font-icons/unlist-outline.svg create mode 100644 src/assets/font-icons/unlist.svg rename src/components/{modals/gift/transfer/GiftTransferModal.module.scss => common/gift/GiftTransferPreview.module.scss} (97%) create mode 100644 src/components/common/gift/GiftTransferPreview.tsx create mode 100644 src/components/modals/gift/resale/GiftResalePriceComposerModal.async.tsx create mode 100644 src/components/modals/gift/resale/GiftResalePriceComposerModal.module.scss create mode 100644 src/components/modals/gift/resale/GiftResalePriceComposerModal.tsx create mode 100644 src/components/ui/ModalStarBalanceBar.module.scss create mode 100644 src/components/ui/ModalStarBalanceBar.tsx diff --git a/src/api/gramjs/apiBuilders/appConfig.ts b/src/api/gramjs/apiBuilders/appConfig.ts index c01a7cd04..12321a380 100644 --- a/src/api/gramjs/apiBuilders/appConfig.ts +++ b/src/api/gramjs/apiBuilders/appConfig.ts @@ -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, }; } diff --git a/src/api/gramjs/apiBuilders/calls.ts b/src/api/gramjs/apiBuilders/calls.ts index 3ac157919..624af1cfe 100644 --- a/src/api/gramjs/apiBuilders/calls.ts +++ b/src/api/gramjs/apiBuilders/calls.ts @@ -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 { diff --git a/src/api/gramjs/apiBuilders/gifts.ts b/src/api/gramjs/apiBuilders/gifts.ts index dd33c8083..5d5d6c30b 100644 --- a/src/api/gramjs/apiBuilders/gifts.ts +++ b/src/api/gramjs/apiBuilders/gifts.ts @@ -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, }; } diff --git a/src/api/gramjs/apiBuilders/messageActions.ts b/src/api/gramjs/apiBuilders/messageActions.ts index 08b5df9fa..d77ca5774 100644 --- a/src/api/gramjs/apiBuilders/messageActions.ts +++ b/src/api/gramjs/apiBuilders/messageActions.ts @@ -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) { diff --git a/src/api/gramjs/apiBuilders/payments.ts b/src/api/gramjs/apiBuilders/payments.ts index 3ac4b68ed..f11319852 100644 --- a/src/api/gramjs/apiBuilders/payments.ts +++ b/src/api/gramjs/apiBuilders/payments.ts @@ -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, }; } diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts index d6aba1ff1..5719a12e0 100644 --- a/src/api/gramjs/gramjsBuilders/index.ts +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -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, diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index 91b88cdb6..f21cbe1a8 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -543,6 +543,8 @@ async function getFullChatInfo(chatId: string): Promise 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 \ No newline at end of file diff --git a/src/assets/font-icons/crown-wear-outline.svg b/src/assets/font-icons/crown-wear-outline.svg new file mode 100644 index 000000000..659240af3 --- /dev/null +++ b/src/assets/font-icons/crown-wear-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/eye-crossed-outline.svg b/src/assets/font-icons/eye-crossed-outline.svg index 240e12ee6..184742538 100644 --- a/src/assets/font-icons/eye-crossed-outline.svg +++ b/src/assets/font-icons/eye-crossed-outline.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/font-icons/eye-outline.svg b/src/assets/font-icons/eye-outline.svg index 0ebb379d5..e3619399b 100644 --- a/src/assets/font-icons/eye-outline.svg +++ b/src/assets/font-icons/eye-outline.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/font-icons/link-badge.svg b/src/assets/font-icons/link-badge.svg index 934209e2e..cad871874 100644 --- a/src/assets/font-icons/link-badge.svg +++ b/src/assets/font-icons/link-badge.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/font-icons/sell-outline.svg b/src/assets/font-icons/sell-outline.svg new file mode 100644 index 000000000..b4303b4f7 --- /dev/null +++ b/src/assets/font-icons/sell-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/sell.svg b/src/assets/font-icons/sell.svg new file mode 100644 index 000000000..f5a8278e0 --- /dev/null +++ b/src/assets/font-icons/sell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/unlist-outline.svg b/src/assets/font-icons/unlist-outline.svg new file mode 100644 index 000000000..8fc7e2c1e --- /dev/null +++ b/src/assets/font-icons/unlist-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/font-icons/unlist.svg b/src/assets/font-icons/unlist.svg new file mode 100644 index 000000000..df95fccf1 --- /dev/null +++ b/src/assets/font-icons/unlist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/localization/fallback.strings b/src/assets/localization/fallback.strings index 24e37abdd..ec905802c 100644 --- a/src/assets/localization/fallback.strings +++ b/src/assets/localization/fallback.strings @@ -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"; diff --git a/src/bundles/stars.ts b/src/bundles/stars.ts index 6adb938fb..e5fc157df 100644 --- a/src/bundles/stars.ts +++ b/src/bundles/stars.ts @@ -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'; diff --git a/src/components/common/gift/GiftMenuItems.tsx b/src/components/common/gift/GiftMenuItems.tsx index b47b5730d..2f05a0e1f 100644 --- a/src/components/common/gift/GiftMenuItems.tsx +++ b/src/components/common/gift/GiftMenuItems.tsx @@ -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')} )} + {canManage && isGiftUnique && !giftResalePrice && ( + + {lang('Sell')} + + )} + {canManage && isGiftUnique && giftResalePrice && ( + + {lang('GiftInfoUnlist')} + + )} {canManage && savedGift && ( {lang(savedGift.isUnsaved ? 'GiftActionShow' : 'GiftActionHide')} )} {canWear && ( - + {lang('GiftInfoWear')} )} {canTakeOff && ( - + {lang('GiftInfoTakeOff')} )} diff --git a/src/components/common/gift/GiftRibbon.tsx b/src/components/common/gift/GiftRibbon.tsx index 896f005e5..7d697e3ac 100644 --- a/src/components/common/gift/GiftRibbon.tsx +++ b/src/components/common/gift/GiftRibbon.tsx @@ -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; diff --git a/src/components/modals/gift/transfer/GiftTransferModal.module.scss b/src/components/common/gift/GiftTransferPreview.module.scss similarity index 97% rename from src/components/modals/gift/transfer/GiftTransferModal.module.scss rename to src/components/common/gift/GiftTransferPreview.module.scss index 257fe3841..f7c04932f 100644 --- a/src/components/modals/gift/transfer/GiftTransferModal.module.scss +++ b/src/components/common/gift/GiftTransferPreview.module.scss @@ -1,4 +1,4 @@ -.header { +.root { display: flex; justify-content: center; align-items: center; diff --git a/src/components/common/gift/GiftTransferPreview.tsx b/src/components/common/gift/GiftTransferPreview.tsx new file mode 100644 index 000000000..79f646ce2 --- /dev/null +++ b/src/components/common/gift/GiftTransferPreview.tsx @@ -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 ( +
+
+ + +
+ + +
+ ); +}; + +export default memo(GiftTransferPreview); diff --git a/src/components/common/gift/SavedGift.tsx b/src/components/common/gift/SavedGift.tsx index 990cc1cd5..5df77fba9 100644 --- a/src/components/common/gift/SavedGift.tsx +++ b/src/components/common/gift/SavedGift.tsx @@ -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 && ( )} diff --git a/src/components/middle/message/ActionMessageText.tsx b/src/components/middle/message/ActionMessageText.tsx index 5b36ed149..fb77b6334 100644 --- a/src/components/middle/message/ActionMessageText.tsx +++ b/src/components/middle/message/ActionMessageText.tsx @@ -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; diff --git a/src/components/modals/ModalContainer.tsx b/src/components/modals/ModalContainer.tsx index ace221a46..1fe6bb587 100644 --- a/src/components/modals/ModalContainer.tsx +++ b/src/components/modals/ModalContainer.tsx @@ -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 { 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 && ( diff --git a/src/components/modals/gift/UniqueGiftHeader.module.scss b/src/components/modals/gift/UniqueGiftHeader.module.scss index f35b6b6a1..2270a24c4 100644 --- a/src/components/modals/gift/UniqueGiftHeader.module.scss +++ b/src/components/modals/gift/UniqueGiftHeader.module.scss @@ -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; } diff --git a/src/components/modals/gift/UniqueGiftHeader.tsx b/src/components/modals/gift/UniqueGiftHeader.tsx index a68aff137..71d365355 100644 --- a/src/components/modals/gift/UniqueGiftHeader.tsx +++ b/src/components/modals/gift/UniqueGiftHeader.tsx @@ -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}

)} + {resellPrice && ( +

+ + {formatStarsTransactionAmount(lang, resellPrice)} + + +

+ )} ); }; diff --git a/src/components/modals/gift/info/GiftInfoModal.module.scss b/src/components/modals/gift/info/GiftInfoModal.module.scss index dc3dc4475..b6726ab76 100644 --- a/src/components/modals/gift/info/GiftInfoModal.module.scss +++ b/src/components/modals/gift/info/GiftInfoModal.module.scss @@ -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)); diff --git a/src/components/modals/gift/info/GiftInfoModal.tsx b/src/components/modals/gift/info/GiftInfoModal.tsx index 783cc8d87..7156ffa9a 100644 --- a/src/components/modals/gift/info/GiftInfoModal.tsx +++ b/src/components/modals/gift/info/GiftInfoModal.tsx @@ -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(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 }) => ( - + + ); }, [lang]); const renderFooterButton = useLastCallback(() => { + if (canBuyGift) { + return ( + + ); + } + if (canFocusUpgrade) { return ( - {isOpen && uniqueGiftContextMenu} + {Boolean(canManage && resellPriceInStars) && ( +
+ {formatStarsAsIcon(lang, resellPriceInStars!, { + asFont: true, + className: styles.giftResalePriceStar, + })} +
+ )} +
+ {isOpen && uniqueGiftContextMenu} +
+ +
+
); @@ -574,7 +642,7 @@ const GiftInfoModal = ({ const footer = (
- {(canManage || tonLink) && ( + {(canManage || tonLink || canBuyGift) && (
{tonLink && (
@@ -596,11 +664,18 @@ const GiftInfoModal = ({ })}
)} - {isVisibleForMe && ( + {!canBuyGift && isVisibleForMe && (
{lang('GiftInfoSenderHidden')}
)} + {canBuyGift && giftOwnerTitle && ( +
+ {lang('GiftInfoBuyGift', { + user: giftOwnerTitle, + }, { withNodes: true })} +
+ )}
)} {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 && ( + + + +

+ {lang('GiftBuyConfirmDescription', { + gift: lang('GiftUnique', { title: uniqueGift.title, number: uniqueGift.number }), + stars: formatStarsAsText(lang, resellPriceInStars), + }, { + withNodes: true, + withMarkdown: true, + })} +

+
+ )} {savedGift && ( ( hasAdminRights, currentUserEmojiStatus, collectibleEmojiStatuses, + currentUser, }; }, )(GiftInfoModal)); diff --git a/src/components/modals/gift/resale/GiftResalePriceComposerModal.async.tsx b/src/components/modals/gift/resale/GiftResalePriceComposerModal.async.tsx new file mode 100644 index 000000000..062736272 --- /dev/null +++ b/src/components/modals/gift/resale/GiftResalePriceComposerModal.async.tsx @@ -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 = (props) => { + const { modal } = props; + const GiftResalePriceComposerModal = useModuleLoader(Bundles.Stars, 'GiftResalePriceComposerModal', !modal); + + // eslint-disable-next-line react/jsx-props-no-spreading + return GiftResalePriceComposerModal ? : undefined; +}; + +export default GiftResalePriceComposerModalAsync; diff --git a/src/components/modals/gift/resale/GiftResalePriceComposerModal.module.scss b/src/components/modals/gift/resale/GiftResalePriceComposerModal.module.scss new file mode 100644 index 000000000..4e02123da --- /dev/null +++ b/src/components/modals/gift/resale/GiftResalePriceComposerModal.module.scss @@ -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; + } +} diff --git a/src/components/modals/gift/resale/GiftResalePriceComposerModal.tsx b/src/components/modals/gift/resale/GiftResalePriceComposerModal.tsx new file mode 100644 index 000000000..f47923ac0 --- /dev/null +++ b/src/components/modals/gift/resale/GiftResalePriceComposerModal.tsx @@ -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(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 ( + +
+ +
+ +
+ + {!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, + })} + + + {isPriceCorrect && starsUsdWithdrawRate && ( + + {`≈ ${formatCurrencyAsString( + price * starsUsdWithdrawRate, + 'USD', + lang.code, + )}`} + + )} +
+ + +
+ ); +}; + +export default memo(withGlobal( + (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)); diff --git a/src/components/modals/gift/transfer/GiftTransferModal.tsx b/src/components/modals/gift/transfer/GiftTransferModal.tsx index e3ecf5fd3..96bd68071 100644 --- a/src/components/modals/gift/transfer/GiftTransferModal.tsx +++ b/src/components/modals/gift/transfer/GiftTransferModal.tsx @@ -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} > -
-
- - -
- - -
+ )}

{renderingModal?.gift.transferStars ? lang('GiftTransferConfirmDescription', { diff --git a/src/components/modals/stars/helpers/transaction.ts b/src/components/modals/stars/helpers/transaction.ts index a2b67879e..c3feca92a 100644 --- a/src/components/modals/stars/helpers/transaction.ts +++ b/src/components/modals/stars/helpers/transaction.ts @@ -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)); } diff --git a/src/components/modals/stars/transaction/StarsTransactionItem.tsx b/src/components/modals/stars/transaction/StarsTransactionItem.tsx index 15ce88602..57674f9de 100644 --- a/src/components/modals/stars/transaction/StarsTransactionItem.tsx +++ b/src/components/modals/stars/transaction/StarsTransactionItem.tsx @@ -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) { diff --git a/src/components/modals/stars/transaction/StarsTransactionModal.tsx b/src/components/modals/stars/transaction/StarsTransactionModal.tsx index f946a72b7..67ccaaffa 100644 --- a/src/components/modals/stars/transaction/StarsTransactionModal.tsx +++ b/src/components/modals/stars/transaction/StarsTransactionModal.tsx @@ -85,7 +85,7 @@ const StarsTransactionModal: FC = ({ } const { - giveawayPostId, photo, stars, isGiftUpgrade, starGift, + giveawayPostId, photo, stars, isGiftUpgrade, starGift, isGiftResale, } = transaction; const gift = transaction?.starGift; @@ -131,6 +131,7 @@ const StarsTransactionModal: FC = ({ modelAttribute={giftAttributes!.model!} title={gift.title} subtitle={lang('GiftInfoCollectible', { number: gift.number })} + resellPrice={transaction.stars} />

); @@ -194,7 +195,7 @@ const StarsTransactionModal: FC = ({ 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 = ({ ]); } + 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'); diff --git a/src/components/ui/Modal.scss b/src/components/ui/Modal.scss index 67871528c..9c368253b 100644 --- a/src/components/ui/Modal.scss +++ b/src/components/ui/Modal.scss @@ -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; diff --git a/src/components/ui/Modal.tsx b/src/components/ui/Modal.tsx index 763e5eba2..8886b47ee 100644 --- a/src/components/ui/Modal.tsx +++ b/src/components/ui/Modal.tsx @@ -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 = ({ @@ -70,6 +72,7 @@ const Modal: FC = ({ onClose, onCloseAnimationEnd, onEnter, + withBalanceBar, }) => { const { ref: modalRef, @@ -167,6 +170,7 @@ const Modal: FC = ({ noBackdrop && 'transparent-backdrop', isSlim && 'slim', isLowStackPriority && 'low-priority', + withBalanceBar && 'with-balance-bar', ); return ( @@ -177,6 +181,11 @@ const Modal: FC = ({ tabIndex={-1} role="dialog" > + {withBalanceBar && ( + + )}
diff --git a/src/components/ui/ModalStarBalanceBar.module.scss b/src/components/ui/ModalStarBalanceBar.module.scss new file mode 100644 index 000000000..7750b4ecb --- /dev/null +++ b/src/components/ui/ModalStarBalanceBar.module.scss @@ -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; +} diff --git a/src/components/ui/ModalStarBalanceBar.tsx b/src/components/ui/ModalStarBalanceBar.tsx new file mode 100644 index 000000000..dbc273eed --- /dev/null +++ b/src/components/ui/ModalStarBalanceBar.tsx @@ -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 ( +
+
+ {lang('ModalStarsBalanceBarDescription', { + stars: formatStarsAsIcon(lang, formatStarsAmount(lang, starBalance), { className: styles.starIcon }), + }, { + withNodes: true, + withMarkdown: true, + })} +
+
+ {lang('GetMoreStarsLinkText')} +
+
+ ); +} + +export default memo(withGlobal( + (global): StateProps => { + const { + stars, + } = global; + + return { + starBalance: stars?.balance, + }; + }, +)(ModalStarBalanceBar)); diff --git a/src/global/actions/api/payments.ts b/src/global/actions/api/payments.ts index 249b65ec8..1932180f5 100644 --- a/src/global/actions/api/payments.ts +++ b/src/global/actions/api/payments.ts @@ -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 }); } diff --git a/src/global/actions/api/stars.ts b/src/global/actions/api/stars.ts index e038dac2c..9e0adf280 100644 --- a/src/global/actions/api/stars.ts +++ b/src/global/actions/api/stars.ts @@ -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 => { 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 => { + 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! }); +}); diff --git a/src/global/actions/apiUpdaters/payments.ts b/src/global/actions/apiUpdaters/payments.ts index 5cd9b5ef0..de0f2d79c 100644 --- a/src/global/actions/apiUpdaters/payments.ts +++ b/src/global/actions/apiUpdaters/payments.ts @@ -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; } diff --git a/src/global/actions/ui/stars.ts b/src/global/actions/ui/stars.ts index ba391d40e..b202f8a34 100644 --- a/src/global/actions/ui/stars.ts +++ b/src/global/actions/ui/stars.ts @@ -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 => { diff --git a/src/global/helpers/payments.ts b/src/global/helpers/payments.ts index 7a54c61d5..fdcdc6990 100644 --- a/src/global/helpers/payments.ts +++ b/src/global/helpers/payments.ts @@ -21,6 +21,22 @@ export function getRequestInputInvoice( ): 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, diff --git a/src/global/types/actions.ts b/src/global/types/actions.ts index 2c02196dd..b7e060f27 100644 --- a/src/global/types/actions.ts +++ b/src/global/types/actions.ts @@ -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; diff --git a/src/global/types/tabState.ts b/src/global/types/tabState.ts index 72f43b7ec..071c0911f 100644 --- a/src/global/types/tabState.ts +++ b/src/global/types/tabState.ts @@ -764,6 +764,11 @@ export type TabState = { gift: ApiSavedStarGift | ApiStarGift; }; + giftResalePriceComposerModal?: { + peerId?: string; + gift: ApiSavedStarGift | ApiStarGift; + }; + giftTransferModal?: { gift: ApiSavedStarGift; }; diff --git a/src/lib/gramjs/tl/AllTLObjects.ts b/src/lib/gramjs/tl/AllTLObjects.ts index cc0c1dcb4..2b6fe4833 100644 --- a/src/lib/gramjs/tl/AllTLObjects.ts +++ b/src/lib/gramjs/tl/AllTLObjects.ts @@ -12,5 +12,5 @@ for (const tl of Object.values(Api)) { } } -export const LAYER = 201; +export const LAYER = 203; export { tlobjects }; diff --git a/src/lib/gramjs/tl/api.d.ts b/src/lib/gramjs/tl/api.d.ts index 9a2ea4328..397150f09 100644 --- a/src/lib/gramjs/tl/api.d.ts +++ b/src/lib/gramjs/tl/api.d.ts @@ -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 { 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 { 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, 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, 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, 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, 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, Api.TypeUpdates> { + // flags: Api.Type; + onlyLeft?: true; + kick?: true; + call: Api.TypeInputGroupCall; + ids: long[]; + block: bytes; + } + export class SendConferenceCallBroadcast extends Request, Api.TypeUpdates> { + call: Api.TypeInputGroupCall; + block: bytes; + } + export class InviteConferenceCallParticipant extends Request, Api.TypeUpdates> { + // flags: Api.Type; + video?: true; + call: Api.TypeInputGroupCall; + userId: Api.TypeInputUser; + } + export class DeclineConferenceCallInvite extends Request, Api.TypeUpdates> { + msgId: int; + } + export class GetGroupCallChainBlocks extends Request, 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, Bool> { + }>, stories.TypeCanSendStoryCount> { peer: Api.TypeInputPeer; } export class SendStory extends Request 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 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 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 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 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 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 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 groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector 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 = 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 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 new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector 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 max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector terms_url:flags.10?string subscription_period:flags.11?int = Invoice; @@ -782,11 +785,11 @@ shippingOption#b6213cdf id:string title:string prices:Vector = 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 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 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 = 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 chats:Vector users:Vector = 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 = stats.BroadcastStats; help.promoDataEmpty#98f6ac75 expires:int = help.PromoData; -help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector 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 dismissed_suggestions:Vector custom_pending_suggestion:flags.4?PendingSuggestion chats:Vector users:Vector = 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 = VideoSize; videoSizeStickerMarkup#da082fe stickerset:InputStickerSet sticker_id:long background_colors:Vector = 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 participants_next_offset:string chats:Vector users:Vector = phone.GroupCall; phone.groupParticipants#f47751b6 count:int participants:Vector next_offset:string chats:Vector users:Vector 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 video_sections:Vector videos:Vector period_options:Vector users:Vector = 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 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 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 subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector next_offset:flags.0?string chats:Vector users:Vector = payments.StarsStatus; foundStory#e87acbc0 peer:Peer story:StoryItem = FoundStory; stories.foundStories#e2de7737 flags:# count:int stories:Vector next_offset:flags.0?string chats:Vector users:Vector = 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 = 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 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 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 = 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 = payments.StarGiftUpgradePreview; users.users#62d706b8 users:Vector = users.Users; users.usersSlice#315a4974 count:int users:Vector = users.Users; payments.uniqueStarGift#caa2f60b gift:StarGift users:Vector = payments.UniqueStarGift; messages.webPagePreview#b53e8b21 media:MessageMedia users:Vector = 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 next_offset:flags.0?string chats:Vector users:Vector = 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 chats:Vector users:Vector = 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 next_offset:flags.0?string attributes:flags.1?Vector attributes_hash:flags.1?long chats:Vector counters:flags.2?Vector users:Vector = 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 = 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; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index 1095184d1..5d9f58f71 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -319,6 +319,7 @@ "payments.getUniqueStarGift", "payments.getStarGiftWithdrawalUrl", "payments.toggleStarGiftsPinnedToTop", + "payments.updateStarGiftPrice", "langpack.getLangPack", "langpack.getStrings", "langpack.getLanguages", diff --git a/src/lib/gramjs/tl/static/api.tl b/src/lib/gramjs/tl/static/api.tl index 1a84527ac..ecc6ded63 100644 --- a/src/lib/gramjs/tl/static/api.tl +++ b/src/lib/gramjs/tl/static/api.tl @@ -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 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 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 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 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 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 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 = 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 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 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 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 = stats.BroadcastStats; help.promoDataEmpty#98f6ac75 expires:int = help.PromoData; -help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector 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 dismissed_suggestions:Vector custom_pending_suggestion:flags.4?PendingSuggestion chats:Vector users:Vector = 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 = 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 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 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 subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector next_offset:flags.0?string chats:Vector users:Vector = 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 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 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 = 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 = payments.StarGiftUpgradePreview; @@ -1931,12 +1938,13 @@ payments.uniqueStarGift#caa2f60b gift:StarGift users:Vector = payments.Uni messages.webPagePreview#b53e8b21 media:MessageMedia users:Vector = 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 next_offset:flags.0?string chats:Vector users:Vector = 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 chats:Vector users:Vector = 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 next_offset:flags.0?string attributes:flags.1?Vector attributes_hash:flags.1?long chats:Vector counters:flags.2?Vector users:Vector = 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 = 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 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 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 = 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 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 = Vector; @@ -2636,7 +2664,7 @@ chatlists.hideChatlistUpdates#66e486fb chatlist:InputChatlist = Bool; chatlists.getLeaveChatlistSuggestions#fdbcd714 chatlist:InputChatlist = Vector; chatlists.leaveChatlist#74fae13a chatlist:InputChatlist peers:Vector = 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 caption:flags.0?string entities:flags.1?Vector privacy_rules:Vector 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 caption:flags.1?string entities:flags.1?Vector privacy_rules:flags.2?Vector = Updates; stories.deleteStories#ae59db5f peer:InputPeer id:Vector = Vector; diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 64149d8ae..1c6489d46 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -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"); } diff --git a/src/styles/icons.woff b/src/styles/icons.woff index 0d883473095a0f6b568ea087508a988aecf1e956..c92f0ac3f61e9b73a88259a0c4b4f31fc55a0166 100644 GIT binary patch delta 32803 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 { '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; }; diff --git a/src/util/localization/format.tsx b/src/util/localization/format.tsx index 3c62ebe3d..d0a33b2d3 100644 --- a/src/util/localization/format.tsx +++ b/src/util/localization/format.tsx @@ -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