feat(client): support updateBotStopped

This commit is contained in:
teidesu 2021-08-04 13:23:39 +03:00
parent c943391e15
commit 6be71c3572
7 changed files with 96 additions and 225 deletions

View file

@ -83,224 +83,6 @@ function toSentence(type, stype = 'inline') {
}
}
// function generateHandler() {
// const lines = []
// const names = ['RawUpdateHandler']
//
// // imports must be added manually because yeah
//
// types.forEach((type) => {
// if (type.updateType === 'IGNORE') return
//
// lines.push(
// `export type ${type.handlerTypeName}Handler<T = ${type.updateType}` +
// `${type.state ? ', S = never' : ''}> = ParsedUpdateHandler<` +
// `'${type.typeName}', T${type.state ? ', S' : ''}>`
// )
// names.push(`${type.handlerTypeName}Handler`)
// })
//
// replaceSections('handler.ts', {
// codegen:
// lines.join('\n') +
// '\n\nexport type UpdateHandler = \n' +
// names.map((i) => ` | ${i}\n`).join(''),
// })
// }
//
// function generateBuilders() {
// const lines = []
// const imports = ['UpdateHandler']
//
// types.forEach((type) => {
// imports.push(`${type.handlerTypeName}Handler`)
//
// if (type.updateType === 'IGNORE') {
// lines.push(`
// /**
// * Create ${toSentence(type)}
// *
// * @param handler ${toSentence(type, 'full')}
// */
// export function ${type.funcName}(
// handler: ${type.handlerTypeName}Handler['callback']
// ): ${type.handlerTypeName}Handler
//
// /**
// * Create ${toSentence(type)} with a filter
// *
// * @param filter Predicate to check the update against
// * @param handler ${toSentence(type, 'full')}
// */
// export function ${type.funcName}(
// filter: ${type.handlerTypeName}Handler['check'],
// handler: ${type.handlerTypeName}Handler['callback']
// ): ${type.handlerTypeName}Handler
//
// /** @internal */
// export function ${type.funcName}(filter: any, handler?: any): ${
// type.handlerTypeName
// }Handler {
// return _create('${type.typeName}', filter, handler)
// }
// `)
// } else {
// lines.push(`
// /**
// * Create ${toSentence(type)}
// *
// * @param handler ${toSentence(type, 'full')}
// */
// export function ${type.funcName}(
// handler: ${type.handlerTypeName}Handler['callback']
// ): ${type.handlerTypeName}Handler
//
// /**
// * Create ${toSentence(type)} with a filter
// *
// * @param filter Update filter
// * @param handler ${toSentence(type, 'full')}
// */
// export function ${type.funcName}<Mod>(
// filter: UpdateFilter<${type.updateType}, Mod>,
// handler: ${type.handlerTypeName}Handler<
// filters.Modify<${type.updateType}, Mod>
// >['callback']
// ): ${type.handlerTypeName}Handler
//
// /** @internal */
// export function ${type.funcName}(
// filter: any,
// handler?: any
// ): ${type.handlerTypeName}Handler {
// return _create('${type.typeName}', filter, handler)
// }
// `)
// }
// })
//
// replaceSections('builders.ts', {
// codegen: lines.join('\n'),
// 'codegen-imports':
// 'import {\n' +
// imports.map((i) => ` ${i},\n`).join('') +
// "} from './handler'",
// })
// }
//
// function generateDispatcher() {
// const lines = []
// const declareLines = []
// const imports = ['UpdateHandler']
//
// types.forEach((type) => {
// imports.push(`${type.handlerTypeName}Handler`)
//
// if (type.updateType === 'IGNORE') {
// declareLines.push(`
// /**
// * Register a plain old ${toSentence(type, 'plain')}
// *
// * @param name Event name
// * @param handler ${toSentence(type, 'full')}
// */
// on(name: '${type.typeName}', handler: ${type.handlerTypeName}Handler['callback']): this
// `)
//
// lines.push(`
// /**
// * Register ${toSentence(type)} without any filters
// *
// * @param handler ${toSentence(type, 'full')}
// * @param group Handler group index
// */
// on${type.handlerTypeName}(handler: ${type.handlerTypeName}Handler['callback'], group?: number): void
//
// /**
// * Register ${toSentence(type)} with a filter
// *
// * @param filter Update filter function
// * @param handler ${toSentence(type, 'full')}
// * @param group Handler group index
// */
// on${type.handlerTypeName}(
// filter: ${type.handlerTypeName}Handler['check'],
// handler: ${type.handlerTypeName}Handler['callback'],
// group?: number
// ): void
//
// /** @internal */
// on${type.handlerTypeName}(filter: any, handler?: any, group?: number): void {
// this._addKnownHandler('${type.funcName}', filter, handler, group)
// }
// `)
// } else {
// declareLines.push(`
// /**
// * Register a plain old ${toSentence(type, 'plain')}
// *
// * @param name Event name
// * @param handler ${toSentence(type, 'full')}
// */
// on(name: '${type.typeName}', handler: ${type.handlerTypeName}Handler['callback']): this
//
// `)
// lines.push(`
// /**
// * Register ${toSentence(type)} without any filters
// *
// * @param handler ${toSentence(type, 'full')}
// * @param group Handler group index
// */
// on${type.handlerTypeName}(handler: ${type.handlerTypeName}Handler${type.state ? `<${type.updateType}, State extends never ? never : UpdateState<State, SceneName>>` : ''}['callback'], group?: number): void
//
// ${type.state ? `
// /**
// * Register ${toSentence(type)} with a filter
// *
// * @param filter Update filter
// * @param handler ${toSentence(type, 'full')}
// * @param group Handler group index
// */
// on${type.handlerTypeName}<Mod>(
// filter: UpdateFilter<${type.updateType}, Mod, State>,
// handler: ${type.handlerTypeName}Handler<filters.Modify<${type.updateType}, Mod>, State extends never ? never : UpdateState<State, SceneName>>['callback'],
// group?: number
// ): void
// ` : ''}
//
// /**
// * Register ${toSentence(type)} with a filter
// *
// * @param filter Update filter
// * @param handler ${toSentence(type, 'full')}
// * @param group Handler group index
// */
// on${type.handlerTypeName}<Mod>(
// filter: UpdateFilter<${type.updateType}, Mod>,
// handler: ${type.handlerTypeName}Handler<filters.Modify<${type.updateType}, Mod>${type.state ? ', State extends never ? never : UpdateState<State, SceneName>' : ''}>['callback'],
// group?: number
// ): void
//
// /** @internal */
// on${type.handlerTypeName}(filter: any, handler?: any, group?: number): void {
// this._addKnownHandler('${type.funcName}', filter, handler, group)
// }
// `)
// }
// })
//
// replaceSections('dispatcher.ts', {
// codegen: lines.join('\n'),
// 'codegen-declare': declareLines.join('\n'),
// 'codegen-imports':
// 'import {\n' +
// imports.map((i) => ` ${i},\n`).join('') +
// "} from './handler'",
// })
// }
//
function generateParsedUpdate() {
replaceSections('types/updates/index.ts', {
codegen: 'export type ParsedUpdate =\n'
@ -310,13 +92,6 @@ function generateParsedUpdate() {
async function main() {
generateParsedUpdate()
// generateBuilders()
// generateHandler()
// generateDispatcher()
// await formatFile('builders.ts')
// await formatFile('handler.ts')
// await formatFile('dispatcher.ts')
}
module.exports = { types, toSentence, replaceSections, formatFile }

View file

@ -11,3 +11,4 @@ poll_vote = PollVoteUpdate
user_status: UserStatusUpdate = UserStatusUpdate
user_typing = UserTypingUpdate
history_read = HistoryReadUpdate
bot_stopped = BotStoppedUpdate

View file

@ -0,0 +1,51 @@
import { TelegramClient } from '../../client'
import { tl } from '@mtqt/tl'
import { makeInspectable } from '../utils'
import { User, UsersIndex } from '../peers'
/**
* A user has stopped or restarted the bot.
*
* This update is **not** sent the first time user
* interacts with the bot.
*/
export class BotStoppedUpdate {
constructor(
readonly client: TelegramClient,
readonly raw: tl.RawUpdateBotStopped,
readonly _users: UsersIndex
) {}
/**
* ID of the user who stopped or restarted the bot
*/
get userId(): number {
return this.raw.userId
}
private _user?: User
/**
* User who stopped or restarted the bot
*/
get user(): User {
if (!this._user) {
this._user = new User(this.client, this._users[this.raw.userId])
}
return this._user
}
/**
* Whether the bot is currently stopped.
*
* If `true`, then the user has stopped the bot.
* If `false`, then the user has re-started the bot.
*/
get stopped(): boolean {
return this.raw.stopped
}
}
makeInspectable(BotStoppedUpdate)

View file

@ -8,6 +8,7 @@ import { PollVoteUpdate } from './poll-vote'
import { UserStatusUpdate } from './user-status-update'
import { UserTypingUpdate } from './user-typing-update'
import { HistoryReadUpdate } from './history-read-update'
import { BotStoppedUpdate } from './bot-stopped'
export {
DeleteMessageUpdate,
@ -18,6 +19,7 @@ export {
UserStatusUpdate,
UserTypingUpdate,
HistoryReadUpdate,
BotStoppedUpdate
}
// begin-codegen
@ -34,5 +36,6 @@ export type ParsedUpdate =
| { name: 'user_status', data: UserStatusUpdate }
| { name: 'user_typing', data: UserTypingUpdate }
| { name: 'history_read', data: HistoryReadUpdate }
| { name: 'bot_stopped', data: BotStoppedUpdate }
// end-codegen

View file

@ -1,6 +1,7 @@
import { TelegramClient } from '../client'
import { tl } from '@mtqt/tl'
import {
BotStoppedUpdate,
CallbackQuery,
ChatMemberUpdate,
ChatsIndex,
@ -110,6 +111,10 @@ const PARSERS: Partial<
updateReadChannelOutbox: historyReadParser,
updateReadChannelDiscussionInbox: historyReadParser,
updateReadChannelDiscussionOutbox: historyReadParser,
updateBotStopped: [
'bot_stopped',
(client, upd, users) => new BotStoppedUpdate(client, upd as any, users),
],
}
/** @internal */

View file

@ -17,6 +17,7 @@ import {
DeleteMessageUpdate,
HistoryReadUpdate,
ParsedUpdate,
BotStoppedUpdate
} from '@mtqt/client'
import { tl } from '@mtqt/tl'
// begin-codegen-imports
@ -35,6 +36,7 @@ import {
UserStatusUpdateHandler,
UserTypingHandler,
HistoryReadHandler,
BotStoppedHandler,
} from './handler'
// end-codegen-imports
import { filters, UpdateFilter } from './filters'
@ -1468,5 +1470,33 @@ export class Dispatcher<State = never, SceneName extends string = string> {
this._addKnownHandler('history_read', filter, handler, group)
}
/**
* Register a bot stopped handler without any filters
*
* @param handler Bot stopped handler
* @param group Handler group index
*/
onBotStopped(handler: BotStoppedHandler['callback'], group?: number): void
/**
* Register a bot stopped handler with a filter
*
* @param filter Update filter
* @param handler Bot stopped handler
* @param group Handler group index
*/
onBotStopped<Mod>(
filter: UpdateFilter<BotStoppedUpdate, Mod>,
handler: BotStoppedHandler<
filters.Modify<BotStoppedUpdate, Mod>
>['callback'],
group?: number
): void
/** @internal */
onBotStopped(filter: any, handler?: any, group?: number): void {
this._addKnownHandler('bot_stopped', filter, handler, group)
}
// end-codegen
}

View file

@ -14,6 +14,7 @@ import {
DeleteMessageUpdate,
PollUpdate,
UserTypingUpdate,
BotStoppedUpdate
} from '@mtqt/client'
import { tl } from '@mtqt/tl'
import { PropagationAction } from './propagation'
@ -94,6 +95,10 @@ export type HistoryReadHandler<T = HistoryReadUpdate> = ParsedUpdateHandler<
'history_read',
T
>
export type BotStoppedHandler<T = BotStoppedUpdate> = ParsedUpdateHandler<
'bot_stopped',
T
>
export type UpdateHandler =
| RawUpdateHandler
@ -109,5 +114,6 @@ export type UpdateHandler =
| UserStatusUpdateHandler
| UserTypingHandler
| HistoryReadHandler
| BotStoppedHandler
// end-codegen