-
Notifications
You must be signed in to change notification settings - Fork 0
Custom Events
Zeroknights edited this page Mar 22, 2026
·
13 revisions
This page explains how to run Athena custom events for your AthenaBot plugin.
- Create a new event file in
/plugins/<plugin_name>/src/events/. - Name the file with a unique event listener name (example:
myLevelUpListener.js). - Set
event.discordto the Athena custom event name you want to listen to (example:athena:levelUp).
Example:
const event = require('../../../../main/discord/core/events/event.js');
module.exports = class myLevelUpListener extends event {
constructor(heart) {
super(heart, { name: 'myLevelUpListener', event: { discord: 'athena:levelUp', bypassManager: false, dm: false, bypassRestrictions: true, permissionLevel: null } });
}
async execute(userId, newLevel) {
try {
this.heart.core.console.log(this.heart.core.console.type.log,`${userId} reached level ${newLevel}`);
}
catch (err) {
this.heart.core.console.log(this.heart.core.console.type.error, `An issue occurred while executing event ${this.getName()}`);
new this.heart.core.error.interface(this.heart, err);
}
}
};- name: Unique identifier for your listener file.
-
discord: The Athena custom event name (example:
athena:levelUp). -
bypassManager: Keep
falseunless you fully understand the side effects. -
dm: Keep
falsefor Athena custom events. -
bypassRestrictions: Keep
true. -
permissionLevel: Keep
nullfor Athena custom events.
(!) For custom events, the important value is event.discord. It must exactly match the emitted event name.
ㅤ
Athena events are not fired by Discord.js. You run them by calling Athena eventManager.emitSafe from your feature logic.
Example emitter:
// Example: after levelup logic is completed
const didEmit = await this.heart.manager.discord.eventManager.emitSafe('athena:levelUp', userId, newLevel);
if (!didEmit) {
this.heart.core.console.log(this.heart.core.console.type.warn, 'Event levelUp emitted but no listener was registered');
}If you emit:
emitSafe('athena:levelUp', userId, newLevel)Your listener should be:
async execute(userId, newLevel) {
// ...
}ㅤ
- Event names are case-sensitive.
- Do not rename
athena:*events unless all emitters and listeners are updated together. - IDs are Discord snowflakes (string) unless the event signature states otherwise.
- Object payloads (ticket/application/errorInterface) should be treated as internal APIs that may evolve.
ㅤ
(!) Signatures are shown as: EventName(arg1, arg2, ...)
-
athena:error(errorInterface)
-
athena:bankUpgrade(userId, bankLevel) -
athena:shopPurchase(userId, itemId, cost) -
athena:jobUpgrade(userId, jobKey, jobLevel) -
athena:lootboxRollPurchase(userId, purchasedRolls) -
athena:lootboxOpen(userId, rewardType, rewardAmount) -
athena:questClaim(userId, period, finishedQuestCount, rewards) -
athena:rankUpgrade(userId, newRank)
-
athena:levelUp(userId, level) -
athena:countingGameSuccess(userId, counterValue) -
athena:countingGameFail(userId, evaluatedInput, expectedCounter) -
athena:hangmanEnd(userId, won, streak, winStreakCurrent) -
athena:higherLowerEnd(userId, streak, highscore) -
athena:starboardSend(userId, messageId, reactionCount) -
athena:starboardReaction(userId, messageId, reactionCount)
-
athena:giveawayEnter(userId, giveawayMessageId, entryCount) -
athena:giveawayLeave(userId, giveawayMessageId, entryCount)
-
athena:tempVoiceCreate(voiceChannelId, ownerUserId, sourceChannelId) -
athena:tempVoiceDelete(voiceChannelId, ownerUserId) -
athena:tempVoiceOwnerChange(voiceChannelId, previousOwnerUserId, newOwnerUserId) -
athena:tempVoiceOwnerSet(voiceChannelId, executorUserId, newOwnerUserId) -
athena:tempVoiceName(voiceChannelId, executorUserId, newName) -
athena:tempVoiceLimit(voiceChannelId, executorUserId, newLimit) -
athena:tempVoiceVisibility(voiceChannelId, executorUserId, visibility) -
athena:tempVoiceKick(voiceChannelId, executorUserId, targetUserId) -
athena:tempVoiceBlacklist(voiceChannelId, executorUserId, targetUserId) -
athena:tempVoiceUnblacklist(voiceChannelId, executorUserId, targetUserId)
-
athena:applySavedRoles(userId, roleCount) -
athena:autoRole(userId, roleCount) -
athena:saveRoles(userId, roleCount) -
athena:pollVote(userId, pollId, optionId) -
athena:pollVoteRevoke(userId, pollId, optionId) -
athena:suggestionCreate(userId, suggestionNumber) -
athena:suggestionStatus(staffUserId, suggestionId, status) -
athena:suggestionReview(staffUserId, suggestionId, approved)
-
athena:blacklist(type, targetUserId, executorUserId, punishmentId) -
athena:unblacklist(type, targetUserId, executorUserId, punishmentId) -
athena:ban(targetUserId, executorUserId, punishmentId, manual) -
athena:unban(targetUserId, executorUserId, punishmentId, manual) -
athena:kick(targetUserId, executorUserId, punishmentId, manual) -
athena:mute(targetUserId, executorUserId, punishmentId, manual) -
athena:unmute(targetUserId, executorUserId, punishmentId, manual) -
athena:warn(targetUserId, executorUserId, punishmentId) -
athena:unwarn(targetUserId, executorUserId, punishmentId) -
athena:strike(targetUserId, executorUserId, punishmentId, strikeAmount) -
athena:automodAction(userId, ruleName, warning)
-
athena:nodeConnect(nodeName) -
athena:nodeDisconnect(nodeName, disconnectCount) -
athena:nodeError(nodeName, errorMessageOrNull) -
athena:playerCreate(guildIdOrNull, defaultVolume) -
athena:trackStart(guildId, requesterUserId, title) -
athena:trackEnd(guildId, titleOrNull, remainingQueueLength) -
athena:queueEnd(guildId, textChannelId)
-
athena:autoVerify(userId) -
athena:verifyFail(userId, remainingAttempts) -
athena:verifySuccess(userId)
-
athena:twitchLive(username, messageId, viewerCount) -
athena:twitchOffline(username) -
athena:youtubeNotification(authorName, videoId, discordChannelId)
-
athena:verifyStaffRoles() -
athena:verifyStaffRolesFail(invalidRoleIds) -
athena:strikelistView(viewerUserId, targetMemberId, punishmentId, page) -
athena:taskClaim(userId, taskId) -
athena:taskEditOpen(userId, taskId, type) -
athena:taskEdit(userId, taskId, type)
-
athena:ticketCreate(ticket) -
athena:ticketAdd(ticket, addedUserId) -
athena:ticketRemove(ticket, removedUserId) -
athena:ticketRename(ticket, newName) -
athena:ticketClaim(ticket, claimerUserId) -
athena:ticketUnclaim(ticket, unclaimerUserId) -
athena:ticketClose(ticket) -
athena:ticketLower(ticket, level) -
athena:ticketElevate(ticket, level) -
athena:applicationStart(userId, applicationIndex) -
athena:applicationSubmit(userId, applicationIndex, answersCount, submitted) -
athena:applicationCancel(userId, applicationIndex) -
athena:applicationChannelCreate(application) -
athena:applicationChatAllow(applicantUserId, staffUserId, appChannelId) -
athena:applicationChatDeny(applicantUserId, staffUserId, appChannelId) -
athena:applicationHistoryView(staffUserId, applicantUserId, appChannelId) -
athena:applicationAccept(application, roleName, staffUserId) -
athena:applicationDeny(application, staffUserId, reason, timeoutMs) -
athena:applicationAutoClose(application)