151 lines
4.4 KiB
TypeScript

import { Api as GramJs } from '../../../lib/gramjs';
import type {
ApiEmojiInteraction, ApiSticker, ApiStickerSet, GramJsEmojiInteraction,
} from '../../types';
import { NO_STICKER_SET_ID } from '../../../config';
import { buildApiThumbnailFromCached, buildApiThumbnailFromPath } from './common';
import localDb from '../localDb';
const LOTTIE_STICKER_MIME_TYPE = 'application/x-tgsticker';
const VIDEO_STICKER_MIME_TYPE = 'video/webm';
export function buildStickerFromDocument(document: GramJs.TypeDocument, isNoPremium?: boolean): ApiSticker | undefined {
if (document instanceof GramJs.DocumentEmpty) {
return undefined;
}
const { mimeType, videoThumbs } = document;
const stickerAttribute = document.attributes
.find((attr: any): attr is GramJs.DocumentAttributeSticker => (
attr instanceof GramJs.DocumentAttributeSticker
));
const fileAttribute = (mimeType === LOTTIE_STICKER_MIME_TYPE || mimeType === VIDEO_STICKER_MIME_TYPE)
&& document.attributes
.find((attr: any): attr is GramJs.DocumentAttributeFilename => (
attr instanceof GramJs.DocumentAttributeFilename
));
if (!stickerAttribute && !fileAttribute) {
return undefined;
}
const isLottie = mimeType === LOTTIE_STICKER_MIME_TYPE;
const isVideo = mimeType === VIDEO_STICKER_MIME_TYPE;
const imageSizeAttribute = document.attributes
.find((attr: any): attr is GramJs.DocumentAttributeImageSize => (
attr instanceof GramJs.DocumentAttributeImageSize
));
const videoSizeAttribute = document.attributes
.find((attr: any): attr is GramJs.DocumentAttributeVideo => (
attr instanceof GramJs.DocumentAttributeVideo
));
const sizeAttribute = imageSizeAttribute || videoSizeAttribute;
const stickerSetInfo = stickerAttribute && stickerAttribute.stickerset instanceof GramJs.InputStickerSetID
? stickerAttribute.stickerset
: undefined;
const emoji = stickerAttribute?.alt;
const cachedThumb = document.thumbs && document.thumbs.find(
(s): s is GramJs.PhotoCachedSize => s instanceof GramJs.PhotoCachedSize,
);
// eslint-disable-next-line no-restricted-globals
if (mimeType === VIDEO_STICKER_MIME_TYPE && !(self as any).isWebmSupported && !cachedThumb) {
const staticThumb = document.thumbs && document.thumbs.find(
(s): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize,
);
if (!staticThumb) {
return undefined;
}
}
const pathThumb = document.thumbs && document.thumbs.find(
(s): s is GramJs.PhotoPathSize => s instanceof GramJs.PhotoPathSize,
);
const thumbnail = cachedThumb ? (
buildApiThumbnailFromCached(cachedThumb)
) : pathThumb && sizeAttribute ? (
buildApiThumbnailFromPath(pathThumb, sizeAttribute)
) : undefined;
const { w: width, h: height } = cachedThumb as GramJs.PhotoCachedSize || sizeAttribute || {};
const hasEffect = !isNoPremium && videoThumbs?.some(({ type }) => type === 'f');
return {
id: String(document.id),
stickerSetId: stickerSetInfo ? String(stickerSetInfo.id) : NO_STICKER_SET_ID,
stickerSetAccessHash: stickerSetInfo && String(stickerSetInfo.accessHash),
emoji,
isLottie,
isVideo,
width,
height,
thumbnail,
hasEffect,
};
}
export function buildStickerSet(set: GramJs.StickerSet): ApiStickerSet {
const {
archived,
animated,
installedDate,
videos,
id,
accessHash,
title,
thumbs,
count,
shortName,
} = set;
return {
archived,
isLottie: animated,
isVideos: videos,
installedDate,
id: String(id),
accessHash: String(accessHash),
title,
hasThumbnail: Boolean(thumbs?.length),
count,
shortName,
};
}
export function buildStickerSetCovered(coveredStickerSet: GramJs.TypeStickerSetCovered): ApiStickerSet {
const stickerSet = buildStickerSet(coveredStickerSet.set);
const stickerSetCovers = (coveredStickerSet instanceof GramJs.StickerSetMultiCovered)
? coveredStickerSet.covers
: [coveredStickerSet.cover];
stickerSet.covers = [];
stickerSetCovers.forEach((cover) => {
if (cover instanceof GramJs.Document) {
const coverSticker = buildStickerFromDocument(cover);
if (coverSticker) {
stickerSet.covers!.push(coverSticker);
localDb.documents[String(cover.id)] = cover;
}
}
});
return stickerSet;
}
export function buildApiEmojiInteraction(json: GramJsEmojiInteraction): ApiEmojiInteraction {
return {
timestamps: json.a.map((l) => l.t),
};
}