From c061581abb4959eda32a70b07d85375b019c7599 Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Tue, 24 Oct 2023 11:49:17 +0300 Subject: [PATCH] chore: various surface api improvements & fixes --- packages/client/src/client.ts | 4 +++- .../src/methods/chats/kick-chat-member.ts | 10 +++++++--- .../client/src/methods/users/resolve-peer.ts | 2 +- packages/client/src/types/peers/index.ts | 8 ++------ packages/core/src/base-client.ts | 9 +++++++++ .../core/src/network/session-connection.ts | 2 +- packages/core/src/utils/logger.ts | 2 +- packages/dispatcher/src/filters/bots.ts | 8 +++++++- packages/dispatcher/src/filters/chat.ts | 19 ++++++++++++------- packages/dispatcher/src/filters/types.ts | 2 ++ 10 files changed, 45 insertions(+), 21 deletions(-) diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index e870d2aa..3133b0a3 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -1587,15 +1587,17 @@ export interface TelegramClient extends BaseTelegramClient { * Kick a user from a chat. * * This effectively bans a user and immediately unbans them. + * * **Available**: ✅ both users and bots * + * @returns Service message about removed user, if one was generated. */ kickChatMember(params: { /** Chat ID */ chatId: InputPeerLike /** User ID */ userId: InputPeerLike - }): Promise + }): Promise /** * Leave a group chat, supergroup or channel * diff --git a/packages/client/src/methods/chats/kick-chat-member.ts b/packages/client/src/methods/chats/kick-chat-member.ts index 10947afa..fea2124f 100644 --- a/packages/client/src/methods/chats/kick-chat-member.ts +++ b/packages/client/src/methods/chats/kick-chat-member.ts @@ -1,7 +1,7 @@ import { BaseTelegramClient } from '@mtcute/core' import { sleep } from '@mtcute/core/utils.js' -import { InputPeerLike } from '../../types/index.js' +import { InputPeerLike, Message } from '../../types/index.js' import { isInputPeerChannel } from '../../utils/peer-utils.js' import { resolvePeer } from '../users/resolve-peer.js' import { banChatMember } from './ban-chat-member.js' @@ -11,6 +11,8 @@ import { unbanChatMember } from './unban-chat-member.js' * Kick a user from a chat. * * This effectively bans a user and immediately unbans them. + * + * @returns Service message about removed user, if one was generated. */ export async function kickChatMember( client: BaseTelegramClient, @@ -20,13 +22,13 @@ export async function kickChatMember( /** User ID */ userId: InputPeerLike }, -): Promise { +): Promise { const { chatId, userId } = params const chat = await resolvePeer(client, chatId) const user = await resolvePeer(client, userId) - await banChatMember(client, { chatId: chat, participantId: user }) + const msg = await banChatMember(client, { chatId: chat, participantId: user }) // not needed in case this is a legacy group if (isInputPeerChannel(chat)) { @@ -34,4 +36,6 @@ export async function kickChatMember( await sleep(1000) await unbanChatMember(client, { chatId: chat, participantId: user }) } + + return msg } diff --git a/packages/client/src/methods/users/resolve-peer.ts b/packages/client/src/methods/users/resolve-peer.ts index b9b4a66a..02f82784 100644 --- a/packages/client/src/methods/users/resolve-peer.ts +++ b/packages/client/src/methods/users/resolve-peer.ts @@ -29,7 +29,7 @@ export async function resolvePeer( if (typeof peerId === 'object') { if (tl.isAnyPeer(peerId)) { peerId = getMarkedPeerId(peerId) - } else if ('type' in peerId) { + } else if ('inputPeer' in peerId) { // User | Chat return peerId.inputPeer } else { diff --git a/packages/client/src/types/peers/index.ts b/packages/client/src/types/peers/index.ts index 347574b5..70cae46a 100644 --- a/packages/client/src/types/peers/index.ts +++ b/packages/client/src/types/peers/index.ts @@ -1,8 +1,5 @@ import { tl } from '@mtcute/core' -import { Chat } from './chat.js' -import { User } from './user.js' - export * from './chat.js' export * from './chat-event/index.js' export * from './chat-invite-link.js' @@ -29,7 +26,7 @@ export type PeerType = 'user' | 'bot' | 'group' | 'channel' | 'supergroup' * - `string`, representing peer's username (without preceding `@`) * - `string`, representing user's phone number * - `"me"` and `"self"` which will be replaced with the current user/bot - * - `Chat` or `User` object + * - Any object with `inputPeer: tl.TypeInputPeer` property * - Raw TL object * * > * Telegram has moved to int64 IDs. Though, Levin [has confirmed](https://t.me/tdlibchat/25071) @@ -42,5 +39,4 @@ export type InputPeerLike = | tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel - | Chat - | User + | { inputPeer: tl.TypeInputPeer } diff --git a/packages/core/src/base-client.ts b/packages/core/src/base-client.ts index ed572050..27222a0a 100644 --- a/packages/core/src/base-client.ts +++ b/packages/core/src/base-client.ts @@ -162,6 +162,13 @@ export interface BaseTelegramClientOptions { */ network?: NetworkManagerExtraParams + /** + * Set logging level for the client. + * + * See static members of {@link LogManager} for possible values. + */ + logLevel?: number + /** * **EXPERT USE ONLY!** * @@ -247,6 +254,8 @@ export class BaseTelegramClient extends EventEmitter { throw new Error('apiId must be a number or a numeric string!') } + if (opts.logLevel) this.log.level = opts.logLevel + this.crypto = (opts.crypto ?? defaultCryptoProviderFactory)() this.storage = opts.storage ?? new MemoryStorage() this._apiHash = opts.apiHash diff --git a/packages/core/src/network/session-connection.ts b/packages/core/src/network/session-connection.ts index 31b9297e..e3e4afee 100644 --- a/packages/core/src/network/session-connection.ts +++ b/packages/core/src/network/session-connection.ts @@ -564,7 +564,7 @@ export class SessionConnection extends PersistentConnection { } if (this._session.recentIncomingMsgIds.has(messageId)) { - this.log.warn('warn: ignoring duplicate message %s', messageId) + this.log.debug('ignoring duplicate message %s', messageId) return } diff --git a/packages/core/src/utils/logger.ts b/packages/core/src/utils/logger.ts index 4855f3e0..431855d9 100644 --- a/packages/core/src/utils/logger.ts +++ b/packages/core/src/utils/logger.ts @@ -2,7 +2,7 @@ import { hexEncode } from '@mtcute/tl-runtime' import { _defaultLoggingHandler } from './platform/logging.js' -let defaultLogLevel = 2 +let defaultLogLevel = 3 if (typeof process !== 'undefined') { const envLogLevel = parseInt(process.env.MTCUTE_LOG_LEVEL ?? '') diff --git a/packages/dispatcher/src/filters/bots.ts b/packages/dispatcher/src/filters/bots.ts index 7e9710ba..16797756 100644 --- a/packages/dispatcher/src/filters/bots.ts +++ b/packages/dispatcher/src/filters/bots.ts @@ -2,7 +2,7 @@ import { MaybeArray, MaybeAsync, Message } from '@mtcute/client' import { MessageContext } from '../context/message.js' import { chat } from './chat.js' -import { and } from './logic.js' +import { and, or } from './logic.js' import { UpdateFilter } from './types.js' /** @@ -92,6 +92,12 @@ export const command = ( */ export const start = and(chat('private'), command('start')) +/** + * Shorthand filter that matches /start commands + * sent in groups (i.e. using `?startgroup` parameter). + */ +export const startGroup = and(or(chat('supergroup'), chat('group')), command('start')) + /** * Filter for deep links (i.e. `/start `). * diff --git a/packages/dispatcher/src/filters/chat.ts b/packages/dispatcher/src/filters/chat.ts index 76c2fbf0..f3e716e9 100644 --- a/packages/dispatcher/src/filters/chat.ts +++ b/packages/dispatcher/src/filters/chat.ts @@ -12,20 +12,25 @@ import { } from '@mtcute/client' import { UpdateContextDistributed } from '../context/base.js' -import { Modify, UpdateFilter } from './types.js' +import { EmptyObject, Modify, UpdateFilter } from './types.js' /** - * Filter messages by chat type + * Filter updates by type of the chat where they happened */ export const chat = - ( + ( type: T, ): UpdateFilter< - Message, + Obj, { - chat: Modify - sender: T extends 'private' | 'bot' | 'group' ? User : User | Chat - } + chat: Modify + } & (Obj extends Message + ? T extends 'private' | 'bot' | 'group' + ? { + sender: User + } + : EmptyObject + : EmptyObject) > => (msg) => msg.chat.chatType === type diff --git a/packages/dispatcher/src/filters/types.ts b/packages/dispatcher/src/filters/types.ts index 0897ef6b..1083862d 100644 --- a/packages/dispatcher/src/filters/types.ts +++ b/packages/dispatcher/src/filters/types.ts @@ -100,3 +100,5 @@ export type WrapBase = { export type Values = T[keyof T] export type UnwrapBase = T extends { base: any } ? T['base'] : never export type ExtractBaseMany = UnwrapBase>>> + +export type EmptyObject = Record