diff --git a/packages/core/src/highlevel/methods/chats/archive-chats.ts b/packages/core/src/highlevel/methods/chats/archive-chats.ts index 1e0e53b0..46482d3d 100644 --- a/packages/core/src/highlevel/methods/chats/archive-chats.ts +++ b/packages/core/src/highlevel/methods/chats/archive-chats.ts @@ -1,4 +1,5 @@ import { MaybeArray } from '../../../types/utils.js' +import { isPresent } from '../../../utils/type-assertions.js' import { ITelegramClient } from '../../client.types.js' import { InputPeerLike } from '../../types/index.js' import { resolvePeerMany } from '../users/resolve-peer-many.js' @@ -15,7 +16,7 @@ export async function archiveChats(client: ITelegramClient, chats: MaybeArray ({ + folderPeers: resolvedPeers.filter(isPresent).map((peer) => ({ _: 'inputFolderPeer', peer, folderId: 1, diff --git a/packages/core/src/highlevel/methods/dialogs/get-peer-dialogs.ts b/packages/core/src/highlevel/methods/dialogs/get-peer-dialogs.ts index 96e80deb..438565b8 100644 --- a/packages/core/src/highlevel/methods/dialogs/get-peer-dialogs.ts +++ b/packages/core/src/highlevel/methods/dialogs/get-peer-dialogs.ts @@ -1,4 +1,5 @@ import { MaybeArray } from '../../../types/utils.js' +import { isPresent } from '../../../utils/type-assertions.js' import { ITelegramClient } from '../../client.types.js' import { Dialog } from '../../types/messages/dialog.js' import { InputPeerLike } from '../../types/peers/index.js' @@ -15,7 +16,7 @@ export async function getPeerDialogs(client: ITelegramClient, peers: MaybeArray< const res = await client.call({ _: 'messages.getPeerDialogs', peers: await resolvePeerMany(client, peers).then((peers) => - peers.map((it) => ({ + peers.filter(isPresent).map((it) => ({ _: 'inputDialogPeer', peer: it, })), diff --git a/packages/core/src/highlevel/methods/misc/normalize-privacy-rules.ts b/packages/core/src/highlevel/methods/misc/normalize-privacy-rules.ts index 8c9edcf3..d09fb4eb 100644 --- a/packages/core/src/highlevel/methods/misc/normalize-privacy-rules.ts +++ b/packages/core/src/highlevel/methods/misc/normalize-privacy-rules.ts @@ -1,5 +1,6 @@ import { tl } from '@mtcute/tl' +import { isPresent } from '../../../utils/type-assertions.js' import { ITelegramClient } from '../../client.types.js' import { InputPrivacyRule } from '../../types/index.js' import { toInputUser } from '../../utils/index.js' @@ -36,7 +37,7 @@ export async function _normalizePrivacyRules( res.push({ _: rule.allow ? 'inputPrivacyValueAllowChatParticipants' : 'inputPrivacyValueDisallowChatParticipants', - chats: chats.map((peer) => { + chats: chats.filter(isPresent).map((peer) => { if ('channelId' in peer) return peer.channelId if ('chatId' in peer) return peer.chatId diff --git a/packages/core/src/highlevel/methods/users/resolve-peer-many.ts b/packages/core/src/highlevel/methods/users/resolve-peer-many.ts index b6a19765..fc1469a5 100644 --- a/packages/core/src/highlevel/methods/users/resolve-peer-many.ts +++ b/packages/core/src/highlevel/methods/users/resolve-peer-many.ts @@ -2,7 +2,8 @@ import { tl } from '@mtcute/tl' import { ConditionVariable } from '../../../utils/condition-variable.js' import { ITelegramClient } from '../../client.types.js' -import { InputPeerLike } from '../../types/index.js' +import { MtPeerNotFoundError } from '../../types/errors.js' +import { InputPeerLike } from '../../types/peers/index.js' import { resolvePeer } from './resolve-peer.js' /** @@ -10,6 +11,8 @@ import { resolvePeer } from './resolve-peer.js' * while also normalizing and removing * peers that can't be normalized to that type. * + * If a peer was not found, it will be skipped. + * * Uses async pool internally, with a concurrent limit of 8 * * @param peerIds Peer Ids @@ -24,11 +27,16 @@ export async function resolvePeerMany +export async function resolvePeerMany( + client: ITelegramClient, + peerIds: InputPeerLike[], +): Promise<(tl.TypeInputPeer | null)[]> /** * @internal @@ -37,18 +45,28 @@ export async function resolvePeerMany( client: ITelegramClient, peerIds: InputPeerLike[], normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null, -): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel)[]> { - const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel)[] = [] +): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> { + const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = [] const limit = 8 if (peerIds.length < limit) { // no point in using async pool for resolvePeer(client, it))) + const res = await Promise.all( + peerIds.map((it) => + resolvePeer(client, it).catch((e) => { + if (e instanceof MtPeerNotFoundError) { + return null + } + throw e + }), + ), + ) if (!normalizer) return res for (const value of res) { + if (!value) continue const norm = normalizer(value) if (norm) { @@ -66,9 +84,14 @@ export async function resolvePeerMany( let nextWorkerIdx = 0 const fetchNext = async (idx = nextWorkerIdx++): Promise => { - const result = await resolvePeer(client, peerIds[idx]) - - buffer[idx] = result + try { + const result = await resolvePeer(client, peerIds[idx]) + buffer[idx] = result + } catch (e) { + if (e instanceof MtPeerNotFoundError) { + buffer[idx] = null + } else throw e + } if (nextIdx === idx) { cv.notify() @@ -98,11 +121,12 @@ export async function resolvePeerMany( nextIdx++ - if (!buf) continue - if (!normalizer) { ret.push(buf) - } else { + continue + } + + if (buf !== null) { const norm = normalizer(buf) if (norm) {