2026-01-13 01:14:20 +01:00

455 lines
13 KiB
TypeScript

import { Api as GramJs } from '../../../lib/gramjs';
import type {
ApiAuctionBidLevel,
ApiDisallowedGiftsSettings,
ApiInputSavedStarGift,
ApiSavedStarGift,
ApiStarGift,
ApiStarGiftAttribute,
ApiStarGiftAttributeCounter,
ApiStarGiftAttributeId,
ApiStarGiftAuctionAcquiredGift,
ApiStarGiftAuctionState,
ApiStarGiftAuctionUserState,
ApiStarGiftCollection,
ApiStarGiftUpgradePreview,
ApiStarGiftUpgradePrice,
ApiTypeResaleStarGifts,
ApiTypeStarGiftAuctionState,
} from '../../types';
import { int2hex } from '../../../util/colors';
import { toJSNumber } from '../../../util/numbers';
import { buildApiChatFromPreview } from '../apiBuilders/chats';
import { addDocumentToLocalDb } from '../helpers/localDb';
import { buildApiFormattedText } from './common';
import { buildApiCurrencyAmount } from './payments';
import { buildApiPeerId } from './peers';
import { getApiChatIdFromMtpPeer } from './peers';
import { buildStickerFromDocument } from './symbols';
import { buildApiUser } from './users';
export function buildApiStarGift(starGift: GramJs.TypeStarGift): ApiStarGift {
if (starGift instanceof GramJs.StarGiftUnique) {
const {
id, num, ownerId, ownerName, title, attributes, availabilityIssued, availabilityTotal, slug, ownerAddress,
giftAddress, resellAmount, releasedBy, resaleTonOnly, requirePremium, valueCurrency, valueAmount, giftId,
} = starGift;
return {
type: 'starGiftUnique',
id: id.toString(),
number: num,
ownerId: ownerId && getApiChatIdFromMtpPeer(ownerId),
ownerName,
ownerAddress,
attributes: attributes.map(buildApiStarGiftAttribute).filter(Boolean),
title,
totalCount: availabilityTotal,
issuedCount: availabilityIssued,
slug,
giftAddress,
resellPrice: resellAmount && resellAmount.map((amount) => buildApiCurrencyAmount(amount)).filter(Boolean),
releasedByPeerId: releasedBy && getApiChatIdFromMtpPeer(releasedBy),
requirePremium,
resaleTonOnly,
valueCurrency,
valueAmount: toJSNumber(valueAmount),
regularGiftId: giftId.toString(),
};
}
const {
id, limited, stars, availabilityRemains, availabilityTotal, convertStars, firstSaleDate, lastSaleDate, soldOut,
birthday, upgradeStars, resellMinStars, title, availabilityResale, releasedBy,
requirePremium, limitedPerUser, perUserTotal, perUserRemains, lockedUntilDate, auction, auctionSlug, giftsPerRound,
background,
} = starGift;
addDocumentToLocalDb(starGift.sticker);
const sticker = buildStickerFromDocument(starGift.sticker)!;
return {
type: 'starGift',
id: id.toString(),
isLimited: limited,
sticker,
stars: toJSNumber(stars),
availabilityRemains,
availabilityTotal,
starsToConvert: toJSNumber(convertStars),
firstSaleDate,
lastSaleDate,
isSoldOut: soldOut,
isBirthday: birthday,
upgradeStars: upgradeStars !== undefined ? toJSNumber(upgradeStars) : undefined,
title,
resellMinStars: resellMinStars !== undefined ? toJSNumber(resellMinStars) : undefined,
releasedByPeerId: releasedBy && getApiChatIdFromMtpPeer(releasedBy),
availabilityResale: availabilityResale !== undefined ? toJSNumber(availabilityResale) : undefined,
requirePremium,
limitedPerUser,
perUserTotal,
perUserRemains,
lockedUntilDate,
isAuction: auction,
auctionSlug,
giftsPerRound,
background: background ? {
centerColor: int2hex(background.centerColor),
edgeColor: int2hex(background.edgeColor),
textColor: int2hex(background.textColor),
} : undefined,
};
}
export function buildApiStarGiftAttribute(attribute: GramJs.TypeStarGiftAttribute): ApiStarGiftAttribute | undefined {
if (attribute instanceof GramJs.StarGiftAttributeModel) {
const sticker = buildStickerFromDocument(attribute.document);
if (!sticker) {
return undefined;
}
addDocumentToLocalDb(attribute.document);
return {
type: 'model',
name: attribute.name,
rarityPercent: attribute.rarityPermille / 10,
sticker,
};
}
if (attribute instanceof GramJs.StarGiftAttributePattern) {
const sticker = buildStickerFromDocument(attribute.document);
if (!sticker) {
return undefined;
}
addDocumentToLocalDb(attribute.document);
return {
type: 'pattern',
name: attribute.name,
rarityPercent: attribute.rarityPermille / 10,
sticker,
};
}
if (attribute instanceof GramJs.StarGiftAttributeBackdrop) {
const {
name, rarityPermille, centerColor, edgeColor, patternColor, textColor, backdropId,
} = attribute;
return {
type: 'backdrop',
backdropId,
name,
rarityPercent: rarityPermille / 10,
centerColor: int2hex(centerColor),
edgeColor: int2hex(edgeColor),
patternColor: int2hex(patternColor),
textColor: int2hex(textColor),
};
}
if (attribute instanceof GramJs.StarGiftAttributeOriginalDetails) {
const {
date, recipientId, message, senderId,
} = attribute;
return {
type: 'originalDetails',
date,
recipientId: recipientId && getApiChatIdFromMtpPeer(recipientId),
message: message && buildApiFormattedText(message),
senderId: senderId && getApiChatIdFromMtpPeer(senderId),
};
}
return undefined;
}
export function buildApiSavedStarGift(userStarGift: GramJs.SavedStarGift, peerId: string): ApiSavedStarGift {
const {
gift, date, convertStars, fromId, message, msgId, nameHidden, unsaved, refunded, upgradeStars, transferStars,
canUpgrade, savedId, canExportAt, pinnedToTop, canResellAt, canTransferAt, prepaidUpgradeHash,
dropOriginalDetailsStars,
} = userStarGift;
const inputGift: ApiInputSavedStarGift | undefined = savedId && peerId
? { type: 'chat', chatId: peerId, savedId: savedId.toString() }
: msgId ? { type: 'user', messageId: msgId } : undefined;
return {
gift: buildApiStarGift(gift),
date,
starsToConvert: toJSNumber(convertStars),
fromId: fromId && getApiChatIdFromMtpPeer(fromId),
message: message && buildApiFormattedText(message),
messageId: msgId,
isNameHidden: nameHidden,
isUnsaved: unsaved,
isRefunded: refunded,
canUpgrade,
alreadyPaidUpgradeStars: toJSNumber(upgradeStars),
transferStars: toJSNumber(transferStars),
inputGift,
savedId: savedId?.toString(),
canExportAt,
canResellAt,
canTransferAt,
isPinned: pinnedToTop,
dropOriginalDetailsStars: dropOriginalDetailsStars !== undefined ? toJSNumber(dropOriginalDetailsStars) : undefined,
prepaidUpgradeHash,
};
}
export function buildApiDisallowedGiftsSettings(
result: GramJs.TypeDisallowedGiftsSettings,
): ApiDisallowedGiftsSettings {
const {
disallowUnlimitedStargifts,
disallowLimitedStargifts,
disallowUniqueStargifts,
disallowPremiumGifts,
} = result;
return {
shouldDisallowUnlimitedStarGifts: disallowUnlimitedStargifts,
shouldDisallowLimitedStarGifts: disallowLimitedStargifts,
shouldDisallowUniqueStarGifts: disallowUniqueStargifts,
shouldDisallowPremiumGifts: disallowPremiumGifts,
};
}
export function buildApiStarGiftAttributeId(
result: GramJs.TypeStarGiftAttributeId,
): ApiStarGiftAttributeId | undefined {
if (result instanceof GramJs.StarGiftAttributeIdModel) {
return {
type: 'model',
documentId: result.documentId.toString(),
};
}
if (result instanceof GramJs.StarGiftAttributeIdPattern) {
return {
type: 'pattern',
documentId: result.documentId.toString(),
};
}
if (result instanceof GramJs.StarGiftAttributeIdBackdrop) {
return {
type: 'backdrop',
backdropId: result.backdropId,
};
}
return undefined;
}
export function buildApiStarGiftAttributeCounter(
result: GramJs.TypeStarGiftAttributeCounter,
): ApiStarGiftAttributeCounter | undefined {
const {
count,
} = result;
const attribute = buildApiStarGiftAttributeId(result.attribute);
if (!attribute) return undefined;
return {
count,
attribute,
};
}
export function buildApiResaleGifts(
result: GramJs.payments.TypeResaleStarGifts,
): ApiTypeResaleStarGifts {
const {
count,
nextOffset,
attributesHash,
} = result;
const gifts = result.gifts.map((g) => buildApiStarGift(g));
const attributes = result.attributes?.map((a) => buildApiStarGiftAttribute(a)).filter(Boolean);
const users = result.users.map((u) => buildApiUser(u)).filter(Boolean);
const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean);
const counters = result.counters?.map((c) => buildApiStarGiftAttributeCounter(c)).filter(Boolean);
return {
count,
gifts,
nextOffset,
attributes,
attributesHash: attributesHash?.toString(),
chats,
counters,
users,
};
}
export function buildInputResaleGiftsAttributes(attributes: ApiStarGiftAttributeId[]):
GramJs.TypeStarGiftAttributeId[] {
return attributes.map((attr) => {
switch (attr.type) {
case 'model':
return new GramJs.StarGiftAttributeIdModel({ documentId: BigInt(attr.documentId) });
case 'pattern':
return new GramJs.StarGiftAttributeIdPattern({ documentId: BigInt(attr.documentId) });
case 'backdrop':
return new GramJs.StarGiftAttributeIdBackdrop({ backdropId: attr.backdropId });
default: {
// Exhaustive check
const _exhaustive: never = attr;
return _exhaustive;
}
}
});
}
export function buildApiStarGiftCollection(collection: GramJs.StarGiftCollection): ApiStarGiftCollection | undefined {
if (!collection) return undefined;
const { collectionId, title, icon, giftsCount, hash } = collection;
if (icon) {
addDocumentToLocalDb(icon);
}
return {
collectionId,
title,
icon: icon && buildStickerFromDocument(icon),
giftsCount,
hash: hash.toString(),
};
}
export function buildApiStarGiftUpgradePrice(price: GramJs.StarGiftUpgradePrice): ApiStarGiftUpgradePrice {
return {
date: price.date,
upgradeStars: toJSNumber(price.upgradeStars),
};
}
export function buildApiStarGiftUpgradePreview(
result: GramJs.payments.StarGiftUpgradePreview,
): ApiStarGiftUpgradePreview {
return {
sampleAttributes: result.sampleAttributes.map(buildApiStarGiftAttribute).filter(Boolean),
prices: result.prices?.map(buildApiStarGiftUpgradePrice) || [],
nextPrices: result.nextPrices?.map(buildApiStarGiftUpgradePrice) || [],
};
}
export function buildApiAuctionBidLevel(bidLevel: GramJs.AuctionBidLevel): ApiAuctionBidLevel {
return {
pos: bidLevel.pos,
amount: toJSNumber(bidLevel.amount) ?? 0,
date: bidLevel.date,
};
}
export function buildApiTypeStarGiftAuctionState(
state: GramJs.TypeStarGiftAuctionState,
): ApiTypeStarGiftAuctionState | undefined {
if (state instanceof GramJs.StarGiftAuctionStateNotModified) {
return undefined;
}
if (state instanceof GramJs.StarGiftAuctionStateFinished) {
const {
startDate, endDate, averagePrice, listedCount, fragmentListedCount, fragmentListedUrl,
} = state;
return {
type: 'finished',
startDate,
endDate,
averagePrice: toJSNumber(averagePrice),
listedCount,
fragmentListedCount,
fragmentListedUrl,
};
}
const {
version, startDate, endDate, minBidAmount, bidLevels, topBidders,
nextRoundAt, lastGiftNum, giftsLeft, currentRound, totalRounds,
} = state;
return {
type: 'active',
version,
startDate,
endDate,
minBidAmount: toJSNumber(minBidAmount),
bidLevels: bidLevels.map(buildApiAuctionBidLevel),
topBidders: topBidders.map((id) => buildApiPeerId(id, 'user')),
nextRoundAt,
lastGiftNum,
giftsLeft,
currentRound,
totalRounds,
};
}
export function buildApiStarGiftAuctionUserState(
userState: GramJs.StarGiftAuctionUserState,
): ApiStarGiftAuctionUserState {
const {
returned, bidAmount, bidDate, minBidAmount, bidPeer, acquiredCount,
} = userState;
return {
isReturned: returned || undefined,
bidAmount: bidAmount !== undefined ? toJSNumber(bidAmount) : undefined,
bidDate,
minBidAmount: minBidAmount !== undefined ? toJSNumber(minBidAmount) : undefined,
bidPeerId: bidPeer && getApiChatIdFromMtpPeer(bidPeer),
acquiredCount,
};
}
export function buildApiStarGiftAuctionState(
result: GramJs.payments.StarGiftAuctionState,
): ApiStarGiftAuctionState | undefined {
const gift = buildApiStarGift(result.gift);
if (gift.type !== 'starGift') return undefined;
const state = buildApiTypeStarGiftAuctionState(result.state);
if (!state) return undefined;
return {
gift,
state,
userState: buildApiStarGiftAuctionUserState(result.userState),
timeout: result.timeout,
};
}
export function buildApiStarGiftAuctionAcquiredGift(
result: GramJs.StarGiftAuctionAcquiredGift,
): ApiStarGiftAuctionAcquiredGift {
return {
peerId: getApiChatIdFromMtpPeer(result.peer),
date: result.date,
bidAmount: toJSNumber(result.bidAmount),
round: result.round,
position: result.pos,
message: result.message ? buildApiFormattedText(result.message) : undefined,
giftNumber: result.giftNum,
isNameHidden: result.nameHidden || undefined,
};
}