diff --git a/core/api/modules/events.js b/core/api/modules/events.js index 4e7d024..7014799 100644 --- a/core/api/modules/events.js +++ b/core/api/modules/events.js @@ -20,6 +20,7 @@ const ticketRemoveListeners = [] const transcriptCreationListeners = [] const commandListeners = [] const reactionRoleListeners = [] +const errorListeners = [] /** * @@ -173,7 +174,7 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => { * @param {discord.Guild} guild * @param {Date} date */ - exports.onCommand = (type,hasPerms,user,channel,guild,date) => { +exports.onCommand = (type,hasPerms,user,channel,guild,date) => { //system bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}]) @@ -185,8 +186,46 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => { } -//reactionrole -//error +/**@typedef {"add"|"remove"|"add&remove"} OTReactionRoleType */ +/**@typedef {"add"|"remove"} OTReactionRoleMode */ + +/** + * @param {OTReactionRoleMode} mode + * @param {OTReactionRoleType} type + * @param {discord.Role} role + * @param {discord.User} user + * @param {discord.TextChannel} channel + * @param {discord.Guild} guild + * @param {Date} date + */ + exports.onReactionRole = (mode,type,role,user,channel,guild,date) => { + //system + bot.errorLog.log("api","someone used a reaction role",[{key:"mode",value:mode},{key:"type",value:type},{key:"roleid",value:role.id},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}]) + + reactionRoleListeners.forEach((func) => { + try { + func(mode,type,role,user,channel,guild,date) + }catch{} + }) + +} + +/** + * @param {String} err + * @param {Date} date + */ + exports.onError = (err,date) => { + //system + bot.errorLog.log("api","there is an error",[{key:"error",value:err}]) + + errorListeners.forEach((func) => { + try { + func(err,date) + }catch{} + }) + +} + //EVENT CALLBACKS: @@ -227,6 +266,23 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => { * @param {Date} date */ +/** + * @callback ReactionRoleEvent + * @param {OTReactionRoleMode} mode + * @param {OTReactionRoleType} type + * @param {discord.Role} role + * @param {discord.User} user + * @param {discord.TextChannel} channel + * @param {discord.Guild} guild + * @param {Date} date + */ + +/** + * @callback ErrorEvent + * @param {String} error + * @param {Date} date + */ + //EVENT EXPORT: /**@param {TicketActionEvent} callback */ @@ -269,6 +325,16 @@ const onCommand = (callback) => { commandListeners.push(callback) } +/**@param {ReactionRoleEvent} callback */ +const onReactionRole = (callback) => { + commandListeners.push(callback) +} + +/**@param {ErrorEvent} callback */ +const onError = (callback) => { + errorListeners.push(callback) +} + exports.events = { onTicketOpen, onTicketClose, @@ -277,5 +343,7 @@ exports.events = { onTicketAdd, onTicketRemove, onTranscriptCreation, - onCommand + onCommand, + onReactionRole, + onError } \ No newline at end of file diff --git a/core/reactionRoles.js b/core/reactionRoles.js index 83c0bf9..31b619e 100644 --- a/core/reactionRoles.js +++ b/core/reactionRoles.js @@ -6,6 +6,8 @@ const log = bot.errorLog.log const l = bot.language const storage = bot.storage +const APIEvents = require("./api/modules/events") + module.exports = async () => { const chalk = await (await import("chalk")).default @@ -34,23 +36,33 @@ module.exports = async () => { interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) }) + }else if (mode == "remove"){ option.roles.forEach((role) => { interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) }) + }else if (mode == "add&remove"){ option.roles.forEach((role) => { if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){ interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) }else { interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) } }) } diff --git a/core/utils/errorTypes.js b/core/utils/errorTypes.js new file mode 100644 index 0000000..89798fc --- /dev/null +++ b/core/utils/errorTypes.js @@ -0,0 +1,3 @@ +/** + * @typedef {String|Boolean} OTErrorType + */ \ No newline at end of file diff --git a/index.js b/index.js index ef2d67b..c9ce310 100644 --- a/index.js +++ b/index.js @@ -151,6 +151,8 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){ } +const APIEvents = require("./core/api/modules/events") + const debugLog = (debugString) => { const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n\n==========================" fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString) @@ -172,6 +174,8 @@ process.on("uncaughtException",async (error,origin) => { const chalk = await (await import("chalk")).default console.log(chalk.red("\nOPEN TICKET ERROR: ")+error+"\n"+chalk.green("\nCreate a ticket in our support server for more information!\nIf you do this, you might help us to avoid a future bug!\n")) errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack) + + APIEvents.onError(error.name+": "+error.message,new Date()) }) client.login(config.auth_token) \ No newline at end of file