UNPKG

dograma

Version:

NodeJS/Browser MTProto API Telegram client library,

273 lines (272 loc) 9.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MemorySession = void 0; const Abstract_1 = require("./Abstract"); const tl_1 = require("../tl"); const big_integer_1 = __importDefault(require("big-integer")); const Utils_1 = require("../Utils"); const Helpers_1 = require("../Helpers"); const __1 = require("../"); class MemorySession extends Abstract_1.Session { constructor() { super(); this._serverAddress = undefined; this._dcId = 0; this._port = undefined; this._takeoutId = undefined; this._entities = new Set(); this._updateStates = {}; } setDC(dcId, serverAddress, port) { this._dcId = dcId | 0; this._serverAddress = serverAddress; this._port = port; } get dcId() { return this._dcId; } get serverAddress() { return this._serverAddress; } get port() { return this._port; } get authKey() { return this._authKey; } set authKey(value) { this._authKey = value; } get takeoutId() { return this._takeoutId; } set takeoutId(value) { this._takeoutId = value; } getAuthKey(dcId) { if (dcId && dcId !== this.dcId) { // Not supported. return undefined; } return this.authKey; } setAuthKey(authKey, dcId) { if (dcId && dcId !== this.dcId) { // Not supported. return undefined; } this.authKey = authKey; } close() { } save() { } async load() { } delete() { } _entityValuesToRow(id, hash, username, phone, name) { // While this is a simple implementation it might be overrode by, // other classes so they don't need to implement the plural form // of the method. Don't remove. return [id, hash, username, phone, name]; } _entityToRow(e) { if (!(e.classType === "constructor")) { return; } let p; let markedId; try { p = (0, Utils_1.getInputPeer)(e, false); markedId = (0, Utils_1.getPeerId)(p); } catch (e) { return; } let pHash; if (p instanceof tl_1.Api.InputPeerUser || p instanceof tl_1.Api.InputPeerChannel) { pHash = p.accessHash; } else if (p instanceof tl_1.Api.InputPeerChat) { pHash = big_integer_1.default.zero; } else { return; } let username = e.username; if (username) { username = username.toLowerCase(); } const phone = e.phone; const name = (0, Utils_1.getDisplayName)(e); return this._entityValuesToRow(markedId, pHash, username, phone, name); } _entitiesToRows(tlo) { let entities = []; if (!(tlo.classType === "constructor") && (0, Helpers_1.isArrayLike)(tlo)) { // This may be a list of users already for instance entities = tlo; } else { if (typeof tlo === "object") { if ("user" in tlo) { entities.push(tlo.user); } if ("chat" in tlo) { entities.push(tlo.chat); } if ("channel" in tlo) { entities.push(tlo.channel); } if ("chats" in tlo && (0, Helpers_1.isArrayLike)(tlo.chats)) { entities = entities.concat(tlo.chats); } if ("users" in tlo && (0, Helpers_1.isArrayLike)(tlo.users)) { entities = entities.concat(tlo.users); } } } const rows = []; // Rows to add (id, hash, username, phone, name) for (const e of entities) { const row = this._entityToRow(e); if (row) { rows.push(row); } } return rows; } processEntities(tlo) { const entitiesSet = this._entitiesToRows(tlo); for (const e of entitiesSet) { this._entities.add(e); } } getEntityRowsByPhone(phone) { for (const e of this._entities) { // id, hash, username, phone, name if (e[3] === phone) { return [e[0], e[1]]; } } } getEntityRowsByUsername(username) { for (const e of this._entities) { // id, hash, username, phone, name if (e[2] === username) { return [e[0], e[1]]; } } } getEntityRowsByName(name) { for (const e of this._entities) { // id, hash, username, phone, name if (e[4] === name) { return [e[0], e[1]]; } } } getEntityRowsById(id, exact = true) { if (exact) { for (const e of this._entities) { // id, hash, username, phone, name if (e[0] === id) { return [e[0], e[1]]; } } } else { const ids = [ __1.utils.getPeerId(new tl_1.Api.PeerUser({ userId: (0, Helpers_1.returnBigInt)(id) })), __1.utils.getPeerId(new tl_1.Api.PeerChat({ chatId: (0, Helpers_1.returnBigInt)(id) })), __1.utils.getPeerId(new tl_1.Api.PeerChannel({ channelId: (0, Helpers_1.returnBigInt)(id) })), ]; for (const e of this._entities) { // id, hash, username, phone, name if (ids.includes(e[0])) { return [e[0], e[1]]; } } } } getInputEntity(key) { let exact; if (typeof key === "object" && !big_integer_1.default.isInstance(key) && key.SUBCLASS_OF_ID) { if (key.SUBCLASS_OF_ID == 0xc91c90b6 || key.SUBCLASS_OF_ID == 0xe669bf46 || key.SUBCLASS_OF_ID == 0x40f202fd) { // @ts-ignore return key; } // Try to early return if this key can be casted as input peer return __1.utils.getInputPeer(key); } else { // Not a TLObject or can't be cast into InputPeer if (typeof key === "object") { key = __1.utils.getPeerId(key); exact = true; } else { exact = false; } } if (big_integer_1.default.isInstance(key) || typeof key == "bigint" || typeof key == "number") { key = key.toString(); } let result = undefined; if (typeof key === "string") { const phone = __1.utils.parsePhone(key); if (phone) { result = this.getEntityRowsByPhone(phone); } else { const { username, isInvite } = __1.utils.parseUsername(key); if (username && !isInvite) { result = this.getEntityRowsByUsername(username); } } if (!result) { const id = __1.utils.parseID(key); if (id) { result = this.getEntityRowsById(id, exact); } } if (!result) { result = this.getEntityRowsByName(key); } } if (result) { let entityId = result[0]; // unpack resulting tuple const entityHash = (0, big_integer_1.default)(result[1]); const resolved = __1.utils.resolveId((0, Helpers_1.returnBigInt)(entityId)); entityId = resolved[0]; const kind = resolved[1]; // removes the mark and returns type of entity if (kind === tl_1.Api.PeerUser) { return new tl_1.Api.InputPeerUser({ userId: entityId, accessHash: entityHash, }); } else if (kind === tl_1.Api.PeerChat) { return new tl_1.Api.InputPeerChat({ chatId: entityId }); } else if (kind === tl_1.Api.PeerChannel) { return new tl_1.Api.InputPeerChannel({ channelId: entityId, accessHash: entityHash, }); } } else { throw new Error("Could not find input entity with key " + key); } throw new Error("Could not find input entity with key " + key); } } exports.MemorySession = MemorySession;