Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

NestJS module for creating Telegram bots by telegraf.js framework

License

Notifications You must be signed in to change notification settings

igorkamyshev/nest-telegram

Repository files navigation

nest-telegram

Scripts sets up by @solid-soda/scripts v2.1.0

Integrate telegraf.js to NestJS application.

Warning! Package under development, please waiting for v1 release.

Instalation

yarn add nest-telegram

Setup

Add TelegramModule to your app

import { TelegramModule, TelegramModuleOptionsFactory } from 'nest-telegram'

// In real app, please, don't store token in source code
class TelegramOptionsFactory implements TelegramModuleOptionsFactory {
  createOptions(): TelegramModuleOptions {
    return {
      token: 'TelegramToken#1213',
      sitePublicUrl: 'https://my-site.com',
    }
  }
}

@Module({
  imports: [
    TelegramModule.forRootAsync({,
      imports: [/* all modules for initialize TelegramOptionsFactory*/]
      useClass: TelegramOptionsFactory,
    }),
    UtilsModule,
  ],
})
export class MyModule implements NestModule {
  constructor(
    private readonly moduleRef: ModuleRef,
    private readonly telegramBot: TelegramBot,
  ) {}

  onModuleInit() {
    const isDev = process.env.NODE_ENV === 'development'

    // in dev mode, we can't use webhook, polling starts automatically
    this.telegramBot.init(this.moduleRef, isDev);
  }

  // ...
}

Add custom middleware to your app

import { TelegramBot } from 'nest-telegram';
import { NestFactory } from '@nestjs/core';
import { AppModule } from '@app/app.module';

async function bootstrap() {
  const isDev = process.env.NODE_ENV === 'development';

  const app = await NestFactory.create(AppModule);

  const bot = app.get(TelegramBot);

  if (!isDev) {
    // in production mode, please use webhook with middleware
    app.use(bot.getMiddleware('hook-path'));
  }

  await app.listen(3000);
}
bootstrap();

Usage

Now, you can decorate any method with TelegramActionHandler.

Example:

import { Injectable } from '@nestjs/common';
import { Context, PipeContext, TelegramActionHandler } from 'nest-telegram';

@Injectable()
export class HelpActions {
  @TelegramActionHandler({ onStart: true })
  async start(ctx: Context) {
    await ctx.reply('Hello!');
  }
}

Available actions for decorator:

  • onStart {boolean}, it triggers on /start command.
  • command {string}, it triggers on any command, e.g. — @TelegramActionHandler({ command: '/help' }).
  • message {string|RegExp}, it triggers on text message matching RegExp or string.
  • location {boolean}, it triggers on location send.

Also, you can write Transformators for context (like Pipes in NestJS). Example:

import { Injectable } from '@nestjs/common'
import { ContextTransformer, Context } from 'nest-telegram'

@Injectable()
class CurrentSender implements ContextTransformer<TokenPayloadModel> {
  async transform(ctx: Context) {
    const user = // get user from DB

    return {
      login: user.login,
      isManager: user.isManager,
    }
  }
}

@Injectable()
export class SomethingActions {
  @TelegramActionHandler({ command: '/say' })
  async say(
    ctx: Context,
    // apply this transformer like this
    @PipeContext(CurrentSender) user: TokenPayloadModel,
  ) {
    const { login } = user

    // now you can use `login`
    await ctx.reply(`Hello, ${login}`)
  }
}

Also, you can write Catchers for exceptions (like Filters in NestJS). Example:

import { TelegramErrorHandler, TelegramCatch, Context } from 'nest-telegram'

@TelegramCatch(MyExecption)
export class MyCatcher
  implements TelegramErrorHandler<MyExecption> {
  public async catch(ctx: Context, exception: MyExecption) {
    await ctx.reply(exception.message)
  }
}

Stay tuned, stable release is coming. 🤓

About

NestJS module for creating Telegram bots by telegraf.js framework

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •