Added Warn and Ban Commands, Added Logging, and Much More

This commit is contained in:
Ahmad 2025-02-23 21:39:49 -05:00
parent d89de72e08
commit 86adac3f08
No known key found for this signature in database
GPG key ID: 8FD8A93530D182BF
33 changed files with 2200 additions and 204 deletions

163
src/util/logging/utils.ts Normal file
View file

@ -0,0 +1,163 @@
import {
User,
GuildMember,
GuildChannel,
EmbedField,
PermissionsBitField,
} from 'discord.js';
import { LogActionPayload, LogActionType, RoleProperties } from './types.js';
import { ACTION_EMOJIS } from './constants.js';
export const formatPermissionName = (perm: string): string => {
return perm
.split('_')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
.join(' ');
};
export const createUserField = (
user: User | GuildMember,
label = 'User',
): EmbedField => ({
name: label,
value: `<@${user.id}>`,
inline: true,
});
export const createModeratorField = (
moderator?: GuildMember,
label = 'Moderator',
): EmbedField | null =>
moderator
? {
name: label,
value: `<@${moderator.id}>`,
inline: true,
}
: null;
export const createChannelField = (channel: GuildChannel): EmbedField => ({
name: 'Channel',
value: `<#${channel.id}>`,
inline: true,
});
export const createPermissionChangeFields = (
oldPerms: Readonly<PermissionsBitField>,
newPerms: Readonly<PermissionsBitField>,
): EmbedField[] => {
const fields: EmbedField[] = [];
const changes: { added: string[]; removed: string[] } = {
added: [],
removed: [],
};
Object.keys(PermissionsBitField.Flags).forEach((perm) => {
const hasOld = oldPerms.has(perm as keyof typeof PermissionsBitField.Flags);
const hasNew = newPerms.has(perm as keyof typeof PermissionsBitField.Flags);
if (hasOld !== hasNew) {
if (hasNew) {
changes.added.push(formatPermissionName(perm));
} else {
changes.removed.push(formatPermissionName(perm));
}
}
});
if (changes.added.length) {
fields.push({
name: '✅ Added Permissions',
value: changes.added.join('\n'),
inline: true,
});
}
if (changes.removed.length) {
fields.push({
name: '❌ Removed Permissions',
value: changes.removed.join('\n'),
inline: true,
});
}
return fields;
};
export const createRoleChangeFields = (
oldRole: Partial<RoleProperties>,
newRole: Partial<RoleProperties>,
): EmbedField[] => {
const fields: EmbedField[] = [];
if (oldRole.name !== newRole.name) {
fields.push({
name: 'Name Changed',
value: `${oldRole.name}${newRole.name}`,
inline: true,
});
}
if (oldRole.color !== newRole.color) {
fields.push({
name: 'Color Changed',
value: `${oldRole.color || 'None'}${newRole.color || 'None'}`,
inline: true,
});
}
const booleanProps: Array<
keyof Pick<RoleProperties, 'hoist' | 'mentionable'>
> = ['hoist', 'mentionable'];
for (const prop of booleanProps) {
if (oldRole[prop] !== newRole[prop]) {
fields.push({
name: `${prop.charAt(0).toUpperCase() + prop.slice(1)} Changed`,
value: `${oldRole[prop] ? 'Yes' : 'No'}${newRole[prop] ? 'Yes' : 'No'}`,
inline: true,
});
}
}
return fields;
};
export const getLogItemId = (payload: LogActionPayload): string => {
switch (payload.action) {
case 'roleCreate':
case 'roleDelete':
case 'roleUpdate':
case 'roleAdd':
case 'roleRemove':
return payload.role.id;
case 'channelCreate':
case 'channelDelete':
case 'channelUpdate':
return payload.channel.id;
case 'messageDelete':
case 'messageEdit':
return payload.message.id;
case 'memberJoin':
case 'memberLeave':
return payload.member.id;
case 'ban':
case 'kick':
case 'mute':
case 'unban':
case 'unmute':
case 'warn':
return payload.target.id;
default:
return 'N/A';
}
};
export const getEmojiForAction = (action: LogActionType): string => {
return ACTION_EMOJIS[action] || '📝';
};