TelegramPWA/src/api/gramjs/helpers.ts
2021-12-31 18:17:38 +01:00

76 lines
2.5 KiB
TypeScript

import { Api as GramJs } from '../../lib/gramjs';
import localDb from './localDb';
import { buildApiPeerId, getApiChatIdFromMtpPeer } from './apiBuilders/peers';
export function resolveMessageApiChatId(mtpMessage: GramJs.TypeMessage) {
if (!(mtpMessage instanceof GramJs.Message || mtpMessage instanceof GramJs.MessageService)) {
return undefined;
}
return getApiChatIdFromMtpPeer(mtpMessage.peerId);
}
export function addMessageToLocalDb(message: GramJs.Message | GramJs.MessageService) {
const messageFullId = `${resolveMessageApiChatId(message)}-${message.id}`;
localDb.messages[messageFullId] = message;
if (
message instanceof GramJs.Message
&& message.media instanceof GramJs.MessageMediaDocument
&& message.media.document instanceof GramJs.Document
) {
localDb.documents[String(message.media.document.id)] = message.media.document;
}
if (
message instanceof GramJs.Message
&& message.media instanceof GramJs.MessageMediaWebPage
&& message.media.webpage instanceof GramJs.WebPage
&& message.media.webpage.document instanceof GramJs.Document
) {
localDb.documents[String(message.media.webpage.document.id)] = message.media.webpage.document;
}
if (message instanceof GramJs.MessageService && 'photo' in message.action) {
addPhotoToLocalDb(message.action.photo);
}
}
export function addPhotoToLocalDb(photo: GramJs.TypePhoto) {
if (photo instanceof GramJs.Photo) {
localDb.photos[String(photo.id)] = photo;
}
}
function addChatToLocalDb(chat: GramJs.Chat | GramJs.Channel, noOverwrite = false) {
const id = buildApiPeerId(chat.id, chat instanceof GramJs.Chat ? 'chat' : 'channel');
if (!noOverwrite || !localDb.chats[id]) {
localDb.chats[id] = chat;
}
}
export function addUserToLocalDb(user: GramJs.User, shouldOverwrite = false) {
const id = buildApiPeerId(user.id, 'user');
if (shouldOverwrite || !localDb.users[id]) {
localDb.users[id] = user;
}
}
export function addEntitiesWithPhotosToLocalDb(entities: (GramJs.TypeUser | GramJs.TypeChat)[]) {
entities.forEach((entity) => {
if (entity instanceof GramJs.User && entity.photo) {
addUserToLocalDb(entity);
} else if ((entity instanceof GramJs.Chat || entity instanceof GramJs.Channel) && entity.photo) {
addChatToLocalDb(entity);
}
});
}
export function serializeBytes(value: Buffer) {
return String.fromCharCode(...value);
}
export function deserializeBytes(value: string) {
return Buffer.from(value, 'binary');
}