mtcute/packages/node/index.ts

96 lines
2.9 KiB
TypeScript
Raw Normal View History

import { TelegramClient, User } from '@mtcute/client'
2021-06-06 00:37:44 +03:00
import { BaseTelegramClient } from '@mtcute/core'
2021-06-07 23:59:17 +03:00
import type { NodeNativeCryptoProvider } from '@mtcute/crypto-node'
2021-06-06 00:37:44 +03:00
import { HtmlMessageEntityParser } from '@mtcute/html-parser'
import { MarkdownMessageEntityParser } from '@mtcute/markdown-parser'
import { SqliteStorage } from '@mtcute/sqlite'
import { createInterface, Interface as RlInterface } from 'readline'
2021-06-06 00:37:44 +03:00
export * from '@mtcute/dispatcher'
export { SqliteStorage }
2021-06-06 00:37:44 +03:00
2021-06-07 23:59:17 +03:00
let nativeCrypto: typeof NodeNativeCryptoProvider | null
try {
nativeCrypto = require('@mtcute/crypto-node').NodeNativeCryptoProvider
} catch (e) {}
2021-06-06 00:37:44 +03:00
export namespace NodeTelegramClient {
export interface Options
extends Omit<BaseTelegramClient.Options, 'storage'> {
2021-06-06 00:37:44 +03:00
/**
* Default parse mode to use.
*
* Both HTML and Markdown parse modes are
* registered automatically.
*
* Defaults to `html`
*/
defaultParseMode?: 'html' | 'markdown'
/**
* Storage to use.
*
* You can pass a file name as a simple string,
* which will be passed directly to `SqliteStorage`
*
* Defaults to SQLite storage in `session.db` file in
* current working directory
2021-06-06 00:37:44 +03:00
*/
storage?: BaseTelegramClient.Options['storage'] | string
}
}
let rl: RlInterface | null = null
/**
* Tiny wrapper over Node `readline` package
* for simpler user input for `.run()` method
*
* @param text Text of the question
*/
export const input = (text: string): Promise<string> => {
if (!rl) {
rl = createInterface({
input: process.stdin,
output: process.stdout,
})
}
return new Promise((res) => rl!.question(text, res))
}
2021-06-06 00:37:44 +03:00
/**
* Tiny wrapper over `TelegramClient` for usage inside Node JS.
*
* This automatically sets the parse modes, native
* crypto addon and defaults to SQLite session.
*/
export class NodeTelegramClient extends TelegramClient {
constructor(opts: NodeTelegramClient.Options) {
super({
2021-06-07 23:59:17 +03:00
crypto: nativeCrypto ? () => new nativeCrypto!() : undefined,
2021-06-06 00:37:44 +03:00
...opts,
storage:
typeof opts.storage === 'string'
? new SqliteStorage(opts.storage)
: opts.storage ?? new SqliteStorage('session.db'),
2021-06-06 00:37:44 +03:00
})
this.registerParseMode(new HtmlMessageEntityParser())
this.registerParseMode(new MarkdownMessageEntityParser())
if (opts.defaultParseMode)
this.setDefaultParseMode(opts.defaultParseMode)
}
run(
params: Parameters<TelegramClient['start']>[0],
then?: (user: User) => void | Promise<void>
): void {
if (!params.phone) params.phone = () => input('Phone > ')
if (!params.code) params.code = () => input('Code > ')
if (!params.password) params.password = () => input('2FA password > ')
return super.run(params, then)
}
2021-06-06 00:37:44 +03:00
}