2025-03-01 17:58:56 +01:00

183 lines
5.1 KiB
TypeScript

import { Api as GramJs } from '../../../lib/gramjs';
import type {
ApiAvailableEffect,
ApiAvailableReaction,
ApiMessageReactor,
ApiPaidReactionPrivacyType,
ApiPeerReaction,
ApiReaction,
ApiReactionCount,
ApiReactions,
ApiReactionWithPaid,
ApiSavedReactionTag,
} from '../../types';
import { buildApiDocument } from './messageContent';
import { getApiChatIdFromMtpPeer } from './peers';
export function buildMessageReactions(reactions: GramJs.MessageReactions): ApiReactions {
const {
recentReactions, results, canSeeList, reactionsAsTags, topReactors,
} = reactions;
return {
areTags: reactionsAsTags,
canSeeList,
results: results.map(buildReactionCount).filter(Boolean).sort(reactionCountComparator),
recentReactions: recentReactions?.map(buildMessagePeerReaction).filter(Boolean),
topReactors: topReactors?.map(buildApiMessageReactor).filter(Boolean),
};
}
function reactionCountComparator(a: ApiReactionCount, b: ApiReactionCount) {
if (a.reaction.type === 'paid') return -1;
if (b.reaction.type === 'paid') return 1;
const diff = b.count - a.count;
if (diff) return diff;
if (a.chosenOrder !== undefined && b.chosenOrder !== undefined) {
return a.chosenOrder - b.chosenOrder;
}
if (a.chosenOrder !== undefined) return 1;
if (b.chosenOrder !== undefined) return -1;
return 0;
}
export function buildReactionCount(reactionCount: GramJs.ReactionCount): ApiReactionCount | undefined {
const { chosenOrder, count, reaction } = reactionCount;
const apiReaction = buildApiReaction(reaction, true);
if (!apiReaction) return undefined;
return {
chosenOrder,
count,
reaction: apiReaction,
};
}
export function buildApiMessageReactor(reactor: GramJs.MessageReactor): ApiMessageReactor {
const {
count, my, top, anonymous, peerId,
} = reactor;
return {
peerId: peerId && getApiChatIdFromMtpPeer(peerId),
count,
isMy: my,
isTop: top,
isAnonymous: anonymous,
};
}
export function buildMessagePeerReaction(userReaction: GramJs.MessagePeerReaction): ApiPeerReaction | undefined {
const {
peerId, reaction, big, unread, date, my,
} = userReaction;
const apiReaction = buildApiReaction(reaction);
if (!apiReaction) return undefined;
return {
peerId: getApiChatIdFromMtpPeer(peerId),
reaction: apiReaction,
addedDate: date,
isUnread: unread,
isBig: big,
isOwn: my,
};
}
export function buildApiReaction(reaction: GramJs.TypeReaction, withPaid?: never): ApiReaction | undefined;
export function buildApiReaction(reaction: GramJs.TypeReaction, withPaid: true): ApiReactionWithPaid | undefined;
export function buildApiReaction(reaction: GramJs.TypeReaction, withPaid?: true): ApiReactionWithPaid | undefined {
if (reaction instanceof GramJs.ReactionEmoji) {
return {
type: 'emoji',
emoticon: reaction.emoticon,
};
}
if (reaction instanceof GramJs.ReactionCustomEmoji) {
return {
type: 'custom',
documentId: reaction.documentId.toString(),
};
}
if (withPaid && reaction instanceof GramJs.ReactionPaid) {
return {
type: 'paid',
};
}
return undefined;
}
export function buildApiSavedReactionTag(tag: GramJs.SavedReactionTag): ApiSavedReactionTag | undefined {
const { reaction, title, count } = tag;
const apiReaction = buildApiReaction(reaction);
if (!apiReaction) return undefined;
return {
reaction: apiReaction,
title,
count,
};
}
export function buildApiAvailableReaction(availableReaction: GramJs.AvailableReaction): ApiAvailableReaction {
const {
selectAnimation, staticIcon, reaction, title, appearAnimation,
inactive, aroundAnimation, centerIcon, effectAnimation, activateAnimation,
premium,
} = availableReaction;
return {
selectAnimation: buildApiDocument(selectAnimation),
appearAnimation: buildApiDocument(appearAnimation),
activateAnimation: buildApiDocument(activateAnimation),
effectAnimation: buildApiDocument(effectAnimation),
staticIcon: buildApiDocument(staticIcon),
aroundAnimation: aroundAnimation ? buildApiDocument(aroundAnimation) : undefined,
centerIcon: centerIcon ? buildApiDocument(centerIcon) : undefined,
reaction: { type: 'emoji', emoticon: reaction },
title,
isInactive: inactive,
isPremium: premium,
};
}
export function buildApiAvailableEffect(availableEffect: GramJs.AvailableEffect): ApiAvailableEffect {
const {
id, emoticon, premiumRequired, staticIconId, effectStickerId, effectAnimationId,
} = availableEffect;
return {
id: id.toString(),
emoticon,
isPremium: premiumRequired,
staticIconId: staticIconId?.toString(),
effectStickerId: effectStickerId.toString(),
effectAnimationId: effectAnimationId?.toString(),
};
}
export function buildApiPaidReactionPrivacy(privacy: GramJs.TypePaidReactionPrivacy) : ApiPaidReactionPrivacyType {
if (privacy instanceof GramJs.PaidReactionPrivacyAnonymous) {
return { type: 'anonymous' };
}
if (privacy instanceof GramJs.PaidReactionPrivacyPeer) {
return {
type: 'peer',
peerId: getApiChatIdFromMtpPeer(privacy.peer),
};
}
return { type: 'default' };
}