Still got errors and warnings, mostly the same and easy to fix
diff --git a/src/commands/help.ts b/src/commands/help.ts
index c3b015c..900f24c 100644
--- a/src/commands/help.ts
+++ b/src/commands/help.ts
@@ -4,15 +4,15 @@
const command = new SlashCommandBuilder()
.setName("help")
- .setDescription("Shows help for commands")
+ .setDescription("Shows help for commands");
-const callback = async (interaction: CommandInteraction): Promise<any> => {
+const callback = async (interaction: CommandInteraction): Promise<void> => {
interaction.reply("hel p"); // TODO: FINISH THIS FOR RELEASE
-}
+};
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
+const check = (_interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/mod/ban.ts b/src/commands/mod/ban.ts
index 8fc98d2..57db408 100644
--- a/src/commands/mod/ban.ts
+++ b/src/commands/mod/ban.ts
@@ -9,15 +9,15 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("ban")
- .setDescription("Bans a user from the server")
- .addUserOption(option => option.setName("user").setDescription("The user to ban").setRequired(true))
- .addNumberOption(option => option.setName("delete").setDescription("The days of messages to delete | Default: 0").setMinValue(0).setMaxValue(7).setRequired(false))
+ .setName("ban")
+ .setDescription("Bans a user from the server")
+ .addUserOption(option => option.setName("user").setDescription("The user to ban").setRequired(true))
+ .addNumberOption(option => option.setName("delete").setDescription("The days of messages to delete | Default: 0").setMinValue(0).setMaxValue(7).setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
+ const { renderUser } = client.logger;
// TODO:[Modals] Replace this with a modal
- let reason = null
+ let reason = null;
let notify = true;
let confirmation;
while (true) {
@@ -28,22 +28,22 @@
"user": renderUser(interaction.options.getUser("user")),
"reason": reason ? ("\n> " + ((reason ?? "").replaceAll("\n", "\n> "))) : "*No reason provided*"
})
- + `The user **will${notify ? '' : ' not'}** be notified\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n`
+ `${addPlurals(interaction.options.getInteger("delete") ? interaction.options.getInteger("delete") : 0, "day")} of messages will be deleted\n\n`
+ `Are you sure you want to ban <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger")
.addReasonButton(reason ?? "")
- .send(reason !== null)
- reason = reason ?? ""
- if (confirmation.cancelled) return
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
- if (confirmation.components) notify = confirmation.components.notify.active
+ .send(reason !== null);
+ reason = reason ?? "";
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
+ if (confirmation.components) notify = confirmation.components.notify.active;
}
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
let dm;
- let config = await client.database.guilds.read(interaction.guild.id);
+ const config = await client.database.guilds.read(interaction.guild.id);
try {
if (notify) {
dm = await (interaction.options.getMember("user") as GuildMember).send({
@@ -59,23 +59,23 @@
.setLabel(config.moderation.ban.text)
.setURL(config.moderation.ban.link)
] : [])]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
+ } catch { dmd = false; }
try {
- let member = (interaction.options.getMember("user") as GuildMember)
+ const member = (interaction.options.getMember("user") as GuildMember);
member.ban({
days: Number(interaction.options.getNumber("delete") ?? 0),
reason: reason ?? "No reason provided"
- })
- try { await client.database.history.create("ban", interaction.guild.id, member.user, interaction.user, reason) } catch {}
- const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger
- let data = {
+ });
+ await client.database.history.create("ban", interaction.guild.id, member.user, interaction.user, reason);
+ const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
+ const data = {
meta: {
- type: 'memberBan',
- displayName: 'Member Banned',
- calculateType: 'guildMemberPunish',
+ type: "memberBan",
+ displayName: "Member Banned",
+ calculateType: "guildMemberPunish",
color: NucleusColors.red,
emoji: "PUNISH.BAN.RED",
timestamp: new Date().getTime()
@@ -87,64 +87,64 @@
bannedBy: entry(interaction.user.id, renderUser(interaction.user)),
reason: entry(reason, reason ? `\n> ${reason}` : "*No reason provided.*"),
accountCreated: entry(member.user.createdAt, renderDelta(member.user.createdAt)),
- serverMemberCount: interaction.guild.memberCount,
+ serverMemberCount: interaction.guild.memberCount
},
hidden: {
guild: interaction.guild.id
}
- }
+ };
log(data);
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.BAN.RED")
- .setTitle(`Ban`)
+ .setTitle("Ban")
.setDescription("Something went wrong and the user was not banned")
.setStatus("Danger")
- ], components: []})
- if (dmd) await dm.delete()
- return
+ ], components: []});
+ if (dmd) await dm.delete();
+ return;
}
- let failed = (dmd === false && notify)
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.BAN.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Ban`)
+ .setTitle("Ban")
.setDescription("The member was banned" + (failed ? ", but could not be notified" : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.BAN.GREEN")
- .setTitle(`Ban`)
+ .setTitle("Ban")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow banning the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot ban the owner of the server"
+ if (member.id === interaction.guild.ownerId) throw "You cannot ban the owner of the server";
// Check if Nucleus can ban the member
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to ban
if (! me.permissions.has("BAN_MEMBERS")) throw "I do not have the *Ban Members* permission";
// Do not allow banning Nucleus
- if (member.id === interaction.guild.me.id) throw "I cannot ban myself"
+ if (member.id === interaction.guild.me.id) throw "I cannot ban myself";
// Allow the owner to ban anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has ban_members permission
if (! member.permissions.has("BAN_MEMBERS")) throw "You do not have the *Ban Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow ban
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/info.ts b/src/commands/mod/info.ts
index c50c6f4..482af5b 100644
--- a/src/commands/mod/info.ts
+++ b/src/commands/mod/info.ts
@@ -1,18 +1,18 @@
-import { HistorySchema } from '../../utils/database';
+import { HistorySchema } from "../../utils/database";
import Discord, { CommandInteraction, GuildMember, MessageActionRow, MessageButton, TextInputComponent } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
import client from "../../utils/client.js";
-import { modalInteractionCollector } from '../../utils/dualCollector.js';
-import pageIndicator from '../../utils/createPageIndicator.js';
+import { modalInteractionCollector } from "../../utils/dualCollector.js";
+import pageIndicator from "../../utils/createPageIndicator.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("info")
- .setDescription("Shows moderator information about a user")
- .addUserOption(option => option.setName("user").setDescription("The user to get information about").setRequired(true))
+ .setName("info")
+ .setDescription("Shows moderator information about a user")
+ .addUserOption(option => option.setName("user").setDescription("The user to get information about").setRequired(true));
const types = {
"warn": {emoji: "PUNISH.WARN.YELLOW", text: "Warned"},
@@ -26,7 +26,7 @@
"unban": {emoji: "MEMBER.UNBAN", text: "Unbanned"},
"purge": {emoji: "PUNISH.CLEARHISTORY", text: "Messages cleared"},
"nickname": {emoji: "PUNISH.NICKNAME.YELLOW", text: "Nickname changed"}
-}
+};
function historyToString(history: HistorySchema) {
let s = `${getEmojiByName(types[history.type].emoji)} ${
@@ -44,16 +44,16 @@
class TimelineSection {
name: string;
- content: {data: HistorySchema, rendered: string}[] = []
+ content: {data: HistorySchema, rendered: string}[] = [];
- addContent = (content: {data: HistorySchema, rendered: string}) => { this.content.push(content); return this; }
+ addContent = (content: {data: HistorySchema, rendered: string}) => { this.content.push(content); return this; };
contentLength = () => { return this.content.reduce((acc, cur) => acc + cur.rendered.length, 0); };
generateName = () => {
- let first = Math.round(this.content[0].data.occurredAt.getTime() / 1000)
- let last = Math.round(this.content[this.content.length - 1].data.occurredAt.getTime() / 1000)
+ const first = Math.round(this.content[0].data.occurredAt.getTime() / 1000);
+ const last = Math.round(this.content[this.content.length - 1].data.occurredAt.getTime() / 1000);
if (first === last) { return this.name = `<t:${first}:F>`; }
return this.name = `<t:${first}:F> - <t:${last}:F>`;
- }
+ };
}
const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
@@ -70,15 +70,15 @@
history = await client.database.history.read(member.guild.id, member.id, currentYear);
history = history.sort((a, b) => b.occurredAt.getTime() - a.occurredAt.getTime()).reverse();
if (openFilterPane) {
- let tempFilteredTypes = filteredTypes
+ let tempFilteredTypes = filteredTypes;
if (filteredTypes.length === 0) { tempFilteredTypes = Object.keys(types); }
- history = history.filter(h => tempFilteredTypes.includes(h.type))
- };
+ history = history.filter(h => tempFilteredTypes.includes(h.type));
+ }
refresh = false;
}
- let groups: TimelineSection[] = []
+ const groups: TimelineSection[] = [];
if (history.length > 0) {
- current = new TimelineSection()
+ current = new TimelineSection();
history.forEach(event => {
if (current.contentLength() + historyToString(event).length > 2000 || current.content.length === 5) {
groups.push(current);
@@ -91,17 +91,17 @@
groups.push(current);
if (pageIndex === null) { pageIndex = groups.length - 1; }
}
- let components = (
+ const components = (
openFilterPane ? [
- new MessageActionRow().addComponents([new Discord.MessageSelectMenu().setOptions(
- Object.entries(types).map(([key, value]) => ({
+ new MessageActionRow().addComponents([new Discord.MessageSelectMenu().setOptions(
+ Object.entries(types).map(([key, value]) => ({
label: value.text,
value: key,
default: filteredTypes.includes(key),
emoji: client.emojis.resolve(getEmojiByName(value.emoji, "id"))
- }))
- ).setMinValues(1).setMaxValues(Object.keys(types).length).setCustomId("filter").setPlaceholder("Select at least one event")])
- ] : []).concat([
+ }))
+ ).setMinValues(1).setMaxValues(Object.keys(types).length).setCustomId("filter").setPlaceholder("Select at least one event")])
+ ] : []).concat([
new MessageActionRow().addComponents([
new MessageButton()
.setCustomId("prevYear")
@@ -126,7 +126,7 @@
.setLabel((currentYear + 1).toString())
.setEmoji(getEmojiByName("CONTROL.RIGHT", "id"))
.setStyle("SECONDARY")
- .setDisabled(currentYear === new Date().getFullYear()),
+ .setDisabled(currentYear === new Date().getFullYear())
]), new MessageActionRow().addComponents([
new MessageButton()
.setLabel("Mod notes")
@@ -139,14 +139,14 @@
.setStyle(openFilterPane ? "SUCCESS" : "PRIMARY")
.setEmoji(getEmojiByName("ICONS.FILTER", "id"))
])
- ])
- let end = "\n\nJanuary " + currentYear.toString() + pageIndicator(
+ ]);
+ const end = "\n\nJanuary " + currentYear.toString() + pageIndicator(
Math.max(groups.length, 1),
groups.length === 0 ? 1 : pageIndex
) + (currentYear === new Date().getFullYear() ? monthNames[new Date().getMonth()] : "December"
- ) + " " + currentYear.toString()
+ ) + " " + currentYear.toString();
if (groups.length > 0) {
- let toRender = groups[Math.min(pageIndex, groups.length - 1)]
+ const toRender = groups[Math.min(pageIndex, groups.length - 1)];
m = await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("MEMBER.JOIN")
.setTitle("Moderation history for " + member.user.username)
@@ -158,7 +158,7 @@
m = await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("MEMBER.JOIN")
.setTitle("Moderation history for " + member.user.username)
- .setDescription(`**${currentYear}**\n\n*No events*` + `\n\n` + end)
+ .setDescription(`**${currentYear}**\n\n*No events*` + "\n\n" + end)
.setStatus("Success")
.setFooter({text: (openFilterPane && filteredTypes.length) ? "Filters are currently enabled" : ""})
], components: components});
@@ -174,9 +174,9 @@
.setStatus("Danger")
.setFooter({text: "Message timed out"})
]});
- return 0
+ return 0;
}
- i.deferUpdate()
+ i.deferUpdate();
if (i.customId === "filter") {
filteredTypes = i.values;
pageIndex = null;
@@ -193,15 +193,15 @@
if (pageIndex >= groups.length) { pageIndex = 0; currentYear++; refresh = true; }
}
if (i.customId === "today") { currentYear = new Date().getFullYear(); pageIndex = null; refresh = true; }
- if (i.customId === "modNotes") { return 1 }
- if (i.customId === "openFilter") { openFilterPane = !openFilterPane; refresh = true }
+ if (i.customId === "modNotes") { return 1; }
+ if (i.customId === "openFilter") { openFilterPane = !openFilterPane; refresh = true; }
}
}
const callback = async (interaction: CommandInteraction): Promise<any> => {
let m;
- let member = (interaction.options.getMember("user")) as Discord.GuildMember;
+ const member = (interaction.options.getMember("user")) as Discord.GuildMember;
await interaction.reply({embeds: [new EmojiEmbed()
.setEmoji("NUCLEUS.LOADING")
.setTitle("Downloading Data")
@@ -233,9 +233,9 @@
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { return }
+ } catch (e) { return; }
if (i.customId === "modify") {
- await i.showModal(new Discord.Modal().setCustomId("modal").setTitle(`Editing moderator note`).addComponents(
+ await i.showModal(new Discord.Modal().setCustomId("modal").setTitle("Editing moderator note").addComponents(
new MessageActionRow<TextInputComponent>().addComponents(new TextInputComponent()
.setCustomId("note")
.setLabel("Note")
@@ -244,7 +244,7 @@
.setStyle("PARAGRAPH")
.setValue(note ? note : "")
)
- ))
+ ));
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Mod notes for " + member.user.username)
@@ -260,24 +260,24 @@
});
let out;
try {
- out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify")
- } catch (e) { continue }
+ out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify");
+ } catch (e) { continue; }
if (out.fields) {
- let toAdd = out.fields.getTextInputValue("note") || null;
+ const toAdd = out.fields.getTextInputValue("note") || null;
await client.database.notes.create(member.guild.id, member.id, toAdd);
- } else { continue }
+ } else { continue; }
} else if (i.customId === "history") {
i.deferUpdate();
- if (!await showHistory(member, interaction) ) return
+ if (!await showHistory(member, interaction) ) return;
}
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
+ const member = (interaction.member as GuildMember);
if (! member.permissions.has("MODERATE_MEMBERS")) throw "You do not have the *Moderate Members* permission";
- return true
-}
+ return true;
+};
export { command };
export { callback };
diff --git a/src/commands/mod/kick.ts b/src/commands/mod/kick.ts
index ef748e8..b9b1b2a 100644
--- a/src/commands/mod/kick.ts
+++ b/src/commands/mod/kick.ts
@@ -1,5 +1,5 @@
import { CommandInteraction, GuildMember, MessageActionRow, MessageButton } from "discord.js";
-import humanizeDuration from 'humanize-duration';
+import humanizeDuration from "humanize-duration";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import confirmationMessage from "../../utils/confirmationMessage.js";
@@ -9,16 +9,16 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("kick")
- .setDescription("Kicks a user from the server")
- .addUserOption(option => option.setName("user").setDescription("The user to kick").setRequired(true))
+ .setName("kick")
+ .setDescription("Kicks a user from the server")
+ .addUserOption(option => option.setName("user").setDescription("The user to kick").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
+ const { renderUser } = client.logger;
// TODO:[Modals] Replace this with a modal
let reason = null;
let notify = true;
- let confirmation
+ let confirmation;
while (true) {
confirmation = await new confirmationMessage(interaction)
.setEmoji("PUNISH.KICK.RED")
@@ -27,23 +27,23 @@
"user": renderUser(interaction.options.getUser("user")),
"reason": reason ? ("\n> " + ((reason ?? "").replaceAll("\n", "\n> "))) : "*No reason provided*"
})
- + `The user **will${notify ? '' : ' not'}** be notified\n\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n\n`
+ `Are you sure you want to kick <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger")
.addReasonButton(reason ?? "")
- .send(reason !== null)
- reason = reason ?? ""
- if (confirmation.cancelled) return
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
+ .send(reason !== null);
+ reason = reason ?? "";
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) {
- notify = confirmation.components.notify.active
+ notify = confirmation.components.notify.active;
}
}
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
let dm;
- let config = await client.database.guilds.read(interaction.guild.id);
+ const config = await client.database.guilds.read(interaction.guild.id);
try {
if (notify) {
dm = await (interaction.options.getMember("user") as GuildMember).send({
@@ -59,20 +59,20 @@
.setLabel(config.moderation.kick.text)
.setURL(config.moderation.kick.link)
] : [])]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
+ } catch { dmd = false; }
try {
- (interaction.options.getMember("user") as GuildMember).kick(reason ?? "No reason provided.")
- let member = (interaction.options.getMember("user") as GuildMember)
- try { await client.database.history.create("kick", interaction.guild.id, member.user, interaction.user, reason) } catch {}
- const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger
- let data = {
+ (interaction.options.getMember("user") as GuildMember).kick(reason ?? "No reason provided.");
+ const member = (interaction.options.getMember("user") as GuildMember);
+ await client.database.history.create("kick", interaction.guild.id, member.user, interaction.user, reason);
+ const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
+ const data = {
meta: {
- type: 'memberKick',
- displayName: 'Member Kicked',
- calculateType: 'guildMemberPunish',
+ type: "memberKick",
+ displayName: "Member Kicked",
+ calculateType: "guildMemberPunish",
color: NucleusColors.red,
emoji: "PUNISH.KICK.RED",
timestamp: new Date().getTime()
@@ -86,64 +86,64 @@
reason: entry(reason, reason ? `\n> ${reason}` : "*No reason provided.*"),
timeInServer: entry(new Date().getTime() - member.joinedTimestamp, humanizeDuration(new Date().getTime() - member.joinedTimestamp, { round: true })),
accountCreated: entry(member.user.createdAt, renderDelta(member.user.createdAt)),
- serverMemberCount: member.guild.memberCount,
+ serverMemberCount: member.guild.memberCount
},
hidden: {
guild: member.guild.id
}
- }
+ };
log(data);
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.KICK.RED")
- .setTitle(`Kick`)
+ .setTitle("Kick")
.setDescription("Something went wrong and the user was not kicked")
.setStatus("Danger")
- ], components: []})
- if (dmd) await dm.delete()
- return
+ ], components: []});
+ if (dmd) await dm.delete();
+ return;
}
- let failed = (dmd === false && notify)
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.KICK.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Kick`)
+ .setTitle("Kick")
.setDescription("The member was kicked" + (failed ? ", but could not be notified" : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.KICK.GREEN")
- .setTitle(`Kick`)
+ .setTitle("Kick")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow kicking the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot kick the owner of the server"
+ if (member.id === interaction.guild.ownerId) throw "You cannot kick the owner of the server";
// Check if Nucleus can kick the member
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to kick
if (! me.permissions.has("KICK_MEMBERS")) throw "I do not have the *Kick Members* permission";
// Do not allow kicking Nucleus
- if (member.id === interaction.guild.me.id) throw "I cannot kick myself"
+ if (member.id === interaction.guild.me.id) throw "I cannot kick myself";
// Allow the owner to kick anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has kick_members permission
if (! member.permissions.has("KICK_MEMBERS")) throw "You do not have the *Kick Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow kick
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/mute.ts b/src/commands/mod/mute.ts
index 808d22d..183c487 100644
--- a/src/commands/mod/mute.ts
+++ b/src/commands/mod/mute.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, GuildMember, MessageActionRow, MessageButton } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
@@ -12,30 +12,30 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("mute")
- .setDescription("Mutes a member, stopping them from talking in the server")
- .addUserOption(option => option.setName("user").setDescription("The user to mute").setRequired(true))
- .addIntegerOption(option => option.setName("days").setDescription("The number of days to mute the user for | Default: 0").setMinValue(0).setMaxValue(27).setRequired(false))
- .addIntegerOption(option => option.setName("hours").setDescription("The number of hours to mute the user for | Default: 0").setMinValue(0).setMaxValue(23).setRequired(false))
- .addIntegerOption(option => option.setName("minutes").setDescription("The number of minutes to mute the user for | Default: 0").setMinValue(0).setMaxValue(59).setRequired(false))
- .addIntegerOption(option => option.setName("seconds").setDescription("The number of seconds to mute the user for | Default: 0").setMinValue(0).setMaxValue(59).setRequired(false))
+ .setName("mute")
+ .setDescription("Mutes a member, stopping them from talking in the server")
+ .addUserOption(option => option.setName("user").setDescription("The user to mute").setRequired(true))
+ .addIntegerOption(option => option.setName("days").setDescription("The number of days to mute the user for | Default: 0").setMinValue(0).setMaxValue(27).setRequired(false))
+ .addIntegerOption(option => option.setName("hours").setDescription("The number of hours to mute the user for | Default: 0").setMinValue(0).setMaxValue(23).setRequired(false))
+ .addIntegerOption(option => option.setName("minutes").setDescription("The number of minutes to mute the user for | Default: 0").setMinValue(0).setMaxValue(59).setRequired(false))
+ .addIntegerOption(option => option.setName("seconds").setDescription("The number of seconds to mute the user for | Default: 0").setMinValue(0).setMaxValue(59).setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger
- const user = interaction.options.getMember("user") as GuildMember
+ const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger;
+ const user = interaction.options.getMember("user") as GuildMember;
const time = {
days: interaction.options.getInteger("days") || 0,
hours: interaction.options.getInteger("hours") || 0,
minutes: interaction.options.getInteger("minutes") || 0,
seconds: interaction.options.getInteger("seconds") || 0
- }
- let config = await client.database.guilds.read(interaction.guild.id)
- let serverSettingsDescription = (config.moderation.mute.timeout ? "given a timeout" : "")
- if (config.moderation.mute.role) serverSettingsDescription += (serverSettingsDescription ? " and " : "") + `given the <@&${config.moderation.mute.role}> role`
+ };
+ const config = await client.database.guilds.read(interaction.guild.id);
+ let serverSettingsDescription = (config.moderation.mute.timeout ? "given a timeout" : "");
+ if (config.moderation.mute.role) serverSettingsDescription += (serverSettingsDescription ? " and " : "") + `given the <@&${config.moderation.mute.role}> role`;
- let muteTime = (time.days * 24 * 60 * 60) + (time.hours * 60 * 60) + (time.minutes * 60) + time.seconds
+ let muteTime = (time.days * 24 * 60 * 60) + (time.hours * 60 * 60) + (time.minutes * 60) + time.seconds;
if (muteTime === 0) {
- let m = await interaction.reply({embeds: [
+ const m = await interaction.reply({embeds: [
new EmojiEmbed()
.setEmoji("PUNISH.MUTE.GREEN")
.setTitle("Mute")
@@ -85,30 +85,30 @@
.setStyle("DANGER")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
])
- ], ephemeral: true, fetchReply: true})
+ ], ephemeral: true, fetchReply: true});
let component;
try {
component = await (m as Discord.Message).awaitMessageComponent({filter: (m) => m.user.id === interaction.user.id, time: 300000});
- } catch { return }
+ } catch { return; }
component.deferUpdate();
if (component.customId === "cancel") return interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.MUTE.RED")
.setTitle("Mute")
.setDescription("Mute cancelled")
.setStatus("Danger")
- ]})
+ ]});
switch (component.customId) {
- case "1m": { muteTime = 60; break; }
- case "10m": { muteTime = 60 * 10; break; }
- case "30m": { muteTime = 60 * 30; break; }
- case "1h": { muteTime = 60 * 60; break; }
- case "6h": { muteTime = 60 * 60 * 6; break; }
- case "12h": { muteTime = 60 * 60 * 12; break; }
- case "1d": { muteTime = 60 * 60 * 24; break; }
- case "1w": { muteTime = 60 * 60 * 24 * 7; break; }
+ case "1m": { muteTime = 60; break; }
+ case "10m": { muteTime = 60 * 10; break; }
+ case "30m": { muteTime = 60 * 30; break; }
+ case "1h": { muteTime = 60 * 60; break; }
+ case "6h": { muteTime = 60 * 60 * 6; break; }
+ case "12h": { muteTime = 60 * 60 * 12; break; }
+ case "1d": { muteTime = 60 * 60 * 24; break; }
+ case "1w": { muteTime = 60 * 60 * 24 * 7; break; }
}
} else {
- await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true})
+ await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
}
// TODO:[Modals] Replace this with a modal
let reason = null;
@@ -124,8 +124,8 @@
"time": `${humanizeDuration(muteTime * 1000, {round: true})}`,
"reason": reason ? ("\n> " + ((reason ?? "").replaceAll("\n", "\n> "))) : "*No reason provided*"
})
- + `The user will be ` + serverSettingsDescription + "\n"
- + `The user **will${notify ? '' : ' not'}** be notified\n\n`
+ + "The user will be " + serverSettingsDescription + "\n"
+ + `The user **will${notify ? "" : " not"}** be notified\n\n`
+ `Are you sure you want to mute <@!${user.id}>?`)
.setColor("Danger")
.addCustomBoolean(
@@ -134,20 +134,20 @@
"An appeal ticket will be created when Confirm is clicked", "CONTROL.TICKET", createAppealTicket)
.addCustomBoolean("notify", "Notify user", false, null, null, "ICONS.NOTIFY." + (notify ? "ON" : "OFF" ), notify)
.addReasonButton(reason ?? "")
- .send(true)
- reason = reason ?? ""
- if (confirmation.cancelled) return
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
+ .send(true);
+ reason = reason ?? "";
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) {
- notify = confirmation.components.notify.active
- createAppealTicket = confirmation.components.appeal.active
+ notify = confirmation.components.notify.active;
+ createAppealTicket = confirmation.components.appeal.active;
}
}
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
let dm;
- let config = await client.database.guilds.read(interaction.guild.id);
+ const config = await client.database.guilds.read(interaction.guild.id);
try {
if (notify) {
dm = await user.send({
@@ -157,7 +157,7 @@
.setDescription(`You have been muted in ${interaction.guild.name}` +
(reason ? ` for:\n> ${reason}` : ".\n\n" +
`You will be unmuted at: <t:${Math.round((new Date).getTime() / 1000) + muteTime}:D> at <t:${Math.round((new Date).getTime() / 1000) + muteTime}:T> (<t:${Math.round((new Date).getTime() / 1000) + muteTime}:R>)`) +
- (confirmation.components.appeal.response ? `You can appeal this here: <#${confirmation.components.appeal.response}>` : ``))
+ (confirmation.components.appeal.response ? `You can appeal this here: <#${confirmation.components.appeal.response}>` : ""))
.setStatus("Danger")
],
components: [new MessageActionRow().addComponents(config.moderation.mute.text ? [new MessageButton()
@@ -165,60 +165,60 @@
.setLabel(config.moderation.mute.text)
.setURL(config.moderation.mute.link)
] : [])]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
- let member = user
- let errors = 0
+ } catch { dmd = false; }
+ const member = user;
+ let errors = 0;
try {
if (config.moderation.mute.timeout) {
- await member.timeout(muteTime * 1000, reason || "No reason provided")
+ await member.timeout(muteTime * 1000, reason || "No reason provided");
if (config.moderation.mute.role !== null) {
- await member.roles.add(config.moderation.mute.role)
+ await member.roles.add(config.moderation.mute.role);
await client.database.eventScheduler.schedule("naturalUnmute", new Date().getTime() + muteTime * 1000, {
guild: interaction.guild.id,
user: user.id,
expires: new Date().getTime() + muteTime * 1000
- })
+ });
}
}
- } catch { errors++ }
+ } catch { errors++; }
try {
if (config.moderation.mute.role !== null) {
- await member.roles.add(config.moderation.mute.role)
+ await member.roles.add(config.moderation.mute.role);
await client.database.eventScheduler.schedule("unmuteRole", new Date().getTime() + muteTime * 1000, {
guild: interaction.guild.id,
user: user.id,
role: config.moderation.mute.role
- })
+ });
}
- } catch (e){ console.log(e); errors++ }
+ } catch (e){ console.log(e); errors++; }
if (errors === 2) {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.MUTE.RED")
- .setTitle(`Mute`)
+ .setTitle("Mute")
.setDescription("Something went wrong and the user was not muted")
.setStatus("Danger")
- ], components: []}) // TODO: make this clearer
- if (dmd) await dm.delete()
- return
+ ], components: []}); // TODO: make this clearer
+ if (dmd) await dm.delete();
+ return;
}
- try { await client.database.history.create("mute", interaction.guild.id, member.user, interaction.user, reason) } catch {}
- let failed = (dmd === false && notify)
+ await client.database.history.create("mute", interaction.guild.id, member.user, interaction.user, reason);
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.MUTE.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Mute`)
- .setDescription("The member was muted" + (failed ? ", but could not be notified" : "") + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ``))
+ .setTitle("Mute")
+ .setDescription("The member was muted" + (failed ? ", but could not be notified" : "") + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
- let data = {
+ ], components: []});
+ const data = {
meta:{
- type: 'memberMute',
- displayName: 'Member Muted',
- calculateType: 'guildMemberPunish',
+ type: "memberMute",
+ displayName: "Member Muted",
+ calculateType: "guildMemberPunish",
color: NucleusColors.yellow,
- emoji: 'PUNISH.WARN.YELLOW',
+ emoji: "PUNISH.WARN.YELLOW",
timestamp: new Date().getTime()
},
list: {
@@ -227,47 +227,47 @@
mutedUntil: entry(new Date().getTime() + muteTime * 1000, renderDelta(new Date().getTime() + muteTime * 1000)),
muted: entry(new Date().getTime(), renderDelta(new Date().getTime() - 1000)),
mutedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
- reason: entry(reason, reason ? reason : '*No reason provided*')
+ reason: entry(reason, reason ? reason : "*No reason provided*")
},
hidden: {
guild: interaction.guild.id
}
- }
+ };
log(data);
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.MUTE.GREEN")
- .setTitle(`Mute`)
+ .setTitle("Mute")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow muting the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot mute the owner of the server"
+ if (member.id === interaction.guild.ownerId) throw "You cannot mute the owner of the server";
// Check if Nucleus can mute the member
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to mute
if (! me.permissions.has("MODERATE_MEMBERS")) throw "I do not have the *Moderate Members* permission";
// Do not allow muting Nucleus
- if (member.id === me.id) throw "I cannot mute myself"
+ if (member.id === me.id) throw "I cannot mute myself";
// Allow the owner to mute anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has moderate_members permission
if (! member.permissions.has("MODERATE_MEMBERS")) throw "You do not have the *Moderate Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow mute
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/nick.ts b/src/commands/mod/nick.ts
index d50becd..9cc8a7c 100644
--- a/src/commands/mod/nick.ts
+++ b/src/commands/mod/nick.ts
@@ -5,17 +5,17 @@
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import keyValueList from "../../utils/generateKeyValueList.js";
import { create, areTicketsEnabled } from "../../actions/createModActionTicket.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("nick")
- .setDescription("Changes a users nickname")
- .addUserOption(option => option.setName("user").setDescription("The user to change").setRequired(true))
- .addStringOption(option => option.setName("name").setDescription("The name to set | Leave blank to clear").setRequired(false))
+ .setName("nick")
+ .setDescription("Changes a users nickname")
+ .addUserOption(option => option.setName("user").setDescription("The user to change").setRequired(true))
+ .addStringOption(option => option.setName("name").setDescription("The name to set | Leave blank to clear").setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
+ const { renderUser } = client.logger;
// TODO:[Modals] Replace this with a modal
let notify = true;
let confirmation;
@@ -27,19 +27,19 @@
"user": renderUser(interaction.options.getUser("user")),
"new nickname": `${interaction.options.getString("name") ? interaction.options.getString("name") : "*No nickname*"}`
})
- + `The user **will${notify ? '' : ' not'}** be notified\n\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n\n`
+ `Are you sure you want to ${interaction.options.getString("name") ? "change" : "clear"} <@!${(interaction.options.getMember("user") as GuildMember).id}>'s nickname?`)
.setColor("Danger")
.addCustomBoolean("notify", "Notify user", false, null, null, "ICONS.NOTIFY." + (notify ? "ON" : "OFF" ), notify)
- .send(interaction.options.getString("name") !== null)
- if (confirmation.cancelled) return
- if (confirmation.success) break
+ .send(interaction.options.getString("name") !== null);
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
if (confirmation.components) {
- notify = confirmation.components.notify.active
+ notify = confirmation.components.notify.active;
}
}
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
let dm;
try {
if (notify) {
@@ -49,94 +49,94 @@
.setTitle("Nickname changed")
.setDescription(`Your nickname was ${interaction.options.getString("name") ? "changed" : "cleared"} in ${interaction.guild.name}.` +
(interaction.options.getString("name") ? ` it is now: ${interaction.options.getString("name")}` : "") + "\n\n" +
- (confirmation.components.appeal.response ? `You can appeal this here: <#${confirmation.components.appeal.response}>` : ``))
+ (confirmation.components.appeal.response ? `You can appeal this here: <#${confirmation.components.appeal.response}>` : ""))
.setStatus("Danger")
]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
+ } catch { dmd = false; }
try {
- let member = (interaction.options.getMember("user") as GuildMember)
- let before = member.nickname
- let nickname = interaction.options.getString("name")
- member.setNickname(nickname ?? null, "Nucleus Nickname command")
- try { await client.database.history.create(
+ const member = (interaction.options.getMember("user") as GuildMember);
+ const before = member.nickname;
+ const nickname = interaction.options.getString("name");
+ member.setNickname(nickname ?? null, "Nucleus Nickname command");
+ await client.database.history.create(
"nickname", interaction.guild.id, member.user, interaction.user,
- null, before, nickname) } catch {}
- const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger
- let data = {
+ null, before, nickname);
+ const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
+ const data = {
meta: {
- type: 'memberUpdate',
- displayName: 'Member Updated',
- calculateType: 'guildMemberUpdate',
+ type: "memberUpdate",
+ displayName: "Member Updated",
+ calculateType: "guildMemberUpdate",
color: NucleusColors.yellow,
emoji: "PUNISH.NICKNAME.YELLOW",
timestamp: new Date().getTime()
},
list: {
memberId: entry(member.id, `\`${member.id}\``),
- before: entry(before, before ? before : '*None*'),
- after: entry(nickname, nickname ? nickname : '*None*'),
+ before: entry(before, before ? before : "*None*"),
+ after: entry(nickname, nickname ? nickname : "*None*"),
updated: entry(new Date().getTime(), renderDelta(new Date().getTime())),
updatedBy: entry(interaction.user.id, renderUser(interaction.user))
},
hidden: {
guild: interaction.guild.id
}
- }
+ };
log(data);
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.NICKNAME.RED")
- .setTitle(`Nickname`)
+ .setTitle("Nickname")
.setDescription("Something went wrong and the users nickname could not be changed.")
.setStatus("Danger")
- ], components: []})
- if (dmd) await dm.delete()
- return
+ ], components: []});
+ if (dmd) await dm.delete();
+ return;
}
- let failed = (dmd === false && notify)
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.NICKNAME.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Nickname`)
- .setDescription("The members nickname was changed" + (failed ? ", but was not notified" : "") + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ``))
+ .setTitle("Nickname")
+ .setDescription("The members nickname was changed" + (failed ? ", but was not notified" : "") + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.NICKNAME.GREEN")
- .setTitle(`Nickname`)
+ .setTitle("Nickname")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow any changing of the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot change the owner's nickname"
+ if (member.id === interaction.guild.ownerId) throw "You cannot change the owner's nickname";
// Check if Nucleus can change the nickname
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to change the nickname
if (! me.permissions.has("MANAGE_NICKNAMES")) throw "I do not have the *Manage Nicknames* permission";
// Allow the owner to change anyone's nickname
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has manage_nicknames permission
if (! member.permissions.has("MANAGE_NICKNAMES")) throw "You do not have the *Manage Nicknames* permission";
// Allow changing your own nickname
- if (member === apply) return true
+ if (member === apply) return true;
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow change
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/purge.ts b/src/commands/mod/purge.ts
index 521d8a7..13e688b 100644
--- a/src/commands/mod/purge.ts
+++ b/src/commands/mod/purge.ts
@@ -9,20 +9,20 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("purge")
- .setDescription("Bulk deletes messages in a channel")
- .addIntegerOption(option => option
- .setName("amount")
- .setDescription("The amount of messages to delete")
- .setRequired(false)
- .setMinValue(1)
- .setMaxValue(100))
- .addUserOption(option => option.setName("user").setDescription("The user to purge messages from").setRequired(false))
- .addStringOption(option => option.setName("reason").setDescription("The reason for the purge").setRequired(false))
+ .setName("purge")
+ .setDescription("Bulk deletes messages in a channel")
+ .addIntegerOption(option => option
+ .setName("amount")
+ .setDescription("The amount of messages to delete")
+ .setRequired(false)
+ .setMinValue(1)
+ .setMaxValue(100))
+ .addUserOption(option => option.setName("user").setDescription("The user to purge messages from").setRequired(false))
+ .addStringOption(option => option.setName("reason").setDescription("The reason for the purge").setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let user = interaction.options.getMember("user") as GuildMember ?? null
- let channel = (interaction.channel as GuildChannel)
+ const user = interaction.options.getMember("user") as GuildMember ?? null;
+ const channel = (interaction.channel as GuildChannel);
if (!(["GUILD_TEXT", "GUILD_NEWS", "GUILD_NEWS_THREAD", "GUILD_PUBLIC_THREAD", "GUILD_PRIVATE_THREAD"].includes(channel.type.toString()))) {
return await interaction.reply({
embeds: [
@@ -33,8 +33,8 @@
.setStatus("Danger")
],
components: [],
- ephemeral: true,
- })
+ ephemeral: true
+ });
}
// TODO:[Modals] Replace this with a modal
if ( !interaction.options.getInteger("amount") ) {
@@ -49,10 +49,10 @@
components: [],
ephemeral: true,
fetchReply: true
- })
- let deleted = [] as Discord.Message[]
+ });
+ let deleted = [] as Discord.Message[];
while (true) {
- let m = await interaction.editReply({
+ const m = await interaction.editReply({
embeds: [
new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.RED")
@@ -74,8 +74,8 @@
.setCustomId("5")
.setLabel("5")
.setStyle("SECONDARY")
- ]),
- new Discord.MessageActionRow().addComponents([
+ ]),
+ new Discord.MessageActionRow().addComponents([
new Discord.MessageButton()
.setCustomId("10")
.setLabel("10")
@@ -97,7 +97,7 @@
.setEmoji(getEmojiByName("CONTROL.TICK", "id"))
])
]
- })
+ });
let component;
try {
component = await (m as Discord.Message).awaitMessageComponent({filter: (m) => m.user.id === interaction.user.id, time: 300000});
@@ -109,12 +109,12 @@
let messages;
await (interaction.channel as TextChannel).messages.fetch({limit: amount}).then(async (ms) => {
if (user) {
- ms = ms.filter(m => m.author.id === user.id)
+ ms = ms.filter(m => m.author.id === user.id);
}
messages = await (channel as TextChannel).bulkDelete(ms, true);
- })
+ });
if (messages) {
- deleted = deleted.concat(messages.map(m => m))
+ deleted = deleted.concat(messages.map(m => m));
}
}
if (deleted.length === 0) return await interaction.editReply({
@@ -126,49 +126,46 @@
.setStatus("Danger")
],
components: []
- })
+ });
if (user) {
- try { await client.database.history.create("purge", interaction.guild.id, user, interaction.options.getString("reason"), null, null, deleted.length) } catch {}
+ await client.database.history.create("purge", interaction.guild.id, user, interaction.options.getString("reason"), null, null, deleted.length);
}
- let attachmentObject;
- try {
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- let data = {
- meta: {
- type: 'channelPurge',
- displayName: 'Channel Purged',
- calculateType: 'messageDelete',
- color: NucleusColors.red,
- emoji: "PUNISH.BAN.RED",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- purgedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(interaction.channel.id, renderChannel(interaction.channel)),
- messagesCleared: entry(deleted.length, deleted.length),
- },
- hidden: {
- guild: interaction.guild.id
- }
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta: {
+ type: "channelPurge",
+ displayName: "Channel Purged",
+ calculateType: "messageDelete",
+ color: NucleusColors.red,
+ emoji: "PUNISH.BAN.RED",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ purgedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(interaction.channel.id, renderChannel(interaction.channel)),
+ messagesCleared: entry(deleted.length, deleted.length)
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- let out = ""
- deleted.reverse().forEach(message => {
- out += `${message.author.username}#${message.author.discriminator} (${message.author.id}) [${new Date(message.createdTimestamp).toISOString()}]\n`
- let lines = message.content.split("\n")
- lines.forEach(line => {out += `> ${line}\n`})
- out += `\n\n`
- })
- attachmentObject = {
- attachment: Buffer.from(out),
- name: `purge-${channel.id}-${Date.now()}.txt`,
- description: "Purge log"
- }
- } catch {}
- let m = await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`CHANNEL.PURGE.GREEN`)
- .setTitle(`Purge`)
+ };
+ log(data);
+ let out = "";
+ deleted.reverse().forEach(message => {
+ out += `${message.author.username}#${message.author.discriminator} (${message.author.id}) [${new Date(message.createdTimestamp).toISOString()}]\n`;
+ const lines = message.content.split("\n");
+ lines.forEach(line => {out += `> ${line}\n`;});
+ out += "\n\n";
+ });
+ const attachmentObject = {
+ attachment: Buffer.from(out),
+ name: `purge-${channel.id}-${Date.now()}.txt`,
+ description: "Purge log"
+ };
+ const m = await interaction.editReply({embeds: [new EmojiEmbed()
+ .setEmoji("CHANNEL.PURGE.GREEN")
+ .setTitle("Purge")
.setDescription("Messages cleared")
.setStatus("Success")
], components: [new Discord.MessageActionRow().addComponents([
@@ -177,29 +174,29 @@
.setLabel("Download transcript")
.setStyle("SUCCESS")
.setEmoji(getEmojiByName("CONTROL.DOWNLOAD", "id"))
- ])]})
+ ])]});
let component;
try {
component = await (m as Discord.Message).awaitMessageComponent({filter: (m) => m.user.id === interaction.user.id, time: 300000});
- } catch {}
+ } catch { return; }
if (component && component.customId === "download") {
interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.GREEN")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("Uploaded")
.setStatus("Success")
- ], components: [], files: [attachmentObject]})
+ ], components: [], files: [attachmentObject]});
} else {
interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.GREEN")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("Messages cleared")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
- return
+ return;
} else {
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.PURGE.RED")
.setTitle("Purge")
.setDescription(keyValueList({
@@ -208,69 +205,66 @@
"reason": `\n> ${interaction.options.getString("reason") ? interaction.options.getString("reason") : "*No reason provided*"}`
}))
.setColor("Danger")
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (confirmation.success) {
let messages;
try {
if (!user) {
- let toDelete = await (interaction.channel as TextChannel).messages.fetch({limit: interaction.options.getInteger("amount")})
+ const toDelete = await (interaction.channel as TextChannel).messages.fetch({limit: interaction.options.getInteger("amount")});
messages = await (channel as TextChannel).bulkDelete(toDelete, true);
} else {
- let toDelete = (await (await (interaction.channel as TextChannel).messages.fetch({limit: 100}))
- .filter(m => m.author.id === user.id)).first(interaction.options.getInteger("amount"))
+ const toDelete = (await (await (interaction.channel as TextChannel).messages.fetch({limit: 100}))
+ .filter(m => m.author.id === user.id)).first(interaction.options.getInteger("amount"));
messages = await (channel as TextChannel).bulkDelete(toDelete, true);
}
} catch(e) {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.RED")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("Something went wrong and no messages were deleted")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
if (user) {
- try { await client.database.history.create("purge", interaction.guild.id, user, interaction.options.getString("reason"), null, null, messages.size) } catch {}
+ await client.database.history.create("purge", interaction.guild.id, user, interaction.options.getString("reason"), null, null, messages.size);
}
- let attachmentObject;
- try {
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- let data = {
- meta: {
- type: 'channelPurge',
- displayName: 'Channel Purged',
- calculateType: 'messageDelete',
- color: NucleusColors.red,
- emoji: "PUNISH.BAN.RED",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- purgedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(interaction.channel.id, renderChannel(interaction.channel)),
- messagesCleared: entry(messages.size, messages.size),
- },
- hidden: {
- guild: interaction.guild.id
- }
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta: {
+ type: "channelPurge",
+ displayName: "Channel Purged",
+ calculateType: "messageDelete",
+ color: NucleusColors.red,
+ emoji: "PUNISH.BAN.RED",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ purgedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(interaction.channel.id, renderChannel(interaction.channel)),
+ messagesCleared: entry(messages.size, messages.size)
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- let out = ""
- messages.reverse().forEach(message => {
- out += `${message.author.username}#${message.author.discriminator} (${message.author.id}) [${new Date(message.createdTimestamp).toISOString()}]\n`
- let lines = message.content.split("\n")
- lines.forEach(line => {out += `> ${line}\n`})
- out += `\n\n`
- })
- attachmentObject = {
- attachment: Buffer.from(out),
- name: `purge-${channel.id}-${Date.now()}.txt`,
- description: `Purge log`
- }
- } catch {}
- let m = await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`CHANNEL.PURGE.GREEN`)
- .setTitle(`Purge`)
+ };
+ log(data);
+ let out = "";
+ messages.reverse().forEach(message => {
+ out += `${message.author.username}#${message.author.discriminator} (${message.author.id}) [${new Date(message.createdTimestamp).toISOString()}]\n`;
+ const lines = message.content.split("\n");
+ lines.forEach(line => {out += `> ${line}\n`;});
+ out += "\n\n";
+ });
+ const attachmentObject = {
+ attachment: Buffer.from(out),
+ name: `purge-${channel.id}-${Date.now()}.txt`,
+ description: "Purge log"
+ };
+ const m = await interaction.editReply({embeds: [new EmojiEmbed()
+ .setEmoji("CHANNEL.PURGE.GREEN")
+ .setTitle("Purge")
.setDescription("Messages cleared")
.setStatus("Success")
], components: [new Discord.MessageActionRow().addComponents([
@@ -279,48 +273,48 @@
.setLabel("Download transcript")
.setStyle("SUCCESS")
.setEmoji(getEmojiByName("CONTROL.DOWNLOAD", "id"))
- ])]})
+ ])]});
let component;
try {
component = await (m as Discord.Message).awaitMessageComponent({filter: (m) => m.user.id === interaction.user.id, time: 300000});
- } catch {}
+ } catch { return; }
if (component && component.customId === "download") {
interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.GREEN")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("Transcript uploaded above")
.setStatus("Success")
- ], components: [], files: [attachmentObject]})
+ ], components: [], files: [attachmentObject]});
} else {
interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.GREEN")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("Messages cleared")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.PURGE.GREEN")
- .setTitle(`Purge`)
+ .setTitle("Purge")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
// Check if nucleus has the manage_messages permission
if (! me.permissions.has("MANAGE_MESSAGES")) throw "I do not have the *Manage Messages* permission";
// Allow the owner to purge
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has manage_messages permission
if (! member.permissions.has("MANAGE_MESSAGES")) throw "You do not have the *Manage Messages* permission";
// Allow purge
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/slowmode.ts b/src/commands/mod/slowmode.ts
index 6b33e12..951dc53 100644
--- a/src/commands/mod/slowmode.ts
+++ b/src/commands/mod/slowmode.ts
@@ -1,4 +1,4 @@
-import humanizeDuration from 'humanize-duration';
+import humanizeDuration from "humanize-duration";
import { CommandInteraction, GuildMember, TextChannel } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
@@ -9,64 +9,64 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("slowmode")
- .setDescription("Manages slowmode in a channel")
- .addStringOption(option => option.setName("time").setDescription("The delay between messages").setRequired(false).addChoices([
- ["Off", "0"],
- ["5 seconds", "5"], ["10 seconds", "10"], ["15 seconds", "15"], ["30 seconds", "30"],
- ["1 minute", "60"], ["2 minutes", "120"], ["5 minutes", "300"], ["10 minutes", "600"],
- ["15 minutes", "900"], ["30 minutes", "1800"],
- ["1 hour", "3600"], ["2 hours", "7200"], ["6 hours", "21600"]
- ]))
+ .setName("slowmode")
+ .setDescription("Manages slowmode in a channel")
+ .addStringOption(option => option.setName("time").setDescription("The delay between messages").setRequired(false).addChoices([
+ ["Off", "0"],
+ ["5 seconds", "5"], ["10 seconds", "10"], ["15 seconds", "15"], ["30 seconds", "30"],
+ ["1 minute", "60"], ["2 minutes", "120"], ["5 minutes", "300"], ["10 minutes", "600"],
+ ["15 minutes", "900"], ["30 minutes", "1800"],
+ ["1 hour", "3600"], ["2 hours", "7200"], ["6 hours", "21600"]
+ ]));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let time = parseInt(interaction.options.getString("time") ?? "0");
- if (time === 0 && (interaction.channel as TextChannel).rateLimitPerUser === 0) { time = 10 }
- let confirmation = await new confirmationMessage(interaction)
+ if (time === 0 && (interaction.channel as TextChannel).rateLimitPerUser === 0) { time = 10; }
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.SLOWMODE.OFF")
.setTitle("Slowmode")
.setDescription(keyValueList({
- "time": time ? humanizeDuration(time * 1000, { round: true }) : "No delay",
+ "time": time ? humanizeDuration(time * 1000, { round: true }) : "No delay"
})
- + `Are you sure you want to set the slowmode in this channel?`)
+ + "Are you sure you want to set the slowmode in this channel?")
.setColor("Danger")
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- (interaction.channel as TextChannel).setRateLimitPerUser(time)
+ (interaction.channel as TextChannel).setRateLimitPerUser(time);
} catch (e) {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.SLOWMODE.OFF")
- .setTitle(`Slowmode`)
+ .setTitle("Slowmode")
.setDescription("Something went wrong while setting the slowmode")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`CHANNEL.SLOWMODE.ON`)
- .setTitle(`Slowmode`)
+ .setEmoji("CHANNEL.SLOWMODE.ON")
+ .setTitle("Slowmode")
.setDescription("The channel slowmode was set successfully")
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.SLOWMODE.ON")
- .setTitle(`Slowmode`)
+ .setTitle("Slowmode")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
+ const member = (interaction.member as GuildMember);
// Check if Nucleus can set the slowmode
if (! interaction.guild.me.permissions.has("MANAGE_CHANNELS")) throw "I do not have the *Manage Channels* permission";
// Check if the user has manage_channel permission
if (! member.permissions.has("MANAGE_CHANNELS")) throw "You do not have the *Manage Channels* permission";
// Allow slowmode
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/softban.ts b/src/commands/mod/softban.ts
index 43d03fd..88ba531 100644
--- a/src/commands/mod/softban.ts
+++ b/src/commands/mod/softban.ts
@@ -9,43 +9,43 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("softban")
- .setDescription("Kicks a user and deletes their messages")
- .addUserOption(option => option.setName("user").setDescription("The user to softban").setRequired(true))
- .addIntegerOption(option => option.setName("delete").setDescription("The days of messages to delete | Default: 0").setMinValue(0).setMaxValue(7).setRequired(false))
+ .setName("softban")
+ .setDescription("Kicks a user and deletes their messages")
+ .addUserOption(option => option.setName("user").setDescription("The user to softban").setRequired(true))
+ .addIntegerOption(option => option.setName("delete").setDescription("The days of messages to delete | Default: 0").setMinValue(0).setMaxValue(7).setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
+ const { renderUser } = client.logger;
// TODO:[Modals] Replace this with a modal
let reason = null;
let notify = true;
let confirmation;
while (true) {
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("PUNISH.BAN.RED")
.setTitle("Softban")
.setDescription(keyValueList({
"user": renderUser(interaction.options.getUser("user")),
"reason": reason ? ("\n> " + ((reason ?? "").replaceAll("\n", "\n> "))) : "*No reason provided*"
})
- + `The user **will${notify ? '' : ' not'}** be notified\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n`
+ `${addPlural(interaction.options.getInteger("delete") ? interaction.options.getInteger("delete") : 0, "day")} of messages will be deleted\n\n`
+ `Are you sure you want to softban <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger")
.addCustomBoolean("notify", "Notify user", false, null, null, "ICONS.NOTIFY." + (notify ? "ON" : "OFF" ), notify)
.addReasonButton(reason ?? "")
- .send(reason !== null)
- reason = reason ?? ""
- if (confirmation.cancelled) return
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
+ .send(reason !== null);
+ reason = reason ?? "";
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) {
- notify = confirmation.components.notify.active
+ notify = confirmation.components.notify.active;
}
}
if (confirmation.success) {
let dmd = false;
- let config = await client.database.guilds.read(interaction.guild.id);
+ const config = await client.database.guilds.read(interaction.guild.id);
try {
if (notify) {
await (interaction.options.getMember("user") as GuildMember).send({
@@ -61,11 +61,11 @@
.setLabel(config.moderation.ban.text)
.setURL(config.moderation.ban.link)
] : [])]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
- let member = (interaction.options.getMember("user") as GuildMember)
+ } catch { dmd = false;}
+ const member = (interaction.options.getMember("user") as GuildMember);
try {
await member.ban({
days: Number(interaction.options.getInteger("delete") ?? 0),
@@ -75,53 +75,53 @@
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.BAN.RED")
- .setTitle(`Softban`)
+ .setTitle("Softban")
.setDescription("Something went wrong and the user was not softbanned")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
- try { await client.database.history.create("softban", interaction.guild.id, member.user, reason) } catch {}
- let failed = (dmd === false && notify)
+ await client.database.history.create("softban", interaction.guild.id, member.user, reason);
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.BAN.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Softban`)
+ .setTitle("Softban")
.setDescription("The member was softbanned" + (failed ? ", but could not be notified" : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.BAN.GREEN")
- .setTitle(`Softban`)
+ .setTitle("Softban")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow softbanning the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot softban the owner of the server"
+ if (member.id === interaction.guild.ownerId) throw "You cannot softban the owner of the server";
// Check if Nucleus can ban the member
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to ban
if (!me.permissions.has("BAN_MEMBERS")) throw "I do not have the *Ban Members* permission";
// Do not allow softbanning Nucleus
- if (member.id === me.id) throw "I cannot softban myself"
+ if (member.id === me.id) throw "I cannot softban myself";
// Allow the owner to softban anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has ban_members permission
if (! member.permissions.has("BAN_MEMBERS")) throw "You do not have the *Ban Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow softban
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/unban.ts b/src/commands/mod/unban.ts
index 2605d28..faf1f08 100644
--- a/src/commands/mod/unban.ts
+++ b/src/commands/mod/unban.ts
@@ -8,46 +8,46 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("unban")
- .setDescription("Unbans a user")
- .addStringOption(option => option.setName("user").setDescription("The user to unban (Username or ID)").setRequired(true))
+ .setName("unban")
+ .setDescription("Unbans a user")
+ .addStringOption(option => option.setName("user").setDescription("The user to unban (Username or ID)").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let bans = await interaction.guild.bans.fetch()
- let user = interaction.options.getString("user")
- let resolved = bans.find(ban => ban.user.id === user)
- if (!resolved) resolved = bans.find(ban => ban.user.username.toLowerCase() === user.toLowerCase())
- if (!resolved) resolved = bans.find(ban => ban.user.tag.toLowerCase() === user.toLowerCase())
+ const bans = await interaction.guild.bans.fetch();
+ const user = interaction.options.getString("user");
+ let resolved = bans.find(ban => ban.user.id === user);
+ if (!resolved) resolved = bans.find(ban => ban.user.username.toLowerCase() === user.toLowerCase());
+ if (!resolved) resolved = bans.find(ban => ban.user.tag.toLowerCase() === user.toLowerCase());
if (!resolved) {
return interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Unban")
.setDescription(`Could not find any user called \`${user}\``)
.setEmoji("PUNISH.UNBAN.RED")
.setStatus("Danger")
- ], ephemeral: true})
+ ], ephemeral: true});
}
// TODO:[Modals] Replace this with a modal
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("PUNISH.UNBAN.RED")
.setTitle("Unban")
.setDescription(keyValueList({
- "user": `${resolved.user.username} [<@${resolved.user.id}>]`,
+ "user": `${resolved.user.username} [<@${resolved.user.id}>]`
})
+ `Are you sure you want to unban <@${resolved.user.id}>?`)
.setColor("Danger")
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
await interaction.guild.members.unban(resolved.user as User, "Unban");
- let member = (resolved.user as User)
- try { await client.database.history.create("unban", interaction.guild.id, member, interaction.user) } catch {}
- const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger
- let data = {
+ const member = (resolved.user as User);
+ await client.database.history.create("unban", interaction.guild.id, member, interaction.user);
+ const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
+ const data = {
meta: {
- type: 'memberUnban',
- displayName: 'Member Unbanned',
- calculateType: 'guildMemberPunish',
+ type: "memberUnban",
+ displayName: "Member Unbanned",
+ calculateType: "guildMemberPunish",
color: NucleusColors.green,
emoji: "PUNISH.BAN.GREEN",
timestamp: new Date().getTime()
@@ -57,48 +57,48 @@
name: entry(member.id, renderUser(member)),
unbanned: entry(new Date().getTime(), renderDelta(new Date().getTime())),
unbannedBy: entry(interaction.user.id, renderUser(interaction.user)),
- accountCreated: entry(member.createdAt, renderDelta(member.createdAt)),
+ accountCreated: entry(member.createdAt, renderDelta(member.createdAt))
},
hidden: {
guild: interaction.guild.id
}
- }
+ };
log(data);
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.UNBAN.RED")
- .setTitle(`Unban`)
+ .setTitle("Unban")
.setDescription("Something went wrong and the user was not unbanned")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.UNBAN.GREEN`)
- .setTitle(`Unban`)
+ .setEmoji("PUNISH.UNBAN.GREEN")
+ .setTitle("Unban")
.setDescription("The member was unbanned")
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.UNBAN.GREEN")
- .setTitle(`Unban`)
+ .setTitle("Unban")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
// Check if Nucleus can unban members
if (! me.permissions.has("BAN_MEMBERS")) throw "I do not have the *Ban Members* permission";
// Allow the owner to unban anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has ban_members permission
if (! member.permissions.has("BAN_MEMBERS")) throw "You do not have the *Ban Members* permission";
// Allow unban
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/unmute.ts b/src/commands/mod/unmute.ts
index 6451837..e00c16d 100644
--- a/src/commands/mod/unmute.ts
+++ b/src/commands/mod/unmute.ts
@@ -8,12 +8,12 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("unmute")
- .setDescription("Unmutes a user")
- .addUserOption(option => option.setName("user").setDescription("The user to unmute").setRequired(true))
+ .setName("unmute")
+ .setDescription("Unmutes a user")
+ .addUserOption(option => option.setName("user").setDescription("The user to unmute").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger
+ const { log, NucleusColors, renderUser, entry, renderDelta } = client.logger;
// TODO:[Modals] Replace this with a modal
let reason = null;
let notify = false;
@@ -26,20 +26,20 @@
"user": renderUser(interaction.options.getUser("user")),
"reason": `\n> ${reason ? reason : "*No reason provided*"}`
})
- + `The user **will${notify ? '' : ' not'}** be notified\n\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n\n`
+ `Are you sure you want to unmute <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger")
.addReasonButton(reason ?? "")
- .send(reason !== null)
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
+ .send(reason !== null);
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) {
- notify = confirmation.components.notify.active
+ notify = confirmation.components.notify.active;
}
}
- if (confirmation.cancelled) return
+ if (confirmation.cancelled) return;
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
let dm;
try {
if (notify) {
@@ -51,29 +51,29 @@
(reason ? ` for:\n> ${reason}` : " with no reason provided."))
.setStatus("Success")
]
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
- let member = (interaction.options.getMember("user") as GuildMember)
+ } catch { dmd = false; }
+ const member = (interaction.options.getMember("user") as GuildMember);
try {
- member.timeout(0, reason || "No reason provided")
+ member.timeout(0, reason || "No reason provided");
} catch {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.MUTE.RED")
- .setTitle(`Unmute`)
+ .setTitle("Unmute")
.setDescription("Something went wrong and the user was not unmuted")
.setStatus("Danger")
- ], components: []})
- if (dmd) await dm.delete()
- return
+ ], components: []});
+ if (dmd) await dm.delete();
+ return;
}
- try { await client.database.history.create("unmute", interaction.guild.id, (interaction.options.getMember("user") as GuildMember).user, interaction.user, reason) } catch {}
- let data = {
+ await client.database.history.create("unmute", interaction.guild.id, (interaction.options.getMember("user") as GuildMember).user, interaction.user, reason);
+ const data = {
meta: {
- type: 'memberUnmute',
- displayName: 'Unmuted',
- calculateType: 'guildMemberPunish',
+ type: "memberUnmute",
+ displayName: "Unmuted",
+ calculateType: "guildMemberPunish",
color: NucleusColors.green,
emoji: "PUNISH.MUTE.GREEN",
timestamp: new Date().getTime()
@@ -82,52 +82,52 @@
memberId: entry(member.user.id, `\`${member.user.id}\``),
name: entry(member.user.id, renderUser(member.user)),
unmuted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
- unmutedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ unmutedBy: entry(interaction.user.id, renderUser(interaction.user))
},
hidden: {
guild: interaction.guild.id
}
- }
+ };
log(data);
- let failed = (dmd === false && notify)
+ const failed = (dmd === false && notify);
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji(`PUNISH.MUTE.${failed ? "YELLOW" : "GREEN"}`)
- .setTitle(`Unmute`)
+ .setTitle("Unmute")
.setDescription("The member was unmuted" + (failed ? ", but could not be notified" : ""))
.setStatus(failed ? "Warning" : "Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.MUTE.GREEN")
- .setTitle(`Unmute`)
+ .setTitle("Unmute")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow unmuting the owner
- if (member.id === interaction.guild.ownerId) throw "You cannot unmute the owner of the server"
+ if (member.id === interaction.guild.ownerId) throw "You cannot unmute the owner of the server";
// Check if Nucleus can unmute the member
- if (! (mePos > applyPos)) throw "I do not have a role higher than that member"
+ if (! (mePos > applyPos)) throw "I do not have a role higher than that member";
// Check if Nucleus has permission to unmute
if (! me.permissions.has("MODERATE_MEMBERS")) throw "I do not have the *Moderate Members* permission";
// Allow the owner to unmute anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has moderate_members permission
if (! member.permissions.has("MODERATE_MEMBERS")) throw "You do not have the *Moderate Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow unmute
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/viewas.ts b/src/commands/mod/viewas.ts
index 2f5cacc..a5bf5ea 100644
--- a/src/commands/mod/viewas.ts
+++ b/src/commands/mod/viewas.ts
@@ -7,40 +7,40 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("viewas")
- .setDescription("View the server as a specific member")
- .addUserOption(option => option.setName("member").setDescription("The member to view as").setRequired(true))
+ .setName("viewas")
+ .setDescription("View the server as a specific member")
+ .addUserOption(option => option.setName("member").setDescription("The member to view as").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let channels = [];
let m;
interaction.guild.channels.cache.forEach(channel => {
- if (!channel.parent && channel.type !== "GUILD_CATEGORY") channels.push(channel)
- })
- channels = [channels]
+ if (!channel.parent && channel.type !== "GUILD_CATEGORY") channels.push(channel);
+ });
+ channels = [channels];
channels = channels.concat(interaction.guild.channels.cache
.filter(c => c.type === "GUILD_CATEGORY")
.map(c => (c as CategoryChannel).children.map(c => c))
- )
- let autoSortBelow = ["GUILD_VOICE", "GUILD_STAGE_VOICE"]
+ );
+ const autoSortBelow = ["GUILD_VOICE", "GUILD_STAGE_VOICE"];
channels = channels.map(c => c.sort((a, b) => {
- if (autoSortBelow.includes(a.type) && autoSortBelow.includes(b.type)) return a.position - b.position
- if (autoSortBelow.includes(a.type)) return 1
- if (autoSortBelow.includes(b.type)) return -1
- return a.position - b.position
- }))
+ if (autoSortBelow.includes(a.type) && autoSortBelow.includes(b.type)) return a.position - b.position;
+ if (autoSortBelow.includes(a.type)) return 1;
+ if (autoSortBelow.includes(b.type)) return -1;
+ return a.position - b.position;
+ }));
// Sort all arrays by the position of the first channels parent position
channels = channels.sort((a, b) => {
- if (!a[0].parent) return -1
- if (!b[0].parent) return 1
- return a[0].parent.position - b[0].parent.position
- })
- let member = interaction.options.getMember("member") as Discord.GuildMember
+ if (!a[0].parent) return -1;
+ if (!b[0].parent) return 1;
+ return a[0].parent.position - b[0].parent.position;
+ });
+ const member = interaction.options.getMember("member") as Discord.GuildMember;
m = await interaction.reply({embeds: [new EmojiEmbed()
.setEmoji("MEMBER.JOIN")
.setTitle("Viewing as " + member.displayName)
.setStatus("Success")
- ], ephemeral: true, fetchReply: true})
+ ], ephemeral: true, fetchReply: true});
let page = 0;
while (true) {
m = await interaction.editReply({embeds: [new EmojiEmbed()
@@ -50,17 +50,17 @@
.setDescription(
`**${channels[page][0].parent ? channels[page][0].parent.name : "Uncategorised"}**` + "\n" +
channels[page].map(c => {
- let channelType = c.type
- if (interaction.guild.rulesChannelId === c.id) channelType = "RULES"
- else if ("nsfw" in c && c.nsfw) channelType += "_NSFW"
+ let channelType = c.type;
+ if (interaction.guild.rulesChannelId === c.id) channelType = "RULES";
+ else if ("nsfw" in c && c.nsfw) channelType += "_NSFW";
return c.permissionsFor(member).has("VIEW_CHANNEL") ? (
`${getEmojiByName("ICONS.CHANNEL." + channelType)} ${c.name}\n` + (() => {
if ("threads" in c && c.threads.cache.size > 0) {
return c.threads.cache.map(t => ` ${
getEmojiByName("ICONS.CHANNEL.THREAD_PIPE") + " " +
- getEmojiByName("ICONS.CHANNEL.THREAD_CHANNEL")} ${t.name}`).join("\n") + "\n"
- }return ""
- })()) : ""
+ getEmojiByName("ICONS.CHANNEL.THREAD_CHANNEL")} ${t.name}`).join("\n") + "\n";
+ }return "";
+ })()) : "";
}).join("") + "\n" + pageIndicator(channels.length, page)
)
], components: [
@@ -83,23 +83,23 @@
.setStyle("PRIMARY")
.setCustomId("next")
])
- ]})
+ ]});
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { return }
- i.deferUpdate()
+ } catch (e) { return; }
+ i.deferUpdate();
if (i.customId === "next") { page++; }
else if (i.customId === "previous") { page--; }
else if (i.customId === "select") { page = parseInt(i.values[0]); }
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
+ const member = (interaction.member as GuildMember);
if (! member.permissions.has("MANAGE_ROLES")) throw "You do not have the *Manage Roles* permission";
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/mod/warn.ts b/src/commands/mod/warn.ts
index b007b29..0648f66 100644
--- a/src/commands/mod/warn.ts
+++ b/src/commands/mod/warn.ts
@@ -5,16 +5,16 @@
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import keyValueList from "../../utils/generateKeyValueList.js";
import { create, areTicketsEnabled } from "../../actions/createModActionTicket.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("warn")
- .setDescription("Warns a user")
- .addUserOption(option => option.setName("user").setDescription("The user to warn").setRequired(true))
+ .setName("warn")
+ .setDescription("Warns a user")
+ .addUserOption(option => option.setName("user").setDescription("The user to warn").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { log, NucleusColors, renderUser, entry } = client.logger
+ const { log, NucleusColors, renderUser, entry } = client.logger;
// TODO:[Modals] Replace this with a modal
let reason = null;
let notify = true;
@@ -28,7 +28,7 @@
"user": renderUser(interaction.options.getUser("user")),
"reason": reason ? ("\n> " + ((reason ?? "").replaceAll("\n", "\n> "))) : "*No reason provided*"
})
- + `The user **will${notify ? '' : ' not'}** be notified\n\n`
+ + `The user **will${notify ? "" : " not"}** be notified\n\n`
+ `Are you sure you want to warn <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger")
.addCustomBoolean(
@@ -37,28 +37,28 @@
"An appeal ticket will be created when Confirm is clicked", "CONTROL.TICKET", createAppealTicket)
.addCustomBoolean("notify", "Notify user", false, null, null, "ICONS.NOTIFY." + (notify ? "ON" : "OFF" ), notify)
.addReasonButton(reason ?? "")
- .send(reason !== null)
- reason = reason ?? ""
- if (confirmation.cancelled) return
- if (confirmation.success) break
- if (confirmation.newReason) reason = confirmation.newReason
+ .send(reason !== null);
+ reason = reason ?? "";
+ if (confirmation.cancelled) return;
+ if (confirmation.success) break;
+ if (confirmation.newReason) reason = confirmation.newReason;
if (confirmation.components) {
- notify = confirmation.components.notify.active
- createAppealTicket = confirmation.components.appeal.active
+ notify = confirmation.components.notify.active;
+ createAppealTicket = confirmation.components.appeal.active;
}
}
if (confirmation.success) {
- let dmd = false
+ let dmd = false;
try {
if (notify) {
- const config = await client.database.guilds.read(interaction.guild.id)
+ const config = await client.database.guilds.read(interaction.guild.id);
await (interaction.options.getMember("user") as GuildMember).send({
embeds: [new EmojiEmbed()
.setEmoji("PUNISH.WARN.RED")
.setTitle("Warned")
.setDescription(`You have been warned in ${interaction.guild.name}` +
(reason ? ` for:\n> ${reason}` : ".") + "\n\n" +
- (confirmation.components.appeal.response ? `You can appeal this here ticket: <#${confirmation.components.appeal.response}>` : ``))
+ (confirmation.components.appeal.response ? `You can appeal this here ticket: <#${confirmation.components.appeal.response}>` : ""))
.setStatus("Danger")
.setFooter({
text: config.moderation.warn.text ? "The button below is set by the server admins. Do not enter any passwords or other account details on the linked site." : "",
@@ -70,17 +70,17 @@
.setLabel(config.moderation.warn.text)
.setURL(config.moderation.warn.link)
])] : []
- })
- dmd = true
+ });
+ dmd = true;
}
- } catch {}
- let data = {
+ } catch { dmd = false; }
+ const data = {
meta:{
- type: 'memberWarn',
- displayName: 'Member warned',
- calculateType: 'guildMemberPunish',
+ type: "memberWarn",
+ displayName: "Member warned",
+ calculateType: "guildMemberPunish",
color: NucleusColors.yellow,
- emoji: 'PUNISH.WARN.YELLOW',
+ emoji: "PUNISH.WARN.YELLOW",
timestamp: new Date().getTime()
},
list: {
@@ -91,27 +91,27 @@
hidden: {
guild: interaction.guild.id
}
- }
- try { await client.database.history.create(
+ };
+ await client.database.history.create(
"warn", interaction.guild.id,
(interaction.options.getMember("user") as GuildMember).user,
interaction.user, reason
- )} catch {}
+ );
log(data);
- let failed = (dmd === false && notify)
+ const failed = (dmd === false && notify);
if (!failed) {
await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.GREEN`)
- .setTitle(`Warn`)
- .setDescription("The user was warned" + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ``))
+ .setEmoji("PUNISH.WARN.GREEN")
+ .setTitle("Warn")
+ .setDescription("The user was warned" + (confirmation.components.appeal.response ? ` and an appeal ticket was opened in <#${confirmation.components.appeal.response}>` : ""))
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else {
- let canSeeChannel = (interaction.options.getMember("user") as GuildMember).permissionsIn(interaction.channel as Discord.TextChannel).has("VIEW_CHANNEL")
- let m = await interaction.editReply({
+ const canSeeChannel = (interaction.options.getMember("user") as GuildMember).permissionsIn(interaction.channel as Discord.TextChannel).has("VIEW_CHANNEL");
+ const m = await interaction.editReply({
embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.RED`)
- .setTitle(`Warn`)
+ .setEmoji("PUNISH.WARN.RED")
+ .setTitle("Warn")
.setDescription("The user's DMs are not open\n\nWhat would you like to do?")
.setStatus("Danger")
], components: [
@@ -131,89 +131,89 @@
.setStyle(canSeeChannel ? "SECONDARY" : "PRIMARY")
])
]
- })
+ });
let component;
try {
component = await (m as Discord.Message).awaitMessageComponent({filter: (m) => m.user.id === interaction.user.id, time: 300000});
} catch (e) {
return await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.GREEN`)
- .setTitle(`Warn`)
+ .setEmoji("PUNISH.WARN.GREEN")
+ .setTitle("Warn")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
if ( component.customId === "here" ) {
await interaction.channel.send({
embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.RED`)
- .setTitle(`Warn`)
- .setDescription(`You have been warned` +
+ .setEmoji("PUNISH.WARN.RED")
+ .setTitle("Warn")
+ .setDescription("You have been warned" +
(reason ? ` for:\n> ${reason}` : "."))
.setStatus("Danger")
],
content: `<@!${(interaction.options.getMember("user") as GuildMember).id}>`,
allowedMentions: {users: [(interaction.options.getMember("user") as GuildMember).id]}
- })
+ });
return await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.GREEN`)
- .setTitle(`Warn`)
- .setDescription("The user was warned" + (confirmation.response ? ` and an appeal ticket was opened in <#${confirmation.response}>` : ``))
+ .setEmoji("PUNISH.WARN.GREEN")
+ .setTitle("Warn")
+ .setDescription("The user was warned" + (confirmation.response ? ` and an appeal ticket was opened in <#${confirmation.response}>` : ""))
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else if (component.customId === "log") {
await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.GREEN`)
- .setTitle(`Warn`)
+ .setEmoji("PUNISH.WARN.GREEN")
+ .setTitle("Warn")
.setDescription("The warn was logged")
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else if (component.customId === "ticket") {
- let ticketChannel = await create(interaction.guild, interaction.options.getUser("user"), interaction.user, reason, "Warn Notification")
+ const ticketChannel = await create(interaction.guild, interaction.options.getUser("user"), interaction.user, reason, "Warn Notification");
if (ticketChannel === null) {
return await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.RED`)
- .setTitle(`Warn`)
+ .setEmoji("PUNISH.WARN.RED")
+ .setTitle("Warn")
.setDescription("A ticket could not be created")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
await interaction.editReply({embeds: [new EmojiEmbed()
- .setEmoji(`PUNISH.WARN.GREEN`)
- .setTitle(`Warn`)
+ .setEmoji("PUNISH.WARN.GREEN")
+ .setTitle("Warn")
.setDescription(`A ticket was created in <#${ticketChannel}>`)
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
}
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("PUNISH.WARN.GREEN")
- .setTitle(`Warn`)
+ .setTitle("Warn")
.setDescription("No changes were made")
.setStatus("Success")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
- let memberPos = member.roles ? member.roles.highest.position : 0
- let mePos = me.roles ? me.roles.highest.position : 0
- let applyPos = apply.roles ? apply.roles.highest.position : 0
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
+ const memberPos = member.roles ? member.roles.highest.position : 0;
+ const mePos = me.roles ? me.roles.highest.position : 0;
+ const applyPos = apply.roles ? apply.roles.highest.position : 0;
// Do not allow warning bots
- if (member.user.bot) throw "I cannot warn bots"
+ if (member.user.bot) throw "I cannot warn bots";
// Allow the owner to warn anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has moderate_members permission
if (! member.permissions.has("MODERATE_MEMBERS")) throw "You do not have the *Moderate Members* permission";
// Check if the user is below on the role list
- if (! (memberPos > applyPos)) throw "You do not have a role higher than that member"
+ if (! (memberPos > applyPos)) throw "You do not have a role higher than that member";
// Allow warn
- return true
-}
+ return true;
+};
export { command, callback, check };
\ No newline at end of file
diff --git a/src/commands/nucleus/guide.ts b/src/commands/nucleus/guide.ts
index 5f2cde2..507730b 100644
--- a/src/commands/nucleus/guide.ts
+++ b/src/commands/nucleus/guide.ts
@@ -7,17 +7,17 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("guide")
- .setDescription("Shows the welcome guide for the bot")
+ .setName("guide")
+ .setDescription("Shows the welcome guide for the bot");
const callback = async (interaction) => {
- guide(interaction.guild, interaction)
-}
+ guide(interaction.guild, interaction);
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- return true
-}
+ return true;
+};
export { command };
export { callback };
diff --git a/src/commands/nucleus/invite.ts b/src/commands/nucleus/invite.ts
index 96e1449..5a1ea59 100644
--- a/src/commands/nucleus/invite.ts
+++ b/src/commands/nucleus/invite.ts
@@ -2,12 +2,12 @@
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("invite")
- .setDescription("Invites Nucleus to your server")
+ .setName("invite")
+ .setDescription("Invites Nucleus to your server");
const callback = async (interaction: CommandInteraction): Promise<any> => {
interaction.reply({embeds: [new EmojiEmbed()
@@ -20,11 +20,11 @@
.setStyle("LINK")
.setURL(`https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=295157886134&scope=bot%20applications.commands`)
])], ephemeral: true});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/nucleus/ping.ts b/src/commands/nucleus/ping.ts
index 6353843..c153e19 100644
--- a/src/commands/nucleus/ping.ts
+++ b/src/commands/nucleus/ping.ts
@@ -1,21 +1,21 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import { CommandInteraction } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import { WrappedCheck } from "jshaiku";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("ping")
- .setDescription("Gets the bot's ping time")
+ .setName("ping")
+ .setDescription("Gets the bot's ping time");
const callback = async (interaction: CommandInteraction): Promise<any> => {
// WEBSOCKET | Nucleus -> Discord
// EDITING | Nucleus -> discord -> nucleus | edit time / 2
- let initial = new Date().getTime();
+ const initial = new Date().getTime();
await interaction.reply({embeds: LoadingEmbed, ephemeral: true});
- let ping = new Date().getTime() - initial;
+ const ping = new Date().getTime() - initial;
interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Ping")
.setDescription(
@@ -25,12 +25,12 @@
)
.setEmoji("CHANNEL.SLOWMODE.OFF")
.setStatus("Danger")
- ]})
-}
+ ]});
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/nucleus/premium.ts b/src/commands/nucleus/premium.ts
index 9d273b9..c8c0f76 100644
--- a/src/commands/nucleus/premium.ts
+++ b/src/commands/nucleus/premium.ts
@@ -5,8 +5,8 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("premium")
- .setDescription("Information about Nucleus Premium")
+ .setName("premium")
+ .setDescription("Information about Nucleus Premium");
const callback = async (interaction: CommandInteraction): Promise<any> => {
interaction.reply({embeds: [new EmojiEmbed()
@@ -20,11 +20,11 @@
.setEmoji("NUCLEUS.LOGO")
.setStatus("Danger")
], ephemeral: true});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/nucleus/stats.ts b/src/commands/nucleus/stats.ts
index beea94b..98b87be 100644
--- a/src/commands/nucleus/stats.ts
+++ b/src/commands/nucleus/stats.ts
@@ -2,12 +2,12 @@
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("stats")
- .setDescription("Gets the bot's stats")
+ .setName("stats")
+ .setDescription("Gets the bot's stats");
const callback = async (interaction: CommandInteraction): Promise<any> => {
interaction.reply({
@@ -22,11 +22,11 @@
], ephemeral: true
});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/nucleus/suggest.ts b/src/commands/nucleus/suggest.ts
index 0c596ff..238e7d5 100644
--- a/src/commands/nucleus/suggest.ts
+++ b/src/commands/nucleus/suggest.ts
@@ -3,55 +3,55 @@
import { WrappedCheck } from "jshaiku";
import confirmationMessage from "../../utils/confirmationMessage.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("suggest")
- .setDescription("Sends a suggestion to the developers")
- .addStringOption(option => option.setName("suggestion").setDescription("The suggestion to send").setRequired(true))
+ .setName("suggest")
+ .setDescription("Sends a suggestion to the developers")
+ .addStringOption(option => option.setName("suggestion").setDescription("The suggestion to send").setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
- let suggestion = interaction.options.getString("suggestion");
- let confirmation = await new confirmationMessage(interaction)
+ const { renderUser } = client.logger;
+ const suggestion = interaction.options.getString("suggestion");
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("ICONS.OPP.ADD")
.setTitle("Suggest")
.setDescription(`**Suggestion:**\n> ${suggestion}\n`
- + `Your username and ID will also be sent with your suggestion.\n\nAre you sure you want to send this suggestion?`)
+ + "Your username and ID will also be sent with your suggestion.\n\nAre you sure you want to send this suggestion?")
.setColor("Danger")
.setInverted(true)
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (confirmation.success) {
- await (client.channels.cache.get('955161206459600976') as Discord.TextChannel).send({
+ await (client.channels.cache.get("955161206459600976") as Discord.TextChannel).send({
embeds: [
new EmojiEmbed()
- .setTitle(`Suggestion`)
+ .setTitle("Suggestion")
.setDescription(`**From:** ${renderUser(interaction.member.user)}\n**Suggestion:**\n> ${suggestion}`)
.setStatus("Danger")
.setEmoji("NUCLEUS.LOGO")
]
- })
+ });
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("ICONS.ADD")
- .setTitle(`Suggest`)
+ .setTitle("Suggest")
.setDescription("Your suggestion was sent successfully")
.setStatus("Success")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("ICONS.OPP.ADD")
- .setTitle(`Suggest`)
+ .setTitle("Suggest")
.setDescription("No changes were made")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/privacy.ts b/src/commands/privacy.ts
index 81d1503..ca56fcd 100644
--- a/src/commands/privacy.ts
+++ b/src/commands/privacy.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import { SelectMenuOption, SlashCommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
@@ -11,13 +11,13 @@
const command = new SlashCommandBuilder()
.setName("privacy")
- .setDescription("Information and options for you and your server's settings")
+ .setDescription("Information and options for you and your server's settings");
class Embed {
embed: Discord.MessageEmbed;
title: string;
- description: string = "";
- pageId: number = 0;
+ description = "";
+ pageId = 0;
components?: MessageActionRow[] = [];
setEmbed(embed: Discord.MessageEmbed) { this.embed = embed; return this; }
setTitle(title: string) { this.title = title; return this; }
@@ -27,7 +27,7 @@
}
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let pages = [
+ const pages = [
new Embed()
.setEmbed(new EmojiEmbed()
.setTitle("Nucleus Privacy")
@@ -81,43 +81,43 @@
let nextFooter = null;
while (true) {
- let selectPane = []
+ let selectPane = [];
if (selectPaneOpen) {
- let options = [];
+ const options = [];
pages.forEach(embed => {
options.push(new SelectMenuOption({
label: embed.title,
value: embed.pageId.toString(),
- description: embed.description || "",
- }))
- })
+ description: embed.description || ""
+ }));
+ });
selectPane = [new MessageActionRow().addComponents([
new Discord.MessageSelectMenu()
.addOptions(options)
.setCustomId("page")
.setMaxValues(1)
.setPlaceholder("Choose a page...")
- ])]
+ ])];
}
- let components = selectPane.concat([new MessageActionRow().addComponents([
+ const components = selectPane.concat([new MessageActionRow().addComponents([
new MessageButton().setCustomId("left").setEmoji(getEmojiByName("CONTROL.LEFT", "id")).setStyle("SECONDARY").setDisabled(page === 0),
new MessageButton().setCustomId("select").setEmoji(getEmojiByName("CONTROL.MENU", "id")).setStyle(selectPaneOpen ? "PRIMARY" : "SECONDARY").setDisabled(false),
new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(page === pages.length - 1)
- ])])
- let em = new Discord.MessageEmbed(pages[page].embed)
+ ])]);
+ const em = new Discord.MessageEmbed(pages[page].embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
- em.setFooter({text: nextFooter ?? ""})
+ em.setFooter({text: nextFooter ?? ""});
await interaction.editReply({
embeds: [em],
components: components.concat(pages[page].components)
});
- let i
+ let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
- nextFooter = null
- i.deferUpdate()
+ } catch(e) { break; }
+ nextFooter = null;
+ i.deferUpdate();
if (i.component.customId === "left") {
if (page > 0) page--;
selectPaneOpen = false;
@@ -130,15 +130,15 @@
page = parseInt(i.values[0]);
selectPaneOpen = false;
} else if (i.component.customId === "clear-all-data") {
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CONTROL.BLOCKCROSS")
.setTitle("Clear All Data")
.setDescription(
- `Are you sure you want to delete all data on this server? This includes your settings and all punishment histories.\n\n` +
+ "Are you sure you want to delete all data on this server? This includes your settings and all punishment histories.\n\n" +
"**This cannot be undone.**"
)
.setColor("Danger")
- .send(true)
+ .send(true);
if (confirmation.cancelled) { break; }
if (confirmation.success) {
client.database.guilds.delete(interaction.guild.id);
@@ -150,25 +150,25 @@
continue;
}
} else {
- let em = new Discord.MessageEmbed(pages[page].embed)
- em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page))
+ const em = new Discord.MessageEmbed(pages[page].embed);
+ em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
em.setFooter({text: "Message closed"});
interaction.editReply({embeds: [em], components: []});
- return
+ return;
}
}
- let em = new Discord.MessageEmbed(pages[page].embed)
- em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page))
+ const em = new Discord.MessageEmbed(pages[page].embed);
+ em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
em.setFooter({text: "Message timed out"});
await interaction.editReply({
embeds: [em],
components: []
});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/role/user.ts b/src/commands/role/user.ts
index d361cf1..d2b05e9 100644
--- a/src/commands/role/user.ts
+++ b/src/commands/role/user.ts
@@ -8,21 +8,21 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("user")
- .setDescription("Gives or removes a role from someone")
- .addUserOption(option => option.setName("user").setDescription("The member to give or remove the role from").setRequired(true))
- .addRoleOption(option => option.setName("role").setDescription("The role to give or remove").setRequired(true))
- .addStringOption(option => option.setName("action").setDescription("The action to perform").setRequired(true).addChoices([
- ["Add", "give"],
- ["Remove", "remove"]
- ]))
+ .setName("user")
+ .setDescription("Gives or removes a role from someone")
+ .addUserOption(option => option.setName("user").setDescription("The member to give or remove the role from").setRequired(true))
+ .addRoleOption(option => option.setName("role").setDescription("The role to give or remove").setRequired(true))
+ .addStringOption(option => option.setName("action").setDescription("The action to perform").setRequired(true).addChoices([
+ ["Add", "give"],
+ ["Remove", "remove"]
+ ]));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser, renderRole } = client.logger
- let action = interaction.options.getString("action");
+ const { renderUser, renderRole } = client.logger;
+ const action = interaction.options.getString("action");
// TODO:[Modals] Replace this with a modal
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("GUILD.ROLES.DELETE")
.setTitle("Role")
.setDescription(keyValueList({
@@ -30,16 +30,16 @@
"role": renderRole(interaction.options.getRole("role"))
}) + `\nAre you sure you want to ${action === "give" ? "give the role to" : "remove the role from"} ${interaction.options.getUser("user")}?`)
.setColor("Danger")
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- let member = interaction.options.getMember("user") as GuildMember
- let role = interaction.options.getRole("role") as Role
+ const member = interaction.options.getMember("user") as GuildMember;
+ const role = interaction.options.getRole("role") as Role;
if (interaction.options.getString("action") === "give") {
- member.roles.add(role)
+ member.roles.add(role);
} else {
- member.roles.remove(role)
+ member.roles.remove(role);
}
} catch (e) {
return await interaction.editReply({embeds: [new EmojiEmbed()
@@ -47,38 +47,38 @@
.setDescription("Something went wrong and the role could not be added")
.setStatus("Danger")
.setEmoji("CONTROL.BLOCKCROSS")
- ], components: []})
+ ], components: []});
}
return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Role")
.setDescription(`The role has been ${action === "give" ? "given" : "removed"} successfully`)
.setStatus("Success")
.setEmoji("GUILD.ROLES.CREATE")
- ], components: []})
+ ], components: []});
} else {
await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("GUILD.ROLES.CREATE")
.setTitle("Role")
- .setDescription(`No changes were made.`)
+ .setDescription("No changes were made.")
.setStatus("Danger")
- ], components: []})
+ ], components: []});
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as GuildMember)
- let me = (interaction.guild.me as GuildMember)
- let apply = (interaction.options.getMember("user") as GuildMember)
- if (member === null || me === null || apply === null) throw "That member is not in the server"
+ const member = (interaction.member as GuildMember);
+ const me = (interaction.guild.me as GuildMember);
+ const apply = (interaction.options.getMember("user") as GuildMember);
+ if (member === null || me === null || apply === null) throw "That member is not in the server";
// Check if Nucleus has permission to role
if (!me.permissions.has("MANAGE_ROLES")) throw "I do not have the *Manage Roles* permission";
// Allow the owner to role anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user has manage_roles permission
if (! member.permissions.has("MANAGE_ROLES")) throw "You do not have the *Manage Roles* permission";
// Allow role
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/rolemenu.ts b/src/commands/rolemenu.ts
index 39e18f7..1a5f297 100644
--- a/src/commands/rolemenu.ts
+++ b/src/commands/rolemenu.ts
@@ -1,19 +1,19 @@
import { CommandInteraction } from "discord.js";
import { SlashCommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
-import { callback as roleMenu } from "../actions/roleMenu.js"
+import { callback as roleMenu } from "../actions/roleMenu.js";
const command = new SlashCommandBuilder()
.setName("rolemenu")
- .setDescription("Lets you choose from sets of roles to apply to yourself")
+ .setDescription("Lets you choose from sets of roles to apply to yourself");
const callback = async (interaction: CommandInteraction): Promise<any> => {
await roleMenu(interaction);
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/server/about.ts b/src/commands/server/about.ts
index 70998d5..b70d0a6 100644
--- a/src/commands/server/about.ts
+++ b/src/commands/server/about.ts
@@ -4,15 +4,15 @@
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
import generateKeyValueList, { toCapitals } from "../../utils/generateKeyValueList.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) => builder
.setName("about")
- .setDescription("Shows info about the server")
+ .setDescription("Shows info about the server");
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let guild = interaction.guild as Guild;
- const { renderUser, renderDelta } = client.logger
+ const guild = interaction.guild as Guild;
+ const { renderUser, renderDelta } = client.logger;
interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Server Info")
.setStatus("Success")
@@ -24,26 +24,26 @@
"owner": `${renderUser((await guild.fetchOwner()).user)}`,
"created": `${renderDelta(guild.createdTimestamp)}`,
"emojis": `${guild.emojis.cache.size}` + (guild.emojis.cache.size > 1 ? `\n> ${
- guild.emojis.cache.first(10).map((emoji) => `<${emoji.animated ? 'a' : ''}:${emoji.name}:${emoji.id}>`).join(" ")
- }` +
- (guild.emojis.cache.size > 10 ? ` and ${guild.emojis.cache.size - 10} more` : ``) : ""),
+ guild.emojis.cache.first(10).map((emoji) => `<${emoji.animated ? "a" : ""}:${emoji.name}:${emoji.id}>`).join(" ")
+ }` +
+ (guild.emojis.cache.size > 10 ? ` and ${guild.emojis.cache.size - 10} more` : "") : ""),
"icon": `[Discord](${guild.iconURL()})`,
"2 factor authentication": `${guild.mfaLevel === "NONE" ? `${getEmojiByName("CONTROL.CROSS")} No` : `${getEmojiByName("CONTROL.TICK")} Yes`}`,
"verification level": `${toCapitals(guild.verificationLevel)}`,
- "explicit content filter": `${toCapitals(guild.explicitContentFilter.toString().replace(/_/, " ", ))}`,
+ "explicit content filter": `${toCapitals(guild.explicitContentFilter.toString().replace(/_/, " " ))}`,
"nitro boost level": `${guild.premiumTier !== "NONE" ? guild.premiumTier.toString()[-1] : "0"}`,
"channels": `${guild.channels.cache.size}`,
"roles": `${guild.roles.cache.size}`,
- "members": `${guild.memberCount}`,
+ "members": `${guild.memberCount}`
})
)
.setThumbnail(guild.iconURL({dynamic: true}))
], ephemeral: true});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/commands.ts b/src/commands/settings/commands.ts
index 23d5c66..7b6b309 100644
--- a/src/commands/settings/commands.ts
+++ b/src/commands/settings/commands.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton, TextInputComponent } from "discord.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
@@ -11,43 +11,43 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("commands")
- .setDescription("Links and text shown to a user after a moderator action is performed")
- .addRoleOption(o => o.setName("role").setDescription("The role given when a member is muted"))
+ .setName("commands")
+ .setDescription("Links and text shown to a user after a moderator action is performed")
+ .addRoleOption(o => o.setName("role").setDescription("The role given when a member is muted"));
const callback = async (interaction: CommandInteraction): Promise<any> => {
await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
let m;
let clicked = "";
if (interaction.options.getRole("role")) {
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("GUILD.ROLES.DELETE")
.setTitle("Moderation Commands")
.setDescription(keyValueList({
- role: `<@&${interaction.options.getRole("role").id}>`,
+ role: `<@&${interaction.options.getRole("role").id}>`
}))
.setColor("Danger")
- .send(true)
+ .send(true);
if (confirmation.cancelled) return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Moderation Commands")
.setDescription("No changes were made")
.setStatus("Success")
.setEmoji("GUILD.ROLES.CREATE")
- ]})
+ ]});
if (confirmation.success) {
await client.database.guilds.write(interaction.guild.id, {["moderation.mute.role"]: interaction.options.getRole("role").id});
}
}
while (true) {
- let config = await client.database.guilds.read(interaction.guild.id);
- let moderation = config.getKey("moderation");
+ const config = await client.database.guilds.read(interaction.guild.id);
+ const moderation = config.getKey("moderation");
m = await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Moderation Commands")
.setEmoji("PUNISH.BAN.GREEN")
.setStatus("Success")
.setDescription(
"These links are shown below the message sent in a user's DM when they are punished.\n\n" +
- `**Mute Role:** ` + (moderation.mute.role ? `<@&${moderation.mute.role}>` : "*None set*")
+ "**Mute Role:** " + (moderation.mute.role ? `<@&${moderation.mute.role}>` : "*None set*")
)
], components: [new MessageActionRow().addComponents([
new MessageButton().setLabel("Warn").setEmoji(getEmojiByName("PUNISH.WARN.YELLOW", "id")).setCustomId("warn").setStyle("SECONDARY"),
@@ -70,19 +70,19 @@
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { return }
+ } catch (e) { return; }
let chosen = moderation[i.customId] ?? {text: null, url: null};
if (i.component.customId === "clearMuteRole") {
- i.deferUpdate()
+ i.deferUpdate();
if (clicked === "clearMuteRole") {
await client.database.guilds.write(interaction.guild.id, {"moderation.mute.role": null });
- } else { clicked = "clearMuteRole" }
- continue
- } else { clicked = "" }
+ } else { clicked = "clearMuteRole"; }
+ continue;
+ } else { clicked = ""; }
if (i.component.customId === "timeout") {
- await i.deferUpdate()
+ await i.deferUpdate();
await client.database.guilds.write(interaction.guild.id, {"moderation.mute.timeout": !moderation.mute.timeout } );
- continue
+ continue;
} else if (i.customId) {
await i.showModal(new Discord.Modal().setCustomId("modal").setTitle(`Options for ${i.customId}`).addComponents(
new MessageActionRow<TextInputComponent>().addComponents(new TextInputComponent()
@@ -101,7 +101,7 @@
.setStyle("SHORT")
.setValue(chosen.link ?? "")
)
- ))
+ ));
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Moderation Links")
@@ -117,27 +117,27 @@
});
let out;
try {
- out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => true)
- } catch (e) { continue }
+ out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => true);
+ } catch (e) { continue; }
if (out.fields) {
- let buttonText = out.fields.getTextInputValue("name");
- let buttonLink = out.fields.getTextInputValue("url").replace(/{id}/gi, "{id}");
- let current = chosen;
+ const buttonText = out.fields.getTextInputValue("name");
+ const buttonLink = out.fields.getTextInputValue("url").replace(/{id}/gi, "{id}");
+ const current = chosen;
if (current.text !== buttonText || current.link !== buttonLink) {
chosen = { text: buttonText, link: buttonLink };
await client.database.guilds.write(interaction.guild.id, { ["moderation." + i.customId]: { text: buttonText, link: buttonLink }});
}
- } else { continue }
+ } else { continue; }
}
}
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/filters.ts b/src/commands/settings/filters.ts
index dfcff99..d35d210 100644
--- a/src/commands/settings/filters.ts
+++ b/src/commands/settings/filters.ts
@@ -1,28 +1,28 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton, MessageSelectMenu } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import client from '../../utils/client.js';
-import confirmationMessage from '../../utils/confirmationMessage.js';
-import generateKeyValueList from '../../utils/generateKeyValueList.js';
-import { ChannelType } from 'discord-api-types';
-import getEmojiByName from '../../utils/getEmojiByName.js';
+import client from "../../utils/client.js";
+import confirmationMessage from "../../utils/confirmationMessage.js";
+import generateKeyValueList from "../../utils/generateKeyValueList.js";
+import { ChannelType } from "discord-api-types";
+import getEmojiByName from "../../utils/getEmojiByName.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("filter")
- .setDescription("Setting for message filters")
+ .setName("filter")
+ .setDescription("Setting for message filters");
const callback = async (interaction: CommandInteraction): Promise<any> => {
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/logs/attachment.ts b/src/commands/settings/logs/attachment.ts
index 2dae74e..edd1c61 100644
--- a/src/commands/settings/logs/attachment.ts
+++ b/src/commands/settings/logs/attachment.ts
@@ -1,5 +1,5 @@
-import { LoadingEmbed } from './../../../utils/defaultEmbeds.js';
-import { ChannelType } from 'discord-api-types';
+import { LoadingEmbed } from "./../../../utils/defaultEmbeds.js";
+import { ChannelType } from "discord-api-types";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import EmojiEmbed from "../../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../../utils/confirmationMessage.js";
@@ -10,76 +10,74 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("attachments")
- .setDescription("Where attachments should be logged to (Premium only)")
- .addChannelOption(option => option.setName("channel").setDescription("The channel to log attachments in").addChannelTypes([
- ChannelType.GuildNews, ChannelType.GuildText
- ]).setRequired(false))
+ .setName("attachments")
+ .setDescription("Where attachments should be logged to (Premium only)")
+ .addChannelOption(option => option.setName("channel").setDescription("The channel to log attachments in").addChannelTypes([
+ ChannelType.GuildNews, ChannelType.GuildText
+ ]).setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let m;
m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
if (interaction.options.getChannel("channel")) {
- let channel
+ let channel;
try {
- channel = interaction.options.getChannel("channel")
+ channel = interaction.options.getChannel("channel");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.TEXT.DELETE")
.setTitle("Attachment Log Channel")
.setDescription("The channel you provided is not a valid channel")
.setStatus("Danger")
- ]})
+ ]});
}
- channel = channel as Discord.TextChannel
+ channel = channel as Discord.TextChannel;
if (channel.guild.id !== interaction.guild.id) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Attachment Log Channel")
- .setDescription(`You must choose a channel in this server`)
+ .setDescription("You must choose a channel in this server")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]});
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.TEXT.EDIT")
.setTitle("Attachment Log Channel")
.setDescription(
- `This will be the channel all attachments will be sent to.\n\n` +
+ "This will be the channel all attachments will be sent to.\n\n" +
`Are you sure you want to set the attachment log channel to <#${channel.id}>?`
)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- await client.database.guilds.write(interaction.guild.id, {"logging.attachments.channel": channel.id})
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- try {
- let data = {
- meta:{
- type: 'attachmentChannelUpdate',
- displayName: 'Attachment Log Channel Updated',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.yellow,
- emoji: "CHANNEL.TEXT.EDIT",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- changedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(channel.id, renderChannel(channel)),
- },
- hidden: {
- guild: interaction.guild.id
- }
+ await client.database.guilds.write(interaction.guild.id, {"logging.attachments.channel": channel.id});
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta:{
+ type: "attachmentChannelUpdate",
+ displayName: "Attachment Log Channel Updated",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.yellow,
+ emoji: "CHANNEL.TEXT.EDIT",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ changedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(channel.id, renderChannel(channel))
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Attachment Log Channel")
- .setDescription(`Something went wrong and the attachment log channel could not be set`)
+ .setDescription("Something went wrong and the attachment log channel could not be set")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
], components: []});
@@ -87,14 +85,14 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Attachment Log Channel")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("CHANNEL.TEXT.CREATE")
], components: []});
}
}
let clicks = 0;
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
let channel = data.logging.staff.channel;
while (true) {
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -115,17 +113,17 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
- i.deferUpdate()
+ } catch(e) { break; }
+ i.deferUpdate();
if (i.component.customId === "clear") {
clicks += 1;
if (clicks === 2) {
clicks = 0;
- await client.database.guilds.write(interaction.guild.id, null, ["logging.announcements.channel"])
+ await client.database.guilds.write(interaction.guild.id, null, ["logging.announcements.channel"]);
channel = undefined;
}
} else {
- break
+ break;
}
}
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -141,13 +139,13 @@
.setStyle("SECONDARY")
.setDisabled(true)
])]});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/logs/channel.ts b/src/commands/settings/logs/channel.ts
index 4030108..da0d156 100644
--- a/src/commands/settings/logs/channel.ts
+++ b/src/commands/settings/logs/channel.ts
@@ -1,5 +1,5 @@
-import { LoadingEmbed } from './../../../utils/defaultEmbeds.js';
-import { ChannelType } from 'discord-api-types';
+import { LoadingEmbed } from "./../../../utils/defaultEmbeds.js";
+import { ChannelType } from "discord-api-types";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import EmojiEmbed from "../../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../../utils/confirmationMessage.js";
@@ -10,74 +10,72 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("channel")
- .setDescription("Sets or shows the log channel")
- .addChannelOption(option => option.setName("channel").setDescription("The channel to set the log channel to").addChannelTypes([
- ChannelType.GuildNews, ChannelType.GuildText
- ]))
+ .setName("channel")
+ .setDescription("Sets or shows the log channel")
+ .addChannelOption(option => option.setName("channel").setDescription("The channel to set the log channel to").addChannelTypes([
+ ChannelType.GuildNews, ChannelType.GuildText
+ ]));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let m;
m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
if (interaction.options.getChannel("channel")) {
- let channel
+ let channel;
try {
- channel = interaction.options.getChannel("channel")
+ channel = interaction.options.getChannel("channel");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.TEXT.DELETE")
.setTitle("Log Channel")
.setDescription("The channel you provided is not a valid channel")
.setStatus("Danger")
- ]})
+ ]});
}
- channel = channel as Discord.TextChannel
+ channel = channel as Discord.TextChannel;
if (channel.guild.id !== interaction.guild.id) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Log Channel")
- .setDescription(`You must choose a channel in this server`)
+ .setDescription("You must choose a channel in this server")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]});
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.TEXT.EDIT")
.setTitle("Log Channel")
.setDescription(`Are you sure you want to set the log channel to <#${channel.id}>?`)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- await client.database.guilds.write(interaction.guild.id, {"logging.logs.channel": channel.id})
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- try {
- let data = {
- meta:{
- type: 'logChannelUpdate',
- displayName: 'Log Channel Changed',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.yellow,
- emoji: "CHANNEL.TEXT.EDIT",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- changedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(channel.id, renderChannel(channel)),
- },
- hidden: {
- guild: channel.guild.id
- }
+ await client.database.guilds.write(interaction.guild.id, {"logging.logs.channel": channel.id});
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta:{
+ type: "logChannelUpdate",
+ displayName: "Log Channel Changed",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.yellow,
+ emoji: "CHANNEL.TEXT.EDIT",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ changedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(channel.id, renderChannel(channel))
+ },
+ hidden: {
+ guild: channel.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
- console.log(e)
+ console.log(e);
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Log Channel")
- .setDescription(`Something went wrong and the log channel could not be set`)
+ .setDescription("Something went wrong and the log channel could not be set")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
], components: []});
@@ -85,14 +83,14 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Log Channel")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("CHANNEL.TEXT.CREATE")
], components: []});
}
}
let clicks = 0;
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
let channel = data.logging.logs.channel;
while (true) {
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -110,17 +108,17 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
- i.deferUpdate()
+ } catch(e) { break; }
+ i.deferUpdate();
if (i.component.customId === "clear") {
clicks += 1;
if (clicks === 2) {
clicks = 0;
- await client.database.guilds.write(interaction.guild.id, null, ["logging.logs.channel"])
+ await client.database.guilds.write(interaction.guild.id, null, ["logging.logs.channel"]);
channel = undefined;
}
} else {
- break
+ break;
}
}
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -136,13 +134,13 @@
.setStyle("SECONDARY")
.setDisabled(true)
])]});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/logs/events.ts b/src/commands/settings/logs/events.ts
index ef303cb..88386c4 100644
--- a/src/commands/settings/logs/events.ts
+++ b/src/commands/settings/logs/events.ts
@@ -1,9 +1,9 @@
-import { LoadingEmbed } from './../../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton, MessageSelectMenu } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../../utils/generateEmojiEmbed.js";
-import client from '../../../utils/client.js';
+import client from "../../../utils/client.js";
import { toHexArray, toHexInteger } from "../../../utils/calculate.js";
@@ -27,20 +27,20 @@
"guildMemberVerify": "Member runs verify",
"autoModeratorDeleted": "Messages auto deleted by Nucleus",
"nucleusSettingsUpdated": "Nucleus' settings updated by a moderator",
- "ticketUpdate": "Tickets created or deleted",
-}
+ "ticketUpdate": "Tickets created or deleted"
+};
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("events")
- .setDescription("Sets what events should be logged")
+ .setName("events")
+ .setDescription("Sets what events should be logged");
const callback = async (interaction: CommandInteraction): Promise<any> => {
await interaction.reply({embeds: LoadingEmbed, fetchReply: true, ephemeral: true});
let m;
while (true) {
- let config = await client.database.guilds.read(interaction.guild.id)
- let converted = toHexArray(config.logging.logs.toLog)
+ const config = await client.database.guilds.read(interaction.guild.id);
+ const converted = toHexArray(config.logging.logs.toLog);
m = await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Logging Events")
.setDescription("Below are the events being logged in the server. You can toggle them on and off in the dropdown")
@@ -68,25 +68,25 @@
.setStyle("DANGER")
.setCustomId("none")
])
- ]})
+ ]});
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
} catch (e) {
- break
+ break;
}
- i.deferUpdate()
+ i.deferUpdate();
if (i.customId === "logs") {
- let selected = i.values;
- let newLogs = toHexInteger(selected.map(e => Object.keys(logs)[parseInt(e)]))
- await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": newLogs})
+ const selected = i.values;
+ const newLogs = toHexInteger(selected.map(e => Object.keys(logs)[parseInt(e)]));
+ await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": newLogs});
} else if (i.customId === "all") {
- let newLogs = toHexInteger(Object.keys(logs).map(e => e))
- await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": newLogs})
+ const newLogs = toHexInteger(Object.keys(logs).map(e => e));
+ await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": newLogs});
} else if (i.customId === "none") {
- await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": 0})
+ await client.database.guilds.write(interaction.guild.id, {"logging.logs.toLog": 0});
} else {
- break
+ break;
}
}
m = await interaction.editReply({embeds: [new EmojiEmbed()
@@ -95,14 +95,14 @@
.setFooter({text: "Message timed out"})
.setStatus("Success")
.setEmoji("CHANNEL.TEXT.CREATE")
- ]})
-}
+ ]});
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/logs/staff.ts b/src/commands/settings/logs/staff.ts
index 5867338..2f0c819 100644
--- a/src/commands/settings/logs/staff.ts
+++ b/src/commands/settings/logs/staff.ts
@@ -1,85 +1,85 @@
-import { LoadingEmbed } from './../../../utils/defaultEmbeds.js';
-import { ChannelType } from 'discord-api-types';
+import { LoadingEmbed } from "./../../../utils/defaultEmbeds.js";
+import { ChannelType } from "discord-api-types";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import EmojiEmbed from "../../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../../utils/confirmationMessage.js";
import getEmojiByName from "../../../utils/getEmojiByName.js";
-import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
-import { WrappedCheck } from "jshaiku";
+import type { SlashCommandSubcommandBuilder } from "@discordjs/builders";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+import type { WrappedCheck } from "jshaiku";
import client from "../../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("staff")
- .setDescription("Settings for the staff notifications channel")
- .addChannelOption(option => option.setName("channel").setDescription("The channel to set the staff notifications channel to").addChannelTypes([
- ChannelType.GuildNews, ChannelType.GuildText
- ]).setRequired(false))
+ .setName("staff")
+ .setDescription("Settings for the staff notifications channel")
+ .addChannelOption(option => option.setName("channel").setDescription("The channel to set the staff notifications channel to").addChannelTypes([
+ ChannelType.GuildNews, ChannelType.GuildText
+ ]).setRequired(false));
-const callback = async (interaction: CommandInteraction): Promise<any> => {
- let m;
- m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
+const callback = async (interaction: CommandInteraction): Promise<unknown | void> => {
+ if (!interaction.guild) return;
+ const m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true}) as Discord.Message<boolean>;
if (interaction.options.getChannel("channel")) {
- let channel
+ let channel;
try {
- channel = interaction.options.getChannel("channel")
+ channel = interaction.options.getChannel("channel");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.TEXT.DELETE")
.setTitle("Staff Notifications Channel")
.setDescription("The channel you provided is not a valid channel")
.setStatus("Danger")
- ]})
+ ]});
}
- channel = channel as Discord.TextChannel
+ channel = channel as Discord.TextChannel;
if (channel.guild.id !== interaction.guild.id) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Staff Notifications Channel")
- .setDescription(`You must choose a channel in this server`)
+ .setDescription("You must choose a channel in this server")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]});
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.TEXT.EDIT")
.setTitle("Staff Notifications Channel")
.setDescription(
- `This will be the channel all notifications, updates, user reports etc. will be sent to.\n\n` +
+ "This will be the channel all notifications, updates, user reports etc. will be sent to.\n\n" +
`Are you sure you want to set the staff notifications channel to <#${channel.id}>?`
)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- await client.database.guilds.write(interaction.guild.id, {"logging.staff.channel": channel.id})
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- try {
- let data = {
- meta:{
- type: 'staffChannelUpdate',
- displayName: 'Staff Notifications Channel Updated',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.yellow,
- emoji: "CHANNEL.TEXT.EDIT",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- changedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(channel.id, renderChannel(channel)),
- },
- hidden: {
- guild: interaction.guild.id
- }
+ await client.database.guilds.write(interaction.guild.id, {"logging.staff.channel": channel.id});
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta:{
+ type: "staffChannelUpdate",
+ displayName: "Staff Notifications Channel Updated",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.yellow,
+ emoji: "CHANNEL.TEXT.EDIT",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ changedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(channel.id, renderChannel(channel))
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Staff Notifications Channel")
- .setDescription(`Something went wrong and the staff notifications channel could not be set`)
+ .setDescription("Something went wrong and the staff notifications channel could not be set")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
], components: []});
@@ -87,14 +87,14 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Staff Notifications Channel")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("CHANNEL.TEXT.CREATE")
], components: []});
}
}
let clicks = 0;
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
let channel = data.logging.staff.channel;
while (true) {
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -112,17 +112,17 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
- i.deferUpdate()
- if (i.component.customId === "clear") {
+ } catch(e) { break; }
+ i.deferUpdate();
+ if ((i.component as MessageButton).customId === "clear") {
clicks += 1;
if (clicks === 2) {
clicks = 0;
- await client.database.guilds.write(interaction.guild.id, null, ["logging.staff.channel"])
+ await client.database.guilds.write(interaction.guild.id, null, ["logging.staff.channel"]);
channel = undefined;
}
} else {
- break
+ break;
}
}
await interaction.editReply({embeds: [new EmojiEmbed()
@@ -138,13 +138,13 @@
.setStyle("SECONDARY")
.setDisabled(true)
])]});
-}
+};
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+const check = (interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/rolemenu.ts b/src/commands/settings/rolemenu.ts
index 891b6f1..9a4ceb0 100644
--- a/src/commands/settings/rolemenu.ts
+++ b/src/commands/settings/rolemenu.ts
@@ -1,25 +1,23 @@
-import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
-import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import confirmationMessage from "../../utils/confirmationMessage.js";
-import getEmojiByName from "../../utils/getEmojiByName.js";
+import Discord, { CommandInteraction } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
-import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("rolemenu")
- .setDescription("rolemenu")// TODO
- .addRoleOption(option => option.setName("role").setDescription("The role to give after verifying")) // TODO
+ .setName("rolemenu")
+ .setDescription("rolemenu")// TODO
+ .addRoleOption(option => option.setName("role").setDescription("The role to give after verifying")); // FIXME FOR FUCK SAKE
-const callback = async (interaction: CommandInteraction): Promise<any> => {
-}
+const callback = async (interaction: CommandInteraction): Promise<void> => {
+ console.log("we changed the charger again because fuck you");
+ await interaction.reply("You're mum");
+};
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_ROLES")) throw "You must have the *Manage Roles* permission to use this command"
+const check = (interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_ROLES")) throw "You must have the *Manage Roles* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/stats.ts b/src/commands/settings/stats.ts
index 10fba6b..4d61496 100644
--- a/src/commands/settings/stats.ts
+++ b/src/commands/settings/stats.ts
@@ -1,23 +1,23 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageSelectMenu } from "discord.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../utils/confirmationMessage.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import client from "../../utils/client.js";
-import convertCurlyBracketString from '../../utils/convertCurlyBracketString.js';
+import convertCurlyBracketString from "../../utils/convertCurlyBracketString.js";
import {callback as statsChannelAddCallback} from "../../reflex/statsChannelUpdate.js";
-import singleNotify from '../../utils/singleNotify.js';
+import singleNotify from "../../utils/singleNotify.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("stats")
- .setDescription("Controls channels which update when someone joins or leaves the server")
- .addChannelOption(option => option.setName("channel").setDescription("The channel to modify"))
- .addStringOption(option => option.setName("name").setDescription("The new channel name | Enter any text or use the extra variables like {memberCount}").setAutocomplete(true))
+ .setName("stats")
+ .setDescription("Controls channels which update when someone joins or leaves the server")
+ .addChannelOption(option => option.setName("channel").setDescription("The channel to modify"))
+ .addStringOption(option => option.setName("name").setDescription("The new channel name | Enter any text or use the extra variables like {memberCount}").setAutocomplete(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- singleNotify("statsChannelDeleted", interaction.guild.id, true)
+ singleNotify("statsChannelDeleted", interaction.guild.id, true);
let m;
m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
let config = await client.database.guilds.read(interaction.guild.id);
@@ -29,72 +29,70 @@
.setTitle("Stats Channel")
.setDescription("You can only have 25 stats channels in a server")
.setStatus("Danger")
- ]})
+ ]});
}
try {
- channel = interaction.options.getChannel("channel")
+ channel = interaction.options.getChannel("channel");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("CHANNEL.TEXT.DELETE")
.setTitle("Stats Channel")
.setDescription("The channel you provided is not a valid channel")
.setStatus("Danger")
- ]})
+ ]});
}
- channel = channel as Discord.TextChannel
+ channel = channel as Discord.TextChannel;
if (channel.guild.id !== interaction.guild.id) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Stats Channel")
- .setDescription(`You must choose a channel in this server`)
+ .setDescription("You must choose a channel in this server")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]});
}
- let newName = await convertCurlyBracketString(interaction.options.getString("name"), null, null, interaction.guild.name, interaction.guild.members)
+ let newName = await convertCurlyBracketString(interaction.options.getString("name"), null, null, interaction.guild.name, interaction.guild.members);
if (interaction.options.getChannel("channel").type === "GUILD_TEXT") {
- newName = newName.toLowerCase().replace(/[\s]/g, "-")
+ newName = newName.toLowerCase().replace(/[\s]/g, "-");
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("CHANNEL.TEXT.EDIT")
.setTitle("Stats Channel")
.setDescription(`Are you sure you want to set <#${channel.id}> to a stats channel?\n\n*Preview: ${newName.replace(/^ +| $/g, "")}*`)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- let name = interaction.options.getString("name")
- let channel = interaction.options.getChannel("channel")
+ const name = interaction.options.getString("name");
+ const channel = interaction.options.getChannel("channel");
await client.database.guilds.write(interaction.guild.id, {[`stats.${channel.id}`]: {name: name, enabled: true}});
- const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger
- try {
- let data = {
- meta:{
- type: 'statsChannelUpdate',
- displayName: 'Stats Channel Updated',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.yellow,
- emoji: "CHANNEL.TEXT.EDIT",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- changedBy: entry(interaction.user.id, renderUser(interaction.user)),
- channel: entry(channel.id, renderChannel(channel)),
- name: entry(interaction.options.getString("name"), `\`${interaction.options.getString("name")}\``)
- },
- hidden: {
- guild: interaction.guild.id
- }
+ const { log, NucleusColors, entry, renderUser, renderChannel } = client.logger;
+ const data = {
+ meta:{
+ type: "statsChannelUpdate",
+ displayName: "Stats Channel Updated",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.yellow,
+ emoji: "CHANNEL.TEXT.EDIT",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ changedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ channel: entry(channel.id, renderChannel(channel)),
+ name: entry(interaction.options.getString("name"), `\`${interaction.options.getString("name")}\``)
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
- console.log(e)
+ console.log(e);
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Stats Channel")
- .setDescription(`Something went wrong and the stats channel could not be set`)
+ .setDescription("Something went wrong and the stats channel could not be set")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
], components: []});
@@ -102,7 +100,7 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Stats Channel")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("CHANNEL.TEXT.CREATE")
], components: []});
@@ -111,11 +109,11 @@
}
while (true) {
config = await client.database.guilds.read(interaction.guild.id);
- let stats = config.getKey("stats")
- let selectMenu = new MessageSelectMenu()
+ const stats = config.getKey("stats");
+ const selectMenu = new MessageSelectMenu()
.setCustomId("remove")
.setMinValues(1)
- .setMaxValues(Math.max(1, Object.keys(stats).length))
+ .setMaxValues(Math.max(1, Object.keys(stats).length));
await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Stats Channel")
.setDescription("The following channels update when someone joins or leaves the server. You can select a channel to remove it from the list.")
@@ -126,30 +124,30 @@
selectMenu.setPlaceholder("Select a stats channel to remove, stopping it updating").addOptions(Object.keys(stats).map(key => ({
label: interaction.guild.channels.cache.get(key).name,
value: key,
- description: `${stats[key].name}`,
+ description: `${stats[key].name}`
})))
] : [selectMenu.setPlaceholder("The server has no stats channels").setDisabled(true).setOptions([
{label: "*Placeholder*", value: "placeholder", description: "No stats channels"}
])])
- ]})
+ ]});
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { break }
- i.deferUpdate()
+ } catch (e) { break; }
+ i.deferUpdate();
if (i.customId === "remove") {
- let toRemove = i.values;
+ const toRemove = i.values;
await client.database.guilds.write(interaction.guild.id, null, toRemove.map(k => `stats.${k}`));
}
}
await interaction.editReply({embeds: [m.embeds[0].setFooter({text: "Message closed"})], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_CHANNELS")) throw "You must have the *Manage Channels* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_CHANNELS")) throw "You must have the *Manage Channels* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/tickets.ts b/src/commands/settings/tickets.ts
index 8ebcf30..3d1901b 100644
--- a/src/commands/settings/tickets.ts
+++ b/src/commands/settings/tickets.ts
@@ -1,14 +1,14 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../utils/confirmationMessage.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton, MessageSelectMenu, TextInputComponent } from "discord.js";
import { SelectMenuOption, SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
-import { ChannelType } from 'discord-api-types';
+import { ChannelType } from "discord-api-types";
import client from "../../utils/client.js";
import { toHexInteger, toHexArray, tickets as ticketTypes } from "../../utils/calculate.js";
-import { capitalize } from '../../utils/generateKeyValueList.js';
+import { capitalize } from "../../utils/generateKeyValueList.js";
import { modalInteractionCollector } from "../../utils/dualCollector.js";
const command = (builder: SlashCommandSubcommandBuilder) => builder
@@ -18,24 +18,24 @@
.addChoices([["Yes", "yes"], ["No", "no"]]))
.addChannelOption(option => option.setName("category").setDescription("The category where tickets are created").addChannelType(ChannelType.GuildCategory).setRequired(false))
.addNumberOption(option => option.setName("maxticketsperuser").setDescription("The maximum amount of tickets a user can create | Default: 5").setRequired(false).setMinValue(1))
- .addRoleOption(option => option.setName("supportrole").setDescription("This role will have view access to all tickets and will be pinged when a ticket is created").setRequired(false))
+ .addRoleOption(option => option.setName("supportrole").setDescription("This role will have view access to all tickets and will be pinged when a ticket is created").setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let m;
- m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true})
- let options = {
+ m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
+ const options = {
enabled: interaction.options.getString("enabled") as string | boolean,
category: interaction.options.getChannel("category"),
maxtickets: interaction.options.getNumber("maxticketsperuser"),
supportping: interaction.options.getRole("supportrole")
- }
- console.log(m)
+ };
+ console.log(m);
if (options.enabled !== null || options.category || options.maxtickets || options.supportping) {
options.enabled = options.enabled === "yes" ? true : false;
if (options.category) {
- let channel
+ let channel;
try {
- channel = interaction.guild.channels.cache.get(options.category.id)
+ channel = interaction.guild.channels.cache.get(options.category.id);
} catch {
return await interaction.editReply({
embeds: [new EmojiEmbed()
@@ -44,13 +44,13 @@
.setDescription("The channel you provided is not a valid category")
.setStatus("Danger")
]
- })
+ });
}
- channel = channel as Discord.CategoryChannel
+ channel = channel as Discord.CategoryChannel;
if (channel.guild.id !== interaction.guild.id) return interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Category")
- .setDescription(`You must choose a category in this server`)
+ .setDescription("You must choose a category in this server")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]
@@ -60,16 +60,16 @@
if (options.maxtickets < 1) return interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Max Tickets")
- .setDescription(`You must choose a number greater than 0`)
+ .setDescription("You must choose a number greater than 0")
.setStatus("Danger")
.setEmoji("CHANNEL.TEXT.DELETE")
]
});
}
- let role
+ let role;
if (options.supportping) {
try {
- role = interaction.guild.roles.cache.get(options.supportping.id)
+ role = interaction.guild.roles.cache.get(options.supportping.id);
} catch {
return await interaction.editReply({
embeds: [new EmojiEmbed()
@@ -78,20 +78,20 @@
.setDescription("The role you provided is not a valid role")
.setStatus("Danger")
]
- })
+ });
}
- role = role as Discord.Role
+ role = role as Discord.Role;
if (role.guild.id !== interaction.guild.id) return interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Support Ping")
- .setDescription(`You must choose a role in this server`)
+ .setDescription("You must choose a role in this server")
.setStatus("Danger")
.setEmoji("GUILD.ROLE.DELETE")
]
});
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("GUILD.TICKET.ARCHIVED")
.setTitle("Tickets")
.setDescription(
@@ -99,26 +99,26 @@
(options.maxtickets ? `**Max Tickets:** ${options.maxtickets}\n` : "") +
(options.supportping ? `**Support Ping:** ${options.supportping.name}\n` : "") +
(options.enabled !== null ? `**Enabled:** ${options.enabled ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`
- }\n` : "") +
- `\nAre you sure you want to apply these settings?`
+ }\n` : "") +
+ "\nAre you sure you want to apply these settings?"
)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
- let toUpdate = {}
- if (options.enabled !== null) toUpdate["tickets.enabled"] = options.enabled
- if (options.category) toUpdate["tickets.category"] = options.category.id
- if (options.maxtickets) toUpdate["tickets.maxTickets"] = options.maxtickets
- if (options.supportping) toUpdate["tickets.supportRole"] = options.supportping.id
+ const toUpdate = {};
+ if (options.enabled !== null) toUpdate["tickets.enabled"] = options.enabled;
+ if (options.category) toUpdate["tickets.category"] = options.category.id;
+ if (options.maxtickets) toUpdate["tickets.maxTickets"] = options.maxtickets;
+ if (options.supportping) toUpdate["tickets.supportRole"] = options.supportping.id;
try {
- await client.database.guilds.write(interaction.guild.id, toUpdate)
+ await client.database.guilds.write(interaction.guild.id, toUpdate);
} catch (e) {
return interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets")
- .setDescription(`Something went wrong and the staff notifications channel could not be set`)
+ .setDescription("Something went wrong and the staff notifications channel could not be set")
.setStatus("Danger")
.setEmoji("GUILD.TICKET.DELETE")
], components: []
@@ -128,7 +128,7 @@
return interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("GUILD.TICKET.OPEN")
], components: []
@@ -136,7 +136,7 @@
}
}
let data = await client.database.guilds.read(interaction.guild.id);
- data.tickets.customTypes = (data.tickets.customTypes || []).filter((v, i, a) => a.indexOf(v) === i)
+ data.tickets.customTypes = (data.tickets.customTypes || []).filter((v, i, a) => a.indexOf(v) === i);
let lastClicked = "";
let embed;
data = {
@@ -147,7 +147,7 @@
useCustom: data.tickets.useCustom,
types: data.tickets.types,
customTypes: data.tickets.customTypes
- }
+ };
while (true) {
embed = new EmojiEmbed()
.setTitle("Tickets")
@@ -161,7 +161,7 @@
`${getEmojiByName("TICKETS.REPORT")} *Indicates a setting stopping tickets from being used*`
)
.setStatus("Success")
- .setEmoji("GUILD.TICKET.OPEN")
+ .setEmoji("GUILD.TICKET.OPEN");
m = await interaction.editReply({
embeds: [embed], components: [new MessageActionRow().addComponents([
new MessageButton()
@@ -186,7 +186,7 @@
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
.setStyle("DANGER")
.setCustomId("clearSupportPing")
- .setDisabled(data.supportRole === null),
+ .setDisabled(data.supportRole === null)
]), new MessageActionRow().addComponents([
new MessageButton()
.setLabel("Manage types")
@@ -197,40 +197,40 @@
.setLabel("Add create ticket button")
.setEmoji(getEmojiByName("TICKETS.SUGGESTION", "id"))
.setStyle("PRIMARY")
- .setCustomId("send"),
+ .setCustomId("send")
])]
});
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { break }
- i.deferUpdate()
+ } catch (e) { break; }
+ i.deferUpdate();
if (i.component.customId === "clearCategory") {
if (lastClicked === "cat") {
lastClicked = "";
- await client.database.guilds.write(interaction.guild.id, null, ["tickets.category"])
+ await client.database.guilds.write(interaction.guild.id, null, ["tickets.category"]);
data.category = undefined;
} else lastClicked = "cat";
} else if (i.component.customId === "clearMaxTickets") {
if (lastClicked === "max") {
lastClicked = "";
- await client.database.guilds.write(interaction.guild.id, null, ["tickets.maxTickets"])
+ await client.database.guilds.write(interaction.guild.id, null, ["tickets.maxTickets"]);
data.maxTickets = 5;
} else lastClicked = "max";
} else if (i.component.customId === "clearSupportPing") {
if (lastClicked === "sup") {
lastClicked = "";
- await client.database.guilds.write(interaction.guild.id, null, ["tickets.supportRole"])
+ await client.database.guilds.write(interaction.guild.id, null, ["tickets.supportRole"]);
data.supportRole = undefined;
} else lastClicked = "sup";
} else if (i.component.customId === "send") {
const ticketMessages = [
{label: "Create ticket", description: "Click the button below to create a ticket"},
{label: "Issues, questions or feedback?", description: "Click below to open a ticket and get help from our staff team"},
- {label: "Contact Us", description: "Click the button below to speak to us privately"},
- ]
+ {label: "Contact Us", description: "Click the button below to speak to us privately"}
+ ];
while (true) {
- let enabled = data.enabled && data.category !== null;
+ const enabled = data.enabled && data.category !== null;
await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Ticket Button")
.setDescription("Select a message template to send in this channel")
@@ -240,8 +240,8 @@
], components: [
new MessageActionRow().addComponents([
new MessageSelectMenu().setOptions(ticketMessages.map((t: {label: string, description: string, value?: string}, index) => {
- t.value = index.toString(); return t as {value: string, label: string, description: string}
- })).setCustomId("template").setMaxValues(1).setMinValues(1).setPlaceholder("Select a message template"),
+ t.value = index.toString(); return t as {value: string, label: string, description: string};
+ })).setCustomId("template").setMaxValues(1).setMinValues(1).setPlaceholder("Select a message template")
]),
new MessageActionRow().addComponents([
new MessageButton()
@@ -263,9 +263,9 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
+ } catch(e) { break; }
if (i.component.customId === "template") {
- i.deferUpdate()
+ i.deferUpdate();
await interaction.channel.send({embeds: [new EmojiEmbed()
.setTitle(ticketMessages[parseInt(i.values[0])].label)
.setDescription(ticketMessages[parseInt(i.values[0])].description)
@@ -277,18 +277,18 @@
.setStyle("SUCCESS")
.setCustomId("createticket")
])]});
- break
+ break;
} else if (i.component.customId === "blank") {
- i.deferUpdate()
+ i.deferUpdate();
await interaction.channel.send({components: [new MessageActionRow().addComponents([new MessageButton()
.setLabel("Create Ticket")
.setEmoji(getEmojiByName("TICKETS.SUGGESTION", "id"))
.setStyle("SUCCESS")
.setCustomId("createticket")
])]});
- break
+ break;
} else if (i.component.customId === "custom") {
- await i.showModal(new Discord.Modal().setCustomId("modal").setTitle(`Enter embed details`).addComponents(
+ await i.showModal(new Discord.Modal().setCustomId("modal").setTitle("Enter embed details").addComponents(
new MessageActionRow<TextInputComponent>().addComponents(new TextInputComponent()
.setCustomId("title")
.setLabel("Title")
@@ -303,7 +303,7 @@
.setRequired(true)
.setStyle("PARAGRAPH")
)
- ))
+ ));
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Ticket Button")
@@ -319,11 +319,11 @@
});
let out;
try {
- out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify")
- } catch (e) { break }
+ out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify");
+ } catch (e) { break; }
if (out.fields) {
- let title = out.fields.getTextInputValue("title");
- let description = out.fields.getTextInputValue("description");
+ const title = out.fields.getTextInputValue("title");
+ const description = out.fields.getTextInputValue("description");
await interaction.channel.send({embeds: [new EmojiEmbed()
.setTitle(title)
.setDescription(description)
@@ -335,26 +335,26 @@
.setStyle("SUCCESS")
.setCustomId("createticket")
])]});
- break
- } else { continue }
+ break;
+ } else { continue; }
}
}
} else if (i.component.customId === "enabled") {
- await client.database.guilds.write(interaction.guild.id, { "tickets.enabled": !data.enabled })
+ await client.database.guilds.write(interaction.guild.id, { "tickets.enabled": !data.enabled });
data.enabled = !data.enabled;
} else if (i.component.customId === "manageTypes") {
data = await manageTypes(interaction, data, m);
} else {
- break
+ break;
}
}
await interaction.editReply({ embeds: [embed.setFooter({ text: "Message closed" })], components: [] });
-}
+};
async function manageTypes(interaction, data, m) {
while (true) {
if (data.useCustom) {
- let customTypes = data.customTypes;
+ const customTypes = data.customTypes;
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Types")
@@ -393,29 +393,29 @@
new MessageButton()
.setLabel("Switch to default types")
.setStyle("SECONDARY")
- .setCustomId("switchToDefault"),
+ .setCustomId("switchToDefault")
])
])
});
} else {
- let inUse = toHexArray(data.types, ticketTypes)
- let options = [];
+ const inUse = toHexArray(data.types, ticketTypes);
+ const options = [];
ticketTypes.forEach(type => {
options.push(new SelectMenuOption({
label: capitalize(type),
value: type,
emoji: client.emojis.cache.get(getEmojiByName(`TICKETS.${type.toUpperCase()}`, "id")),
default: inUse.includes(type)
- }))
- })
- let selectPane = new MessageActionRow().addComponents([
+ }));
+ });
+ const selectPane = new MessageActionRow().addComponents([
new Discord.MessageSelectMenu()
.addOptions(options)
.setCustomId("types")
.setMaxValues(ticketTypes.length)
.setMinValues(1)
.setPlaceholder("Select types to use")
- ])
+ ]);
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Types")
@@ -437,7 +437,7 @@
new MessageButton()
.setLabel("Switch to custom types")
.setStyle("SECONDARY")
- .setCustomId("switchToCustom"),
+ .setCustomId("switchToCustom")
])
]
});
@@ -445,20 +445,20 @@
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
- } catch (e) { break }
+ } catch (e) { break; }
if (i.component.customId === "types") {
- i.deferUpdate()
- let types = toHexInteger(i.values, ticketTypes);
- await client.database.guilds.write(interaction.guild.id, { "tickets.types": types })
+ i.deferUpdate();
+ const types = toHexInteger(i.values, ticketTypes);
+ await client.database.guilds.write(interaction.guild.id, { "tickets.types": types });
data.types = types;
} else if (i.component.customId === "removeTypes") {
- i.deferUpdate()
- let types = i.values
+ i.deferUpdate();
+ const types = i.values;
let customTypes = data.customTypes;
if (customTypes) {
customTypes = customTypes.filter((t) => !types.includes(t));
customTypes = customTypes.length > 0 ? customTypes : null;
- await client.database.guilds.write(interaction.guild.id, { "tickets.customTypes": customTypes })
+ await client.database.guilds.write(interaction.guild.id, { "tickets.customTypes": customTypes });
data.customTypes = customTypes;
}
} else if (i.component.customId === "addType") {
@@ -472,7 +472,7 @@
.setRequired(true)
.setStyle("SHORT")
)
- ))
+ ));
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Tickets > Types")
@@ -488,42 +488,42 @@
});
let out;
try {
- out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "addType")
- } catch (e) { continue }
+ out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "addType");
+ } catch (e) { continue; }
if (out.fields) {
let toAdd = out.fields.getTextInputValue("type");
- if (!toAdd) { continue }
- toAdd = toAdd.substring(0, 80)
+ if (!toAdd) { continue; }
+ toAdd = toAdd.substring(0, 80);
try {
- await client.database.guilds.append(interaction.guild.id, "tickets.customTypes", toAdd)
- } catch { continue }
+ await client.database.guilds.append(interaction.guild.id, "tickets.customTypes", toAdd);
+ } catch { continue; }
data.customTypes = data.customTypes || [];
if (!data.customTypes.includes(toAdd)) {
data.customTypes.push(toAdd);
}
- } else { continue }
+ } else { continue; }
} else if (i.component.customId === "switchToDefault") {
- i.deferUpdate()
- await client.database.guilds.write(interaction.guild.id, { "tickets.useCustom": false }, [])
+ i.deferUpdate();
+ await client.database.guilds.write(interaction.guild.id, { "tickets.useCustom": false }, []);
data.useCustom = false;
} else if (i.component.customId === "switchToCustom") {
- i.deferUpdate()
- await client.database.guilds.write(interaction.guild.id, { "tickets.useCustom": true }, [])
+ i.deferUpdate();
+ await client.database.guilds.write(interaction.guild.id, { "tickets.useCustom": true }, []);
data.useCustom = true;
} else {
- i.deferUpdate()
- break
+ i.deferUpdate();
+ break;
}
}
- return data
+ return data;
}
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/verify.ts b/src/commands/settings/verify.ts
index a77f2f4..c100d05 100644
--- a/src/commands/settings/verify.ts
+++ b/src/commands/settings/verify.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, Emoji, MessageActionRow, MessageButton, MessageSelectMenu, TextInputComponent } from "discord.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import confirmationMessage from "../../utils/confirmationMessage.js";
@@ -6,76 +6,74 @@
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import client from "../../utils/client.js";
-import { modalInteractionCollector } from '../../utils/dualCollector.js';
+import { modalInteractionCollector } from "../../utils/dualCollector.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("verify")
- .setDescription("Manage the role given after typing /verify")
- .addRoleOption(option => option.setName("role").setDescription("The role to give after verifying").setRequired(false))
+ .setName("verify")
+ .setDescription("Manage the role given after typing /verify")
+ .addRoleOption(option => option.setName("role").setDescription("The role to give after verifying").setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
let m;
m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true});
if (interaction.options.getRole("role")) {
- let role
+ let role;
try {
- role = interaction.options.getRole("role")
+ role = interaction.options.getRole("role");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("GUILD.ROLES.DELETE")
.setTitle("Verify Role")
.setDescription("The role you provided is not a valid role")
.setStatus("Danger")
- ]})
+ ]});
}
- role = role as Discord.Role
+ role = role as Discord.Role;
if (role.guild.id !== interaction.guild.id) {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Verify Role")
- .setDescription(`You must choose a role in this server`)
+ .setDescription("You must choose a role in this server")
.setStatus("Danger")
.setEmoji("GUILD.ROLES.DELETE")
]});
}
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("GUILD.ROLES.EDIT")
.setTitle("Verify Role")
.setDescription(`Are you sure you want to set the verify role to <@&${role.id}>?`)
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
await client.database.guilds.write(interaction.guild.id, {"verify.role": role.id, "verify.enabled": true});
- const { log, NucleusColors, entry, renderUser, renderRole } = client.logger
- try {
- let data = {
- meta:{
- type: 'verifyRoleChanged',
- displayName: 'Verify Role Changed',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.green,
- emoji: "CONTROL.BLOCKTICK",
- timestamp: new Date().getTime()
- },
- list: {
- memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
- changedBy: entry(interaction.user.id, renderUser(interaction.user)),
- role: entry(role.id, renderRole(role)),
- },
- hidden: {
- guild: interaction.guild.id
- }
+ const { log, NucleusColors, entry, renderUser, renderRole } = client.logger;
+ const data = {
+ meta:{
+ type: "verifyRoleChanged",
+ displayName: "Verify Role Changed",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.green,
+ emoji: "CONTROL.BLOCKTICK",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
+ changedBy: entry(interaction.user.id, renderUser(interaction.user)),
+ role: entry(role.id, renderRole(role))
+ },
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
- console.log(e)
+ console.log(e);
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Verify Role")
- .setDescription(`Something went wrong while setting the verify role`)
+ .setDescription("Something went wrong while setting the verify role")
.setStatus("Danger")
.setEmoji("GUILD.ROLES.DELETE")
], components: []});
@@ -83,19 +81,19 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Verify Role")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("GUILD.ROLES.CREATE")
], components: []});
}
}
let clicks = 0;
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
let role = data.verify.role;
while (true) {
await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Verify Role")
- .setDescription(role ? `Your verify role is currently set to <@&${role}>` : `You have not set a verify role`)
+ .setDescription(role ? `Your verify role is currently set to <@&${role}>` : "You have not set a verify role")
.setStatus("Success")
.setEmoji("GUILD.ROLES.CREATE")
], components: [new MessageActionRow().addComponents([
@@ -114,21 +112,21 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
- i.deferUpdate()
+ } catch(e) { break; }
+ i.deferUpdate();
if (i.component.customId === "clear") {
clicks += 1;
if (clicks === 2) {
clicks = 0;
- await client.database.guilds.write(interaction.guild.id, null, ["verify.role", "verify.enabled"])
+ await client.database.guilds.write(interaction.guild.id, null, ["verify.role", "verify.enabled"]);
role = undefined;
}
} else if (i.component.customId === "send") {
const verifyMessages = [
{label: "Verify", description: "Click the button below to get verified"},
{label: "Get verified", description: "To get access to the rest of the server, click the button below"},
- {label: "Ready to verify?", description: "Click the button below to verify yourself"},
- ]
+ {label: "Ready to verify?", description: "Click the button below to verify yourself"}
+ ];
while (true) {
await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Verify Button")
@@ -139,8 +137,8 @@
], components: [
new MessageActionRow().addComponents([
new MessageSelectMenu().setOptions(verifyMessages.map((t: {label: string, description: string, value?: string}, index) => {
- t.value = index.toString(); return t as {value: string, label: string, description: string}
- })).setCustomId("template").setMaxValues(1).setMinValues(1).setPlaceholder("Select a message template"),
+ t.value = index.toString(); return t as {value: string, label: string, description: string};
+ })).setCustomId("template").setMaxValues(1).setMinValues(1).setPlaceholder("Select a message template")
]),
new MessageActionRow().addComponents([
new MessageButton()
@@ -162,9 +160,9 @@
let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch(e) { break }
+ } catch(e) { break; }
if (i.component.customId === "template") {
- i.deferUpdate()
+ i.deferUpdate();
await interaction.channel.send({embeds: [new EmojiEmbed()
.setTitle(verifyMessages[parseInt(i.values[0])].label)
.setDescription(verifyMessages[parseInt(i.values[0])].description)
@@ -176,18 +174,18 @@
.setStyle("SUCCESS")
.setCustomId("verifybutton")
])]});
- break
+ break;
} else if (i.component.customId === "blank") {
- i.deferUpdate()
+ i.deferUpdate();
await interaction.channel.send({components: [new MessageActionRow().addComponents([new MessageButton()
.setLabel("Verify")
.setEmoji(getEmojiByName("CONTROL.TICK", "id"))
.setStyle("SUCCESS")
.setCustomId("verifybutton")
])]});
- break
+ break;
} else if (i.component.customId === "custom") {
- await i.showModal(new Discord.Modal().setCustomId("modal").setTitle(`Enter embed details`).addComponents(
+ await i.showModal(new Discord.Modal().setCustomId("modal").setTitle("Enter embed details").addComponents(
new MessageActionRow<TextInputComponent>().addComponents(new TextInputComponent()
.setCustomId("title")
.setLabel("Title")
@@ -202,7 +200,7 @@
.setRequired(true)
.setStyle("PARAGRAPH")
)
- ))
+ ));
await interaction.editReply({
embeds: [new EmojiEmbed()
.setTitle("Verify Button")
@@ -218,11 +216,11 @@
});
let out;
try {
- out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify")
- } catch (e) { break }
+ out = await modalInteractionCollector(m, (m) => m.channel.id === interaction.channel.id, (m) => m.customId === "modify");
+ } catch (e) { break; }
if (out.fields) {
- let title = out.fields.getTextInputValue("title");
- let description = out.fields.getTextInputValue("description");
+ const title = out.fields.getTextInputValue("title");
+ const description = out.fields.getTextInputValue("description");
await interaction.channel.send({embeds: [new EmojiEmbed()
.setTitle(title)
.setDescription(description)
@@ -234,23 +232,23 @@
.setStyle("SUCCESS")
.setCustomId("verifybutton")
])]});
- break
- } else { continue }
+ break;
+ } else { continue; }
}
}
} else {
- i.deferUpdate()
+ i.deferUpdate();
break;
}
}
await interaction.editReply({embeds: [m.embeds[0].setFooter({text: "Message closed"})], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/settings/welcome.ts b/src/commands/settings/welcome.ts
index 1a107ed..34ac292 100644
--- a/src/commands/settings/welcome.ts
+++ b/src/commands/settings/welcome.ts
@@ -1,109 +1,107 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton, MessageSelectMenu } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import client from '../../utils/client.js';
-import confirmationMessage from '../../utils/confirmationMessage.js';
-import generateKeyValueList from '../../utils/generateKeyValueList.js';
-import { ChannelType } from 'discord-api-types';
-import getEmojiByName from '../../utils/getEmojiByName.js';
+import client from "../../utils/client.js";
+import confirmationMessage from "../../utils/confirmationMessage.js";
+import generateKeyValueList from "../../utils/generateKeyValueList.js";
+import { ChannelType } from "discord-api-types";
+import getEmojiByName from "../../utils/getEmojiByName.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("welcome")
- .setDescription("Messages and roles sent or given when someone joins the server")
- .addStringOption(option => option.setName("message").setDescription("The message to send when someone joins the server").setAutocomplete(true))
- .addRoleOption(option => option.setName("role").setDescription("The role given when someone joins the server"))
- .addRoleOption(option => option.setName("ping").setDescription("The role pinged when someone joins the server"))
- .addChannelOption(option => option.setName("channel").setDescription("The channel the welcome message should be sent to").addChannelTypes([
- ChannelType.GuildText, ChannelType.GuildNews
- ]))
+ .setName("welcome")
+ .setDescription("Messages and roles sent or given when someone joins the server")
+ .addStringOption(option => option.setName("message").setDescription("The message to send when someone joins the server").setAutocomplete(true))
+ .addRoleOption(option => option.setName("role").setDescription("The role given when someone joins the server"))
+ .addRoleOption(option => option.setName("ping").setDescription("The role pinged when someone joins the server"))
+ .addChannelOption(option => option.setName("channel").setDescription("The channel the welcome message should be sent to").addChannelTypes([
+ ChannelType.GuildText, ChannelType.GuildNews
+ ]));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderRole, renderChannel, log, NucleusColors, entry, renderUser } = client.logger
+ const { renderRole, renderChannel, log, NucleusColors, entry, renderUser } = client.logger;
await interaction.reply({embeds: LoadingEmbed, fetchReply: true, ephemeral: true});
let m;
if (interaction.options.getRole("role") || interaction.options.getChannel("channel") || interaction.options.getString("message")) {
let role;
let ping;
- let message = interaction.options.getString("message");
+ const message = interaction.options.getString("message");
try {
- role = interaction.options.getRole("role")
- ping = interaction.options.getRole("ping")
+ role = interaction.options.getRole("role");
+ ping = interaction.options.getRole("ping");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("GUILD.ROLES.DELETE")
.setTitle("Welcome Events")
.setDescription("The role you provided is not a valid role")
.setStatus("Danger")
- ]})
+ ]});
}
let channel;
try {
- channel = interaction.options.getChannel("channel")
+ channel = interaction.options.getChannel("channel");
} catch {
return await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("GUILD.ROLES.DELETE")
.setTitle("Welcome Events")
.setDescription("The channel you provided is not a valid channel")
.setStatus("Danger")
- ]})
+ ]});
}
- role = role as Discord.Role
- ping = ping as Discord.Role
- channel = channel as Discord.TextChannel
- let options = {}
- if (role) options["role"] = renderRole(role)
- if (ping) options["ping"] = renderRole(ping)
- if (channel) options["channel"] = renderChannel(channel)
- if (message) options["message"] = "\n> " + message
- let confirmation = await new confirmationMessage(interaction)
+ role = role as Discord.Role;
+ ping = ping as Discord.Role;
+ channel = channel as Discord.TextChannel;
+ const options = {};
+ if (role) options["role"] = renderRole(role);
+ if (ping) options["ping"] = renderRole(ping);
+ if (channel) options["channel"] = renderChannel(channel);
+ if (message) options["message"] = "\n> " + message;
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("GUILD.ROLES.EDIT")
.setTitle("Welcome Events")
.setDescription(generateKeyValueList(options))
.setColor("Warning")
.setInverted(true)
- .send(true)
- if (confirmation.cancelled) return
+ .send(true);
+ if (confirmation.cancelled) return;
if (confirmation.success) {
try {
- let toChange = {}
- if (role) toChange["welcome.role"] = role.id
- if (ping) toChange["welcome.ping"] = ping.id
- if (channel) toChange["welcome.channel"] = channel.id
- if (message) toChange["welcome.message"] = message
+ const toChange = {};
+ if (role) toChange["welcome.role"] = role.id;
+ if (ping) toChange["welcome.ping"] = ping.id;
+ if (channel) toChange["welcome.channel"] = channel.id;
+ if (message) toChange["welcome.message"] = message;
await client.database.guilds.write(interaction.guild.id, toChange);
- let list = {
+ const list = {
memberId: entry(interaction.user.id, `\`${interaction.user.id}\``),
changedBy: entry(interaction.user.id, renderUser(interaction.user))
- }
- if (role) list["role"] = entry(role.id, renderRole(role))
- if (ping) list["ping"] = entry(ping.id, renderRole(ping))
- if (channel) list["channel"] = entry(channel.id, renderChannel(channel.id))
- if (message) list["message"] = entry(message, `\`${message}\``)
- try {
- let data = {
- meta:{
- type: 'welcomeSettingsUpdated',
- displayName: 'Welcome Settings Changed',
- calculateType: 'nucleusSettingsUpdated',
- color: NucleusColors.green,
- emoji: "CONTROL.BLOCKTICK",
- timestamp: new Date().getTime()
- },
- list: list,
- hidden: {
- guild: interaction.guild.id
- }
+ };
+ if (role) list["role"] = entry(role.id, renderRole(role));
+ if (ping) list["ping"] = entry(ping.id, renderRole(ping));
+ if (channel) list["channel"] = entry(channel.id, renderChannel(channel.id));
+ if (message) list["message"] = entry(message, `\`${message}\``);
+ const data = {
+ meta:{
+ type: "welcomeSettingsUpdated",
+ displayName: "Welcome Settings Changed",
+ calculateType: "nucleusSettingsUpdated",
+ color: NucleusColors.green,
+ emoji: "CONTROL.BLOCKTICK",
+ timestamp: new Date().getTime()
+ },
+ list: list,
+ hidden: {
+ guild: interaction.guild.id
}
- log(data);
- } catch {}
+ };
+ log(data);
} catch (e) {
- console.log(e)
+ console.log(e);
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Welcome Events")
- .setDescription(`Something went wrong while updating welcome settings`)
+ .setDescription("Something went wrong while updating welcome settings")
.setStatus("Danger")
.setEmoji("GUILD.ROLES.DELETE")
], components: []});
@@ -111,15 +109,15 @@
} else {
return interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Welcome Events")
- .setDescription(`No changes were made`)
+ .setDescription("No changes were made")
.setStatus("Success")
.setEmoji("GUILD.ROLES.CREATE")
], components: []});
}
}
- let lastClicked = null
+ let lastClicked = null;
while (true) {
- let config = await client.database.guilds.read(interaction.guild.id)
+ const config = await client.database.guilds.read(interaction.guild.id);
m = await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Welcome Events")
.setDescription(
@@ -162,47 +160,47 @@
.setDisabled(config.welcome.channel == "dm")
.setStyle("SECONDARY")
])
- ]})
+ ]});
let i;
try {
i = await m.awaitMessageComponent({ time: 300000 });
} catch (e) {
- break
+ break;
}
- i.deferUpdate()
+ i.deferUpdate();
if (i.customId == "clear-message") {
if (lastClicked == "clear-message") {
await client.database.guilds.write(interaction.guild.id, {"welcome.message": null});
- lastClicked = null
- } else { lastClicked = "clear-message" }
+ lastClicked = null;
+ } else { lastClicked = "clear-message"; }
} else if (i.customId == "clear-role") {
if (lastClicked == "clear-role") {
await client.database.guilds.write(interaction.guild.id, {"welcome.role": null});
- lastClicked = null
- } else { lastClicked = "clear-role" }
+ lastClicked = null;
+ } else { lastClicked = "clear-role"; }
} else if (i.customId == "clear-ping") {
if (lastClicked == "clear-ping") {
await client.database.guilds.write(interaction.guild.id, {"welcome.ping": null});
- lastClicked = null
- } else { lastClicked = "clear-ping" }
+ lastClicked = null;
+ } else { lastClicked = "clear-ping"; }
} else if (i.customId == "clear-channel") {
if (lastClicked == "clear-channel") {
await client.database.guilds.write(interaction.guild.id, {"welcome.channel": null});
- lastClicked = null
- } else { lastClicked = "clear-channel" }
+ lastClicked = null;
+ } else { lastClicked = "clear-channel"; }
} else if (i.customId == "set-channel-dm") {
await client.database.guilds.write(interaction.guild.id, {"welcome.channel": "dm"});
- lastClicked = null
+ lastClicked = null;
}
}
await interaction.editReply({embeds: [m.embeds[0].setFooter({text: "Message closed"})], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_GUILD")) throw "You must have the *Manage Server* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/tag.ts b/src/commands/tag.ts
index 70d5a75..4cae8e3 100644
--- a/src/commands/tag.ts
+++ b/src/commands/tag.ts
@@ -1,35 +1,35 @@
import { AutocompleteInteraction, CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import { SlashCommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
-import client from "../utils/client.js"
+import client from "../utils/client.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
const command = new SlashCommandBuilder()
.setName("tag")
.setDescription("Get and manage the servers tags")
- .addStringOption(o => o.setName("tag").setDescription("The tag to get").setAutocomplete(true).setRequired(true))
+ .addStringOption(o => o.setName("tag").setDescription("The tag to get").setAutocomplete(true).setRequired(true));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const config = await client.database.guilds.read(interaction.guild.id)
- const tags = config.getKey("tags")
- const tag = tags[interaction.options.getString("tag")]
+ const config = await client.database.guilds.read(interaction.guild.id);
+ const tags = config.getKey("tags");
+ const tag = tags[interaction.options.getString("tag")];
if (!tag) {
return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tag")
.setDescription(`Tag \`${interaction.options.getString("tag")}\` does not exist`)
.setEmoji("PUNISH.NICKNAME.RED")
.setStatus("Danger")
- ], ephemeral: true})
+ ], ephemeral: true});
}
- let url = ""
- let components = []
+ let url = "";
+ let components = [];
if (tag.match(/^(http|https):\/\/[^ "]+$/)) {
- url = tag
+ url = tag;
components = [new MessageActionRow().addComponents([new MessageButton()
.setLabel("Open")
.setURL(url)
.setStyle("LINK")
- ])]
+ ])];
}
return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle(interaction.options.getString("tag"))
@@ -37,20 +37,20 @@
.setEmoji("PUNISH.NICKNAME.GREEN")
.setStatus("Success")
.setImage(url)
- ], components: components, ephemeral: true})
+ ], components: components, ephemeral: true});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
const autocomplete = async (interaction: AutocompleteInteraction): Promise<string[]> => {
if (!interaction.guild) return [];
- const config = await client.database.guilds.read(interaction.guild.id)
+ const config = await client.database.guilds.read(interaction.guild.id);
const tags = Object.keys(config.getKey("tags"));
- return tags
-}
+ return tags;
+};
export { command };
export { callback };
diff --git a/src/commands/tags/create.ts b/src/commands/tags/create.ts
index 4615def..d2f15e1 100644
--- a/src/commands/tags/create.ts
+++ b/src/commands/tags/create.ts
@@ -8,14 +8,14 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("create")
- .setDescription("Creates a tag")
- .addStringOption(o => o.setName("name").setRequired(true).setDescription("The name of the tag"))
- .addStringOption(o => o.setName("value").setRequired(true).setDescription("The value of the tag, shown after running /tag name"))
+ .setName("create")
+ .setDescription("Creates a tag")
+ .addStringOption(o => o.setName("name").setRequired(true).setDescription("The name of the tag"))
+ .addStringOption(o => o.setName("value").setRequired(true).setDescription("The value of the tag, shown after running /tag name"));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let name = interaction.options.getString("name");
- let value = interaction.options.getString("value");
+ const name = interaction.options.getString("name");
+ const value = interaction.options.getString("value");
if (name.length > 100) return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tag Create")
.setDescription("Tag names cannot be longer than 100 characters")
@@ -28,7 +28,7 @@
.setStatus("Danger")
.setEmoji("PUNISH.NICKNAME.RED")
], ephemeral: true});
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
if (data.tags.length >= 100) return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tag Create")
.setDescription("You cannot have more than 100 tags")
@@ -41,18 +41,18 @@
.setStatus("Danger")
.setEmoji("PUNISH.NICKNAME.RED")
], ephemeral: true});
- let confirmation = await new confirmationMessage(interaction)
- .setEmoji("PUNISH.NICKNAME.YELLOW")
+ const confirmation = await new confirmationMessage(interaction)
+ .setEmoji("PUNISH.NICKNAME.YELLOW")
.setTitle("Tag create")
.setDescription(keyValueList({
"name": `${name}`,
"value": `\n> ${value}`
})
- + `\nAre you sure you want to create this tag?`)
+ + "\nAre you sure you want to create this tag?")
.setColor("Warning")
.setInverted(true)
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (!confirmation) return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Tag Create")
.setDescription("No changes were made")
@@ -75,13 +75,13 @@
.setStatus("Success")
.setEmoji("PUNISH.NICKNAME.GREEN")
], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/tags/delete.ts b/src/commands/tags/delete.ts
index 68a02d4..5a6d3d4 100644
--- a/src/commands/tags/delete.ts
+++ b/src/commands/tags/delete.ts
@@ -8,31 +8,31 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("delete")
- .setDescription("Deletes a tag")
- .addStringOption(o => o.setName("name").setRequired(true).setDescription("The name of the tag"))
+ .setName("delete")
+ .setDescription("Deletes a tag")
+ .addStringOption(o => o.setName("name").setRequired(true).setDescription("The name of the tag"));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let name = interaction.options.getString("name");
- let data = await client.database.guilds.read(interaction.guild.id);
+ const name = interaction.options.getString("name");
+ const data = await client.database.guilds.read(interaction.guild.id);
if (!data.tags[name]) return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tags")
.setDescription("That tag does not exist")
.setStatus("Danger")
.setEmoji("PUNISH.NICKNAME.RED")
], ephemeral: true});
- let confirmation = await new confirmationMessage(interaction)
+ const confirmation = await new confirmationMessage(interaction)
.setEmoji("PUNISH.NICKNAME.YELLOW")
.setTitle("Tag Delete")
.setDescription(keyValueList({
"name": `${name}`,
"value": `\n> ${data.tags[name]}`
})
- + `\nAre you sure you want to delete this tag?`)
+ + "\nAre you sure you want to delete this tag?")
.setColor("Warning")
.setInverted(true)
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (!confirmation) return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Tag Delete")
.setDescription("No changes were made")
@@ -42,7 +42,7 @@
try {
await client.database.guilds.write(interaction.guild.id, null, ["tags." + name]);
} catch (e) {
- console.log(e)
+ console.log(e);
return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Tag Delete")
.setDescription("Something went wrong and the tag was not deleted")
@@ -56,13 +56,13 @@
.setStatus("Success")
.setEmoji("PUNISH.NICKNAME.GREEN")
], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/tags/edit.ts b/src/commands/tags/edit.ts
index 2f585cd..f3698fc 100644
--- a/src/commands/tags/edit.ts
+++ b/src/commands/tags/edit.ts
@@ -8,16 +8,16 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("edit")
- .setDescription("Edits or renames a tag")
- .addStringOption(o => o.setName("name").setRequired(true).setDescription("The tag to edit"))
- .addStringOption(o => o.setName("value").setRequired(false).setDescription("The new value of the tag / Rename"))
- .addStringOption(o => o.setName("newname").setRequired(false).setDescription("The new name of the tag / Edit"))
+ .setName("edit")
+ .setDescription("Edits or renames a tag")
+ .addStringOption(o => o.setName("name").setRequired(true).setDescription("The tag to edit"))
+ .addStringOption(o => o.setName("value").setRequired(false).setDescription("The new value of the tag / Rename"))
+ .addStringOption(o => o.setName("newname").setRequired(false).setDescription("The new name of the tag / Edit"));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let name = interaction.options.getString("name");
- let value = interaction.options.getString("value") || "";
- let newname = interaction.options.getString("newname") || "";
+ const name = interaction.options.getString("name");
+ const value = interaction.options.getString("value") || "";
+ const newname = interaction.options.getString("newname") || "";
if (!newname && !value) return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tag Edit")
.setDescription("You must specify a value or a new name")
@@ -36,7 +36,7 @@
.setStatus("Danger")
.setEmoji("PUNISH.NICKNAME.RED")
], ephemeral: true});
- let data = await client.database.guilds.read(interaction.guild.id);
+ const data = await client.database.guilds.read(interaction.guild.id);
if (!data.tags[name]) return await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("Tag Edit")
.setDescription("That tag does not exist")
@@ -49,18 +49,18 @@
.setStatus("Danger")
.setEmoji("PUNISH.NICKNAME.RED")
], ephemeral: true});
- let confirmation = await new confirmationMessage(interaction)
- .setEmoji("PUNISH.NICKNAME.YELLOW")
+ const confirmation = await new confirmationMessage(interaction)
+ .setEmoji("PUNISH.NICKNAME.YELLOW")
.setTitle("Tag Edit")
.setDescription(keyValueList({
"name": `${name}` + (newname ? ` -> ${newname}` : ""),
"value": `\n> ${value ? value : data.tags[name]}`
})
- + `\nAre you sure you want to edit this tag?`)
+ + "\nAre you sure you want to edit this tag?")
.setColor("Warning")
.setInverted(true)
- .send()
- if (confirmation.cancelled) return
+ .send();
+ if (confirmation.cancelled) return;
if (!confirmation) return await interaction.editReply({embeds: [new EmojiEmbed()
.setTitle("Tag Edit")
.setDescription("No changes were made")
@@ -68,8 +68,8 @@
.setEmoji("PUNISH.NICKNAME.GREEN")
]});
try {
- let toSet = {};
- let toUnset = []
+ const toSet = {};
+ const toUnset = [];
if (value) toSet[`tags.${name}`] = value;
if (newname) {
toUnset.push(`tags.${name}`);
@@ -90,13 +90,13 @@
.setStatus("Success")
.setEmoji("PUNISH.NICKNAME.GREEN")
], components: []});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let member = (interaction.member as Discord.GuildMember)
- if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command"
+ const member = (interaction.member as Discord.GuildMember);
+ if (!member.permissions.has("MANAGE_MESSAGES")) throw "You must have the *Manage Messages* permission to use this command";
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/tags/list.ts b/src/commands/tags/list.ts
index c335267..7f3637f 100644
--- a/src/commands/tags/list.ts
+++ b/src/commands/tags/list.ts
@@ -1,10 +1,10 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import client from "../../utils/client.js";
-import { SelectMenuOption } from '@discordjs/builders';
+import { SelectMenuOption } from "@discordjs/builders";
import getEmojiByName from "../../utils/getEmojiByName.js";
import createPageIndicator from "../../utils/createPageIndicator.js";
@@ -12,8 +12,8 @@
class Embed {
embed: Discord.MessageEmbed;
title: string;
- description: string = "";
- pageId: number = 0;
+ description = "";
+ pageId = 0;
setEmbed(embed: Discord.MessageEmbed) { this.embed = embed; return this; }
setTitle(title: string) { this.title = title; return this; }
setDescription(description: string) { this.description = description; return this; }
@@ -23,61 +23,61 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
.setName("list")
- .setDescription("Lists all tags in the server")
+ .setDescription("Lists all tags in the server");
const callback = async (interaction: CommandInteraction): Promise<any> => {
- let data = await client.database.guilds.read(interaction.guild.id);
- let tags = data.getKey("tags");
- let strings = []
- if (data === {}) strings = ["*No tags exist*"]
+ const data = await client.database.guilds.read(interaction.guild.id);
+ const tags = data.getKey("tags");
+ let strings = [];
+ if (data === {}) strings = ["*No tags exist*"];
else {
- let string = ""
- for (let tag in tags) {
- let proposed = `**${tag}:** ${tags[tag]}\n`
+ let string = "";
+ for (const tag in tags) {
+ const proposed = `**${tag}:** ${tags[tag]}\n`;
if (string.length + proposed.length > 2000) {
- strings.push(string.slice(0, -1))
- string = ""
+ strings.push(string.slice(0, -1));
+ string = "";
}
- string += proposed
+ string += proposed;
}
- strings.push(string.slice(0, -1))
+ strings.push(string.slice(0, -1));
}
- let pages = []
- for (let string of strings) {
+ const pages = [];
+ for (const string of strings) {
pages.push(new Embed()
.setEmbed(new EmojiEmbed()
.setTitle("Tags")
.setDescription(string)
.setEmoji("PUNISH.NICKNAME.GREEN")
.setStatus("Success")
- ).setTitle(`Page ${pages.length + 1}`).setPageId(pages.length))
+ ).setTitle(`Page ${pages.length + 1}`).setPageId(pages.length));
}
let m;
m = await interaction.reply({embeds: LoadingEmbed, fetchReply: true, ephemeral: true});
let page = 0;
let selectPaneOpen = false;
while (true) {
- let selectPane = []
+ let selectPane = [];
if (selectPaneOpen) {
- let options = [];
+ const options = [];
pages.forEach(embed => {
options.push(new SelectMenuOption({
label: embed.title,
value: embed.pageId.toString(),
- description: embed.description || "",
- }))
- })
+ description: embed.description || ""
+ }));
+ });
selectPane = [new MessageActionRow().addComponents([
new Discord.MessageSelectMenu()
.addOptions(options)
.setCustomId("page")
.setMaxValues(1)
.setPlaceholder("Choose a page...")
- ])]
+ ])];
}
- let em = new Discord.MessageEmbed(pages[page].embed)
+ const em = new Discord.MessageEmbed(pages[page].embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
await interaction.editReply({
embeds: [em],
@@ -88,11 +88,11 @@
new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER")
])])
});
- let i
+ let i;
try {
i = await m.awaitMessageComponent({time: 300000 });
- } catch (e) { break }
- i.deferUpdate()
+ } catch (e) { break; }
+ i.deferUpdate();
if (i.component.customId === "left") {
if (page > 0) page--;
selectPaneOpen = false;
@@ -105,7 +105,7 @@
page = parseInt(i.values[0]);
selectPaneOpen = false;
} else {
- let em = new Discord.MessageEmbed(pages[page].embed)
+ const em = new Discord.MessageEmbed(pages[page].embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message closed");
await interaction.editReply({
embeds: [em], components: [new MessageActionRow().addComponents([
@@ -114,11 +114,11 @@
new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(true),
new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER").setDisabled(true)
])]
- })
+ });
return;
}
}
- let em = new Discord.MessageEmbed(pages[page].embed)
+ const em = new Discord.MessageEmbed(pages[page].embed);
em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message timed out");
await interaction.editReply({
embeds: [em],
@@ -129,11 +129,11 @@
new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER").setDisabled(true)
])]
});
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/ticket/close.ts b/src/commands/ticket/close.ts
index 5a3371e..b3e5351 100644
--- a/src/commands/ticket/close.ts
+++ b/src/commands/ticket/close.ts
@@ -5,16 +5,16 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("close")
- .setDescription("Closes a ticket")
+ .setName("close")
+ .setDescription("Closes a ticket");
const callback = async (interaction: CommandInteraction): Promise<any> => {
await close(interaction);
-}
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/ticket/create.ts b/src/commands/ticket/create.ts
index 3d796aa..25de336 100644
--- a/src/commands/ticket/create.ts
+++ b/src/commands/ticket/create.ts
@@ -5,17 +5,17 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("create")
- .setDescription("Creates a new modmail ticket")
- .addStringOption(option => option.setName("message").setDescription("The content of the ticket").setRequired(false))
+ .setName("create")
+ .setDescription("Creates a new modmail ticket")
+ .addStringOption(option => option.setName("message").setDescription("The content of the ticket").setRequired(false));
const callback = async (interaction: CommandInteraction): Promise<any> => {
- await create(interaction)
-}
+ await create(interaction);
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/user/about.ts b/src/commands/user/about.ts
index 82eda6a..59ba2e6 100644
--- a/src/commands/user/about.ts
+++ b/src/commands/user/about.ts
@@ -1,4 +1,4 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, MessageActionRow, MessageButton } from "discord.js";
import { SelectMenuOption, SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
@@ -6,20 +6,20 @@
import getEmojiByName from "../../utils/getEmojiByName.js";
import generateKeyValueList from "../../utils/generateKeyValueList.js";
import createPageIndicator from "../../utils/createPageIndicator.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("about")
- .setDescription("Shows info about a user")
- .addUserOption(option => option.setName("user").setDescription("The user to get info about | Default: Yourself"))
+ .setName("about")
+ .setDescription("Shows info about a user")
+ .addUserOption(option => option.setName("user").setDescription("The user to get info about | Default: Yourself"));
class Embed {
embed: Discord.MessageEmbed;
title: string;
- description: string = "";
- pageId: number = 0;
+ description = "";
+ pageId = 0;
setEmbed(embed: Discord.MessageEmbed) { this.embed = embed; return this; }
setTitle(title: string) { this.title = title; return this; }
setDescription(description: string) { this.description = description; return this; }
@@ -28,23 +28,23 @@
const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser, renderDelta } = client.logger
- let member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
- let flags: string[] = [];
+ const { renderUser, renderDelta } = client.logger;
+ const member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
+ const flags: string[] = [];
if ([
"438733159748599813", // Pinea
"317731855317336067", // Mini
"261900651230003201", // Coded
- "511655498676699136", // Zan
- ].includes(member.user.id)) { flags.push("NUCLEUSDEVELOPER") }
- if ((await client.guilds.cache.get("684492926528651336")?.members.fetch())?.filter(m => m.roles.cache.has("760896837866749972"))?.map(m => m.id).includes(member.user.id)) { flags.push("CLICKSDEVELOPER") }
+ "511655498676699136" // Zan
+ ].includes(member.user.id)) { flags.push("NUCLEUSDEVELOPER"); }
+ if ((await client.guilds.cache.get("684492926528651336")?.members.fetch())?.filter(m => m.roles.cache.has("760896837866749972"))?.map(m => m.id).includes(member.user.id)) { flags.push("CLICKSDEVELOPER"); }
member.user.flags.toArray().map(flag => {
- flags.push(flag.toString())
- })
- if (member.user.bot === true) { flags.push("BOT") }
+ flags.push(flag.toString());
+ });
+ if (member.user.bot === true) { flags.push("BOT"); }
// Check if they are boosting the server
- if (member.premiumSince) { flags.push("BOOSTER") }
- let nameReplacements = {
+ if (member.premiumSince) { flags.push("BOOSTER"); }
+ const nameReplacements = {
"NUCLEUSDEVELOPER": "**Nucleus Developer**",
"CLICKSDEVELOPER": "Clicks Developer",
"HOUSE_BRAVERY": "Hypesquad Bravery",
@@ -59,31 +59,31 @@
"EARLY_VERIFIED_BOT_DEVELOPER": "Verified Bot Developer",
"BOT": "Bot",
"BOOSTER": "Server Booster"
- }
- let members = await interaction.guild.members.fetch()
- let membersArray = [...members.values()]
- membersArray.sort((a, b) => a.joinedTimestamp - b.joinedTimestamp)
- let joinPos = membersArray.findIndex(m => m.id === member.user.id)
+ };
+ const members = await interaction.guild.members.fetch();
+ const membersArray = [...members.values()];
+ membersArray.sort((a, b) => a.joinedTimestamp - b.joinedTimestamp);
+ const joinPos = membersArray.findIndex(m => m.id === member.user.id);
- let roles = member.roles.cache.filter(r => r.id !== interaction.guild.id).sort()
+ const roles = member.roles.cache.filter(r => r.id !== interaction.guild.id).sort();
let s = "";
let count = 0;
- let ended = false
+ let ended = false;
roles.map(item => {
if (ended) return;
- let string = `<@&${item.id}>, `
+ const string = `<@&${item.id}>, `;
if(s.length + string.length > 1000) {
- ended = true
- s += `and ${roles.size - count} more`
- return
- };
- count ++
+ ended = true;
+ s += `and ${roles.size - count} more`;
+ return;
+ }
+ count ++;
s += string;
- })
+ });
if(s.length > 0 && !ended) s = s.slice(0, -2);
- let perms = ""
- let permsArray = {
+ let perms = "";
+ const permsArray = {
"ADMINISTRATOR": "Administrator",
"MANAGE_GUILD": "Manage Server",
"MANAGE_ROLES": "Manage Roles",
@@ -96,15 +96,15 @@
"MANAGE_MESSAGES": "Manage Messages",
"VIEW_AUDIT_LOG": "View Audit Log",
"MENTION_EVERYONE": "Mention Everyone"
- }
+ };
Object.keys(permsArray).map(perm => {
- let hasPerm = member.permissions.has(perm as Discord.PermissionString)
- perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`
- })
+ const hasPerm = member.permissions.has(perm as Discord.PermissionString);
+ perms += `${getEmojiByName("CONTROL." + (hasPerm ? "TICK" : "CROSS"))} ${permsArray[perm]}\n`;
+ });
let selectPaneOpen = false;
- let embeds = [
+ const embeds = [
new Embed()
.setEmbed(new EmojiEmbed()
.setTitle("User Info: General")
@@ -138,7 +138,7 @@
generateKeyValueList({
"member": renderUser(member.user),
"id": `\`${member.id}\``,
- "roles": `${member.roles.cache.size - 1}`,
+ "roles": `${member.roles.cache.size - 1}`
}) + "\n" +
(s.length > 0 ? s : "*None*") + "\n"
)
@@ -152,37 +152,37 @@
.setDescription(
generateKeyValueList({
"member": renderUser(member.user),
- "id": `\`${member.id}\``,
+ "id": `\`${member.id}\``
}) + "\n" + perms
)
.setThumbnail(await member.user.displayAvatarURL({dynamic: true}))
- ).setTitle("Key Permissions").setDescription("Key permissions the user has").setPageId(2),
- ]
- let m
+ ).setTitle("Key Permissions").setDescription("Key permissions the user has").setPageId(2)
+ ];
+ let m;
m = await interaction.reply({embeds: LoadingEmbed, fetchReply: true, ephemeral: true});
- let page = 0
- let breakReason = ""
+ let page = 0;
+ let breakReason = "";
while (true) {
- let em = new Discord.MessageEmbed(embeds[page].embed)
+ const em = new Discord.MessageEmbed(embeds[page].embed);
em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page));
- let selectPane = []
+ let selectPane = [];
if (selectPaneOpen) {
- let options = [];
+ const options = [];
embeds.forEach(embed => {
options.push(new SelectMenuOption({
label: embed.title,
value: embed.pageId.toString(),
- description: embed.description || "",
- }))
- })
+ description: embed.description || ""
+ }));
+ });
selectPane = [new MessageActionRow().addComponents([
new Discord.MessageSelectMenu()
.addOptions(options)
.setCustomId("page")
.setMaxValues(1)
.setPlaceholder("Choose a page...")
- ])]
+ ])];
}
await interaction.editReply({
embeds: [em],
@@ -207,12 +207,12 @@
.setCustomId("close")
.setStyle("DANGER")
])])
- })
- let i
+ });
+ let i;
try {
i = await m.awaitMessageComponent({time: 300000});
- } catch { breakReason = "Message timed out"; break }
- i.deferUpdate()
+ } catch { breakReason = "Message timed out"; break; }
+ i.deferUpdate();
if (i.component.customId === "left") {
if (page > 0) page--;
selectPaneOpen = false;
@@ -232,7 +232,7 @@
break;
}
}
- let em = new Discord.MessageEmbed(embeds[page].embed)
+ const em = new Discord.MessageEmbed(embeds[page].embed);
em.setDescription(em.description + "\n" + createPageIndicator(embeds.length, page) + " | " + breakReason);
await interaction.editReply({embeds: [em], components: [new MessageActionRow().addComponents([
new MessageButton()
@@ -255,12 +255,12 @@
.setCustomId("close")
.setStyle("DANGER")
.setDisabled(true)
- ])]})
-}
+ ])]});
+};
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/user/avatar.ts b/src/commands/user/avatar.ts
index e72506f..8f327a5 100644
--- a/src/commands/user/avatar.ts
+++ b/src/commands/user/avatar.ts
@@ -2,19 +2,18 @@
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
-import getEmojiByName from "../../utils/getEmojiByName.js";
import generateKeyValueList from "../../utils/generateKeyValueList.js";
-import client from "../../utils/client.js"
+import client from "../../utils/client.js";
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("avatar")
- .setDescription("Shows the avatar of a user")
- .addUserOption(option => option.setName("user").setDescription("The user to get the avatar of | Default: Yourself"))
+ .setName("avatar")
+ .setDescription("Shows the avatar of a user")
+ .addUserOption(option => option.setName("user").setDescription("The user to get the avatar of | Default: Yourself"));
-const callback = async (interaction: CommandInteraction): Promise<any> => {
- const { renderUser } = client.logger
- let member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
+const callback = async (interaction: CommandInteraction): Promise<void> => {
+ const { renderUser } = client.logger;
+ const member = (interaction.options.getMember("user") || interaction.member) as Discord.GuildMember;
await interaction.reply({embeds: [new EmojiEmbed()
.setTitle("User Info")
.setStatus("Success")
@@ -22,16 +21,16 @@
.setDescription(
generateKeyValueList({
"member": renderUser(member.user),
- "url": member.user.displayAvatarURL({dynamic: true}),
+ "url": member.user.displayAvatarURL({dynamic: true})
})
)
.setImage(await member.user.displayAvatarURL({dynamic: true}))
], ephemeral: true, fetchReply: true});
-}
+};
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
+const check = (_interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/user/track.ts b/src/commands/user/track.ts
index c2e0986..48733fc 100644
--- a/src/commands/user/track.ts
+++ b/src/commands/user/track.ts
@@ -1,6 +1,8 @@
-import { LoadingEmbed } from './../../utils/defaultEmbeds.js';
+import { LoadingEmbed } from "./../../utils/defaultEmbeds.js";
import Discord, { CommandInteraction, GuildMember, Message, MessageActionRow, MessageButton } from "discord.js";
import { SelectMenuOption, SlashCommandSubcommandBuilder } from "@discordjs/builders";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
import { WrappedCheck } from "jshaiku";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
@@ -9,91 +11,92 @@
const command = (builder: SlashCommandSubcommandBuilder) =>
builder
- .setName("track")
- .setDescription("Moves a user along a role track")
- .addUserOption(option => option.setName("user").setDescription("The user to manage").setRequired(true))
+ .setName("track")
+ .setDescription("Moves a user along a role track")
+ .addUserOption(option => option.setName("user").setDescription("The user to manage").setRequired(true));
-const generateFromTrack = (position: number, active: any, size: number, disabled: any) => {
- active = active ? "ACTIVE" : "INACTIVE"
- disabled = disabled ? "GREY." : ""
- if (position === 0 && size === 1) return "TRACKS.SINGLE." + disabled + active
- if (position === size - 1) return "TRACKS.VERTICAL.BOTTOM." + disabled + active
- if (position === 0) return "TRACKS.VERTICAL.TOP." + disabled + active
- return "TRACKS.VERTICAL.MIDDLE." + disabled + active
-}
+const generateFromTrack = (position: number, active: string | boolean, size: number, disabled: string | boolean) => {
+ active = active ? "ACTIVE" : "INACTIVE";
+ disabled = disabled ? "GREY." : "";
+ if (position === 0 && size === 1) return "TRACKS.SINGLE." + disabled + active;
+ if (position === size - 1) return "TRACKS.VERTICAL.BOTTOM." + disabled + active;
+ if (position === 0) return "TRACKS.VERTICAL.TOP." + disabled + active;
+ return "TRACKS.VERTICAL.MIDDLE." + disabled + active;
+};
-const callback = async (interaction: CommandInteraction): Promise<any> => {
+const callback = async (interaction: CommandInteraction): Promise<void | unknown> => {
const { renderUser } = client.logger;
const member = interaction.options.getMember("user") as GuildMember;
const guild = interaction.guild;
- let config = await client.database.guilds.read(guild.id);
- await interaction.reply({embeds: LoadingEmbed, ephemeral: true})
- let track = 0
+ if (!guild) return;
+ const config = await client.database.guilds.read(guild.id);
+ await interaction.reply({embeds: LoadingEmbed, ephemeral: true});
+ let track = 0;
let generated;
- const roles = await guild.roles.fetch()
- let memberRoles = await member.roles
- let managed
+ const roles = await guild.roles.fetch();
+ const memberRoles = await member.roles;
+ let managed: boolean;
while (true) {
- let data = config.tracks[track]
- if (data.manageableBy !== undefined) managed = data.manageableBy.some(element => {return memberRoles.cache.has(element)})
- else managed = false
- let dropdown = new Discord.MessageSelectMenu().addOptions(config.tracks.map((option, index) => {
- let hasRoleInTrack = option.track.some(element => {return memberRoles.cache.has(element)})
+ const data = config.tracks[track];
+ if (data.manageableBy !== undefined) managed = data.manageableBy.some((element: string) => {return memberRoles.cache.has(element);});
+ else managed = false;
+ const dropdown = new Discord.MessageSelectMenu().addOptions(config.tracks.map((option, index) => {
+ const hasRoleInTrack = option.track.some((element: string) => {return memberRoles.cache.has(element);});
return new SelectMenuOption({
default: index === track,
label: option.name,
value: index.toString(),
description: option.track.length === 0 ? "No" : addPlural(option.track.length, "role"),
emoji: client.emojis.resolve(getEmojiByName("TRACKS.SINGLE." + (hasRoleInTrack ? "ACTIVE" : "INACTIVE"), "id"))
- })
- })).setCustomId("select").setMaxValues(1)
- let allowed = []
- generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n"
- generated += (data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n"
- generated += (data.retainPrevious ? "When promoted, the user keeps previous roles" : "Members will lose their current role when promoted") + "\n"
+ });
+ })).setCustomId("select").setMaxValues(1);
+ const allowed = [];
+ generated = "**Track:** " + data.name + "\n" + "**Member:** " + renderUser(member.user) + "\n";
+ generated += (data.nullable ? "Members do not need a role in this track" : "A role in this track is required") + "\n";
+ generated += (data.retainPrevious ? "When promoted, the user keeps previous roles" : "Members will lose their current role when promoted") + "\n";
generated += "\n" + data.track.map((role, index) => {
- let allow = (roles.get(role).position >= (interaction.member as GuildMember).roles.highest.position) && !managed
- allowed.push(!allow)
+ const allow = (roles.get(role).position >= (interaction.member as GuildMember).roles.highest.position) && !managed;
+ allowed.push(!allow);
return getEmojiByName(generateFromTrack(
index,
memberRoles.cache.has(role),
data.track.length,
allow
)) + " " +
- roles.get(role).name + " [<@&" + roles.get(role).id + ">]"
- }).join("\n")
- let selected = [];
+ roles.get(role).name + " [<@&" + roles.get(role).id + ">]";
+ }).join("\n");
+ const selected = [];
for (let i = 0; i < data.track.length; i++) {
- if (memberRoles.cache.has(data.track[i])) selected.push(data.track[i])
+ if (memberRoles.cache.has(data.track[i])) selected.push(data.track[i]);
}
- let conflict = data.retainPrevious ? false : selected.length > 1;
- let conflictDropdown
- let currentRoleIndex
+ const conflict = data.retainPrevious ? false : selected.length > 1;
+ let conflictDropdown;
+ let currentRoleIndex;
if (conflict) {
- generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${selected.length} roles from this track. `
- conflictDropdown = []
+ generated += `\n\n${getEmojiByName(`PUNISH.WARN.${managed ? "YELLOW" : "RED"}`)} This user has ${selected.length} roles from this track. `;
+ conflictDropdown = [];
if (
(roles.get(selected[0]).position < memberRoles.highest.position) || managed
) {
- generated += `In order to promote or demote this user, you must select which role the member should keep.`
+ generated += "In order to promote or demote this user, you must select which role the member should keep.";
selected.forEach(role => {
conflictDropdown.push(new SelectMenuOption({
label: roles.get(role).name,
- value: roles.get(role).id,
- }))
- })
+ value: roles.get(role).id
+ }));
+ });
conflictDropdown = [new Discord.MessageSelectMenu()
.addOptions(conflictDropdown)
.setCustomId("conflict")
.setMaxValues(1)
- .setPlaceholder("Select a role to keep")]
+ .setPlaceholder("Select a role to keep")];
} else {
- generated += "You don't have permission to manage one or more of the users roles, and therefore can't select one to keep."
+ generated += "You don't have permission to manage one or more of the users roles, and therefore can't select one to keep.";
}
} else {
- currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0].toString())
+ currentRoleIndex = selected.length === 0 ? -1 : data.track.indexOf(selected[0].toString());
}
- let m = await interaction.editReply({embeds: [new EmojiEmbed()
+ const m = await interaction.editReply({embeds: [new EmojiEmbed()
.setEmoji("TRACKS.ICON")
.setTitle("Tracks")
.setDescription(`${generated}`)
@@ -101,82 +104,82 @@
], components: [
new MessageActionRow().addComponents(dropdown)
]
- .concat(conflict && conflictDropdown.length ? [new MessageActionRow().addComponents(conflictDropdown)] : [])
- .concat([
- new MessageActionRow().addComponents([
- new MessageButton()
- .setEmoji(getEmojiByName("CONTROL.UP", "id"))
- .setLabel("Move up")
- .setCustomId("promote")
- .setStyle("SUCCESS")
- .setDisabled(conflict || currentRoleIndex === 0 || (currentRoleIndex === -1 ? false : !allowed[currentRoleIndex - 1])),
- new MessageButton()
- .setEmoji(getEmojiByName("CONTROL.DOWN", "id"))
- .setLabel("Move down")
- .setCustomId("demote")
- .setStyle("DANGER")
- .setDisabled(conflict || (
- data.nullable ? currentRoleIndex <= -1 :
- currentRoleIndex === data.track.length - 1 || currentRoleIndex <= -1
- ) || !allowed[currentRoleIndex]),
- ])
- ])})
+ .concat(conflict && conflictDropdown.length ? [new MessageActionRow().addComponents(conflictDropdown)] : [])
+ .concat([
+ new MessageActionRow().addComponents([
+ new MessageButton()
+ .setEmoji(getEmojiByName("CONTROL.UP", "id"))
+ .setLabel("Move up")
+ .setCustomId("promote")
+ .setStyle("SUCCESS")
+ .setDisabled(conflict || currentRoleIndex === 0 || (currentRoleIndex === -1 ? false : !allowed[currentRoleIndex - 1])),
+ new MessageButton()
+ .setEmoji(getEmojiByName("CONTROL.DOWN", "id"))
+ .setLabel("Move down")
+ .setCustomId("demote")
+ .setStyle("DANGER")
+ .setDisabled(conflict || (
+ data.nullable ? currentRoleIndex <= -1 :
+ currentRoleIndex === data.track.length - 1 || currentRoleIndex <= -1
+ ) || !allowed[currentRoleIndex])
+ ])
+ ])});
let component;
try {
component = await (m as Message).awaitMessageComponent({time: 300000});
} catch (e) {
- return
+ return;
}
- component.deferUpdate()
+ component.deferUpdate();
if (component.customId === "conflict") {
- let rolesToRemove = selected.filter(role => role !== component.values[0])
- await member.roles.remove(rolesToRemove)
+ const rolesToRemove = selected.filter(role => role !== component.values[0]);
+ await member.roles.remove(rolesToRemove);
} else if (component.customId === "promote") {
if (
currentRoleIndex === -1 ? allowed[data.track.length - 1] :
- allowed[currentRoleIndex - 1] && allowed[currentRoleIndex]
+ allowed[currentRoleIndex - 1] && allowed[currentRoleIndex]
) {
if (currentRoleIndex === -1) {
- await member.roles.add(data.track[data.track.length - 1])
+ await member.roles.add(data.track[data.track.length - 1]);
} else if (currentRoleIndex < data.track.length) {
- if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex])
- await member.roles.add(data.track[currentRoleIndex - 1])
+ if (!data.retainPrevious) await member.roles.remove(data.track[currentRoleIndex]);
+ await member.roles.add(data.track[currentRoleIndex - 1]);
}
}
} else if (component.customId === "demote") {
if(allowed[currentRoleIndex]) {
if (currentRoleIndex === data.track.length - 1) {
- if (data.nullable) await member.roles.remove(data.track[currentRoleIndex])
+ if (data.nullable) await member.roles.remove(data.track[currentRoleIndex]);
} else if (currentRoleIndex > -1) {
- await member.roles.remove(data.track[currentRoleIndex])
- await member.roles.add(data.track[currentRoleIndex + 1])
+ await member.roles.remove(data.track[currentRoleIndex]);
+ await member.roles.add(data.track[currentRoleIndex + 1]);
}
}
} else if (component.customId === "select") {
- track = component.values[0]
+ track = component.values[0];
}
}
-}
+};
-const check = async (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
- let tracks = (await client.database.guilds.read(interaction.guild.id)).tracks
- if (tracks.length === 0) throw "This server does not have any tracks"
- let member = (interaction.member as GuildMember)
+const check = async (interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
+ const tracks = (await client.database.guilds.read(interaction.guild.id)).tracks;
+ if (tracks.length === 0) throw "This server does not have any tracks";
+ const member = (interaction.member as GuildMember);
// Allow the owner to promote anyone
- if (member.id === interaction.guild.ownerId) return true
+ if (member.id === interaction.guild.ownerId) return true;
// Check if the user can manage any of the tracks
- let managed = false
+ let managed = false;
for (const element of tracks) {
- if (!element.track.manageableBy) continue
- if (!element.track.manageableBy.some(role => member.roles.cache.has(role))) continue
+ if (!element.track.manageableBy) continue;
+ if (!element.track.manageableBy.some(role => member.roles.cache.has(role))) continue;
managed = true;
break;
- };
+ }
// Check if the user has manage_roles permission
if (!managed && ! member.permissions.has("MANAGE_ROLES")) throw "You do not have the *Manage Roles* permission";
// Allow track
return true;
-}
+};
export { command };
export { callback };
diff --git a/src/commands/verify.ts b/src/commands/verify.ts
index bd71fe4..f7e66b8 100644
--- a/src/commands/verify.ts
+++ b/src/commands/verify.ts
@@ -1,19 +1,21 @@
-import { CommandInteraction } from "discord.js";
+import type { CommandInteraction } from "discord.js";
import { SlashCommandBuilder } from "@discordjs/builders";
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
import { WrappedCheck } from "jshaiku";
import verify from "../reflex/verify.js";
const command = new SlashCommandBuilder()
.setName("verify")
- .setDescription("Get verified in the server")
+ .setDescription("Get verified in the server");
-const callback = async (interaction: CommandInteraction): Promise<any> => {
+const callback = async (interaction: CommandInteraction): Promise<void> => {
verify(interaction);
-}
+};
-const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
+const check = (_interaction: CommandInteraction, _defaultCheck: WrappedCheck) => {
return true;
-}
+};
export { command };
export { callback };