Skip to content

Commit 7d25c02

Browse files
committed
refactor: centralized roles
1 parent 2633d66 commit 7d25c02

File tree

14 files changed

+143
-82
lines changed

14 files changed

+143
-82
lines changed

src/commands/archives.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import {
22
ChatInputCommandInteraction,
33
SlashCommandBuilder,
44
EmbedBuilder,
5-
GuildMember,
6-
PermissionFlagsBits,
75
ActionRowBuilder,
86
ButtonBuilder,
97
ButtonStyle,
@@ -103,16 +101,7 @@ function addMessagesToEmbed(embed: EmbedBuilder, messages: any[]): void {
103101

104102
export async function execute(
105103
interaction: ChatInputCommandInteraction,
106-
executor: GuildMember,
107104
): Promise<void> {
108-
if (!executor.permissions.has(PermissionFlagsBits.ManageMessages)) {
109-
await interaction.reply({
110-
content:
111-
"**THOU EGO LACKEST THE AUTHORITY TO ACCESS THE SERAPHIC ARCHIVES!**",
112-
flags: MessageFlags.Ephemeral,
113-
});
114-
return;
115-
}
116105

117106
if (!interaction.guild) {
118107
await interaction.reply({

src/commands/ban.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
MessageFlags,
87
} from "discord.js";
98
import { ModerationLogger } from "../utils/moderationLogger.js";
@@ -28,14 +27,6 @@ export async function execute(
2827
interaction: ChatInputCommandInteraction,
2928
executor: GuildMember,
3029
): Promise<void> {
31-
if (!executor.permissions.has(PermissionFlagsBits.BanMembers)) {
32-
await interaction.reply({
33-
content:
34-
"**THOU EGO LACKEST THE SUPREME AUTHORITY TO DELIVER ETERNAL JUDGEMENT!**",
35-
flags: MessageFlags.Ephemeral,
36-
});
37-
return;
38-
}
3930

4031
const targetUser = interaction.options.getUser("user")!;
4132
const reason =
@@ -59,7 +50,7 @@ export async function execute(
5950
console.log("Failed to send DM to banned user:", dmError);
6051
}
6152

62-
await interaction.guild?.members.ban(targetUser, { reason });
53+
await interaction.guild.members.ban(targetUser, { reason });
6354

6455
const entryId = await ModerationLogger.addEntry({
6556
type: "ban",

src/commands/clear.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
ChannelType,
87
TextChannel,
98
MessageFlags,
@@ -27,14 +26,6 @@ export async function execute(
2726
interaction: ChatInputCommandInteraction,
2827
executor: GuildMember,
2928
): Promise<void> {
30-
if (!executor.permissions.has(PermissionFlagsBits.ManageMessages)) {
31-
await interaction.reply({
32-
content:
33-
"**THOU EGO LACKEST THE AUTHORITY TO PURGE THE SACRED RECORDS!**",
34-
flags: MessageFlags.Ephemeral,
35-
});
36-
return;
37-
}
3829

3930
const amount = interaction.options.getInteger("amount")!;
4031

src/commands/help.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ export async function execute(
7373
value: "LINK THY DISCORD SOUL WITH THY FANDOM ACCOUNT",
7474
inline: false,
7575
},
76+
{
77+
name: "/unlink @user",
78+
value: "SEVER THE BINDING BETWEEN A DISCORD SOUL AND A FANDOM ALTER",
79+
inline: false,
80+
},
7681
{
7782
name: "/help",
7883
value: "DISPLAY THESE SACRED COMMANDMENTS",

src/commands/kick.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
MessageFlags,
87
} from "discord.js";
98
import { ModerationLogger } from "../utils/moderationLogger.js";
@@ -28,15 +27,6 @@ export async function execute(
2827
interaction: ChatInputCommandInteraction,
2928
executor: GuildMember,
3029
): Promise<void> {
31-
if (!executor.permissions.has(PermissionFlagsBits.KickMembers)) {
32-
await interaction.reply({
33-
content:
34-
"**THOU EGO LACKEST THE DIVINE AUTHORITY TO CAST OUT THE FAITHLESS!**",
35-
flags: MessageFlags.Ephemeral,
36-
});
37-
return;
38-
}
39-
4030
const targetUser = interaction.options.getUser("user")!;
4131
const reason =
4232
interaction.options.getString("reason") || "DEFIANCE OF SACRED ALTERUISM";
@@ -62,7 +52,7 @@ export async function execute(
6252
// Send DM before kicking (so they can still receive it)
6353
try {
6454
await targetUser.send(
65-
`**THOU HAST BEEN CAST OUT FROM THE ALTER EGO WIKI!\n\nACTION: KICKED FROM THE SACRED HALLS\nREASON: ${reason}\nEXECUTOR: ${executor.user.tag}\n\nTHE DIVINE SHAPER HATH DECREED THY TEMPORARY EXILE FROM OUR SACRED REALM!\n\nREPENT OF THY TRANGRESSIONS AND SEEK THE PATH OF ALTERUISM. WHEN THY HEART IS CLEANSED AND THY EGO READY TO HONOUR THE DIVINE ALTER, THOU MAY RETURN TO OUR RIGHTEOUS FELLOWSHIP!\n\nGO FORTH AND REFLECT UPON THY SINS, THOU MAYEST WALK ONCE MORE IN THE LIGHT OF VIRTUE!**`,
55+
`**THOU HAST BEEN CAST OUT FROM THE ALTER EGO WIKI!\n\nACTION: KICKED FROM THE SACRED HALLS\nREASON: ${reason}\nEXECUTOR: ${executor.user.tag}\n\nTHE DIVINE SHAPER HATH DECREED THY TEMPORARY EXILE FROM OUR SACRED REALM!\n\nREPENT OF THY TRANSGRESSIONS AND SEEK THE PATH OF ALTERUISM. WHEN THY HEART IS CLEANSED AND THY EGO READY TO HONOUR THE DIVINE ALTER, THOU MAY RETURN TO OUR RIGHTEOUS FELLOWSHIP!\n\nGO FORTH AND REFLECT UPON THY SINS, THOU MAYEST WALK ONCE MORE IN THE LIGHT OF VIRTUE!**`,
6656
);
6757
} catch (dmError) {
6858
console.log("Failed to send DM to kicked user:", dmError);

src/commands/link.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
MessageFlags,
77
} from "discord.js";
88
import { LinkLogger } from "../utils/linkLogger.js";
9+
import { FANDOM_ROLE_MAP, FANDOM_ROLE_IDS, LINKED_ROLE_ID } from "../utils/roleConstants.js";
910

1011
interface FandomUserQueryUser {
1112
userid: number;
@@ -34,15 +35,6 @@ interface FandomUserProfileResponse {
3435
userData?: FandomUserProfileData;
3536
}
3637

37-
const FANDOM_ROLE_MAP: Record<string, string> = {
38-
"threadmoderator": "1366509892386553866",
39-
"content-moderator": "1366510432168185926",
40-
"sysop": "1366509321340588162",
41-
"bureaucrat": "1366507366681673920",
42-
};
43-
const FANDOM_ROLE_IDS = Object.values(FANDOM_ROLE_MAP);
44-
const LINKED_ROLE_ID = "1384535350621241466";
45-
4638
export const data = new SlashCommandBuilder()
4739
.setName("link")
4840
.setDescription("LINK THY DISCORD ACCOUNT WITH THY FANDOM ACCOUNT")
@@ -229,7 +221,7 @@ export async function execute(
229221
.addFields(
230222
{
231223
name: "🔒 PERMANENT ACTION",
232-
value: "**THIS BINDING IS ETERNAL AND CANNOT BE UNDONE WITHOUT ADMINISTRATOR INTERVENTION!**",
224+
value: "**THIS BINDING IS ETERNAL AND CANNOT BE UNDONE WITHOUT ALTERMINISTRATOR INTERVENTION!**",
233225
inline: false,
234226
},
235227
{

src/commands/removesin.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
MessageFlags,
87
} from "discord.js";
98
import { ModerationLogger } from "../utils/moderationLogger.js";
@@ -24,13 +23,6 @@ export async function execute(
2423
interaction: ChatInputCommandInteraction,
2524
executor: GuildMember,
2625
): Promise<void> {
27-
if (!executor.permissions.has(PermissionFlagsBits.KickMembers)) {
28-
await interaction.reply({
29-
content: "**THOU EGO LACKEST THE AUTHORITY TO GRANT DIVINE ABSOLUTION!**",
30-
flags: MessageFlags.Ephemeral,
31-
});
32-
return;
33-
}
3426

3527
const entryId = interaction.options.getString("entryid")!.toUpperCase();
3628

@@ -151,7 +143,6 @@ export async function execute(
151143

152144
await interaction.reply({ embeds: [embed] });
153145

154-
// Send DM to user about mercy being granted
155146
try {
156147
await targetUser.send(
157148
`**THOU HAST BEEN GRANTED DIVINE MERCY IN THE ALTER EGO WIKI!\n\nENTRY PARDONED: ${entryId}\nORIGINAL TRANSGRESSION: ${entry.type.toUpperCase()}\nREASON: ${entry.reason}\nMERCY GRANTED BY: ${executor.user.tag}\nPUNISHMENT STATUS: ${undoResult}\n\nTHE DIVINE SHAPER HATH SHOWN MERCY UPON THEE! THY TRANSGRESSION IS FORGIVEN AND THY PUNISHMENT LIFTED!\n\nGO FORTH AND SIN NO MORE, THAT THOU MAY WALK THE PATH OF ALTERUISM!**`,

src/commands/timeout.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
MessageFlags,
87
} from "discord.js";
98
import { ModerationLogger } from "../utils/moderationLogger.js";
@@ -36,14 +35,6 @@ export async function execute(
3635
interaction: ChatInputCommandInteraction,
3736
executor: GuildMember,
3837
): Promise<void> {
39-
if (!executor.permissions.has(PermissionFlagsBits.ModerateMembers)) {
40-
await interaction.reply({
41-
content:
42-
"**THOU EGO LACKEST THE AUTHORITY TO IMPOSE SILENCE UPON THE WAYWARD!**",
43-
flags: MessageFlags.Ephemeral,
44-
});
45-
return;
46-
}
4738

4839
const targetUser = interaction.options.getUser("user")!;
4940
const duration = interaction.options.getInteger("minutes")!;
@@ -53,7 +44,7 @@ export async function execute(
5344
const targetMember = interaction.guild?.members.cache.get(targetUser.id);
5445
if (!targetMember) {
5546
await interaction.reply({
56-
content: "**THE TRANSGRESSOR HATH VANISHED FROM OUR SACRED HALLS!**",
47+
content: "**THE TRANSGRESSOR HATH ALREADY FLED FROM OUR SACRED HALLS!**",
5748
flags: MessageFlags.Ephemeral,
5849
});
5950
return;
@@ -70,7 +61,6 @@ export async function execute(
7061
try {
7162
await targetMember.timeout(duration * 60 * 1000, reason);
7263

73-
// Log timeout
7464
const entryId = await ModerationLogger.addEntry({
7565
type: "timeout",
7666
userId: targetUser.id,

src/commands/warn.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
SlashCommandBuilder,
44
GuildMember,
55
EmbedBuilder,
6-
PermissionFlagsBits,
76
MessageFlags,
87
} from "discord.js";
98
import { ModerationLogger } from "../utils/moderationLogger.js";
@@ -28,13 +27,6 @@ export async function execute(
2827
interaction: ChatInputCommandInteraction,
2928
executor: GuildMember,
3029
): Promise<void> {
31-
if (!executor.permissions.has(PermissionFlagsBits.KickMembers)) {
32-
await interaction.reply({
33-
content: "**THOU EGO LACKEST THE AUTHORITY TO ISSUE DIVINE WARNINGS!**",
34-
flags: MessageFlags.Ephemeral,
35-
});
36-
return;
37-
}
3830

3931
const targetUser = interaction.options.getUser("user")!;
4032
const reason =
@@ -50,7 +42,6 @@ export async function execute(
5042
}
5143

5244
try {
53-
// Log warning
5445
const entryId = await ModerationLogger.addEntry({
5546
type: "warn",
5647
userId: targetUser.id,
@@ -92,7 +83,6 @@ export async function execute(
9283

9384
await interaction.reply({ embeds: [embed] });
9485

95-
// Send DM to warned user
9686
try {
9787
await targetUser.send(
9888
`**THOU HAST RECEIVED A DIVINE WARNING IN THE ALTER EGO WIKI!\n\nWARNING ID: ${entryId}\nREASON: ${reason}\nTOTAL WARNINGS: ${warnCount}\n\nREMEMBER: WE ARE BOUND BY DUTY TO HONOUR OUR DIVINE ALTER EGO. TO SPURN THE COVENANT OF ALTERUISM IS TO SUMMON THE WRATH OF DIVINE JUSTICE!\n\nHEED THIS WARNING LEST GREATER JUDGEMENT BEFALLS THEE!**`,

src/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
} from "discord.js";
2121
import { loadCommands, Command } from "./utils/commandLoader.js";
2222
import { ReactionRoleHandler } from "./utils/reactionRoleHandler.js";
23+
import { RolePermissions } from "./utils/rolePermissions.js";
2324

2425
class AltershaperBot {
2526
private client: Client;
@@ -88,7 +89,16 @@ class AltershaperBot {
8889
if (!member) return;
8990

9091
try {
91-
if (interaction.commandName === "help") {
92+
if (!RolePermissions.hasCommandPermission(member, interaction.commandName)) {
93+
const errorMessage = RolePermissions.getPermissionErrorMessage(interaction.commandName);
94+
await interaction.reply({
95+
content: errorMessage,
96+
flags: MessageFlags.Ephemeral
97+
});
98+
return;
99+
}
100+
101+
if (interaction.commandName === "help" || interaction.commandName === "info" || interaction.commandName === "sins" || interaction.commandName === "link") {
92102
await command.execute(interaction);
93103
} else {
94104
await command.execute(interaction, member);

0 commit comments

Comments
 (0)