2020-03-31 18:37:42 +03:00
< p align = "center" >
2020-05-03 12:46:24 +03:00
< a href = "http://nestjs.com/" target = "blank" >
< img src = "https://nestjs.com/img/logo-small.svg" width = "120" alt = "Nest Logo" /
< / a >
2020-03-31 18:37:42 +03:00
< / p >
2020-05-03 12:46:24 +03:00
# NestJS Telegraf
![npm ](https://img.shields.io/npm/dm/nestjs-telegraf )
![GitHub last commit ](https://img.shields.io/github/last-commit/bukhalo/nestjs-telegraf )
![NPM ](https://img.shields.io/npm/l/nestjs-telegraf )
2020-01-12 14:54:23 +03:00
2020-03-28 00:08:58 +03:00
[Telegraf ](https://github.com/telegraf/telegraf ) module for [NestJS ](https://github.com/nestjs/nest ).
2020-01-12 14:54:23 +03:00
## Installation
```bash
2020-03-19 20:50:04 +03:00
$ npm i nestjs-telegraf
2019-07-16 18:56:02 +03:00
```
2020-03-19 20:50:04 +03:00
Once the installation process is complete, we can import the TelegrafModule into the root AppModule.
2020-01-24 10:31:15 +03:00
```typescript
2020-03-19 20:50:04 +03:00
/* app.module.ts */
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
import { Module } from '@nestjs/common';
import { TelegrafModule } from 'nestjs-telegraf';
2020-01-24 10:31:15 +03:00
@Module ({
imports: [
2020-03-19 20:50:04 +03:00
TelegrafModule.forRoot({
token: 'TELEGRAM_BOT_TOKEN',
})
2020-01-24 10:31:15 +03:00
],
})
2020-03-19 20:50:04 +03:00
export class AppModule {}
2020-01-24 10:31:15 +03:00
```
2020-03-19 20:50:04 +03:00
The `forRoot()` method accepts the same configuration object as Telegraf class constructor from the Telegraf package, as described [here ](https://telegraf.js.org/#/?id=constructor ).
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
## Telegraf methods
2020-08-23 00:00:59 +03:00
Each Telegraf instance method described [here ](https://telegraf.js.org/#/?id=telegraf ) has own decorator in `nestjs-telegraf` package. The name of the decorator corresponds to the name of the Telegraf method. For example [`@Hears` ](https://telegraf.js.org/#/?id=hears ), [`@On` ](https://telegraf.js.org/#/?id=on ), [`@Action` ](https://telegraf.js.org/#/?id=action ) and so on.
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
Now let's try to repeat the example from the Telegraf [documentation page ](https://telegraf.js.org/#/?id=example ).
2020-01-24 10:31:15 +03:00
```typescript
2020-03-19 20:50:04 +03:00
/* app.service.ts */
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
import { Injectable } from '@nestjs/common';
import {
2020-08-14 12:42:57 +03:00
Start,
Help,
On,
Hears,
2020-05-03 12:14:17 +03:00
Context,
2020-03-19 20:50:04 +03:00
} from 'nestjs-telegraf';
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
@Injectable ()
export class AppService {
2020-08-14 12:42:57 +03:00
@Start ()
2020-05-03 12:14:17 +03:00
start(ctx: Context) {
2020-03-19 20:50:04 +03:00
ctx.reply('Welcome');
}
2020-01-24 10:31:15 +03:00
2020-08-14 12:42:57 +03:00
@Help ()
2020-05-03 12:14:17 +03:00
help(ctx: Context) {
2020-03-19 20:50:04 +03:00
ctx.reply('Send me a sticker');
}
2020-01-24 10:31:15 +03:00
2020-08-14 12:42:57 +03:00
@On ('sticker')
2020-05-03 12:14:17 +03:00
on(ctx: Context) {
2020-03-19 20:50:04 +03:00
ctx.reply('👍');
}
2020-01-24 10:31:15 +03:00
2020-08-14 12:42:57 +03:00
@Hears ('hi')
2020-05-03 12:14:17 +03:00
hears(ctx: Context) {
2020-03-19 20:50:04 +03:00
ctx.reply('Hey there');
2020-01-24 10:31:15 +03:00
}
}
```
2020-05-03 12:14:17 +03:00
## Bot injection
At times you may need to access the native `Telegraf` instance. For example, you may want to connect stage middleware. You can inject the Telegraf by using the `@InjectBot()` decorator as follows:
```typescript
import { Injectable } from '@nestjs/common';
import { InjectBot, TelegrafProvider } from 'nestjs-telegraf';
@Injectable ()
export class BotSettingsService {
constructor(@InjectBot() private bot: TelegrafProvider) {}
}
```
2020-03-19 20:50:04 +03:00
## Async configuration
When you need to pass module options asynchronously instead of statically, use the forRootAsync() method. As with most dynamic modules, Nest provides several techniques to deal with async configuration.
2020-01-24 10:31:15 +03:00
2020-03-19 20:50:04 +03:00
One technique is to use a factory function:
2020-02-29 13:27:29 +03:00
```typescript
2020-03-19 20:50:04 +03:00
TelegrafModule.forRootAsync({
useFactory: () => ({
token: 'TELEGRAM_BOT_TOKEN',
}),
});
```
2020-02-29 13:27:29 +03:00
2020-03-19 20:50:04 +03:00
Like other [factory providers ](https://docs.nestjs.com/fundamentals/custom-providers#factory-providers-usefactory ), our factory function can be async and can inject dependencies through inject.
2020-02-29 13:27:29 +03:00
2020-03-19 20:50:04 +03:00
```typescript
TelegrafModule.forRootAsync({
2020-05-03 12:14:17 +03:00
imports: [ConfigModule.forFeature(telegrafModuleConfig)],
2020-03-19 20:50:04 +03:00
useFactory: async (configService: ConfigService) => ({
2020-03-28 00:08:58 +03:00
token: configService.get< string > ('TELEGRAM_BOT_TOKEN'),
2020-02-29 13:27:29 +03:00
}),
2020-03-19 20:50:04 +03:00
inject: [ConfigService],
});
2020-02-29 13:27:29 +03:00
```
2020-03-19 20:50:04 +03:00
Alternatively, you can configure the TelegrafModule using a class instead of a factory, as shown below:
2020-02-29 13:27:29 +03:00
2020-03-19 20:50:04 +03:00
```typescript
TelegrafModule.forRootAsync({
useClass: TelegrafConfigService,
});
```
2020-02-29 13:27:29 +03:00
2020-03-19 20:50:04 +03:00
The construction above instantiates `TelegrafConfigService` inside `TelegrafModule` , using it to create the required options object. Note that in this example, the `TelegrafConfigService` has to implement the `TelegrafOptionsFactory` interface, as shown below. The `TelegrafModule` will call the `createTelegrafOptions()` method on the instantiated object of the supplied class.
2020-02-29 13:27:29 +03:00
2020-03-19 20:50:04 +03:00
```typescript
2020-02-29 13:27:29 +03:00
@Injectable ()
2020-03-19 20:50:04 +03:00
class TelegrafConfigService implements TelegrafOptionsFactory {
2020-04-24 14:01:38 +03:00
createTelegrafOptions(): TelegrafModuleOptions {
2020-02-29 13:27:29 +03:00
return {
2020-03-19 20:50:04 +03:00
token: 'TELEGRAM_BOT_TOKEN',
2020-02-29 13:27:29 +03:00
};
}
}
```
2020-03-19 20:50:04 +03:00
If you want to reuse an existing options provider instead of creating a private copy inside the `TelegrafModule` , use the `useExisting` syntax.
2020-01-24 10:31:15 +03:00
```typescript
2020-03-19 20:50:04 +03:00
TelegrafModule.forRootAsync({
2020-05-03 12:14:17 +03:00
imports: [ConfigModule.forFeature(telegrafModuleConfig)],
2020-03-19 20:50:04 +03:00
useExisting: ConfigService,
});
2020-01-24 10:31:15 +03:00
```
2020-04-24 17:56:55 +03:00
## Webhooks
If you want to configure a telegram bot webhook, you need to get a middleware from `TelegrafProvider` for connect it in your `main.ts` file.
To access it, you must use the `app.get()` method, followed by the provider reference:
```typescript
const telegrafProvider = app.get('TelegrafProvider');
```
Now you can connect middleware:
```typescript
2020-04-26 00:11:40 +03:00
app.use(telegrafProvider.webhookCallback('/secret-path'));
2020-04-24 18:52:54 +03:00
```
2020-04-24 17:56:55 +03:00
2020-04-24 18:52:54 +03:00
The last step is to specify launchOptions in `forRoot` method:
```typescript
TelegrafModule.forRootAsync({
2020-05-03 12:14:17 +03:00
imports: [ConfigModule.forFeature(telegrafModuleConfig)],
2020-04-24 18:52:54 +03:00
useFactory: async (configService: ConfigService) => ({
token: configService.get< string > ('TELEGRAM_BOT_TOKEN'),
launchOptions: {
webhook: {
domain: 'domain.tld',
hookPath: '/secret-path',
}
}
}),
inject: [ConfigService],
});
2020-04-24 17:56:55 +03:00
```
2020-05-03 12:14:17 +03:00
2020-03-31 18:37:42 +03:00
## Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here ](https://docs.nestjs.com/support ).
2020-01-12 14:54:23 +03:00
## People
2019-07-16 18:56:02 +03:00
2020-04-24 13:59:33 +03:00
- Authors - [Aleksandr Bukhalo ](https://bukhalo.com/ ) & [Igor Kamyshev ](https://kamyshev.me/ )
- Maintainers - [Aleksandr Bukhalo ](https://bukhalo.com/ )
2020-03-31 18:37:42 +03:00
- Website - [https://nestjs.com ](https://nestjs.com/ )
## License
Nest is [MIT licensed ](https://github.com/nestjs/nest/blob/master/LICENSE ).
2020-04-29 12:19:43 +03:00
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL - CONTRIBUTORS - LIST:START - Do not remove or modify this section -->
<!-- prettier - ignore - start -->
<!-- markdownlint - disable -->
< table >
< tr >
2020-05-03 12:46:24 +03:00
< td align = "center" > < a href = "https://github.com/Sedjj" > < img src = "https://avatars3.githubusercontent.com/u/5383030?v=4" width = "100px;" alt = "" / > < br / > < sub > < b > Eldar Salimzebarov< / b > < / sub > < / a > < br / > < a href = "https://github.com/bukhalo/nestjs-telegraf/issues?q=author%3ASedjj" title = "Bug reports" > 🐛< / a > < / td >
< td align = "center" > < a href = "http://www.ismb.it/vito.macchia" > < img src = "https://avatars3.githubusercontent.com/u/2249342?v=4" width = "100px;" alt = "" / > < br / > < sub > < b > Vito Macchia< / b > < / sub > < / a > < br / > < a href = "https://github.com/bukhalo/nestjs-telegraf/commits?author=lamuertepeluda" title = "Code" > 💻< / a > < a href = "https://github.com/bukhalo/nestjs-telegraf/issues?q=author%3Alamuertepeluda" title = "Bug reports" > 🐛< / a > < / td >
2020-04-29 12:26:34 +03:00
< td align = "center" > < a href = "https://github.com/edgesite" > < img src = "https://avatars3.githubusercontent.com/u/10336620?v=4" width = "100px;" alt = "" / > < br / > < sub > < b > KITAHARA SETSUNA< / b > < / sub > < / a > < br / > < a href = "https://github.com/bukhalo/nestjs-telegraf/commits?author=edgesite" title = "Code" > 💻< / a > < a href = "https://github.com/bukhalo/nestjs-telegraf/issues?q=author%3Aedgesite" title = "Bug reports" > 🐛< / a > < / td >
2020-05-03 12:46:24 +03:00
< td align = "center" > < a href = "https://bukhalo.com/" > < img src = "https://avatars2.githubusercontent.com/u/14031838?v=4" width = "100px;" alt = "" / > < br / > < sub > < b > Aleksandr Bukhalo< / b > < / sub > < / a > < br / > < a href = "https://github.com/bukhalo/nestjs-telegraf/commits?author=bukhalo" title = "Code" > 💻< / a > < a href = "https://github.com/bukhalo/nestjs-telegraf/commits?author=bukhalo" title = "Documentation" > 📖< / a > < a href = "https://github.com/bukhalo/nestjs-telegraf/pulls?q=is%3Apr+reviewed-by%3Abukhalo" title = "Reviewed Pull Requests" > 👀< / a > < / td >
< td align = "center" > < a href = "https://github.com/VyacheslavSaloidWork" > < img src = "https://avatars3.githubusercontent.com/u/43011265?v=4" width = "100px;" alt = "" / > < br / > < sub > < b > Vyacheslav Saloid< / b > < / sub > < / a > < br / > < a href = "https://github.com/bukhalo/nestjs-telegraf/issues?q=author%3AVyacheslavSaloidWork" title = "Bug reports" > 🐛< / a > < / td >
2020-04-29 12:19:43 +03:00
< / tr >
< / table >
<!-- markdownlint - enable -->
<!-- prettier - ignore - end -->
<!-- ALL - CONTRIBUTORS - LIST:END -->
2020-08-14 12:42:57 +03:00
This project follows the [all-contributors ](https://github.com/all-contributors/all-contributors ) specification. Contributions of any kind welcome!