Development (#63)
diff --git a/.gitignore b/.gitignore
index d73f2ea..9eaba59 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,7 +6,7 @@
!src/config/*.d.ts
!src/config/format.ts
!src/config/default.ts
-!src/config/emojis.json
+!src/config/emojis.ts
src/utils/migration/data
src/config/main.ts
.vscode/
diff --git a/src/commands/mod/ban.ts b/src/commands/mod/ban.ts
index 41d1252..78f936c 100644
--- a/src/commands/mod/ban.ts
+++ b/src/commands/mod/ban.ts
@@ -191,7 +191,10 @@
if (!interaction.guild) return;
const member = interaction.member as GuildMember;
// Check if the user has ban_members permission
- if (!member.permissions.has("BanMembers")) return "You do not have the *Ban Members* permission";
+ if (!member.permissions.has("BanMembers")) {
+ // if(!partial) client.logger.warn("Missing permissions", "Ban", "User does not have Ban Members permission");
+ return "You do not have the *Ban Members* permission";
+ }
if (partial) return true;
const me = interaction.guild.members.me!;
let apply: GuildMember;
diff --git a/src/commands/nucleus/stats.ts b/src/commands/nucleus/stats.ts
index 9690258..1cbcee8 100644
--- a/src/commands/nucleus/stats.ts
+++ b/src/commands/nucleus/stats.ts
@@ -8,6 +8,7 @@
CommandInteraction,
ComponentType,
Guild,
+ GuildTextBasedChannel,
ModalBuilder,
ModalSubmitInteraction,
TextInputBuilder,
@@ -91,7 +92,11 @@
],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
- new ButtonBuilder().setCustomId("admin").setLabel("Admin Panel").setStyle(ButtonStyle.Primary)
+ new ButtonBuilder().setCustomId("admin").setLabel("Admin Panel").setStyle(ButtonStyle.Primary),
+ new ButtonBuilder()
+ .setCustomId("announce")
+ .setLabel("Announce to all Guilds")
+ .setStyle(ButtonStyle.Danger)
)
]
});
@@ -120,152 +125,280 @@
// console.log(interaction)
if (!("awaitMessageComponent" in channel)) return;
let GuildID = interaction.guildId;
- if (!GuildID) {
- try {
- i1 = await channel!.awaitMessageComponent<ComponentType.Button>({
- filter: (i) => i.customId === "admin" && i.user.id === interaction.user.id && i.message.id === m.id,
- time: 300000
- });
- } catch (e) {
- console.log(e);
- return;
- }
- await i1.showModal(modal);
- let out: ModalSubmitInteraction;
- try {
- out = await i1.awaitModalSubmit({
- filter: (i) => i.customId === "adminPanel" && i.user.id === interaction.user.id,
- time: 300000
- });
- } catch {
- return;
- }
- await out.deferUpdate();
- GuildID = out.fields.getTextInputValue("guildID");
- } else if (!client.guilds.cache.has(GuildID)) {
- await interaction.editReply({
- embeds: [new EmojiEmbed().setTitle("Admin").setDescription("Not in server").setStatus("Danger")],
- components: []
- });
- }
-
- await interaction.editReply({
- embeds: [],
- components: [
- new ActionRowBuilder<ButtonBuilder>().addComponents(
- new ButtonBuilder().setCustomId("stats").setLabel("Stats").setStyle(ButtonStyle.Primary),
- new ButtonBuilder().setCustomId("data").setLabel("Guild data").setStyle(ButtonStyle.Secondary),
- new ButtonBuilder().setCustomId("cache").setLabel("Reset cache").setStyle(ButtonStyle.Success),
- new ButtonBuilder().setCustomId("leave").setLabel("Leave").setStyle(ButtonStyle.Danger),
- new ButtonBuilder().setCustomId("purge").setLabel("Delete data").setStyle(ButtonStyle.Danger)
- )
- ]
- });
- let i;
try {
- i = await m.awaitMessageComponent<ComponentType.Button>({
- filter: (i) => i.user.id === interaction.user.id && i.message.id === m.id,
+ i1 = await m.awaitMessageComponent<ComponentType.Button>({
+ filter: (i) => i.user.id === interaction.user.id,
time: 300000
});
- } catch {
+ } catch (e) {
+ console.log(e);
return;
}
- const guild = (await client.guilds.fetch(GuildID)) as Guild | null;
- if (!guild) {
- await i.deferUpdate();
- await interaction.editReply({
- embeds: [new EmojiEmbed().setTitle("Admin").setDescription("Not in server").setStatus("Danger")],
- components: []
- });
- return;
- }
- if (i.customId === "stats") {
- await i.deferUpdate();
- await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Stats")
- .setDescription(
- `**Name:** ${guild.name}\n` +
- `**ID:** \`${guild.id}\`\n` +
- `**Owner:** ${client.users.cache.get(guild.ownerId)!.tag}\n` +
- `**Member Count:** ${guild.memberCount}\n` +
- `**Created:** <t:${guild.createdTimestamp}:F>\n` +
- `**Added Nucleus:** <t:${guild.members.me!.joinedTimestamp}:R>\n` +
- `**Nucleus' Perms:** https://discordapi.com/permissions.html#${guild.members.me!.permissions.valueOf()}\n`
+ switch (i1.customId) {
+ case "admin": {
+ if (!GuildID) {
+ await i1.showModal(modal);
+ let out: ModalSubmitInteraction;
+ try {
+ out = await i1.awaitModalSubmit({
+ filter: (i) => i.customId === "adminPanel" && i.user.id === interaction.user.id,
+ time: 300000
+ });
+ } catch {
+ return;
+ }
+ await out.deferUpdate();
+ GuildID = out.fields.getTextInputValue("guildID");
+ } else if (!client.guilds.cache.has(GuildID)) {
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed().setTitle("Admin").setDescription("Not in server").setStatus("Danger")
+ ],
+ components: []
+ });
+ }
+
+ await interaction.editReply({
+ embeds: [],
+ components: [
+ new ActionRowBuilder<ButtonBuilder>().addComponents(
+ new ButtonBuilder().setCustomId("stats").setLabel("Stats").setStyle(ButtonStyle.Primary),
+ new ButtonBuilder()
+ .setCustomId("data")
+ .setLabel("Guild data")
+ .setStyle(ButtonStyle.Secondary),
+ new ButtonBuilder()
+ .setCustomId("cache")
+ .setLabel("Reset cache")
+ .setStyle(ButtonStyle.Success),
+ new ButtonBuilder().setCustomId("leave").setLabel("Leave").setStyle(ButtonStyle.Danger),
+ new ButtonBuilder()
+ .setCustomId("purge")
+ .setLabel("Delete data")
+ .setStyle(ButtonStyle.Danger)
)
- .setStatus("Success")
- .setEmoji("SETTINGS.STATS.GREEN")
- ]
- });
- } else if (i.customId === "leave") {
- if (!(await confirm(interaction))) {
- await interaction.editReply({
- embeds: [new EmojiEmbed().setTitle("No changes were made").setStatus("Danger")],
- components: []
+ ]
});
- return;
+ let i;
+ try {
+ i = await m.awaitMessageComponent<ComponentType.Button>({
+ filter: (i) => i.user.id === interaction.user.id && i.message.id === m.id,
+ time: 300000
+ });
+ } catch {
+ return;
+ }
+ const guild = (await client.guilds.fetch(GuildID)) as Guild | null;
+ if (!guild) {
+ await i.deferUpdate();
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed().setTitle("Admin").setDescription("Not in server").setStatus("Danger")
+ ],
+ components: []
+ });
+ return;
+ }
+ if (i.customId === "stats") {
+ await i.deferUpdate();
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Stats")
+ .setDescription(
+ `**Name:** ${guild.name}\n` +
+ `**ID:** \`${guild.id}\`\n` +
+ `**Owner:** ${client.users.cache.get(guild.ownerId)!.tag}\n` +
+ `**Member Count:** ${guild.memberCount}\n` +
+ `**Created:** <t:${guild.createdTimestamp}:F>\n` +
+ `**Added Nucleus:** <t:${guild.members.me!.joinedTimestamp}:R>\n` +
+ `**Nucleus' Perms:** https://discordapi.com/permissions.html#${guild.members.me!.permissions.valueOf()}\n`
+ )
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ]
+ });
+ } else if (i.customId === "leave") {
+ if (!(await confirm(interaction))) {
+ await interaction.editReply({
+ embeds: [new EmojiEmbed().setTitle("No changes were made").setStatus("Danger")],
+ components: []
+ });
+ return;
+ }
+ await guild.leave();
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Left")
+ .setDescription(`Left ${guild.name}`)
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: []
+ });
+ } else if (i.customId === "data") {
+ await i.deferUpdate();
+ // Get all the data and convert to a string
+ const data = await client.database.guilds.read(guild.id);
+ const stringified = JSON.stringify(data, null, 2);
+ const buffer = Buffer.from(stringified);
+ const attachment = new AttachmentBuilder(buffer).setName("data.json");
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Data")
+ .setDescription(`Data for ${guild.name}`)
+ .setStatus("Success")
+ ],
+ components: [],
+ files: [attachment]
+ });
+ } else if (i.customId === "purge") {
+ if (!(await confirm(interaction))) {
+ await interaction.editReply({
+ embeds: [new EmojiEmbed().setTitle("No changes were made").setStatus("Danger")],
+ components: []
+ });
+ return;
+ }
+ await client.database.guilds.delete(GuildID);
+ await client.database.history.delete(GuildID);
+ await client.database.notes.delete(GuildID);
+ await client.database.transcripts.deleteAll(GuildID);
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Purge")
+ .setDescription(`Deleted data for ${guild.name}`)
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: []
+ });
+ } else if (i.customId === "cache") {
+ await i.deferUpdate();
+ await client.memory.forceUpdate(guild.id);
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Cache")
+ .setDescription(`Reset cache for ${guild.name}`)
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: []
+ });
+ }
+ break;
}
- await guild.leave();
- await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Left")
- .setDescription(`Left ${guild.name}`)
- .setStatus("Success")
- .setEmoji("SETTINGS.STATS.GREEN")
- ],
- components: []
- });
- } else if (i.customId === "data") {
- await i.deferUpdate();
- // Get all the data and convert to a string
- const data = await client.database.guilds.read(guild.id);
- const stringified = JSON.stringify(data, null, 2);
- const buffer = Buffer.from(stringified);
- const attachment = new AttachmentBuilder(buffer).setName("data.json");
- await interaction.editReply({
- embeds: [
- new EmojiEmbed().setTitle("Data").setDescription(`Data for ${guild.name}`).setStatus("Success")
- ],
- components: [],
- files: [attachment]
- });
- } else if (i.customId === "purge") {
- if (!(await confirm(interaction))) {
+ case "announce": {
+ const channelsToNotify = await client.database.guilds.staffChannels();
+ const modal2 = new ModalBuilder()
+ .addComponents(
+ new ActionRowBuilder<TextInputBuilder>().addComponents(
+ new TextInputBuilder()
+ .setStyle(TextInputStyle.Paragraph)
+ .setLabel("Announcement")
+ .setCustomId("announcement")
+ .setPlaceholder("Announcement...")
+ )
+ )
+ .setTitle("Announcement")
+ .setCustomId("announce");
+ await i1.showModal(modal2);
+ let out: ModalSubmitInteraction;
+ try {
+ out = await i1.awaitModalSubmit({
+ filter: (i) => i.customId === "announce" && i.user.id === interaction.user.id,
+ time: 300000
+ });
+ } catch {
+ return;
+ }
+ await out.deferUpdate();
+ const announcement = out.fields.getTextInputValue("announcement");
await interaction.editReply({
- embeds: [new EmojiEmbed().setTitle("No changes were made").setStatus("Danger")],
- components: []
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Announcement")
+ .setDescription(
+ `Announcement will be sent to ${channelsToNotify.length} channels.\n\n${announcement}`
+ )
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: [
+ new ActionRowBuilder<ButtonBuilder>().addComponents(
+ new ButtonBuilder()
+ .setCustomId("confirm")
+ .setLabel("Confirm")
+ .setStyle(ButtonStyle.Success),
+ new ButtonBuilder().setCustomId("cancel").setLabel("Cancel").setStyle(ButtonStyle.Danger)
+ )
+ ]
});
- return;
+
+ let i;
+ try {
+ i = await m.awaitMessageComponent<ComponentType.Button>({
+ filter: (i) => i.user.id === interaction.user.id,
+ time: 300000
+ });
+ } catch {
+ return;
+ }
+ if (i.customId === "confirm") {
+ await i.deferUpdate();
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Announcement")
+ .setDescription(
+ `Sending to ${channelsToNotify.length} channels. Preview:\n\n${announcement}`
+ )
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: []
+ });
+ const announcementEmbed = new EmojiEmbed()
+ .setTitle("Developer Announcement")
+ .setDescription(announcement)
+ .setStatus("Danger")
+ .setEmoji("NUCLEUS.LOGO")
+ .setFooter({
+ text: `Sent by ${interaction.user.username}`,
+ iconURL: interaction.user.displayAvatarURL()
+ });
+ for (const channel of channelsToNotify) {
+ const ch = (await client.channels.fetch(channel)) as GuildTextBasedChannel | null;
+ if (!ch) continue;
+ await ch.send({
+ embeds: [announcementEmbed]
+ });
+ }
+ await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Announcement")
+ .setDescription(
+ `Sent to ${channelsToNotify.length} channels. Preview:\n\n${announcement}`
+ )
+ .setStatus("Success")
+ .setEmoji("SETTINGS.STATS.GREEN")
+ ],
+ components: []
+ });
+ } else if (i.customId === "cancel") {
+ await i.deferUpdate();
+ await interaction.editReply({
+ embeds: [new EmojiEmbed().setTitle("Announcement Cancelled").setStatus("Danger")],
+ components: []
+ });
+ }
+ break;
}
- await client.database.guilds.delete(GuildID);
- await client.database.history.delete(GuildID);
- await client.database.notes.delete(GuildID);
- await client.database.transcripts.deleteAll(GuildID);
- await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Purge")
- .setDescription(`Deleted data for ${guild.name}`)
- .setStatus("Success")
- .setEmoji("SETTINGS.STATS.GREEN")
- ],
- components: []
- });
- } else if (i.customId === "cache") {
- await i.deferUpdate();
- await client.memory.forceUpdate(guild.id);
- await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Cache")
- .setDescription(`Reset cache for ${guild.name}`)
- .setStatus("Success")
- .setEmoji("SETTINGS.STATS.GREEN")
- ],
- components: []
- });
}
}
};
diff --git a/src/config/emojis.json b/src/config/emojis.json
deleted file mode 100644
index 585934d..0000000
--- a/src/config/emojis.json
+++ /dev/null
@@ -1,402 +0,0 @@
-{
- "NUCLEUS": {
- "LOGO": "953040840945721385",
- "PREMIUMACTIVATE": "a1067536222764925068",
- "PREMIUM": "1067928702027042876",
- "LOADING": "a946346549271732234",
- "INFO": {
- "HELP": "751751467014029322",
- "ABOUT": "751762088346517504",
- "COMMANDS": "751762088229339136",
- "SUPPORT": "751762087780286495"
- },
- "COMMANDS": {
- "RAID": "777143043711172608",
- "LOCK": "776848800995868682",
- "IGNORE": "777520659270074389"
- }
- },
- "ICONS": {
- "ADD": "826823514904330251",
- "REMOVE": "826823515268186152",
- "EDIT": "989911820267577366",
- "HISTORY": "989911933069168690",
- "FILTER": "990242059451514902",
- "ATTACHMENT": "997570687193587812",
- "LOGGING": "999613304446144562",
- "SAVE": "1065722246322200586",
- "REORDER": "1069323453909454890",
- "PUBLISH": "1081691380004421743",
- "NOTIFY": {
- "ON": "1000726394579464232",
- "OFF": "1078058136092541008"
- },
- "OPP": {
- "ADD": "837355918831124500",
- "REMOVE": "837355918420869162"
- },
- "CHANNEL": {
- "GUILD_TEXT": "990209996182679632",
- "GUILD_TEXT_NSFW": "990216363526221824",
- "GUILD_VOICE": "990213162697637969",
- "GUILD_VOICE_NSFW": "990216017244463124",
- "GUILD_STORE": "853668786925469706",
- "GUILD_NEWS": "853668786493063169",
- "GUILD_NEWS_NSFW": "990216028300673094",
- "GUILD_STAGE_VOICE": "853668786842763294",
- "THREAD_CHANNEL": "990210005108158514",
- "THREAD_PIPE": "990213168183779348",
- "RULES": "990213153080115250",
- "FORUM": "1061706437526552716",
- "CATEGORY": "1064943289708597348"
- },
- "FLAGS": {
- "RED": "1082719687219101800",
- "YELLOW": "1082719684060794890",
- "GREEN": "1082719681326108763",
- "BLUE": "1082719679161843734",
- "PURPLE": "1082719686292156628",
- "GRAY": "1082719682492125337"
- }
- },
- "CONTROL": {
- "TICK": "947441964234702849",
- "REDTICK": "999612396727439370",
- "CROSS": "947441948543815720",
- "BLOCKCROSS": "952261738349330493",
- "BLOCKTICK": "991805475777695855",
- "LEFT": "947441951148486728",
- "RIGHT": "947441957473488916",
- "UP": "963409197293273108",
- "DOWN": "963409199549796352",
- "DOWNLOAD": "947959513032585236",
- "TICKET": "973253514488860683",
- "MENU": "976580327835320410",
- "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"
- },
- "CATEGORY": {
- "CREATE": "787987508465238026",
- "EDIT": "787987508565770300",
- "DELETE": "787987508507967488"
- },
- "PURGE": {
- "RED": "729064530797133875",
- "GREEN": "947443645391441940"
- },
- "TITLEUPDATE": "729763053620691044",
- "TOPICUPDATE": "729763053477953536",
- "SLOWMODE": {
- "ON": "973616021304913950",
- "OFF": "777138171447869480"
- },
- "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": {
- "CREATE": "751762088229339136",
- "EDIT": "729065958584614925",
- "DELETE": "729064530432360461",
- "PIN": "729064530755190894",
- "REACTION": {
- "ADD": "",
- "REMOVE": "",
- "CLEAR": "729064531468353606"
- },
- "PING": {
- "MASS": "729620608408879124",
- "EVERYONE": "729064531073957909",
- "ROLE": "729263536915742770"
- }
- },
- "PUNISH": {
- "WARN": {
- "RED": "947433493384806430",
- "YELLOW": "729764054897524768",
- "GREEN": "947433504076091424"
- },
- "KICK": {
- "RED": "729764053794422896",
- "YELLOW": "947429333289562132",
- "GREEN": "947428786692042764"
- },
- "BAN": {
- "RED": "729764053861400637",
- "YELLOW": "729764053941223476",
- "GREEN": "947421674364629022"
- },
- "UNBAN": {
- "RED": "972511610885255259",
- "YELLOW": "972511620343414794",
- "GREEN": "729263536840114216"
- },
- "MUTE": {
- "RED": "947555098974883910",
- "YELLOW": "729764053865463840",
- "GREEN": "947555107980066866"
- },
- "SOFTBAN": "729764053941223476",
- "VOICEMUTE": "729764054855450697",
- "CLEARHISTORY": "729764062270980096",
- "NICKNAME": {
- "RED": "959762533101731980",
- "YELLOW": "729064531019694090",
- "GREEN": "959762533072392202"
- }
- },
- "BADGES": {
- "NUCLEUSDEVELOPER": "957722888360853595",
- "CLICKSDEVELOPER": "957722888314683462",
- "BOT": "776375959108190239",
- "BOOSTER": "775783766131605545",
- "HypeSquadOnlineHouse1": "775783765930016789",
- "HypeSquadOnlineHouse2": "775783766152577095",
- "HypeSquadOnlineHouse3": "775783766303440937",
- "Hypesquad": "775783766194126908",
- "PremiumEarlySupporter": "775783766055452693",
- "BugHunterLevel1": "775783766252847154",
- "BugHunterLevel2": "775783766130950234",
- "Partner": "775783766178005033",
- "Staff": "775783766383788082",
- "VerifiedDeveloper": "775783766425600060",
- "Quarantined": "1059794708638994474",
- "Spammer": "1059794708638994474",
- "ActiveDeveloper": "1059795592966053918"
- },
- "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"
- }
- },
- "SETTINGS": {
- "STATS": {
- "GREEN": "752214059159650396",
- "RED": "1065677252630675556"
- }
- },
- "GUILD": {
- "RED": "959779988264079361",
- "YELLOW": "729763053352124529",
- "GREEN": "959779988503154698",
- "EMOJI": {
- "CREATE": "953035168115982437",
- "EDIT": "729066518549233795",
- "DELETE": "953035210121953320"
- },
- "SETTINGS": {
- "GREEN": "752570111063228507",
- "RED": "1068607393728049253"
- },
- "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",
- "GRAY": {
- "ACTIVE": "963123505052934144",
- "INACTIVE": "963123495221469194"
- }
- },
- "MIDDLE": {
- "ACTIVE": "963122679332880384",
- "INACTIVE": "963122673246937199",
- "GRAY": {
- "ACTIVE": "963123517702955018",
- "INACTIVE": "963123511927390329"
- }
- },
- "BOTTOM": {
- "ACTIVE": "963122691752218624",
- "INACTIVE": "963122685691453552",
- "GRAY": {
- "ACTIVE": "963123529988059187",
- "INACTIVE": "963123523742748742"
- }
- }
- },
- "SINGLE": {
- "ACTIVE": "963361162215424060",
- "INACTIVE": "963361431758176316",
- "GRAY": {
- "ACTIVE": "963361204695334943",
- "INACTIVE": "963361200828198952"
- }
- }
- },
- "COLORS": {
- "RED": "875822912802803754",
- "ORANGE": "875822913104785418",
- "YELLOW": "875822913079611402",
- "GREEN": "875822913213841418",
- "BLUE": "875822912777637889",
- "PURPLE": "875822913213841419",
- "PINK": "875822913088020541",
- "GRAY": "875822913117368340"
- }
-}
diff --git a/src/config/emojis.ts b/src/config/emojis.ts
new file mode 100644
index 0000000..b7ed91a
--- /dev/null
+++ b/src/config/emojis.ts
@@ -0,0 +1,402 @@
+export default {
+ NUCLEUS: {
+ LOGO: "953040840945721385",
+ PREMIUMACTIVATE: "a1067536222764925068",
+ PREMIUM: "1067928702027042876",
+ LOADING: "a946346549271732234",
+ INFO: {
+ HELP: "751751467014029322",
+ ABOUT: "751762088346517504",
+ COMMANDS: "751762088229339136",
+ SUPPORT: "751762087780286495"
+ },
+ COMMANDS: {
+ RAID: "777143043711172608",
+ LOCK: "776848800995868682",
+ IGNORE: "777520659270074389"
+ }
+ },
+ ICONS: {
+ ADD: "826823514904330251",
+ REMOVE: "826823515268186152",
+ EDIT: "989911820267577366",
+ HISTORY: "989911933069168690",
+ FILTER: "990242059451514902",
+ ATTACHMENT: "997570687193587812",
+ LOGGING: "999613304446144562",
+ SAVE: "1065722246322200586",
+ REORDER: "1069323453909454890",
+ PUBLISH: "1081691380004421743",
+ NOTIFY: {
+ ON: "1000726394579464232",
+ OFF: "1078058136092541008"
+ },
+ OPP: {
+ ADD: "837355918831124500",
+ REMOVE: "837355918420869162"
+ },
+ CHANNEL: {
+ GUILD_TEXT: "990209996182679632",
+ GUILD_TEXT_NSFW: "990216363526221824",
+ GUILD_VOICE: "990213162697637969",
+ GUILD_VOICE_NSFW: "990216017244463124",
+ GUILD_STORE: "853668786925469706",
+ GUILD_NEWS: "853668786493063169",
+ GUILD_NEWS_NSFW: "990216028300673094",
+ GUILD_STAGE_VOICE: "853668786842763294",
+ THREAD_CHANNEL: "990210005108158514",
+ THREAD_PIPE: "990213168183779348",
+ RULES: "990213153080115250",
+ FORUM: "1061706437526552716",
+ CATEGORY: "1064943289708597348"
+ },
+ FLAGS: {
+ RED: "1082719687219101800",
+ YELLOW: "1082719684060794890",
+ GREEN: "1082719681326108763",
+ BLUE: "1082719679161843734",
+ PURPLE: "1082719686292156628",
+ GRAY: "1082719682492125337"
+ }
+ },
+ CONTROL: {
+ TICK: "947441964234702849",
+ REDTICK: "999612396727439370",
+ CROSS: "947441948543815720",
+ BLOCKCROSS: "952261738349330493",
+ BLOCKTICK: "991805475777695855",
+ LEFT: "947441951148486728",
+ RIGHT: "947441957473488916",
+ UP: "963409197293273108",
+ DOWN: "963409199549796352",
+ DOWNLOAD: "947959513032585236",
+ TICKET: "973253514488860683",
+ MENU: "976580327835320410",
+ 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"
+ },
+ CATEGORY: {
+ CREATE: "787987508465238026",
+ EDIT: "787987508565770300",
+ DELETE: "787987508507967488"
+ },
+ PURGE: {
+ RED: "729064530797133875",
+ GREEN: "947443645391441940"
+ },
+ TITLEUPDATE: "729763053620691044",
+ TOPICUPDATE: "729763053477953536",
+ SLOWMODE: {
+ ON: "973616021304913950",
+ OFF: "777138171447869480"
+ },
+ 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: {
+ CREATE: "751762088229339136",
+ EDIT: "729065958584614925",
+ DELETE: "729064530432360461",
+ PIN: "729064530755190894",
+ REACTION: {
+ ADD: "",
+ REMOVE: "",
+ CLEAR: "729064531468353606"
+ },
+ PING: {
+ MASS: "729620608408879124",
+ EVERYONE: "729064531073957909",
+ ROLE: "729263536915742770"
+ }
+ },
+ PUNISH: {
+ WARN: {
+ RED: "947433493384806430",
+ YELLOW: "729764054897524768",
+ GREEN: "947433504076091424"
+ },
+ KICK: {
+ RED: "729764053794422896",
+ YELLOW: "947429333289562132",
+ GREEN: "947428786692042764"
+ },
+ BAN: {
+ RED: "729764053861400637",
+ YELLOW: "729764053941223476",
+ GREEN: "947421674364629022"
+ },
+ UNBAN: {
+ RED: "972511610885255259",
+ YELLOW: "972511620343414794",
+ GREEN: "729263536840114216"
+ },
+ MUTE: {
+ RED: "947555098974883910",
+ YELLOW: "729764053865463840",
+ GREEN: "947555107980066866"
+ },
+ SOFTBAN: "729764053941223476",
+ VOICEMUTE: "729764054855450697",
+ CLEARHISTORY: "729764062270980096",
+ NICKNAME: {
+ RED: "959762533101731980",
+ YELLOW: "729064531019694090",
+ GREEN: "959762533072392202"
+ }
+ },
+ BADGES: {
+ NUCLEUSDEVELOPER: "957722888360853595",
+ CLICKSDEVELOPER: "957722888314683462",
+ BOT: "776375959108190239",
+ BOOSTER: "775783766131605545",
+ HypeSquadOnlineHouse1: "775783765930016789",
+ HypeSquadOnlineHouse2: "775783766152577095",
+ HypeSquadOnlineHouse3: "775783766303440937",
+ Hypesquad: "775783766194126908",
+ PremiumEarlySupporter: "775783766055452693",
+ BugHunterLevel1: "775783766252847154",
+ BugHunterLevel2: "775783766130950234",
+ Partner: "775783766178005033",
+ Staff: "775783766383788082",
+ VerifiedDeveloper: "775783766425600060",
+ Quarantined: "1059794708638994474",
+ Spammer: "1059794708638994474",
+ ActiveDeveloper: "1059795592966053918"
+ },
+ 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"
+ }
+ },
+ SETTINGS: {
+ STATS: {
+ GREEN: "752214059159650396",
+ RED: "1065677252630675556"
+ }
+ },
+ GUILD: {
+ RED: "959779988264079361",
+ YELLOW: "729763053352124529",
+ GREEN: "959779988503154698",
+ EMOJI: {
+ CREATE: "953035168115982437",
+ EDIT: "729066518549233795",
+ DELETE: "953035210121953320"
+ },
+ SETTINGS: {
+ GREEN: "752570111063228507",
+ RED: "1068607393728049253"
+ },
+ 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",
+ GRAY: {
+ ACTIVE: "963123505052934144",
+ INACTIVE: "963123495221469194"
+ }
+ },
+ MIDDLE: {
+ ACTIVE: "963122679332880384",
+ INACTIVE: "963122673246937199",
+ GRAY: {
+ ACTIVE: "963123517702955018",
+ INACTIVE: "963123511927390329"
+ }
+ },
+ BOTTOM: {
+ ACTIVE: "963122691752218624",
+ INACTIVE: "963122685691453552",
+ GRAY: {
+ ACTIVE: "963123529988059187",
+ INACTIVE: "963123523742748742"
+ }
+ }
+ },
+ SINGLE: {
+ ACTIVE: "963361162215424060",
+ INACTIVE: "963361431758176316",
+ GRAY: {
+ ACTIVE: "963361204695334943",
+ INACTIVE: "963361200828198952"
+ }
+ }
+ },
+ COLORS: {
+ RED: "875822912802803754",
+ ORANGE: "875822913104785418",
+ YELLOW: "875822913079611402",
+ GREEN: "875822913213841418",
+ BLUE: "875822912777637889",
+ PURPLE: "875822913213841419",
+ PINK: "875822913088020541",
+ GRAY: "875822913117368340"
+ }
+}
diff --git a/src/utils/database.ts b/src/utils/database.ts
index 51b2bca..5386f7f 100644
--- a/src/utils/database.ts
+++ b/src/utils/database.ts
@@ -142,6 +142,16 @@
// console.log("Guild delete")
await this.guilds.deleteOne({ id: guild });
}
+
+ async staffChannels(): Promise<string[]> {
+ const entries = await this.guilds
+ .find(
+ { "logging.staff.channel": { $exists: true } },
+ { projection: { "logging.staff.channel": 1, _id: 0 } }
+ )
+ .toArray();
+ return entries.map((e) => e.logging.staff.channel!);
+ }
}
interface TranscriptEmbed {
diff --git a/src/utils/getEmojiByName.ts b/src/utils/getEmojiByName.ts
index 9bbf61f..ebcb257 100644
--- a/src/utils/getEmojiByName.ts
+++ b/src/utils/getEmojiByName.ts
@@ -1,12 +1,24 @@
-import emojis from "../config/emojis.json" assert { type: "json" };
+import emojis from "../config/emojis.js";
import _ from "lodash";
interface EmojisIndex {
[key: string]: string | EmojisIndex | EmojisIndex[];
}
-function getEmojiByName(name: string | null, format?: string): string {
- if (!name) return "";
+const EMOJIPATHS: string[] = [];
+
+function getEmojiPaths(obj: EmojisIndex, path: string[] = []) {
+ for (const key in obj) {
+ if (typeof obj[key] === "string") {
+ EMOJIPATHS.push([...path, key].join("."));
+ } else {
+ getEmojiPaths(obj[key] as EmojisIndex, [...path, key]);
+ }
+ }
+}
+getEmojiPaths(emojis);
+
+function getEmojiByName(name: (typeof EMOJIPATHS)[number], format?: string): string {
const parts = name.split(".");
let id: string | EmojisIndex | EmojisIndex[] | undefined = emojis;
for (const part of parts) {