Merge branch 'better-logging' into 'rewrite'
feat: improve logging See merge request Cynosphere/HiddenPhox!23
This commit is contained in:
commit
c6cc65b61e
2 changed files with 297 additions and 8 deletions
|
@ -4,10 +4,17 @@ 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");
|
||||||
|
|
||||||
const {AuditLogActions, APIEndpoints, CDNEndpoints, GuildIntegrationTypes} = require("#util/dconstants.js");
|
const {
|
||||||
const {JoinSourceTypeNames} = require("#util/constants.js");
|
AuditLogActions,
|
||||||
|
APIEndpoints,
|
||||||
|
CDNEndpoints,
|
||||||
|
GuildIntegrationTypes,
|
||||||
|
GuildProfileVisibility,
|
||||||
|
} = require("#util/dconstants.js");
|
||||||
|
const {JoinSourceTypeNames, ChannelTypeNames} = require("#util/constants.js");
|
||||||
const {formatUsername, getDefaultAvatar} = require("#util/misc.js");
|
const {formatUsername, getDefaultAvatar} = require("#util/misc.js");
|
||||||
const {snowflakeToTimestamp} = require("#util/time.js");
|
const {snowflakeToTimestamp} = require("#util/time.js");
|
||||||
|
const {GUILD_ICON, BANNER, CDN_URL} = require("@projectdysnomia/dysnomia/lib/rest/Endpoints.js");
|
||||||
|
|
||||||
const COLOR_ADDED = 0x399d53;
|
const COLOR_ADDED = 0x399d53;
|
||||||
const COLOR_REMOVED = 0xe55152;
|
const COLOR_REMOVED = 0xe55152;
|
||||||
|
@ -18,6 +25,13 @@ async function getLoggingChannel(guild) {
|
||||||
return guild.channels.get(channelId) ?? guild.threads.get(channelId);
|
return guild.channels.get(channelId) ?? guild.threads.get(channelId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatNameChange(before, after) {
|
||||||
|
const beforeFormatted = before != null ? before : "<no value>";
|
||||||
|
const afterFormatted = after != null ? after : "<no value>";
|
||||||
|
|
||||||
|
return `\`${beforeFormatted}\` > \`${afterFormatted}\``;
|
||||||
|
}
|
||||||
|
|
||||||
const WHITELISTED_EVENTS = new Set([
|
const WHITELISTED_EVENTS = new Set([
|
||||||
"GUILD_UPDATE",
|
"GUILD_UPDATE",
|
||||||
"CHANNEL_CREATE",
|
"CHANNEL_CREATE",
|
||||||
|
@ -73,18 +87,17 @@ events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
||||||
if (!channel) return;
|
if (!channel) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const before = entry.before;
|
||||||
|
const after = entry.after;
|
||||||
|
|
||||||
switch (entry.actionType) {
|
switch (entry.actionType) {
|
||||||
case AuditLogActions.GUILD_UPDATE:
|
|
||||||
case AuditLogActions.CHANNEL_CREATE:
|
|
||||||
case AuditLogActions.CHANNEL_UPDATE:
|
case AuditLogActions.CHANNEL_UPDATE:
|
||||||
case AuditLogActions.CHANNEL_DELETE:
|
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_CREATE:
|
case AuditLogActions.CHANNEL_OVERWRITE_CREATE:
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_UPDATE:
|
case AuditLogActions.CHANNEL_OVERWRITE_UPDATE:
|
||||||
case AuditLogActions.CHANNEL_OVERWRITE_DELETE:
|
case AuditLogActions.CHANNEL_OVERWRITE_DELETE:
|
||||||
case AuditLogActions.MEMBER_KICK:
|
case AuditLogActions.MEMBER_KICK:
|
||||||
case AuditLogActions.MEMBER_BAN_ADD:
|
case AuditLogActions.MEMBER_BAN_ADD:
|
||||||
case AuditLogActions.MEMBER_BAN_REMOVE:
|
case AuditLogActions.MEMBER_BAN_REMOVE:
|
||||||
case AuditLogActions.MEMBER_UPDATE:
|
|
||||||
case AuditLogActions.BOT_ADD:
|
case AuditLogActions.BOT_ADD:
|
||||||
case AuditLogActions.ROLE_CREATE:
|
case AuditLogActions.ROLE_CREATE:
|
||||||
case AuditLogActions.ROLE_UPDATE:
|
case AuditLogActions.ROLE_UPDATE:
|
||||||
|
@ -114,8 +127,7 @@ events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
||||||
case AuditLogActions.CLYDE_AI_PROFILE_UPDATE:
|
case AuditLogActions.CLYDE_AI_PROFILE_UPDATE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_CREATE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_CREATE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_UPDATE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_UPDATE:
|
||||||
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_DELETE:
|
case AuditLogActions.GUILD_SCHEDULED_EVENT_EXCEPTION_DELETE: {
|
||||||
case AuditLogActions.GUILD_PROFILE_UPDATE: {
|
|
||||||
channel
|
channel
|
||||||
.createMessage({
|
.createMessage({
|
||||||
content: Object.entries(AuditLogActions).find(([name, val]) => val === entry.actionType)[0],
|
content: Object.entries(AuditLogActions).find(([name, val]) => val === entry.actionType)[0],
|
||||||
|
@ -129,6 +141,277 @@ events.add("guildAuditLogEntryCreate", "logging", async function (entry) {
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case AuditLogActions.CHANNEL_DELETE:
|
||||||
|
case AuditLogActions.CHANNEL_CREATE: {
|
||||||
|
const fields = [];
|
||||||
|
const hasCreated = entry.actionType == AuditLogActions.CHANNEL_CREATE;
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(hasCreated ? after : before)) {
|
||||||
|
switch (key) {
|
||||||
|
case "name": {
|
||||||
|
fields.push({
|
||||||
|
name: "Name",
|
||||||
|
value: `#${value}`,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "type": {
|
||||||
|
const typeName = ChannelTypeNames[value];
|
||||||
|
fields.push({
|
||||||
|
name: "Type",
|
||||||
|
value: typeName,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "nsfw": {
|
||||||
|
fields.push({
|
||||||
|
name: "NSFW",
|
||||||
|
value: value == true ? "Yes" : "No",
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
channel.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: hasCreated ? COLOR_ADDED : COLOR_REMOVED,
|
||||||
|
title: `Channel ${hasCreated ? "created" : "deleted"}`,
|
||||||
|
description: `<@${entry.user.id}> (${formatUsername(entry.user)}) ${
|
||||||
|
hasCreated ? `created channel <#${entry.targetID}>` : `deleted channel`
|
||||||
|
}`,
|
||||||
|
fields,
|
||||||
|
footer: {
|
||||||
|
text: `Channel ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.GUILD_UPDATE: {
|
||||||
|
const fields = [];
|
||||||
|
|
||||||
|
let thumbnail;
|
||||||
|
let image;
|
||||||
|
|
||||||
|
for (const [key, newValue] of Object.entries(after)) {
|
||||||
|
const oldValue = before[key];
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case "name":
|
||||||
|
fields.push({
|
||||||
|
name: "Name",
|
||||||
|
value: formatNameChange(oldValue, newValue),
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case "description":
|
||||||
|
fields.push({
|
||||||
|
name: "Description",
|
||||||
|
value: formatNameChange(oldValue, newValue),
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case "icon_hash": {
|
||||||
|
const oldIconURL = new URL(GUILD_ICON(entry.targetID, oldValue), CDN_URL);
|
||||||
|
const newIconURL = new URL(GUILD_ICON(entry.targetID, newValue), CDN_URL);
|
||||||
|
|
||||||
|
const oldIconFormatted = `[Old](${oldIconURL})`;
|
||||||
|
const newIconFormatted = `[New](${newIconURL})`;
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "Icon",
|
||||||
|
value: `${oldIconFormatted} > ${newIconFormatted}`,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
thumbnail = newIconURL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "banner_hash": {
|
||||||
|
const oldBannerURL = new URL(BANNER(entry.targetID, oldValue), CDN_URL);
|
||||||
|
const newBannerURL = new URL(BANNER(entry.targetID, newValue), CDN_URL);
|
||||||
|
|
||||||
|
const oldBannerFormatted = `[Old](${oldBannerURL})`;
|
||||||
|
const newBannerFormated = `[Old](${newBannerURL})`;
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "Banner",
|
||||||
|
value: `${oldBannerFormatted} > ${newBannerFormated}`,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
image = newBannerFormated;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "system_channel_id": {
|
||||||
|
// system_channel_id never has a before value, afaik?
|
||||||
|
// this might be wrong
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "System Channel",
|
||||||
|
value: `${newValue}`,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "widget_enabled": {
|
||||||
|
fields.push({
|
||||||
|
name: "Widget Enabled",
|
||||||
|
value: newValue == true ? "Yes" : "No",
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "max_members": {
|
||||||
|
fields.push({
|
||||||
|
name: "Max Members",
|
||||||
|
value: newValue,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
// 🙏
|
||||||
|
fields.push({
|
||||||
|
name: key,
|
||||||
|
value: `${oldValue} > ${newValue}`,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "Updated by",
|
||||||
|
value: `<@${entry.user.id}>`,
|
||||||
|
inline: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
channel.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_CHANGED,
|
||||||
|
title: `Server updated`,
|
||||||
|
fields,
|
||||||
|
thumbnail:
|
||||||
|
thumbnail != undefined
|
||||||
|
? {
|
||||||
|
url: thumbnail,
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
image:
|
||||||
|
image != undefined
|
||||||
|
? {
|
||||||
|
url: image,
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
footer: {
|
||||||
|
text: `Guild ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.GUILD_PROFILE_UPDATE: {
|
||||||
|
const fields = [];
|
||||||
|
|
||||||
|
for (const [key, newValue] of Object.entries(after)) {
|
||||||
|
const oldValue = before[key];
|
||||||
|
switch (key) {
|
||||||
|
case "visibility": {
|
||||||
|
const newVisibility = GuildProfileVisibility[newValue]
|
||||||
|
? GuildProfileVisibility[newValue]
|
||||||
|
: `Unknown ${newValue}`;
|
||||||
|
const oldVisibility = GuildProfileVisibility[oldValue]
|
||||||
|
? GuildProfileVisibility[oldValue]
|
||||||
|
: `Unknown ${oldValue}`;
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "Visibility",
|
||||||
|
value: formatNameChange(oldVisibility, newVisibility),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: "Updated by",
|
||||||
|
value: `<@${entry.user.id}>`,
|
||||||
|
inline: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
channel.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_CHANGED,
|
||||||
|
title: `Server Profile updated`,
|
||||||
|
fields,
|
||||||
|
footer: {
|
||||||
|
text: `Guild ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AuditLogActions.MEMBER_UPDATE: {
|
||||||
|
const fields = [];
|
||||||
|
|
||||||
|
const bot = hf.bot;
|
||||||
|
const target = bot.users.get(entry.targetID);
|
||||||
|
|
||||||
|
const oldNickname = before?.nick;
|
||||||
|
const newNickname = after?.nick;
|
||||||
|
|
||||||
|
const isTimedOut = after?.communication_disabled_until != undefined;
|
||||||
|
|
||||||
|
if (oldNickname != newNickname) {
|
||||||
|
fields.push({
|
||||||
|
name: "Nickname",
|
||||||
|
value: formatNameChange(oldNickname, newNickname),
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const timeoutDuration = new Date(
|
||||||
|
isTimedOut ? after?.communication_disabled_until : before?.communication_disabled_until
|
||||||
|
);
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
name: isTimedOut ? "Timed out" : "Was timed out until",
|
||||||
|
value: `<t:${Math.round(timeoutDuration.getTime() / 1000)}>`,
|
||||||
|
inline: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
channel.createMessage({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
color: COLOR_CHANGED,
|
||||||
|
title: `Member updated`,
|
||||||
|
description: `<@${entry.user.id}> (${formatUsername(entry.user)}) updated member <@${
|
||||||
|
entry.targetID
|
||||||
|
}> (${formatUsername(target)})`,
|
||||||
|
fields,
|
||||||
|
footer: {
|
||||||
|
text: `User ID: ${entry.targetID}`,
|
||||||
|
},
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
case AuditLogActions.MEMBER_ROLE_UPDATE: {
|
case AuditLogActions.MEMBER_ROLE_UPDATE: {
|
||||||
const isAdd = entry.after.$add != null;
|
const isAdd = entry.after.$add != null;
|
||||||
const isSelf = entry.user.id === entry.targetID;
|
const isSelf = entry.user.id === entry.targetID;
|
||||||
|
|
|
@ -207,3 +207,9 @@ module.exports.VerificationLevelStrings = [
|
||||||
"(╯°□°)╯︵ ┻━┻ (High)",
|
"(╯°□°)╯︵ ┻━┻ (High)",
|
||||||
"┻━┻ ミヽ(ಠ益ಠ)ノ彡┻━┻ (Very High/Phone)",
|
"┻━┻ ミヽ(ಠ益ಠ)ノ彡┻━┻ (Very High/Phone)",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
module.exports.GuildProfileVisibility = {
|
||||||
|
1: "Public",
|
||||||
|
2: "Restricted",
|
||||||
|
3: "Public (application-only)",
|
||||||
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue