blob: 655d7810329407e909321b360e85a0101745d084 [file] [log] [blame]
pineafanea063042022-05-19 19:08:44 +01001import { SelectMenuOption } from '@discordjs/builders';
pineafanad54d752022-04-18 19:01:43 +01002import Discord, { MessageActionRow, MessageButton } from "discord.js";
pineafan4edb7762022-06-26 19:21:04 +01003import EmojiEmbed from "../utils/generateEmojiEmbed.js";
pineafanad54d752022-04-18 19:01:43 +01004import getEmojiByName from "../utils/getEmojiByName.js";
pineafan34369e62022-05-18 16:52:37 +01005import createPageIndicator from "../utils/createPageIndicator.js";
pineafanad54d752022-04-18 19:01:43 +01006
pineafanea063042022-05-19 19:08:44 +01007class Embed {
8 embed: Discord.MessageEmbed;
9 title: string;
10 description: string = "";
11 pageId: number = 0;
12 setEmbed(embed: Discord.MessageEmbed) { this.embed = embed; return this; }
13 setTitle(title: string) { this.title = title; return this; }
14 setDescription(description: string) { this.description = description; return this; }
15 setPageId(pageId: number) { this.pageId = pageId; return this; }
16}
17
pineafanad54d752022-04-18 19:01:43 +010018export default async (guild, interaction?) => {
pineafane625d782022-05-09 18:04:32 +010019 let c = guild.publicUpdatesChannel ? guild.publicUpdatesChannel : guild.systemChannel;
20 c = c ? c : guild.channels.cache.find(ch => ch.type === "GUILD_TEXT" && ch.permissionsFor(guild.roles.everyone).has("SEND_MESSAGES") && ch.permissionsFor(guild.me).has("EMBED_LINKS"));
pineafanad54d752022-04-18 19:01:43 +010021 let pages = [
pineafanea063042022-05-19 19:08:44 +010022 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010023 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010024 .setTitle("Welcome to Nucleus")
25 .setDescription(
26 "Thanks for adding Nucleus to your server\n\n" +
27 "On the next few pages you can find instructions on getting started, and commands you may want to set up\n\n" +
28 "If you need support, have questions or want features, you can let us know in [Clicks](https://discord.gg/bPaNnxe)"
29 )
30 .setEmoji("NUCLEUS.LOGO")
31 .setStatus("Danger")
32 ).setTitle("Welcome").setDescription("About Nucleus").setPageId(0),
33 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010034 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010035 .setTitle("Logging")
36 .setDescription(
37 "Nucleus can log server events and keep you informed with what content is being posted to your server.\n" +
38 "We have 2 different types of logs, which each can be configured to send to a channel of your choice:\n" +
39 "**General Logs:** These are events like kicks and channel changes etc.\n" +
pineafanda6e5342022-07-03 10:03:16 +010040 "**Warning Logs:** Warnings like NSFW avatars and spam etc. that may require action by a server staff member. " +
41 "These go to to a separate staff notifications channel.\n\n" +
42 "A general log channel can be set with `/settings log`\n" +
pineafanea063042022-05-19 19:08:44 +010043 "A warning log channel can be set with `/settings warnings channel`"
44 )
45 .setEmoji("NUCLEUS.LOGO")
46 .setStatus("Danger")
47 ).setTitle("Logging").setDescription("Logging, staff warning logs etc.").setPageId(1),
48 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010049 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010050 .setTitle("Moderation")
51 .setDescription(
52 "Nucleus has a number of commands that can be used to moderate your server.\n" +
53 "These commands are all found under `/mod`, and they include:\n" +
54 `**${getEmojiByName("PUNISH.WARN.YELLOW")} Warn:** The user is warned (via DM) that they violated server rules.\n` +
55 `**${getEmojiByName("PUNISH.CLEARHISTORY")} Clear:** Some messages from a user are deleted in a channel.\n` +
56 `**${getEmojiByName("PUNISH.MUTE.YELLOW")} Mute:** The user is unable to send messages or join voice chats.\n` +
57 `**${getEmojiByName("PUNISH.MUTE.GREEN")} Unmute:** The user is able to send messages in the server.\n` +
58 `**${getEmojiByName("PUNISH.KICK.RED")} Kick:** The user is removed from the server.\n` +
59 `**${getEmojiByName("PUNISH.SOFTBAN")} Softban:** Kicks the user, deleting their messages from every channel.\n` +
60 `**${getEmojiByName("PUNISH.BAN.RED")} Ban:** The user is removed from the server, and they are unable to rejoin.\n` +
61 `**${getEmojiByName("PUNISH.BAN.GREEN")} Unban:** The user is able to rejoin the server.`
62 )
pineafanad54d752022-04-18 19:01:43 +010063 .setEmoji("NUCLEUS.LOGO")
64 .setStatus("Danger")
pineafanea063042022-05-19 19:08:44 +010065 ).setTitle("Moderation").setDescription("Basic moderation commands").setPageId(2),
66 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010067 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010068 .setTitle("Verify")
69 .setDescription(
70 "Nucleus has a verification system that allows users to prove they aren't bots.\n" +
71 "This is done by running `/verify` which sends a message only the user can see, giving them a link to a CAPTCHA to verify.\n" +
72 "After the user complete's the CAPTCHA, they are given a role and can use the permissions accordingly.\n" +
pineafanda6e5342022-07-03 10:03:16 +010073 "You can set the role given with `/settings verify`"
pineafanea063042022-05-19 19:08:44 +010074 )
75 .setEmoji("NUCLEUS.LOGO")
76 .setStatus("Danger")
77 ).setTitle("Verify").setDescription("Captcha verification system").setPageId(3),
78 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010079 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010080 .setTitle("Content Scanning")
81 .setDescription(
82 "Nucleus has a content scanning system that automatically scans links and images sent by users.\n" +
83 "Nucleus can detect, delete, and punish users for sending NSFW content, or links to scam or adult sites.\n" +
pineafanda6e5342022-07-03 10:03:16 +010084 "You can set the threshold for this in `/settings automation`" // TODO
pineafanea063042022-05-19 19:08:44 +010085 )
86 .setEmoji("NUCLEUS.LOGO")
87 .setStatus("Danger")
88 ).setTitle("Content Scanning").setDescription("Content (NSFW, malware, scams) scanning").setPageId(4),
89 new Embed()
pineafan4edb7762022-06-26 19:21:04 +010090 .setEmbed(new EmojiEmbed()
pineafanea063042022-05-19 19:08:44 +010091 .setTitle("Tickets")
92 .setDescription(
93 "Nucleus has a ticket system that allows users to create tickets and have a support team respond to them.\n" +
94 "Tickets can be created with `/ticket create` and a channel is created, pinging the user and support role.\n" +
pineafanda6e5342022-07-03 10:03:16 +010095 "When the ticket is resolved, anyone can run `/ticket close` (or click the button) to close it.\n" +
pineafanea063042022-05-19 19:08:44 +010096 "Running `/ticket close` again will delete the ticket."
97 )
98 .setEmoji("NUCLEUS.LOGO")
99 .setStatus("Danger")
pineafan6702cef2022-06-13 17:52:37 +0100100 ).setTitle("Tickets").setDescription("Ticket system").setPageId(5),
101 new Embed()
pineafan4edb7762022-06-26 19:21:04 +0100102 .setEmbed(new EmojiEmbed()
pineafan6702cef2022-06-13 17:52:37 +0100103 .setTitle("Tags")
104 .setDescription(
105 "Add a tag system to your server with the `/tag` and `/tags` commands.\n" +
106 "To create a tag, type `/tags create <tag name> <tag content>`.\n" +
107 "Tag names and content can be edited with `/tags edit`.\n" +
108 "To delete a tag, type `/tags delete <tag name>`.\n" +
109 "To view all tags, type `/tags list`.\n"
110 )
111 .setEmoji("NUCLEUS.LOGO")
112 .setStatus("Danger")
113 ).setTitle("Tags").setDescription("Tag system").setPageId(6)
pineafanad54d752022-04-18 19:01:43 +0100114 ]
pineafane625d782022-05-09 18:04:32 +0100115 let m;
pineafanad54d752022-04-18 19:01:43 +0100116 if (interaction) {
117 m = await interaction.reply({embeds: [
pineafan4edb7762022-06-26 19:21:04 +0100118 new EmojiEmbed()
pineafanad54d752022-04-18 19:01:43 +0100119 .setTitle("Welcome")
120 .setDescription(`One moment...`)
121 .setStatus("Danger")
122 .setEmoji("NUCLEUS.LOADING")
123 ], fetchReply: true, ephemeral: true});
124 } else {
125 m = await c.send({embeds: [
pineafan4edb7762022-06-26 19:21:04 +0100126 new EmojiEmbed()
pineafanad54d752022-04-18 19:01:43 +0100127 .setTitle("Welcome")
128 .setDescription(`One moment...`)
129 .setStatus("Danger")
130 .setEmoji("NUCLEUS.LOADING")
131 ], fetchReply: true });
pineafane625d782022-05-09 18:04:32 +0100132 }
pineafanad54d752022-04-18 19:01:43 +0100133 let page = 0;
134
135 let f = async (component) => {
136 return (component.member as Discord.GuildMember).permissions.has("MANAGE_GUILD");
137 }
138
pineafanea063042022-05-19 19:08:44 +0100139 let selectPaneOpen = false;
140
pineafanad54d752022-04-18 19:01:43 +0100141 while (true) {
pineafanea063042022-05-19 19:08:44 +0100142 let selectPane = []
143
144 if (selectPaneOpen) {
145 let options = [];
146 pages.forEach(embed => {
147 options.push(new SelectMenuOption({
148 label: embed.title,
149 value: embed.pageId.toString(),
150 description: embed.description || "",
151 }))
152 })
153 selectPane = [new MessageActionRow().addComponents([
154 new Discord.MessageSelectMenu()
155 .addOptions(options)
156 .setCustomId("page")
157 .setMaxValues(1)
158 .setPlaceholder("Choose a page...")
159 ])]
160 }
pineafan6702cef2022-06-13 17:52:37 +0100161 let components = selectPane.concat([new MessageActionRow().addComponents([
162 new MessageButton().setCustomId("left").setEmoji(getEmojiByName("CONTROL.LEFT", "id")).setStyle("SECONDARY").setDisabled(page === 0),
163 new MessageButton().setCustomId("select").setEmoji(getEmojiByName("CONTROL.MENU", "id")).setStyle(selectPaneOpen ? "PRIMARY" : "SECONDARY").setDisabled(false),
164 new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(page === pages.length - 1),
165 new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER")
166 ])])
pineafanad54d752022-04-18 19:01:43 +0100167 if (interaction) {
pineafanea063042022-05-19 19:08:44 +0100168 let em = new Discord.MessageEmbed(pages[page].embed)
pineafan34369e62022-05-18 16:52:37 +0100169 em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
pineafanad54d752022-04-18 19:01:43 +0100170 await interaction.editReply({
pineafan34369e62022-05-18 16:52:37 +0100171 embeds: [em],
pineafan6702cef2022-06-13 17:52:37 +0100172 components: components
pineafanad54d752022-04-18 19:01:43 +0100173 });
174 } else {
pineafanea063042022-05-19 19:08:44 +0100175 let em = new Discord.MessageEmbed(pages[page].embed)
176 em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page));
pineafanad54d752022-04-18 19:01:43 +0100177 await m.edit({
pineafanea063042022-05-19 19:08:44 +0100178 embeds: [em],
pineafan6702cef2022-06-13 17:52:37 +0100179 components: components,
pineafanad54d752022-04-18 19:01:43 +0100180 fetchReply: true
181 });
182 }
183 let i
184 try {
pineafanc6158ab2022-06-17 16:34:07 +0100185 i = await m.awaitMessageComponent({filter: interaction ? () => { return true } : f, time: 300000});
pineafanad54d752022-04-18 19:01:43 +0100186 } catch(e) { break }
187 i.deferUpdate()
188 if (i.component.customId == "left") {
189 if (page > 0) page--;
pineafanea063042022-05-19 19:08:44 +0100190 selectPaneOpen = false;
pineafanad54d752022-04-18 19:01:43 +0100191 } else if (i.component.customId == "right") {
192 if (page < pages.length - 1) page++;
pineafanea063042022-05-19 19:08:44 +0100193 selectPaneOpen = false;
194 } else if (i.component.customId == "select") {
195 selectPaneOpen = !selectPaneOpen;
196 } else if (i.component.customId == "page") {
197 page = parseInt(i.values[0]);
198 selectPaneOpen = false;
199 } else {
pineafanad54d752022-04-18 19:01:43 +0100200 if (interaction) {
pineafanea063042022-05-19 19:08:44 +0100201 let em = new Discord.MessageEmbed(pages[page].embed)
pineafan34369e62022-05-18 16:52:37 +0100202 em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message closed");
203 interaction.editReply({embeds: [em], components: [new MessageActionRow().addComponents([
204 new MessageButton().setCustomId("left").setEmoji(getEmojiByName("CONTROL.LEFT", "id")).setStyle("SECONDARY").setDisabled(true),
pineafanea063042022-05-19 19:08:44 +0100205 new MessageButton().setCustomId("select").setEmoji(getEmojiByName("CONTROL.MENU", "id")).setStyle(selectPaneOpen ? "PRIMARY" : "SECONDARY").setDisabled(true),
pineafan34369e62022-05-18 16:52:37 +0100206 new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(true),
207 new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER").setDisabled(true)
208 ])], fetchReply: true});
pineafanad54d752022-04-18 19:01:43 +0100209 } else {
210 m.delete();
211 }
212 return;
pineafanad54d752022-04-18 19:01:43 +0100213 }
214 }
215 if (interaction) {
pineafan34369e62022-05-18 16:52:37 +0100216 let em = new Discord.MessageEmbed(pages[page])
217 em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message timed out");
pineafanad54d752022-04-18 19:01:43 +0100218 await interaction.editReply({
pineafan34369e62022-05-18 16:52:37 +0100219 embeds: [em],
pineafanad54d752022-04-18 19:01:43 +0100220 components: [new MessageActionRow().addComponents([
221 new MessageButton().setCustomId("left").setEmoji(getEmojiByName("CONTROL.LEFT", "id")).setStyle("SECONDARY").setDisabled(true),
pineafanea063042022-05-19 19:08:44 +0100222 new MessageButton().setCustomId("select").setEmoji(getEmojiByName("CONTROL.MENU", "id")).setStyle("SECONDARY").setDisabled(true),
pineafanad54d752022-04-18 19:01:43 +0100223 new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(true),
224 new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER").setDisabled(true)
225 ])]
226 });
227 } else {
pineafan34369e62022-05-18 16:52:37 +0100228 let em = new Discord.MessageEmbed(pages[page])
229 em.setDescription(em.description + "\n\n" + createPageIndicator(pages.length, page) + " | Message timed out");
pineafanad54d752022-04-18 19:01:43 +0100230 await m.edit({
pineafan34369e62022-05-18 16:52:37 +0100231 embeds: [em],
pineafanad54d752022-04-18 19:01:43 +0100232 components: [new MessageActionRow().addComponents([
233 new MessageButton().setCustomId("left").setEmoji(getEmojiByName("CONTROL.LEFT", "id")).setStyle("SECONDARY").setDisabled(true),
pineafanea063042022-05-19 19:08:44 +0100234 new MessageButton().setCustomId("select").setEmoji(getEmojiByName("CONTROL.MENU", "id")).setStyle("SECONDARY").setDisabled(true),
pineafanad54d752022-04-18 19:01:43 +0100235 new MessageButton().setCustomId("right").setEmoji(getEmojiByName("CONTROL.RIGHT", "id")).setStyle("SECONDARY").setDisabled(true),
236 new MessageButton().setCustomId("close").setEmoji(getEmojiByName("CONTROL.CROSS", "id")).setStyle("DANGER").setDisabled(true)
237 ])]
238 });
239 }
240}