8000 GitHub - iamsr/discord-nestjs: 👾 NestJS package for discord.js
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

iamsr/discord-nestjs

 
 

Repository files navigation

Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications, heavily inspired by Angular.

NPM Version Package License

🧾 Description

NestJS package for discord.js

👨🏻‍💻 Installation

$ npm install discord-nestjs discord.js

OR

$ yarn add discord-nestjs discord.js

📑 Overview

You can use forRoot or forRootAsync to configure your module

  • token * - your discord bot token see
  • commandPrefix * - global prefix for command events
  • allowGuilds - list of Guild IDs that the bot is allowed to work with
  • denyGuilds - list of Guild IDs that the bot is not allowed to work with
  • allowChannels - linking commands to a channel (can also be set through a decorator)
    • commandName * - command name
    • channels * - channel ID list
  • you can also set all options as for the client from the "discord.js" library

💡 Example

/*bot.module.ts*/

@Module({
  imports: [DiscordModule.forRoot({
    token: 'Njg2MzI2OTMwNTg4NTY1NTQx.XmVlww.EF_bMXRvYgMUCQhg_jYnieoBW-k',
    commandPrefix: '!',
    allowGuilds: ['745366351929016363'],
    denyGuilds: ['520622812742811698'],
    allowChannels: [{
      commandName: 'some',
      channels: ['745366352386326572'] 
    }]
    // and other discord options
  })],
  providers: [BotGateway]
})
export class BotModule {
}

Or async

/*bot.module.ts*/

@Module({
  imports: [DiscordModule.forRootAsync({
    useFactory: () => ({
      token: 'Njg2MzI2OTMwNTg4NTY1NTQx.XmVlww.EF_bMXRvYgMUCQhg_jYnieoBW-k',
      commandPrefix: '!',
      allowGuilds: ['745366351929016363'],
      denyGuilds: ['520622812742811698'],
      allowChannels: [{
        commandName: 'some',
        channels: ['745366352386326572'] 
      }]
      // and other discord options
    })
  })],
  providers: [BotGateway]
})
export class BotModule {
}

▶️ Usage

Create your class (e.g. BotGateway), mark it with @Injectable() or @Controller()

💡 Example

/*bot.gateway.ts*/

import { Injectable, Logger } from '@nestjs/common';
import { On, DiscordClient } from 'discord-nestjs';

@Injectable()
export class BotGateway {
  private readonly logger = new Logger(BotGateway.name);

  constructor(
    private readonly discordClient: DiscordClient
  ) {
  }

  @On({event: 'ready'})
  onReady(): void {
    this.logger.log(`Logged in as ${this.discordClient.user.tag}!`);
  }
}

✨ You can use the following decorators:

ℹ️ Decorator @Client

You can get discord client via @Client() decorator instead constructor property

💡 Example

/*bot.gateway.ts*/

import { Injectable, Logger } from '@nestjs/common';
import { On, DiscordClient } from 'discord-nestjs';

@Injectable()
export class BotGateway {
  private readonly logger = new Logger(BotGateway.name);

  @Client()
  discordClient: DiscordClient;

  @On({event: 'ready'})
  onReady(): void {
    this.logger.log(`Logged in as ${this.discordClient.user.tag}!`);
  }
}

ℹ️ Decorator @Command

Use the @Command decorator to handle incoming commands to the bot

  • name * - command name
  • prefix - override global prefix
  • isRemoveCommandName - remove command name from message
  • isRemovePrefix - remove prefix name from message
  • isIgnoreBotMessage - ignore incoming messages from bots
  • allowChannels - list of channel identifiers on which this command will work
  • isRemoveMessage - remove message from channel after receive

💡 Example

/*bot.gateway.ts*/

@Injectable()
export class BotGateway {
  @OnCommand({name: 'start'})
  async onCommand(message: Message): Promise<void> {
      await message.reply(`Execute command: ${message.content}`);
  }
}

ℹ️ Decorator @On

Handle discord events see

  • event * - name of the event to listen to

💡 Example

/*bot.gateway.ts*/

@Injectable()
export class BotGateway {
  @On({event: 'message'})
  async onMessage(message: Message): Promise<void> {
    if (!message.author.bot) {
      await message.reply('I\'m watching you');
    }
  }
}

ℹ️ Decorator @Once

Handle discord events (only once) see

  • event * - name of the event to listen to

💡 Example

/*bot.gateway.ts*/

@Injectable()
export class BotGateway {
  @Once({event: 'message'})
  async onceMessage(message: Message): Promise<void> {
    if (!message.author.bot) {
      await message.reply('I\'m watching you');
    }
  }
}

ℹ️ Decorator @UseGuards (Test feature)

To guard incoming messages you can use @UseGuards() decorator

💡 Example

You need to implement DiscordGuard interface

/*bot.guard.ts*/

import { DiscordGuard } from 'discord-nestjs';
import { ClientEvents, Message } from 'discord.js';

export class BotGuard implements DiscordGuard {
  async canActive(
    event: keyof ClientEvents,
    context: Message
  ): Promise<boolean> {
    if (context.author.id === '766863033789563648') {
      return true;
    } else {
      const embed = new MessageEmbed()
        .setColor()
        .setTitle('Ups! Not allowed!');
      await context.reply(embed);
      return false;
    }
  }
}
/*bot.gateway.ts*/
import { On, UseGuards, OnCommand } from 'discord-nestjs';
import { Message } from 'discord.js';

@Injectable()
export class BotGateway {
  @UseGuards(BotGuard)
  @OnCommand({name: 'hide'})
  async guardCommand(message: Message): Promise<void> {
      // to do something
  }
}

ℹ️ Decorator @UseInterceptors (Test feature)

To intercept incoming messages you can use @UseInterceptors() decorator

💡 Example

You need to implement DiscordInterceptor interface

/*bot.interceptor.ts*/

import { DiscordInterceptor } from 'discord-nestjs';
import { ClientEvents } from 'discord.js';

export class BotInterceptor implements DiscordInterceptor {
  intercept(event: keyof ClientEvents, context: any): any {
    return 'Some custom value';
  }
}
/*bot.gateway.ts*/
import { On, UseInterceptors } from 'discord-nestjs';

@Injectable()
export class BotGateway {
  @UseInterceptors(BotInterceptor)
  @On({event: 'message'})
  async onSomeEvent(context: string): Promise<void> {
      // to do something
  }
}

ℹ️ Decorator @Middleware (Test feature)

For handling intermediate requests you can use @Middleware decorator

  • allowEvents - handled events
  • denyEvents - skipped events

💡 Example

You need to implement DiscordMiddleware interface

/*bot.middleware.ts*/

@Middleware()
export class BotMiddleware implements DiscordMiddleware {
  private readonly logger = new Logger(BotMiddleware.name);

  use(
    event: keyof ClientEvents,
    context: ClientEvents[keyof ClientEvents]
  ): void {
    if (event === 'message') {
      this.logger.log('On message event triggered');
    }
  }
}

Don't forget to add to providers

@Module({
  providers: [BotMiddleware]
})
export class BotModule {
}

Any questions or suggestions? Discord Федок#3051

About

👾 NestJS package for discord.js

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 98.3%
  • JavaScript 1.7%
0