Skip to content

Events

Listen to gateway events with client.on. Handle messages, guild updates, voice state changes, and more.

Basic Usage

Use client.on(Events.X, handler) to subscribe to events. Handlers receive event-specific payloads.

TIP

client.events.X(handler) offers the same API with chaining and better autocomplete.

javascript
import { Client, Events } from '@erinjs/core';

const client = new Client({ intents: 0 });

client.on(Events.Ready, () => {
  console.log('Bot is ready!');
});

client.on(Events.MessageCreate, async (message) => {
  console.log(message.content);
});

await client.login(process.env.ERIN_BOT_TOKEN);
javascript
import { Client, Events } from '@erinjs/core';

const client = new Client({ intents: 0 });

client
  .events.Ready(() => console.log('Bot is ready!'))
  .events.MessageCreate(async (message) => console.log(message.content));

await client.login(process.env.ERIN_BOT_TOKEN);

Common Events

Essential events for most bots.

javascript
// Bot finished loading
client.on(Events.Ready, () => {});

// New message (DM or guild)
client.on(Events.MessageCreate, async (message) => {});

// Reaction events
client.on(Events.MessageReactionAdd, (reaction, user, messageId, channelId, emoji, userId) => {});
client.on(Events.MessageReactionRemove, (reaction, user, messageId, channelId, emoji, userId) => {});

// Guild joined/left/updated
client.on(Events.GuildCreate, (guild) => {});
client.on(Events.GuildDelete, (guild) => {});

// Channel created/updated/deleted
client.on(Events.ChannelCreate, (channel) => {});
client.on(Events.ChannelDelete, (channel) => {});

// Member joined/left/updated
client.on(Events.GuildMemberAdd, (member) => {});
client.on(Events.GuildMemberRemove, (member) => {});

// Voice state changed (for @erinjs/voice)
client.on(Events.VoiceStateUpdate, (data) => {});
client.on(Events.VoiceServerUpdate, (data) => {});

Reaction Events

Listen for when users add or remove reactions. Handlers receive (reaction, user, messageId, channelId, emoji, userId). Use MessageReactionRemoveAll and MessageReactionRemoveEmoji for moderator actions.

javascript
import { Client, Events } from '@erinjs/core';

const client = new Client({ intents: 0 });

client.on(Events.MessageReactionAdd, (reaction, user, messageId, channelId, emoji, userId) => {
  const emojiStr = emoji.id ? `<:${emoji.name}:${emoji.id}>` : emoji.name;
  console.log(`User ${userId} reacted with ${emojiStr} on message ${messageId}`);

  // Filter for specific message (e.g. poll) or emoji
  if (emoji.name === '👍') {
    console.log('Someone voted yes!');
  }
});

client.on(Events.MessageReactionRemove, (reaction, user, messageId, channelId, emoji, userId) => {
  console.log(`User ${userId} removed ${emoji.name} from message ${messageId}`);
});

client.on(Events.MessageReactionRemoveAll, (data) => {
  console.log(`All reactions cleared from message ${data.message_id}`);
});

client.on(Events.MessageReactionRemoveEmoji, (data) => {
  console.log(`All ${data.emoji.name} reactions removed from message ${data.message_id}`);
});

await client.login(process.env.ERIN_BOT_TOKEN);

Error Handling

javascript
client.on(Events.Error, (err) => {
  console.error('Client error:', err);
});

Gateway Dispatch Events Reference

All events the erin.js gateway can send. Use GatewayDispatchEvents from @erinjs/types for type-safe checks.

CategoryEvents
Connection & SessionReady, Resumed, SessionsReplace
UserUserUpdate, UserSettingsUpdate, UserGuildSettingsUpdate, UserPinnedDmsUpdate, UserNoteUpdate, RecentMentionDelete
Saved Messages & AuthSavedMessageCreate, SavedMessageDelete, AuthSessionChange
PresencePresenceUpdate
GuildGuildCreate, GuildUpdate, GuildDelete, GuildMemberAdd, GuildMemberUpdate, GuildMemberRemove, GuildMembersChunk, GuildMemberListUpdate, GuildSync
RolesGuildRoleCreate, GuildRoleUpdate, GuildRoleUpdateBulk, GuildRoleDelete
Guild AssetsGuildEmojisUpdate, GuildStickersUpdate
ModerationGuildBanAdd, GuildBanRemove
ChannelsChannelCreate, ChannelUpdate, ChannelUpdateBulk, ChannelDelete, ChannelRecipientAdd, ChannelRecipientRemove, ChannelPinsUpdate, ChannelPinsAck
PassivePassiveUpdates
InvitesInviteCreate, InviteDelete
MessagesMessageCreate, MessageUpdate, MessageDelete, MessageDeleteBulk, MessageReactionAdd, MessageReactionRemove, MessageReactionRemoveAll, MessageReactionRemoveEmoji, MessageAck
TypingTypingStart
WebhooksWebhooksUpdate
RelationshipsRelationshipAdd, RelationshipUpdate, RelationshipRemove
VoiceVoiceStateUpdate, VoiceServerUpdate
CallsCallCreate, CallUpdate, CallDelete
FavoritesFavoriteMemeCreate, FavoriteMemeUpdate, FavoriteMemeDelete
SDK / CompatibilityInteractionCreate, GuildIntegrationsUpdate, GuildScheduledEventCreate, GuildScheduledEventUpdate, GuildScheduledEventDelete

Event Payload Reference

Payload structure for each event. Handler receives (data) or (message), (reaction, user, ...) etc. Types: Gateway*DispatchData from @erinjs/types.

EventPayload
READY{ v, user, guilds, session_id, shard?, application: { id, flags } }
RESUMED(no payload)
SESSIONS_REPLACEArray of session objects
USER_UPDATEAPIUser — id, username, discriminator, global_name, avatar, etc.
GUILD_CREATEAPIGuild — id, name, icon, owner_id, channels[], members[], roles[], ...
GUILD_UPDATEAPIGuild — full guild object
GUILD_DELETE{ id, unavailable? }
GUILD_MEMBER_ADDAPIGuildMember & { guild_id } — user, roles, nick, joined_at, ...
GUILD_MEMBER_UPDATE{ guild_id, roles, user, nick?, avatar?, joined_at?, ... }
GUILD_MEMBER_REMOVE{ guild_id, user }
GUILD_MEMBERS_CHUNK{ guild_id, members[], chunk_index, chunk_count, presences?, nonce? }
GUILD_MEMBER_LIST_UPDATE{ guild_id, id, member_count, online_count, groups[], ops[] }
GUILD_ROLE_CREATE{ guild_id, role: APIRole }
GUILD_ROLE_UPDATE{ guild_id, role: APIRole }
GUILD_ROLE_UPDATE_BULK{ guild_id, roles: APIRole[] }
GUILD_ROLE_DELETE{ guild_id, role_id }
GUILD_EMOJIS_UPDATE{ guild_id, emojis: APIEmoji[] }
GUILD_STICKERS_UPDATE{ guild_id, stickers: APISticker[] }
GUILD_BAN_ADD{ guild_id, user, reason? }
GUILD_BAN_REMOVE{ guild_id, user }
CHANNEL_CREATEAPIChannel — id, name, type, guild_id?, parent_id, ...
CHANNEL_UPDATEAPIChannel
CHANNEL_UPDATE_BULK{ channels: APIChannel[] }
CHANNEL_DELETEAPIChannel
CHANNEL_RECIPIENT_ADD{ channel_id, user }
CHANNEL_RECIPIENT_REMOVE{ channel_id, user }
CHANNEL_PINS_UPDATE{ channel_id, guild_id?, last_pin_timestamp? }
CHANNEL_PINS_ACK{ channel_id, last_pin_timestamp? }
INVITE_CREATEAPIInvite — code, guild, channel, inviter?, expires_at?, ...
INVITE_DELETE{ code, channel_id, guild_id? }
MESSAGE_CREATEAPIMessage — id, channel_id, author, content, embeds, attachments, member?, ...
MESSAGE_UPDATEAPIMessage — partial (edited fields)
MESSAGE_DELETE{ id, channel_id, guild_id?, content?, author_id? }
MESSAGE_DELETE_BULK{ ids[], channel_id, guild_id? }
MESSAGE_REACTION_ADD{ message_id, channel_id, user_id, guild_id?, emoji: { id, name, animated? } }
MESSAGE_REACTION_REMOVE{ message_id, channel_id, user_id, guild_id?, emoji }
MESSAGE_REACTION_REMOVE_ALL{ message_id, channel_id, guild_id? }
MESSAGE_REACTION_REMOVE_EMOJI{ message_id, channel_id, guild_id?, emoji }
MESSAGE_ACK{ message_id, channel_id } — read receipt
TYPING_START{ channel_id, user_id, timestamp, guild_id?, member? }
VOICE_STATE_UPDATE{ guild_id?, channel_id, user_id, member?, session_id, deaf?, mute?, ... }
VOICE_SERVER_UPDATE{ token, guild_id, endpoint, connection_id? }
WEBHOOKS_UPDATE{ guild_id, channel_id }
PRESENCE_UPDATE{ user: { id }, guild_id?, status?, activities?, custom_status? }
GUILD_INTEGRATIONS_UPDATE{ guild_id }
GUILD_SCHEDULED_EVENT_CREATE{ guild_id, id }
GUILD_SCHEDULED_EVENT_UPDATE{ guild_id, id }
GUILD_SCHEDULED_EVENT_DELETE{ guild_id, id }
USER_NOTE_UPDATE{ id, note? }
SAVED_MESSAGE_CREATEAPIMessage
SAVED_MESSAGE_DELETE{ id }
RELATIONSHIP_ADD / UPDATE{ id, type }
RELATIONSHIP_REMOVE{ id }
CALL_CREATE / UPDATE / DELETE{ id, channel_id, ... }
INTERACTION_CREATEAPIApplicationCommandInteraction

Released under the Apache-2.0 License.