1.0.5 • Published 3 years ago

discord-nestjs-xzyv v1.0.5

Weekly downloads
1
License
MIT
Repository
-
Last release
3 years ago

🧾 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
  • webhook - connecting with webhook
    • webhookId * - webhook id
    • webhookToken * - webhook token
  • 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'],
        },
      ],
      webhook: {
        webhookId: 'your_webhook_id',
        webhookToken: 'your_webhook_token',
      },
      // 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'],
          },
        ],
        webhook: {
          webhookId: 'your_webhook_id',
          webhookToken: 'your_webhook_token',
        },
        // 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}!`);
    this.discordClient.getWebhookClient().send('hello bot is up!');
  }
}

✨ 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

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago

0.2.8

3 years ago

0.2.7

3 years ago

0.2.6

3 years ago

0.2.5

3 years ago

0.2.4

3 years ago

0.2.3

3 years ago

0.2.2

3 years ago

0.2.1

3 years ago

0.2.0

3 years ago

0.1.8

3 years ago

0.1.7

3 years ago

0.1.9

3 years ago

0.1.6

3 years ago

0.1.5

3 years ago

0.1.4

3 years ago