I did some work at school and need to save it hi github
oh also you're welcome mini, i changed the colours
diff --git a/src/commands/mod/mute.ts b/src/commands/mod/mute.ts
index 2942844..3c4544e 100644
--- a/src/commands/mod/mute.ts
+++ b/src/commands/mod/mute.ts
@@ -227,7 +227,7 @@
// Check if Nucleus has permission to mute
if (! interaction.guild.me.permissions.has("MODERATE_MEMBERS")) throw "I do not have the `moderate_members` permission";
// Do not allow the user to have admin or be the owner
- if (apply.permissions.has("ADMINISTRATOR") || apply.id == interaction.guild.ownerId) throw "You cannot mute an admin or the owner"
+ if ((interaction.options.getMember("user") as GuildMember).permissions.has("ADMINISTRATOR") || (interaction.options.getMember("user") as GuildMember).id == interaction.guild.ownerId) throw "You cannot mute an admin or the owner"
// Do not allow muting Nucleus
if (member.id == interaction.guild.me.id) throw "I cannot mute myself"
// Allow the owner to mute anyone
diff --git a/src/commands/mod/slowmode.ts b/src/commands/mod/slowmode.ts
index b91f065..8bec805 100644
--- a/src/commands/mod/slowmode.ts
+++ b/src/commands/mod/slowmode.ts
@@ -1,57 +1,53 @@
-import humanizeDuration from 'humanize-duration';
-import { CommandInteraction, GuildMember, TextChannel } from "discord.js";
+import { CommandInteraction } from "discord.js";
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
import { WrappedCheck } from "jshaiku";
-import keyValueList from "../../utils/generateKeyValueList.js";
-import confirmationMessage from "../../utils/confirmationMessage.js";
-import generateEmojiEmbed from "../../utils/generateEmojiEmbed.js";
+import humanizeDuration from 'humanize-duration';
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"]
- ]))
+ .addIntegerOption(option => option.setName("seconds").setDescription("The seconds between messages").setRequired(false))
+ .addIntegerOption(option => option.setName("minutes").setDescription("The minutes between messages").setRequired(false))
+ .addIntegerOption(option => option.setName("hours").setDescription("The hours between messages").setRequired(false))
-const callback = async (interaction: CommandInteraction) => {
- let time = parseInt(interaction.options.getString("time") ?? "0");
- if (time === 0 && (interaction.channel as TextChannel).rateLimitPerUser === 0) { time = 10 }
+const callback = (interaction: CommandInteraction) => {
+ let seconds = interaction.option.getInteger("seconds")
+ let minutes = interaction.option.getInteger("minutes")
+ let hours = interaction.option.getInteger("hours")
+ let totalTime = seconds + (minutes * 60) + (hours * 60 * 60)
+
let confirmation = await new confirmationMessage(interaction)
- .setEmoji("CHANNEL.SLOWMODE.RED")
+ .setEmoji("PUNISH.SLOWMODE.RED")
.setTitle("Slowmode")
.setDescription(keyValueList({
- "time": time ? humanizeDuration(time * 1000, { round: true }) : "No delay",
+ "delay": `${totalTime ? humanizeDuration(totalTime * 1000) : "*No delay*"}`
})
- + `Are you sure you want to set the slowmode in this channel?`)
+ + `Are you sure you want to enable slowmode in this channel?`)
.setColor("Danger")
// pluralize("day", interaction.options.getInteger("delete"))
// const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" }
.send()
if (confirmation.success) {
try {
- (interaction.channel as TextChannel).setRateLimitPerUser(time)
- } catch (e) {
- await interaction.editReply({embeds: [new generateEmojiEmbed()
- .setEmoji("CHANNEL.SLOWMODE.RED")
+ await interaction.setRateLimitPerUser(totalTime, "Nucleus slowmode")
+ } catch {
+ return await interaction.editReply({embeds: [new generateEmojiEmbed()
+ .setEmoji("PUNISH.SLOWMODE.RED")
.setTitle(`Slowmode`)
- .setDescription("An error occurred while setting the slowmode")
+ .setDescription("Something went wrong and the slowmode could not be set.")
.setStatus("Danger")
], components: []})
}
await interaction.editReply({embeds: [new generateEmojiEmbed()
- .setEmoji(`CHANNEL.SLOWMODE.GREEN`)
+ .setEmoji("PUNISH.NICKNAME.GREEN")
.setTitle(`Slowmode`)
.setDescription("The channel slowmode was set successfully")
.setStatus("Success")
], components: []})
} else {
await interaction.editReply({embeds: [new generateEmojiEmbed()
- .setEmoji("CHANNEL.SLOWMODE.GREEN")
+ .setEmoji("PUNISH.SLOWMODE.GREEN")
.setTitle(`Slowmode`)
.setDescription("No changes were made")
.setStatus("Success")
@@ -61,9 +57,12 @@
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
let 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
+ let me = (interaction.guild.me as GuildMember)
+ // Check if Nucleus can edit the channel
+ if (! interaction.guild.me.permission.has("MANAGE_CHANNELS")) throw "I do not have permission to edit this channel"
+ // Allow the owner to set any channel
+ if (member.id == interaction.guild.ownerId) return true
+ // Check if the user has manage_channels permission
if (! member.permissions.has("MANAGE_CHANNELS")) throw "You do not have the `manage_channels` permission";
// Allow slowmode
return true
diff --git a/src/commands/mod/unban.ts b/src/commands/mod/unban.ts
index 26815eb..8ea3ec1 100644
--- a/src/commands/mod/unban.ts
+++ b/src/commands/mod/unban.ts
@@ -88,6 +88,7 @@
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
let member = (interaction.member as GuildMember)
+ let me = (interaction.guild.me as GuildMember)
// Check if Nucleus can unban members
if (! interaction.guild.me.permissions.has("BAN_MEMBERS")) throw "I do not have the `ban_members` permission";
// Allow the owner to unban anyone
diff --git a/src/commands/mod/unmute.ts b/src/commands/mod/unmute.ts
index 2d630ea..163c059 100644
--- a/src/commands/mod/unmute.ts
+++ b/src/commands/mod/unmute.ts
@@ -89,7 +89,7 @@
// Check if Nucleus has permission to unmute
if (! interaction.guild.me.permissions.has("MODERATE_MEMBERS")) throw "I do not have the `moderate_members` permission";
// Do not allow the user to have admin or be the owner
- if (apply.permissions.has("ADMINISTRATOR") || (interaction.options.getMember("user") as GuildMember).id == interaction.guild.ownerId) throw "You cannot unmute an admin or the owner"
+ if ((interaction.options.getMember("user") as GuildMember).permissions.has("ADMINISTRATOR") || (interaction.options.getMember("user") as GuildMember).id == interaction.guild.ownerId) throw "You cannot unmute an admin or the owner"
// Allow the owner to unmute anyone
if (member.id == interaction.guild.ownerId) return true
// Check if the user has moderate_members permission
diff --git a/src/commands/mod/unnamed.ts b/src/commands/mod/unnamed.ts
index c2d5618..4c6a31e 100644
--- a/src/commands/mod/unnamed.ts
+++ b/src/commands/mod/unnamed.ts
@@ -217,7 +217,7 @@
// Check if Nucleus has permission to UNNAMED
if (! interaction.guild.me.permissions.has("MANAGE_ROLES")) throw "I do not have the `manage_roles` permission";
// Do not allow the user to have admin or be the owner
- if (apply.permissions.has("ADMINISTRATOR") || (interaction.options.getMember("user") as GuildMember).id == interaction.guild.ownerId) throw "You cannot mute an admin or the owner"
+ if ((interaction.options.getMember("user") as GuildMember).permissions.has("ADMINISTRATOR") || (interaction.options.getMember("user") as GuildMember).id == interaction.guild.ownerId) throw "You cannot mute an admin or the owner"
// Do not allow muting Nucleus
if (member.id == interaction.guild.me.id) throw "I cannot UNNAMED myself"
// Allow the owner to UNNAMED anyone
diff --git a/src/commands/nucleus/suggest.ts b/src/commands/nucleus/suggest.ts
index 0512020..d1d6a03 100644
--- a/src/commands/nucleus/suggest.ts
+++ b/src/commands/nucleus/suggest.ts
@@ -20,6 +20,7 @@
.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?`)
.setColor("Danger")
+ .setInverted(true)
.send()
if (confirmation.success) {
await (interaction.client.channels.cache.get('955161206459600976') as Discord.TextChannel).send({
diff --git a/src/commands/user/track.ts b/src/commands/user/track.ts
index ebbef82..be32f41 100644
--- a/src/commands/user/track.ts
+++ b/src/commands/user/track.ts
@@ -162,10 +162,11 @@
}
const check = (interaction: CommandInteraction, defaultCheck: WrappedCheck) => {
+ let member = (interaction.member as GuildMember)
// Allow the owner to promote anyone
- if ((interaction.member as GuildMember).id == interaction.guild.ownerId) return true
+ if (member.id == interaction.guild.ownerId) return true
// Check if the user has manage_roles permission
- if (! (interaction.member as GuildMember).permissions.has("MANAGE_ROLES")) throw "You do not have the `manage_roles` permission";
+ if (! member.permissions.has("MANAGE_ROLES")) throw "You do not have the `manage_roles` permission";
// Allow track
return true // TODO: allow if the member has manage perms
}
diff --git a/src/config/emojis.json b/src/config/emojis.json
new file mode 100644
index 0000000..12741f2
--- /dev/null
+++ b/src/config/emojis.json
@@ -0,0 +1,352 @@
+{
+ "NUCLEUS": {
+ "LOGO": "953040840945721385",
+ "LOADING": "a946346549271732234",
+ "INFO": {
+ "HELP": "751751467014029322",
+ "ABOUT": "751762088346517504",
+ "COMMANDS": "751762088229339136",
+ "SUPPORT": "751762087780286495"
+ },
+ "COMMANDS": {
+ "RAID": "777143043711172608",
+ "LOCK": "776848800995868682",
+ "IGNORE": "777520659270074389"
+ }
+ },
+ "ICONS": {
+ "ADD": "826823514904330251",
+ "REMOVE": "826823515268186152",
+ "OPP": {
+ "ADD": "837355918831124500",
+ "REMOVE": "837355918420869162"
+ },
+ "CHANNEL": {
+ "TEXT": "752971441351426089",
+ "VOICE": "752971441586307091",
+ "STORE": "853668786925469706",
+ "ANNOUNCEMENT": "853668786493063169",
+ "STAGE": "853668786842763294"
+ }
+ },
+ "CONTROL": {
+ "TICK": "947441964234702849",
+ "CROSS": "947441948543815720",
+ "BLOCKCROSS": "952261738349330493",
+ "LEFT": "947441951148486728",
+ "RIGHT": "947441957473488916",
+ "UP": "963409197293273108",
+ "DOWN": "963409199549796352",
+ "DOWNLOAD": "947959513032585236",
+ "TICKET": "973253514488860683",
+ "PILL": {
+ "TICK": "753314339082993832",
+ "CROSS": "753314339389309100"
+ }
+ },
+ "STATUS": {
+ "ONLINE": "729064530084102166",
+ "IDLE": "729064531577536582",
+ "DND": "729064531057311886",
+ "STREAMING": "729764055082074153",
+ "OFFLINE": "729064531271221289"
+ },
+ "CHANNEL": {
+ "TEXT": {
+ "CREATE": "729066924943737033",
+ "EDIT": "951957316117360640",
+ "DELETE": "729064529211686922"
+ },
+ "VOICE": {
+ "CREATE": "729064530830950530",
+ "EDIT": "951957316071223336",
+ "DELETE": "729064530981683200"
+ },
+ "STORE": {
+ "CREATE": "729064530709315715",
+ "DELETE": "729064530768035922"
+ },
+ "CATEGORY": {
+ "CREATE": "787987508465238026",
+ "EDIT": "787987508565770300",
+ "DELETE": "787987508507967488"
+ },
+ "PURGE": {
+ "RED": "729064530797133875",
+ "GREEN": "947443645391441940"
+ },
+ "TITLEUPDATE": "729763053620691044",
+ "TOPICUPDATE": "729763053477953536",
+ "SLOWMODE": {
+ "ON": "777138171301068831",
+ "OFF": "777138171447869480",
+ "//TODO": "// TODO"
+ },
+ "NSFW": {
+ "ON": "729064531208175736",
+ "OFF": "729381430991388752"
+ }
+ },
+ "MEMBER": {
+ "JOIN": "729066519337762878",
+ "LEAVE": "729064531170558575",
+ "BOT": {
+ "JOIN": "729064528666689587",
+ "LEAVE": "729064528998039633"
+ },
+ "KICK": "729263536785850458",
+ "BAN": "729263536643112991",
+ "UNBAN": "729263536840114216"
+ },
+ "INVITE": {
+ "CREATE": "729064529274601482",
+ "DELETE": "729064531103580230"
+ },
+ "WEBHOOK": {
+ "CREATE": "752070251906203679",
+ "UPDATE": "752073772823216191",
+ "DELETE": "752070251948146768"
+ },
+ "MESSAGE": {
+ "EDIT": "729065958584614925",
+ "DELETE": "729064530432360461",
+ "PIN": "729064530755190894",
+ "REACTION": {
+ "ADD": "",
+ "REMOVE": "",
+ "CLEAR": "729064531468353606"
+ },
+ "PING": {
+ "MASS": "729620608408879124",
+ "EVERYONE": "729064531073957909",
+ "ROLE": "729263536915742770"
+ }
+ },
+ "PUNISH": {
+ "WARN": {
+ "RED": "947433493384806430",
+ "GREEN": "947433504076091424",
+ "YELLOW": "729764054897524768"
+ },
+ "KICK": {
+ "RED": "729764053794422896",
+ "GREEN": "947428786692042764",
+ "YELLOW": "947429333289562132"
+ },
+ "BAN": {
+ "RED": "729764053861400637",
+ "GREEN": "947421674364629022",
+ "YELLOW": "729764053941223476"
+ },
+ "UNBAN": {
+ "GREEN": "729263536840114216",
+ "YELLOW": "972511620343414794",
+ "RED": "972511610885255259"
+ },
+ "MUTE": {
+ "RED": "947555098974883910",
+ "GREEN": "947555107980066866",
+ "YELLOW": "729764053865463840"
+ },
+ "SOFTBAN": "729764053941223476",
+ "VOICEMUTE": "729764054855450697",
+ "CLEARHISTORY": "729764062270980096",
+ "NICKNAME": {
+ "RED": "959762533101731980",
+ "YELLOW": "729064531019694090",
+ "GREEN": "959762533072392202"
+ }
+ },
+ "BADGES": {
+ "NUCLEUSDEVELOPER": "957722888360853595",
+ "CLICKSDEVELOPER": "957722888314683462",
+ "HOUSE_BRAVERY": "775783765930016789",
+ "HOUSE_BRILLIANCE": "775783766152577095",
+ "HOUSE_BALANCE": "775783766303440937",
+ "HYPESQUAD_EVENTS": "775783766194126908",
+ "EARLY_SUPPORTER": "775783766055452693",
+ "BUGHUNTER_LEVEL_1": "775783766252847154",
+ "BUGHUNTER_LEVEL_2": "775783766130950234",
+ "PARTNERED_SERVER_OWNER": "775783766178005033",
+ "DISCORD_EMPLOYEE": "775783766383788082",
+ "EARLY_VERIFIED_BOT_DEVELOPER": "775783766425600060",
+ "BOT": "776375959108190239",
+ "BOOSTER": "775783766131605545"
+ },
+ "VOICE": {
+ "CONNECT": "784785219391193138",
+ "CHANGE": "784785219353968670",
+ "LEAVE": "784785219432480808",
+ "MUTE": "784785219613360149",
+ "UNMUTE": "784785219441524766",
+ "DEAFEN": "784785219424747550",
+ "UNDEAFEN": "784785219324346378",
+ "STREAM": {
+ "START": "853519659775819787",
+ "STOP": "853519660116213780"
+ },
+ "VIDEO": {
+ "START": "853519659945295873",
+ "STOP": "853519660116738078"
+ }
+ },
+ "GUILD": {
+ "RED": "959779988264079361",
+ "YELLOW": "729763053352124529",
+ "GREEN": "959779988503154698",
+ "EMOJI": {
+ "CREATE": "953035168115982437",
+ "EDIT": "729066518549233795",
+ "DELETE": "953035210121953320"
+ },
+ "GRAPHS": "752214059159650396",
+ "SETTINGS": "752570111063228507",
+ "ICONCHANGE": "729763053612302356",
+ "TICKET": {
+ "OPEN": "853245836331188264",
+ "CLOSE": "853580122506133505",
+ "ARCHIVED": "853580122636025856"
+ },
+ "ROLES": {
+ "CREATE": "729064530763579413",
+ "DELETE": "729064530885476392",
+ "EDIT": "776109664793919489",
+ "MEMBERS": "752570111281594509",
+ "MESSAGES": "752570111373606942",
+ "VOICE": "752570111088525354"
+ }
+ },
+ "MOD": {
+ "IMAGES": {
+ "SWEARING": "730438422627614810",
+ "INVISIBLE": "730438422690398238",
+ "TOOBIG": "730438422921084998",
+ "TOOSMALL": "730438422921216150"
+ },
+ "SWEARING": "730438422816096377",
+ "SPAM": "730438422853845042"
+ },
+ "NUMBERS": [
+ {
+ "NORMAL": "753259024404840529",
+ "GREEN": "753312608378945648",
+ "RED": "753312608890650664"
+ },
+ {
+ "NORMAL": "753259025990418515",
+ "GREEN": "753312608550912112",
+ "RED": "753312609075462246"
+ },
+ {
+ "NORMAL": "753259024409034896",
+ "GREEN": "753312608513294366",
+ "RED": "753312608680935446"
+ },
+ {
+ "NORMAL": "753259024358703205",
+ "GREEN": "753312608815284426",
+ "RED": "753312609377320966"
+ },
+ {
+ "NORMAL": "753259024555835513",
+ "GREEN": "753312608735461457",
+ "RED": "753312609255686223"
+ },
+ {
+ "NORMAL": "753259024744579283",
+ "GREEN": "753312608630604017",
+ "RED": "753312609138376777"
+ },
+ {
+ "NORMAL": "753259024354639994",
+ "GREEN": "753312608656031806",
+ "RED": "753312609465270412"
+ },
+ {
+ "NORMAL": "753259024530800661",
+ "GREEN": "753312608718815322",
+ "RED": "753312609104822313"
+ },
+ {
+ "NORMAL": "753259024895574037",
+ "GREEN": "753312608790249646",
+ "RED": "753312609477984319"
+ },
+ {
+ "NORMAL": "753259024681533553",
+ "GREEN": "753312608899170365",
+ "RED": "753312609557545089"
+ }
+ ],
+ "BOTS": {
+ "GPS": "878919163937185803",
+ "NUCLEUS": "878919163597439016",
+ "CLICKSFORMS": "878919163337388073",
+ "CASTAWAY": "878919164255944726",
+ "CMPING": "878919164125929502",
+ "HOOKY": "878919164121731082"
+ },
+ "CFSERVICE": {
+ "VERIFIED": "881984571242053642",
+ "UNVERIFIED": "881984571258847232"
+ },
+ "TICKETS": {
+ "SUPPORT": "952295894370369587",
+ "REPORT": "952295894437482537",
+ "QUESTION": "952295894403907645",
+ "ISSUE": "952295894412316672",
+ "SUGGESTION": "952295894399725588",
+ "OTHER": "952295894445883502"
+ },
+ "TRACKS": {
+ "ICON": "963170616444334171",
+ "HORIZONTAL": {
+ "LEFT": {
+ "ACTIVE": "963121920038035506",
+ "INACTIVE": "963121944239153242"
+ },
+ "MIDDLE": {
+ "ACTIVE": "963121925893263420",
+ "INACTIVE": "963121949796597870"
+ },
+ "RIGHT": {
+ "ACTIVE": "963121933384302602",
+ "INACTIVE": "963121956125831168"
+ }
+ },
+ "VERTICAL": {
+ "TOP": {
+ "ACTIVE": "963122664648630293",
+ "INACTIVE": "963122659862917140",
+ "GREY": {
+ "ACTIVE": "963123505052934144",
+ "INACTIVE": "963123495221469194"
+ }
+ },
+ "MIDDLE": {
+ "ACTIVE": "963122679332880384",
+ "INACTIVE": "963122673246937199",
+ "GREY": {
+ "ACTIVE": "963123517702955018",
+ "INACTIVE": "963123511927390329"
+ }
+ },
+ "BOTTOM": {
+ "ACTIVE": "963122691752218624",
+ "INACTIVE": "963122685691453552",
+ "GREY": {
+ "ACTIVE": "963123529988059187",
+ "INACTIVE": "963123523742748742"
+ }
+ }
+ },
+ "SINGLE": {
+ "ACTIVE": "963361162215424060",
+ "INACTIVE": "963361431758176316",
+ "GREY": {
+ "ACTIVE": "963361204695334943",
+ "INACTIVE": "963361200828198952"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/utils/confirmationMessage.ts b/src/utils/confirmationMessage.ts
index f5c322b..8281ead 100644
--- a/src/utils/confirmationMessage.ts
+++ b/src/utils/confirmationMessage.ts
@@ -14,6 +14,7 @@
customCallbackString: string = "";
customCallbackClicked: boolean = false;
customCallbackResponse: any = null;
+ inverted: boolean;
constructor(interaction: CommandInteraction) {
this.interaction = interaction;
@@ -22,6 +23,7 @@
this.emoji = "";
this.description = "";
this.color = "";
+ this.inverted = false
this.customCallback = () => {}
}
@@ -52,13 +54,13 @@
new MessageActionRow().addComponents([
new Discord.MessageButton()
.setCustomId("yes")
- .setLabel("Yes")
- .setStyle("SUCCESS")
+ .setLabel("Confirm")
+ .setStyle(this.inverted ? "SUCCESS" : "DANGER")
.setEmoji(getEmojiByName("CONTROL.TICK", "id")),
new Discord.MessageButton()
.setCustomId("no")
.setLabel("Cancel")
- .setStyle("DANGER")
+ .setStyle(this.inverted ? "DANGER" : "SUCCESS")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
].concat(this.customButtonTitle ? [new Discord.MessageButton()
.setCustomId("custom")
@@ -81,14 +83,14 @@
try {
component = await (m as Message).awaitMessageComponent({filter: (m) => m.user.id === this.interaction.user.id, time: 2.5 * 60 * 1000});
} catch (e) {
- return {success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse};
+ return { success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse };
}
if (component.customId === "yes") {
component.deferUpdate();
- return {success: true, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse};
+ return { success: true, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse };
} else if (component.customId === "no") {
component.deferUpdate();
- return {success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse};
+ return { success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse };
} else if (component.customId === "custom") {
component.deferUpdate();
this.customCallbackResponse = this.customCallback();