UNPKG

dograma

Version:

NodeJS/Browser MTProto API Telegram client library,

214 lines (195 loc) 6.1 kB
import { Api } from "../tl"; import type { Entity, EntityLike } from "../define"; import { ChatGetter } from "../tl/custom"; import type { TelegramClient } from ".."; import { isArrayLike, returnBigInt } from "../Helpers"; import { utils } from "../"; import { SenderGetter } from "../tl/custom/senderGetter"; import bigInt from "big-integer"; import { parseID } from "../Utils"; /** @hidden */ export async function _intoIdSet( client: TelegramClient, chats: EntityLike[] | EntityLike | undefined ): Promise<string[] | undefined> { if (chats == undefined) { return undefined; } if (!isArrayLike(chats)) { chats = [chats]; } const result: Set<string> = new Set<string>(); for (let chat of chats) { if ( typeof chat == "number" || typeof chat == "bigint" || (typeof chat == "string" && parseID(chat)) || bigInt.isInstance(chat) ) { chat = returnBigInt(chat); if (chat.lesser(0)) { result.add(chat.toString()); } else { result.add( utils.getPeerId( new Api.PeerUser({ userId: chat, }) ) ); result.add( utils.getPeerId( new Api.PeerChat({ chatId: chat, }) ) ); result.add( utils.getPeerId( new Api.PeerChannel({ channelId: chat, }) ) ); } } else if ( typeof chat == "object" && chat.SUBCLASS_OF_ID == 0x2d45687 ) { result.add(utils.getPeerId(chat)); } else { chat = await client.getInputEntity(chat); if (chat instanceof Api.InputPeerSelf) { chat = await client.getMe(true); } result.add(utils.getPeerId(chat)); } } return Array.from(result); } export interface DefaultEventInterface { /** * May be one or more entities (username/peer/etc.), preferably IDs.<br/> * By default, only matching chats will be handled. */ chats?: EntityLike[]; /** * Whether to treat the chats as a blacklist instead of as a whitelist (default).<br/> * This means that every chat will be handled *except* those specified in ``chats``<br/> * which will be ignored if ``blacklistChats:true``. */ blacklistChats?: boolean; /** * A callable function that should accept the event as input * parameter, and return a value indicating whether the event * should be dispatched or not (any truthy value will do, it * does not need to be a `bool`). It works like a custom filter: */ func?: CallableFunction; } /** * The common event builder, with builtin support to filter per chat.<br/> * All events inherit this. */ export class EventBuilder { chats?: string[]; blacklistChats: boolean; resolved: boolean; func?: CallableFunction; client?: TelegramClient; constructor(eventParams: DefaultEventInterface) { this.chats = eventParams.chats?.map((x) => x.toString()); this.blacklistChats = eventParams.blacklistChats || false; this.resolved = false; this.func = eventParams.func; } build( update: Api.TypeUpdate, callback?: CallableFunction, selfId?: bigInt.BigInteger ): any { if (update) return update; } async resolve(client: TelegramClient) { if (this.resolved) { return; } await this._resolve(client); this.resolved = true; } async _resolve(client: TelegramClient) { this.chats = await _intoIdSet(client, this.chats); } filter( event: EventCommon | EventCommonSender ): undefined | EventCommon | EventCommonSender { if (!this.resolved) { return; } if (this.chats != undefined) { if (event.chatId == undefined) { return; } const inside = this.chats.includes(event.chatId.toString()); if (inside == this.blacklistChats) { // If this chat matches but it's a blacklist ignore. // If it doesn't match but it's a whitelist ignore. return; } } if (this.func && !this.func(event)) { return; } return event; } } interface EventCommonInterface { chatPeer?: EntityLike; msgId?: number; broadcast?: boolean; } export class EventCommon extends ChatGetter { _eventName = "Event"; _entities: Map<string, Entity>; _messageId?: number; constructor({ chatPeer = undefined, msgId = undefined, broadcast = undefined, }: EventCommonInterface) { super(); ChatGetter.initChatClass(this, { chatPeer, broadcast }); this._entities = new Map(); this._client = undefined; this._messageId = msgId; } _setClient(client: TelegramClient) { this._client = client; } get client() { return this._client; } } export class EventCommonSender extends SenderGetter { _eventName = "Event"; _entities: Map<string, Entity>; _messageId?: number; constructor({ chatPeer = undefined, msgId = undefined, broadcast = undefined, }: EventCommonInterface) { super(); ChatGetter.initChatClass(this, { chatPeer, broadcast }); SenderGetter.initChatClass(this, { chatPeer, broadcast }); this._entities = new Map(); this._client = undefined; this._messageId = msgId; } _setClient(client: TelegramClient) { this._client = client; } get client() { return this._client; } }