Event listeners react to Discord gateway events (messageCreate, guildMemberAdd, etc.). Each file in src/events/ exports a default EventListener — djs-core registers it on startup.

Event file names become the internal listener id (ready.ts → ready). Use Events.ClientReady, not the deprecated Events.Ready.

Basic listener

import { EventListener } from "@djs-core/runtime";
import { ActivityType, Events } from "discord.js";
export default new EventListener()
.event(Events.ClientReady)
.run((client) => {
console.log(`Logged in as ${client.user.tag}!`);
client.user.setActivity({
name: "over your server",
type: ActivityType.Watching,
});
});

Message events

import { EventListener } from "@djs-core/runtime";
import { Events } from "discord.js";
export default new EventListener()
.event(Events.MessageCreate)
.run(async (client, message) => {
if (message.author.bot) return;
if (message.content === "!ping") {
await message.reply("Pong!");
}
});

Member events

import { EventListener } from "@djs-core/runtime";
import { Events } from "discord.js";
export default new EventListener()
.event(Events.GuildMemberAdd)
.run(async (client, member) => {
console.log(`${member.user.tag} joined ${member.guild.name}`);
});

API

Method Description
.event(Events.EventName) Discord event to subscribe to
.run((client, ...args) => { ... }) Handler — receives client plus event-specific arguments from discord.js

Gateway events need the right intents in djs.config.ts. The runtime defaults to Guilds only — add GuildMessages, GuildMembers, etc. when your listeners need them.