151 lines
4.4 KiB
TypeScript
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),
|
|
};
|
|
}
|