dograma
Version:
NodeJS/Browser MTProto API Telegram client library,
121 lines (107 loc) • 3.27 kB
text/typescript
import type { Entity, EntityLike } from "../../define";
import type { TelegramClient } from "../../client/TelegramClient";
import { utils } from "../../";
import { Api } from "../api";
import { betterConsoleLog, returnBigInt } from "../../Helpers";
import { inspect } from "../../inspect";
export interface ChatGetterConstructorParams {
chatPeer?: EntityLike;
inputChat?: EntityLike;
chat?: EntityLike;
broadcast?: boolean;
}
export class ChatGetter {
_chatPeer?: EntityLike;
_inputChat?: EntityLike;
_chat?: Entity;
_broadcast?: boolean;
public _client?: TelegramClient;
[inspect.custom]() {
return betterConsoleLog(this);
}
static initChatClass(
c: any,
{ chatPeer, inputChat, chat, broadcast }: ChatGetterConstructorParams
) {
c._chatPeer = chatPeer;
c._inputChat = inputChat;
c._chat = chat;
c._broadcast = broadcast;
c._client = undefined;
}
get chat() {
return this._chat;
}
async getChat() {
if (
!this._chat ||
("min" in this._chat && (await this.getInputChat()))
) {
try {
if (this._inputChat) {
this._chat = await this._client?.getEntity(this._inputChat);
}
} catch (e) {
await this._refetchChat();
}
}
return this._chat;
}
get inputChat() {
if (!this._inputChat && this._chatPeer && this._client) {
try {
this._inputChat = this._client._entityCache.get(
utils.getPeerId(this._chatPeer)
);
} catch (e) {}
}
return this._inputChat;
}
async getInputChat() {
if (!this.inputChat && this.chatId && this._client) {
try {
const target = this.chatId;
for await (const dialog of this._client.iterDialogs({
limit: 100,
})) {
if (dialog.id!.eq(target!)) {
this._chat = dialog.entity;
this._inputChat = dialog.inputEntity;
break;
}
}
} catch (e) {
// do nothing
}
return this._inputChat;
}
return this._inputChat;
}
get chatId() {
return this._chatPeer
? returnBigInt(utils.getPeerId(this._chatPeer))
: undefined;
}
get isPrivate() {
return this._chatPeer
? this._chatPeer instanceof Api.PeerUser
: undefined;
}
get isGroup() {
if (!this._broadcast && this.chat && "broadcast" in this.chat) {
this._broadcast = Boolean(this.chat.broadcast);
}
if (this._chatPeer instanceof Api.PeerChannel) {
if (this._broadcast === undefined) {
return undefined;
} else {
return !this._broadcast;
}
}
return this._chatPeer instanceof Api.PeerChat;
}
get isChannel() {
return this._chatPeer instanceof Api.PeerChannel;
}
async _refetchChat() {}
}