455 lines
13 KiB
TypeScript
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,
|
|
};
|
|
}
|