Skip to main content

Listeners

How to use Listeners

Necord supports interacting with all discord events via the @On and @Once decorator. These decorators can be used within any injectable class, such as services or custom providers.

app.service.ts
import { Injectable, Logger } from '@nestjs/common';
import { Once, On, Context, ContextOf } from 'necord';

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

@Once('clientReady')
public onReady(@Context() [client]: ContextOf<'clientReady'>) {
this.logger.log(`Bot logged in as ${client.user.username}`);
}

@On('warn')
public onWarn(@Context() [message]: ContextOf<'warn'>) {
this.logger.warn(message);
}
}
Warning

If you use global filters, guards or interceptors, they will be triggered once per event! This means if you are replying to the message in guards, you can run into issues with duplicated responses or invalid interactions. Have a look at the NecordExecutionContext.getDiscovery() metadata to learn more about the current context.

Context

You might have noticed the @Context decorator in the last snippet: This is used to inject the event context within the method. As there are many type of events, its type must be inferred from the ContextOf<type: string> type.

You can access the context variables by using the @Context() decorator within your function, which will populate the variable with an array of arguments.

app.service.ts
@On('messageCreate')
public onMessageCreate(@Context() [message]: ContextOf<'messageCreate'>) {
console.log(message.content);
}

Custom Events

Necord out of the box supports all the events provided by discord.js. You can also create custom events using the @CustomListenerHandler and @CustomListener decorators.

user-update.handler.ts
import { Injectable } from '@nestjs/common';
import { CustomListener, CustomListenerHandler, BaseHandler, ContextOf, createCustomOnDecorator } from 'necord';
import { User } from 'discord.js';

export type CustomUserUpdateEvents = {
userAvatarUpdate: [user: User, oldAvatar: string, newAvatar: string];
};

export type ContextOfCustomUserUpdate<K extends keyof E, E = CustomUserUpdateEvents> = E[K];

export const OnCustomUserUpdate = createCustomOnDecorator<CustomUserUpdateEvents>();

@Injectable()
@CustomListener('userUpdate')
export class UserUpdateHandler extends BaseHandler<CustomUserUpdateEvents> {
@CustomListenerHandler()
public handleUserAvatarUpdate([oldUser, newUser]: ContextOf<'userUpdate'>) {
if (oldUser.partial) return;

if (oldUser.displayAvatarURL() !== newUser.displayAvatarURL()) {
this.emit(
'userAvatarUpdate',
newUser,
oldUser.displayAvatarURL(),
newUser.displayAvatarURL()
);
}
}
}
Tip

You can create not only custom @On decorators, but also your own @Once decorators. To do this, use the createCustomOnceDecorator function, which works similarly to createCustomOnDecorator but subscribes the handler only to the first occurrence of the event.

Also, you can create multiple custom event handlers in a single class by adding more methods with the @CustomListenerHandler() decorator.

And then you can listen to the custom event using the @OnCustomUserUpdate decorator.

app.service.ts
import { Injectable } from '@nestjs/common';
import { OnCustomUserUpdate, ContextOfCustomUserUpdate, Context } from './user-update.handler';

@Injectable()
export class AppService {
@OnCustomUserUpdate('userAvatarUpdate')
public onAvatarUpdate(@Context() context: ContextOfCustomUserUpdate<'userAvatarUpdate'>) {
const [user, oldAvatar, newAvatar] = context;
console.log(`User ${user.username} changed avatar from ${oldAvatar} to ${newAvatar}`);
}
}

Also you can use @On<CustomUserUpdateEvents>('userAvatarUpdate') instead of creating a new decorator. But creating a new decorator is more convenient and cleaner.

List of Custom Events

The following is a list of all the custom events provided by Necord. It can be accessed via the @On decorator.

Channel Events

Event NameDescription
guildChannelPermissionsUpdateEmitted whenever a channel's permission overwrite for a guild is updated.

Guild Events

Event NameDescription
guildBoostLevelUpEmitted whenever a guild's boost level increases.
guildBoostLevelDownEmitted whenever a guild's boost level decreases.
guildBannerAddEmitted whenever a guild's banner is added.
guildAfkChannelAddEmitted whenever a guild's AFK channel is added.
guildVanityURLAddEmitted whenever a guild's vanity URL is added.
guildVanityURLUpdateEmitted whenever a guild's vanity URL is updated.
guildVanityURLRemoveEmitted whenever a guild's vanity URL is removed.
guildFeaturesUpdateEmitted whenever a guild's features are updated.
guildAcronymUpdateEmitted whenever a guild's acronym is updated.
guildOwnerUpdateEmitted whenever a guild's owner is updated.
guildPartnerAddEmitted whenever a guild's is partner of discord now
guildPartnerRemoveEmitted whenever a guild's is no longer partner of discord
guildVerificationAddEmitted whenever a guild's verification level is added.
guildVerificationRemoveEmitted whenever a guild's verification level is removed.

Guild Audit Log Events

Event NameDescription
guildAuditLogEntryAddEmitted whenever an entry is added to the audit log.
guildAuditLogEntryUpdateEmitted whenever an entry is updated in the audit log.
guildAuditLogEntryDeleteEmitted whenever an entry is removed from the audit log.
guildAuditLogEntryWebhookCreateEmitted whenever a webhook is created in the audit log.
guildAuditLogEntryWebhookUpdateEmitted whenever a webhook is updated in the audit log.
guildAuditLogEntryWebhookDeleteEmitted whenever a webhook is deleted in the audit log.

Guild Member Events

Event NameDescription
guildMemberBoostEmitted whenever a member's boost is activated.
guildMemberUnboostEmitted whenever a member's boost is deactivated.
guildMemberRoleAddEmitted whenever a role is added to a member.
guildMemberRoleRemoveEmitted whenever a role is removed from a member.
guildMemberNicknameUpdateEmitted whenever a member's nickname is updated.
guildMemberEnteredEmitted whenever a member enters a guild.
guildMemberAvatarAddEmitted whenever a member's avatar is added.
guildMemberAvatarRemoveEmitted whenever a member's avatar is removed.
guildMemberAvatarUpdateEmitted whenever a member's avatar is updated.

Role Update Events

Event NameDescription
rolePositionUpdateEmitted whenever a role's position is updated.
rolePermissionsUpdateEmitted whenever a role's permissions are updated.
roleIconAddEmitted whenever a role's icon is added.
roleIconRemoveEmitted whenever a role's icon is removed.
roleIconUpdateEmitted whenever a role's icon is updated.

Thread Update Events

Event NameDescription
threadStateUpdateEmitted whenever a thread's state is updated.
threadNameUpdateEmitted whenever a thread's name is updated.
threadLockStateUpdateEmitted whenever a thread's lock state is updated.
threadRateLimitPerUserUpdateEmitted whenever a thread's rate limit per user is updated.
threadAutoArchiveDurationUpdateEmitted whenever a thread's auto archive duration is updated.

Message Events

Event NameDescription
messagePinnedEmitted whenever a message is pinned.
messageContentEditedEmitted whenever a message is updated.

Presence Events

Event NameDescription
guildMemberOfflineEmitted whenever a member goes offline.
guildMemberOnlineEmitted whenever a member goes online.

User Events

Event NameDescription
userAvatarUpdateEmitted whenever a user's avatar is updated.
userUsernameUpdateEmitted whenever a user's username is updated.
userDiscriminatorUpdateEmitted whenever a user's discriminator is updated.
userFlagsUpdateEmitted whenever a user's flags are updated.

Voice Events

Event NameDescription
voiceChannelJoinEmitted whenever a member joins a voice channel.
voiceChannelLeaveEmitted whenever a member leaves a voice channel.
voiceChannelSwitchEmitted whenever a member switches voice channel.
voiceChannelMutestateEmitted whenever a member is muted or deafened in a voice channel.
voiceChannelUnmuteEmitted whenever a member is unmuted in a voice channel.
voiceChannelDeafEmitted whenever a member is deafened in a voice channel.
voiceChannelUndeafEmitted whenever a member is undeafened in a voice channel.
voiceStreamingStartEmitted whenever a member starts streaming.
voiceStreamingStopEmitted whenever a member stops streaming.