logging: thread create/delete, try catch
This commit is contained in:
parent
b124f2b0f2
commit
926d062d9e
1 changed files with 226 additions and 111 deletions
|
@ -1,5 +1,6 @@
|
||||||
const {Member} = require("@projectdysnomia/dysnomia");
|
const {Member, PrivateThreadChannel} = require("@projectdysnomia/dysnomia");
|
||||||
|
|
||||||
|
const logger = require("#lib/logger.js");
|
||||||
const {getGuildData} = require("#lib/guildData.js");
|
const {getGuildData} = require("#lib/guildData.js");
|
||||||
const events = require("#lib/events.js");
|
const events = require("#lib/events.js");
|
||||||
|
|
||||||
|
@ -17,50 +18,236 @@ async function getLoggingChannel(guild) {
|
||||||
return guild.channels.get(channelId) ?? guild.threads.get(channelId);
|
return guild.channels.get(channelId) ?? guild.threads.get(channelId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WHITELISTED_EVENTS = new Set([
|
||||||
|
"GUILD_UPDATE",
|
||||||
|
"CHANNEL_CREATE",
|
||||||
|
"CHANNEL_UPDATE",
|
||||||
|
"CHANNEL_DELETE",
|
||||||
|
"CHANNEL_OVERWRITE_CREATE",
|
||||||
|
"CHANNEL_OVERWRITE_UPDATE",
|
||||||
|
"CHANNEL_OVERWRITE_DELETE",
|
||||||
|
"MEMBER_KICK",
|
||||||
|
"MEMBER_BAN_ADD",
|
||||||
|
"MEMBER_BAN_REMOVE",
|
||||||
|
"MEMBER_UPDATE",
|
||||||
|
"BOT_ADD",
|
||||||
|
"ROLE_CREATE",
|
||||||
|
"ROLE_UPDATE",
|
||||||
|
"ROLE_DELETE",
|
||||||
|
"INVITE_CREATE",
|
||||||
|
"INVITE_UPDATE",
|
||||||
|
"INVITE_DELETE",
|
||||||
|
"EMOJI_CREATE",
|
||||||
|
"EMOJI_UPDATE",
|
||||||
|
"EMOJI_DELETE",
|
||||||
|
"INTEGRATION_CREATE",
|
||||||
|
"INTEGRATION_UPDATE",
|
||||||
|
"INTEGRATION_DELETE",
|
||||||
|
"STICKER_CREATE",
|
||||||
|
"STICKER_UPDATE",
|
||||||
|
"STICKER_DELETE",
|
||||||
|
"GUILD_SCHEDULED_EVENT_CREATE",
|
||||||
|
"GUILD_SCHEDULED_EVENT_UPDATE",
|
||||||
|
"GUILD_SCHEDULED_EVENT_DELETE",
|
||||||
|
"APPLICATION_COMMAND_PERMISSION_UPDATE",
|
||||||
|
"ONBOARDING_PROMPT_CREATE",
|
||||||
|
"ONBOARDING_PROMPT_UPDATE",
|
||||||
|
"ONBOARDING_PROMPT_DELETE",
|
||||||
|
"MEMBER_ROLE_UPDATE",
|
||||||
|
"THREAD_CREATE",
|
||||||
|
"THREAD_UPDATE",
|
||||||
|
"THREAD_DELETE",
|
||||||
|
]);
|
||||||
|
|
||||||
events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
||||||
const channel = await getLoggingChannel(entry.guild);
|
const channel = await getLoggingChannel(entry.guild);
|
||||||
if (!channel) return;
|
if (!channel) return;
|
||||||
|
|
||||||
switch (entry.actionType) {
|
try {
|
||||||
case AuditLogActions.GUILD_UPDATE:
|
switch (entry.actionType) {
|
||||||
case AuditLogActions.CHANNEL_CREATE:
|
case AuditLogActions.GUILD_UPDATE:
|
||||||
case AuditLogActions.CHANNEL_UPDATE:
|
case AuditLogActions.CHANNEL_CREATE:
|
||||||
case AuditLogActions.CHANNEL_DELETE:
|
case AuditLogActions.CHANNEL_UPDATE:
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_CREATE:
|
case AuditLogActions.CHANNEL_DELETE:
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_UPDATE:
|
case AuditLogActions.CHANNEL_OVERWRITE_CREATE:
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_DELETE:
|
case AuditLogActions.CHANNEL_OVERWRITE_UPDATE:
|
||||||
case AuditLogActions.MEMBER_KICK:
|
case AuditLogActions.CHANNEL_OVERWRITE_DELETE:
|
||||||
case AuditLogActions.MEMBER_BAN_ADD:
|
case AuditLogActions.MEMBER_KICK:
|
||||||
case AuditLogActions.MEMBER_BAN_REMOVE:
|
case AuditLogActions.MEMBER_BAN_ADD:
|
||||||
case AuditLogActions.MEMBER_UPDATE:
|
case AuditLogActions.MEMBER_BAN_REMOVE:
|
||||||
case AuditLogActions.BOT_ADD:
|
case AuditLogActions.MEMBER_UPDATE:
|
||||||
case AuditLogActions.ROLE_CREATE:
|
case AuditLogActions.BOT_ADD:
|
||||||
case AuditLogActions.ROLE_UPDATE:
|
case AuditLogActions.ROLE_CREATE:
|
||||||
case AuditLogActions.ROLE_DELETE:
|
case AuditLogActions.ROLE_UPDATE:
|
||||||
case AuditLogActions.INVITE_CREATE:
|
case AuditLogActions.ROLE_DELETE:
|
||||||
case AuditLogActions.INVITE_UPDATE:
|
case AuditLogActions.INVITE_CREATE:
|
||||||
case AuditLogActions.INVITE_DELETE:
|
case AuditLogActions.INVITE_UPDATE:
|
||||||
case AuditLogActions.EMOJI_CREATE:
|
case AuditLogActions.INVITE_DELETE:
|
||||||
case AuditLogActions.EMOJI_UPDATE:
|
case AuditLogActions.EMOJI_CREATE:
|
||||||
case AuditLogActions.EMOJI_DELETE:
|
case AuditLogActions.EMOJI_UPDATE:
|
||||||
case AuditLogActions.INTEGRATION_CREATE:
|
case AuditLogActions.EMOJI_DELETE:
|
||||||
case AuditLogActions.INTEGRATION_UPDATE:
|
case AuditLogActions.INTEGRATION_CREATE:
|
||||||
case AuditLogActions.INTEGRATION_DELETE:
|
case AuditLogActions.INTEGRATION_UPDATE:
|
||||||
case AuditLogActions.STICKER_CREATE:
|
case AuditLogActions.INTEGRATION_DELETE:
|
||||||
case AuditLogActions.STICKER_UPDATE:
|
case AuditLogActions.STICKER_CREATE:
|
||||||
case AuditLogActions.STICKER_DELETE:
|
case AuditLogActions.STICKER_UPDATE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_CREATE:
|
case AuditLogActions.STICKER_DELETE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_UPDATE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_CREATE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_DELETE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_UPDATE:
|
||||||
case AuditLogActions.THREAD_CREATE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_DELETE:
|
||||||
case AuditLogActions.THREAD_DELETE:
|
case AuditLogActions.APPLICATION_COMMAND_PERMISSION_UPDATE:
|
||||||
case AuditLogActions.APPLICATION_COMMAND_PERMISSION_UPDATE:
|
case AuditLogActions.ONBOARDING_PROMPT_CREATE:
|
||||||
case AuditLogActions.ONBOARDING_PROMPT_CREATE:
|
case AuditLogActions.ONBOARDING_PROMPT_UPDATE:
|
||||||
case AuditLogActions.ONBOARDING_PROMPT_UPDATE:
|
case AuditLogActions.ONBOARDING_PROMPT_DELETE: {
|
||||||
case AuditLogActions.ONBOARDING_PROMPT_DELETE: {
|
channel
|
||||||
|
.createMessage({
|
||||||
|
content: Object.entries(AuditLogActions).find(([name, val]) => val === entry.actionType)[0],
|
||||||
|
attachments: [
|
||||||
|
{
|
||||||
|
filename: entry.id + ".json",
|
||||||
|
file: JSON.stringify(entry, null, 4),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.MEMBER_ROLE_UPDATE: {
|
||||||
|
const added = entry.after.$add != null;
|
||||||
|
const isSelf = entry.user.id === entry.targetID;
|
||||||
|
const role = (entry.after.$add ?? entry.after.$remove)[0];
|
||||||
|
|
||||||
|
channel
|
||||||
|
.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: added ? COLOR_ADDED : COLOR_REMOVED,
|
||||||
|
title: `Member Role Updated`,
|
||||||
|
description: `<@${entry.user.id}> (${formatUsername(entry.user)}) ${added ? "added" : "removed"} role ${
|
||||||
|
added ? "to" : "from"
|
||||||
|
} ${isSelf ? "self" : `<@${entry.targetID}> (${formatUsername(entry.target.user)})`}`,
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "Role",
|
||||||
|
value: `<@&${role.id}> (${role.name})`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
footer: {
|
||||||
|
text: `Role ID: ${role.id}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.THREAD_CREATE: {
|
||||||
|
channel
|
||||||
|
.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_ADDED,
|
||||||
|
title: `${entry.after.invitable != null ? "Private " : ""}Thread Created`,
|
||||||
|
description: `<#${entry.targetID}> (${entry.after.name})`,
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "Created by",
|
||||||
|
value: `<@${entry.user.id}> (${formatUsername(entry.user)})`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
footer: {
|
||||||
|
text: `Thread ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.THREAD_UPDATE: {
|
||||||
|
channel
|
||||||
|
.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_CHANGED,
|
||||||
|
title: `${
|
||||||
|
entry.target != null && entry.target instanceof PrivateThreadChannel ? "Private " : ""
|
||||||
|
}Thread Updated`,
|
||||||
|
description: `<#${entry.targetID}>${entry.target?.name != null ? ` (${entry.target.name})` : ""} ${
|
||||||
|
entry.before.locked === true && entry.after.locked === false
|
||||||
|
? "unlocked"
|
||||||
|
: entry.before.locked === false && entry.after.locked === true
|
||||||
|
? "locked"
|
||||||
|
: entry.before.archived === true && entry.after.archived === false
|
||||||
|
? "unarchived"
|
||||||
|
: entry.before.archived === false && entry.after.archived === true
|
||||||
|
? "archived"
|
||||||
|
: entry.before.invitable === false && entry.after.invitable === true
|
||||||
|
? "mention inviting enabled"
|
||||||
|
: entry.before.invitable === true && entry.after.invitable === false
|
||||||
|
? "mention inviting disabled"
|
||||||
|
: "updated"
|
||||||
|
} by <@${entry.user.id}> (${formatUsername(entry.user)})`,
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
fields: [
|
||||||
|
entry.after.name != null && {
|
||||||
|
name: "Name",
|
||||||
|
value: `\`${entry.before.name}\` -> \`${entry.after.name}\``,
|
||||||
|
},
|
||||||
|
entry.after.auto_archive_duration != null && {
|
||||||
|
name: "Hide After Inactivity",
|
||||||
|
value: `\`${entry.before.auto_archive_duration}\` -> \`${entry.after.auto_archive_duration}\``,
|
||||||
|
},
|
||||||
|
entry.after.rate_limit_per_user != null && {
|
||||||
|
name: "Slowmode",
|
||||||
|
value: `\`${entry.before.rate_limit_per_user}\` -> \`${entry.after.rate_limit_per_user}\``,
|
||||||
|
},
|
||||||
|
].filter((x) => !!x),
|
||||||
|
footer: {
|
||||||
|
text: `Thread ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.THREAD_DELETE: {
|
||||||
|
channel
|
||||||
|
.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_ADDED,
|
||||||
|
title: `${entry.before.invitable != null ? "Private " : ""}Thread Deleted`,
|
||||||
|
description: `<#${entry.targetID}> (${entry.before.name})`,
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: "Deleted by",
|
||||||
|
value: `<@${entry.user.id}> (${formatUsername(entry.user)})`,
|
||||||
|
inline: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
footer: {
|
||||||
|
text: `Thread ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
const eventName = Object.entries(AuditLogActions).find(([name, val]) => val === entry.actionType)[0];
|
||||||
|
if (WHITELISTED_EVENTS.has(eventName)) {
|
||||||
|
logger.error("logging", `Failed to create log entry in ${entry.guild.id} for ${eventName}: ${err}`);
|
||||||
channel
|
channel
|
||||||
.createMessage({
|
.createMessage({
|
||||||
content: Object.entries(AuditLogActions).find(([name, val]) => val === entry.actionType)[0],
|
content: `Failed to create pretty embed for ${eventName}`,
|
||||||
attachments: [
|
attachments: [
|
||||||
{
|
{
|
||||||
filename: entry.id + ".json",
|
filename: entry.id + ".json",
|
||||||
|
@ -69,78 +256,6 @@ events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AuditLogActions.MEMBER_ROLE_UPDATE: {
|
|
||||||
const added = entry.after.$add != null;
|
|
||||||
const isSelf = entry.user.id === entry.targetID;
|
|
||||||
const role = (entry.after.$add ?? entry.after.$remove)[0];
|
|
||||||
|
|
||||||
channel
|
|
||||||
.createMessage({
|
|
||||||
embeds: [
|
|
||||||
{
|
|
||||||
color: added ? COLOR_ADDED : COLOR_REMOVED,
|
|
||||||
title: `Member Role Updated`,
|
|
||||||
description: `<@${entry.user.id}> (${formatUsername(entry.user)}) ${added ? "added" : "removed"} role ${
|
|
||||||
added ? "to" : "from"
|
|
||||||
} ${isSelf ? "self" : `<@${entry.targetID}> (${formatUsername(entry.target.user)})`}`,
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
fields: [
|
|
||||||
{
|
|
||||||
name: "Role",
|
|
||||||
value: `<@&${role.id}> (${role.name})`,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
footer: {
|
|
||||||
text: `Role ID: ${role.id}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AuditLogActions.THREAD_UPDATE: {
|
|
||||||
channel
|
|
||||||
.createMessage({
|
|
||||||
embeds: [
|
|
||||||
{
|
|
||||||
color: COLOR_CHANGED,
|
|
||||||
title: "Thread Updated",
|
|
||||||
description: `<#${entry.targetID}>${entry.target?.name != null ? ` (${entry.target.name})` : ""} ${
|
|
||||||
entry.before.locked === true && entry.after.locked === false
|
|
||||||
? "unlocked"
|
|
||||||
: entry.before.locked === false && entry.after.locked === true
|
|
||||||
? "locked"
|
|
||||||
: entry.before.archived === true && entry.after.archived === false
|
|
||||||
? "unarchived"
|
|
||||||
: entry.before.archived === false && entry.after.archived === true
|
|
||||||
? "archived"
|
|
||||||
: "updated"
|
|
||||||
} by <@${entry.user.id}> (${formatUsername(entry.user)})`,
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
fields: [
|
|
||||||
entry.after.name != null && {
|
|
||||||
name: "Name",
|
|
||||||
value: `\`${entry.before.name}\` -> \`${entry.after.name}\``,
|
|
||||||
},
|
|
||||||
entry.after.auto_archive_duration != null && {
|
|
||||||
name: "Hide After Inactivity",
|
|
||||||
value: `\`${entry.before.auto_archive_duration}\` -> \`${entry.after.auto_archive_duration}\``,
|
|
||||||
},
|
|
||||||
entry.after.rate_limit_per_user != null && {
|
|
||||||
name: "Slowmode",
|
|
||||||
value: `\`${entry.before.rate_limit_per_user}\` -> \`${entry.after.rate_limit_per_user}\``,
|
|
||||||
},
|
|
||||||
].filter((x) => !!x),
|
|
||||||
footer: {
|
|
||||||
text: `Thread ID: ${entry.targetID}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue