🤖 Powerful Nest module for easy and fast creation Telegram bots
Go to file
allcontributors[bot] 72d6be0497
docs: add Sedjj as a contributor (#69)
* docs: update README.md [skip ci]

* docs: create .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2020-04-29 12:19:43 +03:00
.github chore: add sponsor button 2020-04-24 13:53:38 +03:00
lib feat: add launch options 2020-04-24 18:52:54 +03:00
.all-contributorsrc docs: add Sedjj as a contributor (#69) 2020-04-29 12:19:43 +03:00
.eslintrc.js chore: replace tslint with eslint (pull request #1) 2020-03-27 20:41:55 +00:00
.gitignore improvement(workflow): rewrite all workflow 2020-01-12 14:18:48 +03:00
.npmignore chore: add .eslintrc.js into .npmignore file 2020-03-27 23:50:03 +03:00
.prettierignore fix: add telegraf.provider.ts into .prettierignore 🤬 2020-03-28 11:47:34 +03:00
.prettierrc feat: complete rewrite 2020-03-19 16:21:35 +03:00
index.d.ts improvement(workflow): rewrite all workflow 2020-01-12 14:18:48 +03:00
index.js improvement(workflow): rewrite all workflow 2020-01-12 14:18:48 +03:00
index.ts improvement(workflow): rewrite all workflow 2020-01-12 14:18:48 +03:00
LICENSE.md chore: update meta info 2020-04-24 13:59:33 +03:00
package-lock.json chore: bump version 2020-04-24 17:59:16 +03:00
package.json chore: bump version 2020-04-24 17:59:16 +03:00
README.md docs: add Sedjj as a contributor (#69) 2020-04-29 12:19:43 +03:00
renovate.json chore(renovate.json): configure renovate bot 2020-01-23 21:28:11 +03:00
tsconfig.json improvement(workflow): rewrite all workflow 2020-01-12 14:18:48 +03:00

[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications.

NPM Version Package License NPM Downloads CircleCI Coverage Discord Backers on Open Collective Sponsors on Open Collective Support us

Description

Telegraf module for NestJS.

Installation

$ npm i nestjs-telegraf

Once the installation process is complete, we can import the TelegrafModule into the root AppModule.

/* app.module.ts */

import { Module } from '@nestjs/common';
import { TelegrafModule } from 'nestjs-telegraf';

@Module({
  imports: [
    TelegrafModule.forRoot({
      token: 'TELEGRAM_BOT_TOKEN',
    })
  ],
})
export class AppModule {}

The forRoot() method accepts the same configuration object as Telegraf class constructor from the Telegraf package, as described here.

Telegraf methods

Each Telegraf instance method described here has own decorator in nestjs-telegraf package. The name of the decorator corresponds to the name of the Telegraf method and starts with Telegraf. For example @TelegrafHears, @TelegrafOn, @TelegrafAction and so on.

Now let's try to repeat the example from the Telegraf documentation page.

/* app.service.ts */

import { Injectable } from '@nestjs/common';
import {
  TelegrafStart,
  TelegrafHelp,
  TelegrafOn,
  TelegrafHears,
  ContextMessageUpdate,
} from 'nestjs-telegraf';

@Injectable()
export class AppService {
  @TelegrafStart()
  start(ctx: ContextMessageUpdate) {
    ctx.reply('Welcome');
  }

  @TelegrafHelp()
  help(ctx: ContextMessageUpdate) {
    ctx.reply('Send me a sticker');
  }

  @TelegrafOn('sticker')
  on(ctx: ContextMessageUpdate) {
    ctx.reply('👍');
  }

  @TelegrafHears('hi')
  hears(ctx: ContextMessageUpdate) {
    ctx.reply('Hey there');
  }
}

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.

One technique is to use a factory function:

TelegrafModule.forRootAsync({
  useFactory: () => ({
    token: 'TELEGRAM_BOT_TOKEN',
  }),
});

Like other factory providers, our factory function can be async and can inject dependencies through inject.

TelegrafModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    token: configService.get<string>('TELEGRAM_BOT_TOKEN'),
  }),
  inject: [ConfigService],
});

Alternatively, you can configure the TelegrafModule using a class instead of a factory, as shown below:

TelegrafModule.forRootAsync({
  useClass: TelegrafConfigService,
});

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.

@Injectable()
class TelegrafConfigService implements TelegrafOptionsFactory {
  createTelegrafOptions(): TelegrafModuleOptions {
    return {
      token: 'TELEGRAM_BOT_TOKEN',
    };
  }
}

If you want to reuse an existing options provider instead of creating a private copy inside the TelegrafModule, use the useExisting syntax.

TelegrafModule.forRootAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
});

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:

const telegrafProvider = app.get('TelegrafProvider');

Now you can connect middleware:

app.use(telegrafProvider.webhookCallback('/secret-path'));

The last step is to specify launchOptions in forRoot method:

TelegrafModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    token: configService.get<string>('TELEGRAM_BOT_TOKEN'),
    launchOptions: {
      webhook: {
        domain: 'domain.tld',
        hookPath: '/secret-path',
      }
    }
  }),
  inject: [ConfigService],
});

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.

People

License

Nest is MIT licensed.

Contributors

Thanks goes to these wonderful people (emoji key):


Eldar Salimzebarov

🐛 🤔

This project follows the all-contributors specification. Contributions of any kind welcome!