diff --git a/.eslintrc.json b/.eslintrc.json
index 67417ac..7f0049a 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,119 +1,91 @@
{
- "extends": [
- "plugin:@typescript-eslint/recommended"
- ],
- "plugins": [
- "@typescript-eslint"
- ],
- "parser": "@typescript-eslint/parser",
- "env": {
- "node": true,
- "es6": true
- },
- "ignorePatterns": [
- "src/deploy-commands.js"
- ],
- "rules": {
- "arrow-spacing": [
- "error",
- {
- "before": true,
- "after": true
- }
- ],
- "brace-style": [
- "error",
- "stroustrup",
- {
- "allowSingleLine": true
- }
- ],
- "comma-dangle": [
- "error",
- "always-multiline"
- ],
- "comma-spacing": "error",
- "comma-style": "error",
- "curly": [
- "error",
- "multi-line",
- "consistent"
- ],
- "dot-location": [
- "error",
- "property"
- ],
- "handle-callback-err": "off",
- "indent": [
- "error",
- "tab"
- ],
- "keyword-spacing": "error",
- "max-nested-callbacks": [
- "error",
- {
- "max": 4
- }
- ],
- "max-statements-per-line": [
- "error",
- {
- "max": 2
- }
- ],
- "no-console": "off",
- "no-empty-function": "error",
- "no-floating-decimal": "error",
- "no-lonely-if": "error",
- "no-multi-spaces": "error",
- "no-multiple-empty-lines": [
- "error",
- {
- "max": 2,
- "maxEOF": 1,
- "maxBOF": 0
- }
- ],
- "no-shadow": [
- "error",
- {
- "allow": [
- "err",
- "resolve",
- "reject"
- ]
- }
- ],
- "no-trailing-spaces": [
- "error"
- ],
- "no-var": "error",
- "object-curly-spacing": [
- "error",
- "always"
- ],
- "prefer-const": "error",
- "quotes": [
- "error",
- "single"
- ],
- "semi": [
- "error",
- "always"
- ],
- "space-before-blocks": "error",
- "space-before-function-paren": [
- "error",
- {
- "anonymous": "never",
- "named": "never",
- "asyncArrow": "always"
- }
- ],
- "space-in-parens": "error",
- "space-infix-ops": "error",
- "space-unary-ops": "error",
- "spaced-comment": "error",
- "yoda": "error"
- }
-}
\ No newline at end of file
+ "extends": [
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "plugins": [
+ "@typescript-eslint"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "env": {
+ "node": true,
+ "es6": true
+ },
+ "ignorePatterns": [
+ "src/deploy-commands.js"
+ ],
+ "rules": {
+ "arrow-spacing": [
+ "error",
+ {
+ "before": true,
+ "after": true
+ }
+ ],
+ "comma-dangle": [
+ "error",
+ "always-multiline"
+ ],
+ "comma-spacing": "error",
+ "comma-style": "error",
+ "dot-location": [
+ "error",
+ "property"
+ ],
+ "handle-callback-err": "off",
+ "keyword-spacing": "error",
+ "max-nested-callbacks": [
+ "error",
+ {
+ "max": 4
+ }
+ ],
+ "max-statements-per-line": [
+ "error",
+ {
+ "max": 2
+ }
+ ],
+ "no-console": "off",
+ "no-empty-function": "error",
+ "no-floating-decimal": "error",
+ "no-lonely-if": "error",
+ "no-multi-spaces": "error",
+ "no-multiple-empty-lines": [
+ "error",
+ {
+ "max": 2,
+ "maxEOF": 1,
+ "maxBOF": 0
+ }
+ ],
+ "no-shadow": [
+ "error",
+ {
+ "allow": [
+ "err",
+ "resolve",
+ "reject"
+ ]
+ }
+ ],
+ "no-trailing-spaces": [
+ "error"
+ ],
+ "no-var": "error",
+ "object-curly-spacing": [
+ "error",
+ "always"
+ ],
+ "prefer-const": "error",
+ "semi": [
+ "error",
+ "always"
+ ],
+ "space-before-blocks": "error",
+ "space-in-parens": "error",
+ "space-infix-ops": "error",
+ "space-unary-ops": "error",
+ "spaced-comment": "error",
+ "yoda": "error"
+ }
+}
diff --git a/.prettierrc b/.prettierrc
index 02222a0..0fbafe2 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,6 +1,7 @@
{
- "singleQuote": false,
+ "singleQuote": true,
"semi": true,
+ "useTabs": true,
"endOfLine": "lf",
"trailingComma": "es5"
}
diff --git a/src/commands/about.ts b/src/commands/about.ts
index 9b4f277..6203fb5 100644
--- a/src/commands/about.ts
+++ b/src/commands/about.ts
@@ -1,72 +1,72 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { MessageEmbed, CommandInteraction } from "discord.js";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { MessageEmbed, CommandInteraction } from 'discord.js';
-import gitlog from "gitlog";
+import gitlog from 'gitlog';
-import userScore from "../models/userScore";
+import userScore from '../models/userScore';
-import { paginateInteraction } from "../helpers/util/pagination";
+import { paginateInteraction } from '../helpers/util/pagination';
export const data = new SlashCommandBuilder()
- .setName("about")
- .setDescription("Commands regarding the creation/development of the bot");
+ .setName('about')
+ .setDescription('Commands regarding the creation/development of the bot');
export async function execute(interaction: CommandInteraction) {
- await interaction.deferReply();
+ await interaction.deferReply();
- const client = interaction.client;
- const embeds: MessageEmbed[] = [];
+ const client = interaction.client;
+ const embeds: MessageEmbed[] = [];
- const contributorEmbed = new MessageEmbed()
- .setTitle("Contributors")
- .addField("Creator", "<@745063586422063214> [ADawesomeguy#3602]", true)
- .addField(
- "Contributors",
- "<@650525101048987649> [tEjAs#8127]\n<@426864344463048705> [tetrident#9396]",
- true
- ) // Add more contributors here, first one is Abheek, second one is Tejas
- .setTimestamp()
- .setColor("#ffffff");
- embeds.push(contributorEmbed);
+ const contributorEmbed = new MessageEmbed()
+ .setTitle('Contributors')
+ .addField('Creator', '<@745063586422063214> [ADawesomeguy#3602]', true)
+ .addField(
+ 'Contributors',
+ '<@650525101048987649> [tEjAs#8127]\n<@426864344463048705> [tetrident#9396]',
+ true
+ ) // Add more contributors here, first one is Abheek, second one is Tejas
+ .setTimestamp()
+ .setColor('#ffffff');
+ embeds.push(contributorEmbed);
- const gitRepoLocation = __dirname;
+ const gitRepoLocation = __dirname;
- const commits = gitlog({
- repo: gitRepoLocation,
- number: 5,
- fields: ["hash", "abbrevHash", "subject", "authorName", "authorDateRel"],
- });
+ const commits = gitlog({
+ repo: gitRepoLocation,
+ number: 5,
+ fields: ['hash', 'abbrevHash', 'subject', 'authorName', 'authorDateRel'],
+ });
- const changelogEmbed = new MessageEmbed()
- .setAuthor({
- name: interaction.user.tag,
- iconURL: interaction.user.displayAvatarURL(),
- })
- .setTitle("Changelog")
- .setColor("#ffffff")
- .setTimestamp();
+ const changelogEmbed = new MessageEmbed()
+ .setAuthor({
+ name: interaction.user.tag,
+ iconURL: interaction.user.displayAvatarURL(),
+ })
+ .setTitle('Changelog')
+ .setColor('#ffffff')
+ .setTimestamp();
- commits.forEach((commit) => {
- changelogEmbed.addField(
- commit.abbrevHash,
- `> \`Hash:\`${commit.hash}\n> \`Subject:\`${commit.subject}\n> \`Author:\`${commit.authorName}\n> \`Date:\`${commit.authorDateRel}\n> \`Link\`: [GitHub](https://github.com/ADawesomeguy/AwesomeSciBo/commit/${commit.hash})\n`
- );
- });
- embeds.push(changelogEmbed);
+ commits.forEach((commit) => {
+ changelogEmbed.addField(
+ commit.abbrevHash,
+ `> \`Hash:\`${commit.hash}\n> \`Subject:\`${commit.subject}\n> \`Author:\`${commit.authorName}\n> \`Date:\`${commit.authorDateRel}\n> \`Link\`: [GitHub](https://github.com/ADawesomeguy/AwesomeSciBo/commit/${commit.hash})\n`
+ );
+ });
+ embeds.push(changelogEmbed);
- await client.guilds.fetch();
- const trainingDocuments = await userScore.countDocuments({});
- const aboutBotEmbed = new MessageEmbed()
- .setAuthor({
- name: interaction.user.tag,
- iconURL: interaction.user.displayAvatarURL(),
- })
- .setTitle("About AwesomeSciBo")
- .addField("Servers", `${client.guilds.cache.size}`, true)
- .addField("Training Users", `${trainingDocuments}`, true)
- .setTimestamp();
+ await client.guilds.fetch();
+ const trainingDocuments = await userScore.countDocuments({});
+ const aboutBotEmbed = new MessageEmbed()
+ .setAuthor({
+ name: interaction.user.tag,
+ iconURL: interaction.user.displayAvatarURL(),
+ })
+ .setTitle('About AwesomeSciBo')
+ .addField('Servers', `${client.guilds.cache.size}`, true)
+ .addField('Training Users', `${trainingDocuments}`, true)
+ .setTimestamp();
- embeds.push(aboutBotEmbed);
+ embeds.push(aboutBotEmbed);
- paginateInteraction(interaction, embeds);
+ paginateInteraction(interaction, embeds);
}
diff --git a/src/commands/help.ts b/src/commands/help.ts
index 20b2d1d..43a2ddc 100644
--- a/src/commands/help.ts
+++ b/src/commands/help.ts
@@ -1,18 +1,18 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { MessageEmbed, CommandInteraction } from "discord.js";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { MessageEmbed, CommandInteraction } from 'discord.js';
export const data = new SlashCommandBuilder()
- .setName("help")
- .setDescription("Replies with a help message explaining what the bot can do");
+ .setName('help')
+ .setDescription('Replies with a help message explaining what the bot can do');
export async function execute(interaction: CommandInteraction) {
- await interaction.deferReply();
- await interaction.deferReply();
+ await interaction.deferReply();
+ await interaction.deferReply();
- const helpEmbed = new MessageEmbed()
- .setDescription(
- "AwesomeSciBo has migrated to using slash commands! You can take a look at the different commands by typing `/` and clicking on the AwesomeSciBo icon."
- )
- .setColor("#ffffff");
- interaction.followUp({ embeds: [helpEmbed] });
+ const helpEmbed = new MessageEmbed()
+ .setDescription(
+ 'AwesomeSciBo has migrated to using slash commands! You can take a look at the different commands by typing `/` and clicking on the AwesomeSciBo icon.'
+ )
+ .setColor('#ffffff');
+ interaction.followUp({ embeds: [helpEmbed] });
}
diff --git a/src/commands/rounds.ts b/src/commands/rounds.ts
index 004357b..65775ca 100644
--- a/src/commands/rounds.ts
+++ b/src/commands/rounds.ts
@@ -1,178 +1,178 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { MessageEmbed, CommandInteraction } from "discord.js";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { MessageEmbed, CommandInteraction } from 'discord.js';
-import axios from "axios";
+import axios from 'axios';
-import log from "../helpers/log";
-import generatedRound from "../models/generatedRound";
+import log from '../helpers/log';
+import generatedRound from '../models/generatedRound';
export const data = new SlashCommandBuilder()
- .setName("rounds")
- .setDescription("Commands regarding the generation of rounds")
- .addSubcommand((subcommand) => {
- subcommand
- .setName("generate")
- .setDescription(
- "Generates a round with randomized questions from https://scibowldb.com/"
- );
- return subcommand;
- })
- .addSubcommand((subcommand) => {
- subcommand
- .setName("list")
- .setDescription("Lists your 5 most recently generated rounds with links");
- return subcommand;
- })
- .addSubcommand((subcommand) => {
- subcommand
- .setName("hit")
- .setDescription(
- "Shows the total number of rounds hit as well as the number for the specific user"
- );
- return subcommand;
- });
+ .setName('rounds')
+ .setDescription('Commands regarding the generation of rounds')
+ .addSubcommand((subcommand) => {
+ subcommand
+ .setName('generate')
+ .setDescription(
+ 'Generates a round with randomized questions from https://scibowldb.com/'
+ );
+ return subcommand;
+ })
+ .addSubcommand((subcommand) => {
+ subcommand
+ .setName('list')
+ .setDescription('Lists your 5 most recently generated rounds with links');
+ return subcommand;
+ })
+ .addSubcommand((subcommand) => {
+ subcommand
+ .setName('hit')
+ .setDescription(
+ 'Shows the total number of rounds hit as well as the number for the specific user'
+ );
+ return subcommand;
+ });
export async function execute(interaction: CommandInteraction) {
- const action = interaction.options.getSubcommand();
- switch (action) {
- case "generate": {
- interaction.deferReply({ ephemeral: true });
-
- let finalizedHTML =
- "
ROUND GENERATED BY AWESOMESCIBO USING THE SCIBOWLDB API
";
- let tossup_question: string;
- let question_category: string;
- let tossup_format: string;
- let tossup_answer: string;
- let bonus_question: string;
- let bonus_format: string;
- let bonus_answer: string;
- let htmlContent = "";
- await axios
- .post("https://scibowldb.com/api/questions", {
- categories: [
- "BIOLOGY",
- "PHYSICS",
- "CHEMISTRY",
- "EARTH AND SPACE",
- "ASTRONOMY",
- "MATH",
- ],
- })
- .then((response) => {
- for (let i = 1; i < 26; i++) {
- const questionData =
- response.data.questions[
- Math.floor(Math.random() * response.data.questions.length)
- ];
- tossup_question = questionData.tossup_question;
- tossup_answer = questionData.tossup_answer;
- question_category = questionData.category;
- tossup_format = questionData.tossup_format;
- bonus_question = questionData.bonus_question;
- bonus_answer = questionData.bonus_answer;
- bonus_format = questionData.bonus_format;
- htmlContent =
- "
TOSS-UP
\n
" +
- `${i}) ${question_category}` +
- " " +
- `${tossup_format}` +
- " " +
- tossup_question +
- "
" +
- "ANSWER: " +
- tossup_answer +
- "
";
- htmlContent +=
- "
BONUS
\n
" +
- `${i}) ${question_category}` +
- " " +
- `${bonus_format}` +
- " " +
- bonus_question +
- "
" +
- "ANSWER: " +
- bonus_answer +
- "
";
- htmlContent = htmlContent.replace(/\n/g, "
");
- finalizedHTML += htmlContent;
- }
-
- const newGeneratedRound = new generatedRound({
- htmlContent: finalizedHTML,
- requestedBy: interaction.user.id,
- authorTag: interaction.user.tag,
- timestamp: new Date().toISOString(),
- });
-
- newGeneratedRound.save((err, round) => {
- if (err) {
- log({
- logger: "rounds",
- content: `Saving round to DB failed: ${err}`,
- level: "error",
- });
- return;
- }
- interaction.followUp({
- content: `Here's your round: https://api.adawesome.tech/round/${round._id.toString()}`,
- ephemeral: true,
- });
- });
- });
- break;
- }
-
- case "list": {
- interaction.deferReply({ ephemeral: true });
-
- let roundsList = await generatedRound
- .find({ requestedBy: interaction.user.id })
- .sort({ timestamp: -1 });
- let finalMessage = "";
- if (!roundsList) {
- interaction.followUp("You haven't requested any rounds!");
- return;
- }
-
- if (roundsList.length > 5) {
- roundsList = roundsList.slice(0, 5);
- }
-
- roundsList.forEach(async (item, index) => {
- finalMessage += `${index + 1}. [${
- item.timestamp.split("T")[0]
- }](https://api.adawesome.tech/round/${item._id.toString()})\n`;
- });
-
- const roundsListEmbed = new MessageEmbed()
- .setAuthor({
- name: interaction.user.tag,
- iconURL: interaction.user.displayAvatarURL(),
- })
- .setTitle("Last 5 rounds requested")
- .setDescription(finalMessage)
- .setTimestamp();
-
- interaction.followUp({
- embeds: [roundsListEmbed],
- ephemeral: true,
- });
- break;
- }
-
- case "hit": {
- await interaction.deferReply();
-
- const totalCount = await generatedRound.countDocuments({});
- const userCount = await generatedRound.countDocuments({
- requestedBy: interaction.user.id,
- });
-
- interaction.followUp(
- `Total Hits: ${totalCount}\nYour Hits: ${userCount}`
- );
- break;
- }
- }
+ const action = interaction.options.getSubcommand();
+ switch (action) {
+ case 'generate': {
+ interaction.deferReply({ ephemeral: true });
+
+ let finalizedHTML =
+ " ROUND GENERATED BY AWESOMESCIBO USING THE SCIBOWLDB API
";
+ let tossup_question: string;
+ let question_category: string;
+ let tossup_format: string;
+ let tossup_answer: string;
+ let bonus_question: string;
+ let bonus_format: string;
+ let bonus_answer: string;
+ let htmlContent = '';
+ await axios
+ .post('https://scibowldb.com/api/questions', {
+ categories: [
+ 'BIOLOGY',
+ 'PHYSICS',
+ 'CHEMISTRY',
+ 'EARTH AND SPACE',
+ 'ASTRONOMY',
+ 'MATH',
+ ],
+ })
+ .then((response) => {
+ for (let i = 1; i < 26; i++) {
+ const questionData =
+ response.data.questions[
+ Math.floor(Math.random() * response.data.questions.length)
+ ];
+ tossup_question = questionData.tossup_question;
+ tossup_answer = questionData.tossup_answer;
+ question_category = questionData.category;
+ tossup_format = questionData.tossup_format;
+ bonus_question = questionData.bonus_question;
+ bonus_answer = questionData.bonus_answer;
+ bonus_format = questionData.bonus_format;
+ htmlContent =
+ "
TOSS-UP
\n
" +
+ `${i}) ${question_category}` +
+ ' ' +
+ `${tossup_format}` +
+ ' ' +
+ tossup_question +
+ '
' +
+ 'ANSWER: ' +
+ tossup_answer +
+ '
';
+ htmlContent +=
+ "
BONUS
\n
" +
+ `${i}) ${question_category}` +
+ ' ' +
+ `${bonus_format}` +
+ ' ' +
+ bonus_question +
+ '
' +
+ 'ANSWER: ' +
+ bonus_answer +
+ '
';
+ htmlContent = htmlContent.replace(/\n/g, '
');
+ finalizedHTML += htmlContent;
+ }
+
+ const newGeneratedRound = new generatedRound({
+ htmlContent: finalizedHTML,
+ requestedBy: interaction.user.id,
+ authorTag: interaction.user.tag,
+ timestamp: new Date().toISOString(),
+ });
+
+ newGeneratedRound.save((err, round) => {
+ if (err) {
+ log({
+ logger: 'rounds',
+ content: `Saving round to DB failed: ${err}`,
+ level: 'error',
+ });
+ return;
+ }
+ interaction.followUp({
+ content: `Here's your round: https://api.adawesome.tech/round/${round._id.toString()}`,
+ ephemeral: true,
+ });
+ });
+ });
+ break;
+ }
+
+ case 'list': {
+ interaction.deferReply({ ephemeral: true });
+
+ let roundsList = await generatedRound
+ .find({ requestedBy: interaction.user.id })
+ .sort({ timestamp: -1 });
+ let finalMessage = '';
+ if (!roundsList) {
+ interaction.followUp("You haven't requested any rounds!");
+ return;
+ }
+
+ if (roundsList.length > 5) {
+ roundsList = roundsList.slice(0, 5);
+ }
+
+ roundsList.forEach(async (item, index) => {
+ finalMessage += `${index + 1}. [${
+ item.timestamp.split('T')[0]
+ }](https://api.adawesome.tech/round/${item._id.toString()})\n`;
+ });
+
+ const roundsListEmbed = new MessageEmbed()
+ .setAuthor({
+ name: interaction.user.tag,
+ iconURL: interaction.user.displayAvatarURL(),
+ })
+ .setTitle('Last 5 rounds requested')
+ .setDescription(finalMessage)
+ .setTimestamp();
+
+ interaction.followUp({
+ embeds: [roundsListEmbed],
+ ephemeral: true,
+ });
+ break;
+ }
+
+ case 'hit': {
+ await interaction.deferReply();
+
+ const totalCount = await generatedRound.countDocuments({});
+ const userCount = await generatedRound.countDocuments({
+ requestedBy: interaction.user.id,
+ });
+
+ interaction.followUp(
+ `Total Hits: ${totalCount}\nYour Hits: ${userCount}`
+ );
+ break;
+ }
+ }
}
diff --git a/src/commands/score.ts b/src/commands/score.ts
index 3c4d973..7e9c942 100644
--- a/src/commands/score.ts
+++ b/src/commands/score.ts
@@ -1,47 +1,47 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { CommandInteraction, MessageEmbed } from "discord.js";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { CommandInteraction, MessageEmbed } from 'discord.js';
-import log from "../helpers/log";
-import userScore from "../models/userScore";
+import log from '../helpers/log';
+import userScore from '../models/userScore';
export const data = new SlashCommandBuilder()
- .setName("score")
- .setDescription("Returns the score of the current user or another")
- .addUserOption((option) => {
- option
- .setName("user")
- .setDescription("The user to find the score for")
- .setRequired(false);
+ .setName('score')
+ .setDescription('Returns the score of the current user or another')
+ .addUserOption((option) => {
+ option
+ .setName('user')
+ .setDescription('The user to find the score for')
+ .setRequired(false);
- return option;
- });
+ return option;
+ });
export async function execute(interaction: CommandInteraction) {
- const scoreEmbed = new MessageEmbed().setColor("#ffffff");
-
- const user = interaction.options.getUser("user") || interaction.user;
- userScore.findOne({ authorID: user.id }, async (err, score) => {
- if (err) {
- log({
- logger: "db",
- content: `Unable to obtain user: ${err}`,
- level: "info",
- });
- }
-
- if (!score) {
- await interaction.reply({
- content:
- "Unfortunately, that user does not seem to have used AwesomeSciBo yet.",
- ephemeral: true,
- });
- return;
- }
-
- scoreEmbed
- .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
- .setDescription(`Score: \`${score.score}\``);
-
- await interaction.reply({ embeds: [scoreEmbed] });
- });
+ const scoreEmbed = new MessageEmbed().setColor('#ffffff');
+
+ const user = interaction.options.getUser('user') || interaction.user;
+ userScore.findOne({ authorID: user.id }, async (err, score) => {
+ if (err) {
+ log({
+ logger: 'db',
+ content: `Unable to obtain user: ${err}`,
+ level: 'info',
+ });
+ }
+
+ if (!score) {
+ await interaction.reply({
+ content:
+ 'Unfortunately, that user does not seem to have used AwesomeSciBo yet.',
+ ephemeral: true,
+ });
+ return;
+ }
+
+ scoreEmbed
+ .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
+ .setDescription(`Score: \`${score.score}\``);
+
+ await interaction.reply({ embeds: [scoreEmbed] });
+ });
}
diff --git a/src/commands/settings.ts b/src/commands/settings.ts
index 97c290d..c18eaf3 100644
--- a/src/commands/settings.ts
+++ b/src/commands/settings.ts
@@ -1,289 +1,289 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { Message, MessageActionRow, MessageSelectMenu } from "discord.js";
-import { CommandInteraction, MessageEmbed } from "discord.js";
-import log from "../helpers/log";
-import userConfig from "../models/userConfig";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { Message, MessageActionRow, MessageSelectMenu } from 'discord.js';
+import { CommandInteraction, MessageEmbed } from 'discord.js';
+import log from '../helpers/log';
+import userConfig from '../models/userConfig';
export const data = new SlashCommandBuilder()
- .setName("settings")
- .setDescription("BETA - settings configuration")
- .addSubcommand((subcommand) => {
- subcommand.setName("subject").setDescription("Changes subject of problems");
- return subcommand;
- })
- .addSubcommand((subcommand) => {
- subcommand.setName("display").setDescription("Displays current settings");
- return subcommand;
- })
- .addSubcommand((subcommand) => {
- subcommand
- .setName("gradelevels")
- .setDescription("Changes grade level of problems");
- return subcommand;
- });
+ .setName('settings')
+ .setDescription('BETA - settings configuration')
+ .addSubcommand((subcommand) => {
+ subcommand.setName('subject').setDescription('Changes subject of problems');
+ return subcommand;
+ })
+ .addSubcommand((subcommand) => {
+ subcommand.setName('display').setDescription('Displays current settings');
+ return subcommand;
+ })
+ .addSubcommand((subcommand) => {
+ subcommand
+ .setName('gradelevels')
+ .setDescription('Changes grade level of problems');
+ return subcommand;
+ });
export async function execute(interaction: CommandInteraction) {
- const action = interaction.options.getSubcommand();
- switch (action) {
- case "display": {
- await interaction.deferReply();
- const settingsEmbed = new MessageEmbed().setColor("#ffffff");
+ const action = interaction.options.getSubcommand();
+ switch (action) {
+ case 'display': {
+ await interaction.deferReply();
+ const settingsEmbed = new MessageEmbed().setColor('#ffffff');
- const user = interaction.options.getUser("user") || interaction.user;
+ const user = interaction.options.getUser('user') || interaction.user;
- settingsEmbed
- .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
- .setDescription("Current selections: ");
- const menu = new MessageActionRow().addComponents(
- new MessageSelectMenu()
- .setCustomId("selectdisp")
- .setPlaceholder("Nothing selected")
- .addOptions([
- {
- label: "subjects",
- description: "subjects",
- value: "subjects",
- },
- {
- label: "gradelevels",
- description: "grade levels",
- value: "gradelevels",
- },
- ])
- );
+ settingsEmbed
+ .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
+ .setDescription('Current selections: ');
+ const menu = new MessageActionRow().addComponents(
+ new MessageSelectMenu()
+ .setCustomId('selectdisp')
+ .setPlaceholder('Nothing selected')
+ .addOptions([
+ {
+ label: 'subjects',
+ description: 'subjects',
+ value: 'subjects',
+ },
+ {
+ label: 'gradelevels',
+ description: 'grade levels',
+ value: 'gradelevels',
+ },
+ ])
+ );
- interaction
- .followUp({
- embeds: [
- /* settingsEmbed*/
- ],
- components: [menu],
- })
- .then((dispMsg) => {
- const w = dispMsg as Message;
- const dispFilter = (i) =>
- ["selectdisp"].includes(i.customId) &&
- i.user.id == interaction.user.id; // <== ATTENTION! First argument...
- w.awaitMessageComponent({
- filter: dispFilter,
- componentType: "SELECT_MENU",
- }).then(async (dispChoice) => {
- const vals = dispChoice.values;
- const config = await userConfig.findById(interaction.user.id);
- if (!config) {
- await interaction.editReply({
- content: "You don't have a configuration!",
- embeds: [],
- components: [],
- });
- } else if (vals.length === 1 && vals.at(0) === "subjects") {
- await interaction.editReply({
- content: `Current subjects setting: ${config.subjects
- .toString()
- .split(",")
- .join(", ")}`,
- components: [],
- });
- } else if (vals.length === 1 && vals.at(0) === "gradelevels") {
- await interaction.editReply({
- content: `Current grade level setting: ${config.gradeLevels
- .toString()
- .split(",")
- .join(", ")}`,
- components: [],
- });
- } else {
- (err) =>
- log({
- logger:
- "'Error occurred: /settings:display did not equal subjects or gradelevels.'",
- content: `${err}`,
- level: "error",
- });
- }
- });
- });
- break;
- }
- case "gradelevels": {
- await interaction.deferReply();
+ interaction
+ .followUp({
+ embeds: [
+ /* settingsEmbed*/
+ ],
+ components: [menu],
+ })
+ .then((dispMsg) => {
+ const w = dispMsg as Message;
+ const dispFilter = (i) =>
+ ['selectdisp'].includes(i.customId) &&
+ i.user.id == interaction.user.id; // <== ATTENTION! First argument...
+ w.awaitMessageComponent({
+ filter: dispFilter,
+ componentType: 'SELECT_MENU',
+ }).then(async (dispChoice) => {
+ const vals = dispChoice.values;
+ const config = await userConfig.findById(interaction.user.id);
+ if (!config) {
+ await interaction.editReply({
+ content: "You don't have a configuration!",
+ embeds: [],
+ components: [],
+ });
+ } else if (vals.length === 1 && vals.at(0) === 'subjects') {
+ await interaction.editReply({
+ content: `Current subjects setting: ${config.subjects
+ .toString()
+ .split(',')
+ .join(', ')}`,
+ components: [],
+ });
+ } else if (vals.length === 1 && vals.at(0) === 'gradelevels') {
+ await interaction.editReply({
+ content: `Current grade level setting: ${config.gradeLevels
+ .toString()
+ .split(',')
+ .join(', ')}`,
+ components: [],
+ });
+ } else {
+ (err) =>
+ log({
+ logger:
+ "'Error occurred: /settings:display did not equal subjects or gradelevels.'",
+ content: `${err}`,
+ level: 'error',
+ });
+ }
+ });
+ });
+ break;
+ }
+ case 'gradelevels': {
+ await interaction.deferReply();
- const settingsEmbed = new MessageEmbed().setColor("#ffffff");
+ const settingsEmbed = new MessageEmbed().setColor('#ffffff');
- const user = interaction.options.getUser("user") || interaction.user;
+ const user = interaction.options.getUser('user') || interaction.user;
- settingsEmbed
- .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
- .setDescription("Current level settings: ");
- const menu = new MessageActionRow().addComponents(
- new MessageSelectMenu()
- .setCustomId("selectlvl")
- .setPlaceholder("Nothing selected")
- .setMinValues(1)
- .setMaxValues(2)
- .addOptions([
- {
- label: "Middle School",
- description: "Middle school level problems",
- value: "MS",
- },
- {
- label: "High School",
- description: "High school level problems",
- value: "HS",
- },
- ])
- );
+ settingsEmbed
+ .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
+ .setDescription('Current level settings: ');
+ const menu = new MessageActionRow().addComponents(
+ new MessageSelectMenu()
+ .setCustomId('selectlvl')
+ .setPlaceholder('Nothing selected')
+ .setMinValues(1)
+ .setMaxValues(2)
+ .addOptions([
+ {
+ label: 'Middle School',
+ description: 'Middle school level problems',
+ value: 'MS',
+ },
+ {
+ label: 'High School',
+ description: 'High school level problems',
+ value: 'HS',
+ },
+ ])
+ );
- interaction
- .followUp({
- embeds: [
- /* settingsEmbed*/
- ],
- components: [menu],
- })
- .then((lvlMsg) => {
- const w = lvlMsg as Message;
- const lvlFilter = (i) =>
- ["selectlvl"].includes(i.customId) &&
- i.user.id == interaction.user.id; // <== ATTENTION! First argument...
- w.awaitMessageComponent({
- filter: lvlFilter,
- componentType: "SELECT_MENU",
- }).then(async (lvlChoice) => {
- const vals = lvlChoice.values;
- const levels = new Array();
- await userConfig.findOneAndUpdate(
- { _id: interaction.user.id },
- { gradeLevels: vals },
- {
- upsert: true,
- new: true,
- }
- );
- await vals.forEach((v) => {
- switch (v) {
- case "MS":
- levels.push("Middle School");
- break;
- case "HS":
- levels.push("High School");
- }
- });
- await interaction.editReply({
- content: `Level set to: ${levels
- .toString()
- .split(",")
- .join(", ")}`,
- embeds: [],
- components: [],
- });
- });
- });
- break;
- }
- case "subject": {
- await interaction.deferReply();
+ interaction
+ .followUp({
+ embeds: [
+ /* settingsEmbed*/
+ ],
+ components: [menu],
+ })
+ .then((lvlMsg) => {
+ const w = lvlMsg as Message;
+ const lvlFilter = (i) =>
+ ['selectlvl'].includes(i.customId) &&
+ i.user.id == interaction.user.id; // <== ATTENTION! First argument...
+ w.awaitMessageComponent({
+ filter: lvlFilter,
+ componentType: 'SELECT_MENU',
+ }).then(async (lvlChoice) => {
+ const vals = lvlChoice.values;
+ const levels = new Array();
+ await userConfig.findOneAndUpdate(
+ { _id: interaction.user.id },
+ { gradeLevels: vals },
+ {
+ upsert: true,
+ new: true,
+ }
+ );
+ await vals.forEach((v) => {
+ switch (v) {
+ case 'MS':
+ levels.push('Middle School');
+ break;
+ case 'HS':
+ levels.push('High School');
+ }
+ });
+ await interaction.editReply({
+ content: `Level set to: ${levels
+ .toString()
+ .split(',')
+ .join(', ')}`,
+ embeds: [],
+ components: [],
+ });
+ });
+ });
+ break;
+ }
+ case 'subject': {
+ await interaction.deferReply();
- const settingsEmbed = new MessageEmbed().setColor("#ffffff");
+ const settingsEmbed = new MessageEmbed().setColor('#ffffff');
- const user = interaction.options.getUser("user") || interaction.user;
+ const user = interaction.options.getUser('user') || interaction.user;
- settingsEmbed
- .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
- .setDescription("Current subject settings: ");
- const menu = new MessageActionRow().addComponents(
- new MessageSelectMenu()
- .setCustomId("selectsubject")
- .setPlaceholder("Nothing selected")
- .setMinValues(1)
- .setMaxValues(7)
- .addOptions([
- {
- label: "Astronomy",
- description: "Astronomy",
- value: "ASTRONOMY",
- },
- {
- label: "Biology",
- description: "Biology",
- value: "BIOLOGY",
- },
- {
- label: "Earth Science",
- description: "Earth Science",
- value: "EARTH SCIENCE",
- },
- {
- label: "Chemistry",
- description: "Chemistry",
- value: "CHEMISTRY",
- },
- {
- label: "Physics",
- description: "Physics",
- value: "PHYSICS",
- },
- {
- label: "Mathematics",
- description: "Mathematics",
- value: "MATH",
- },
- {
- label: "Energy",
- description: "Energy",
- value: "ENERGY",
- },
- ])
- );
+ settingsEmbed
+ .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL() })
+ .setDescription('Current subject settings: ');
+ const menu = new MessageActionRow().addComponents(
+ new MessageSelectMenu()
+ .setCustomId('selectsubject')
+ .setPlaceholder('Nothing selected')
+ .setMinValues(1)
+ .setMaxValues(7)
+ .addOptions([
+ {
+ label: 'Astronomy',
+ description: 'Astronomy',
+ value: 'ASTRONOMY',
+ },
+ {
+ label: 'Biology',
+ description: 'Biology',
+ value: 'BIOLOGY',
+ },
+ {
+ label: 'Earth Science',
+ description: 'Earth Science',
+ value: 'EARTH SCIENCE',
+ },
+ {
+ label: 'Chemistry',
+ description: 'Chemistry',
+ value: 'CHEMISTRY',
+ },
+ {
+ label: 'Physics',
+ description: 'Physics',
+ value: 'PHYSICS',
+ },
+ {
+ label: 'Mathematics',
+ description: 'Mathematics',
+ value: 'MATH',
+ },
+ {
+ label: 'Energy',
+ description: 'Energy',
+ value: 'ENERGY',
+ },
+ ])
+ );
- interaction
- .followUp({
- embeds: [
- /* settingsEmbed*/
- ],
- components: [menu],
- })
- .then((subjectMsg) => {
- const subjectFilter = (i) =>
- ["selectsubject"].includes(i.customId) &&
- i.user.id == interaction.user.id; // <== ATTENTION! First argument...
- (subjectMsg as Message)
- .awaitMessageComponent({
- filter: subjectFilter,
- componentType: "SELECT_MENU",
- })
- .then(async (subjectChoice) => {
- const vals = subjectChoice.values;
- await userConfig.findOneAndUpdate(
- { _id: interaction.user.id },
- { subjects: vals },
- {
- upsert: true,
- new: true,
- }
- );
- const subjects = new Array();
- await vals.forEach((v) => {
- subjects.push(
- v
- .toLowerCase()
- .split(" ")
- .map((w) => w[0].toUpperCase() + w.substring(1))
- .join(" ")
- );
- });
- await interaction.editReply({
- content: `Subjects set to: ${subjects
- .toString()
- .split(",")
- .join(", ")}`,
- components: [],
- embeds: [],
- });
- });
- });
- break;
- }
- }
+ interaction
+ .followUp({
+ embeds: [
+ /* settingsEmbed*/
+ ],
+ components: [menu],
+ })
+ .then((subjectMsg) => {
+ const subjectFilter = (i) =>
+ ['selectsubject'].includes(i.customId) &&
+ i.user.id == interaction.user.id; // <== ATTENTION! First argument...
+ (subjectMsg as Message)
+ .awaitMessageComponent({
+ filter: subjectFilter,
+ componentType: 'SELECT_MENU',
+ })
+ .then(async (subjectChoice) => {
+ const vals = subjectChoice.values;
+ await userConfig.findOneAndUpdate(
+ { _id: interaction.user.id },
+ { subjects: vals },
+ {
+ upsert: true,
+ new: true,
+ }
+ );
+ const subjects = new Array();
+ await vals.forEach((v) => {
+ subjects.push(
+ v
+ .toLowerCase()
+ .split(' ')
+ .map((w) => w[0].toUpperCase() + w.substring(1))
+ .join(' ')
+ );
+ });
+ await interaction.editReply({
+ content: `Subjects set to: ${subjects
+ .toString()
+ .split(',')
+ .join(', ')}`,
+ components: [],
+ embeds: [],
+ });
+ });
+ });
+ break;
+ }
+ }
}
diff --git a/src/commands/top.ts b/src/commands/top.ts
index 3e08a4c..59085b3 100644
--- a/src/commands/top.ts
+++ b/src/commands/top.ts
@@ -1,75 +1,75 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
-import { CommandInteraction, MessageEmbed } from "discord.js";
+import { SlashCommandBuilder } from '@discordjs/builders';
+import { CommandInteraction, MessageEmbed } from 'discord.js';
-import log from "../helpers/log";
-import userScore from "../models/userScore";
+import log from '../helpers/log';
+import userScore from '../models/userScore';
export const data = new SlashCommandBuilder()
- .setName("top")
- .setDescription(
- "Lists top ten scores across servers and in the current server"
- );
+ .setName('top')
+ .setDescription(
+ 'Lists top ten scores across servers and in the current server'
+ );
export async function execute(interaction: CommandInteraction) {
- await interaction.deferReply();
+ await interaction.deferReply();
- userScore
- .find({})
- .sort({ score: -1 }) // Sort by descending order
- .exec(async (err, obj) => {
- if (err) {
- log({
- logger: "top",
- content: `Getting top players failed: ${err}`,
- level: "error",
- });
- console.log(err);
- }
+ userScore
+ .find({})
+ .sort({ score: -1 }) // Sort by descending order
+ .exec(async (err, obj) => {
+ if (err) {
+ log({
+ logger: 'top',
+ content: `Getting top players failed: ${err}`,
+ level: 'error',
+ });
+ console.log(err);
+ }
- if (obj.length < 10) {
- // Need at least 10 scores for top 10
- return interaction.followUp(
- `There are only ${obj.length} users, we need at least 10!`
- );
- }
+ if (obj.length < 10) {
+ // Need at least 10 scores for top 10
+ return interaction.followUp(
+ `There are only ${obj.length} users, we need at least 10!`
+ );
+ }
- const embeds: MessageEmbed[] = [];
- let lbMessageContent = "";
+ const embeds: MessageEmbed[] = [];
+ let lbMessageContent = '';
- for (let i = 0; i < 10; i++) {
- lbMessageContent += `${i + 1}: <@${obj[i].authorID}>: ${
- obj[i].score
- }\n`; // Loop through each user and add their name and score to leaderboard content
- }
+ for (let i = 0; i < 10; i++) {
+ lbMessageContent += `${i + 1}: <@${obj[i].authorID}>: ${
+ obj[i].score
+ }\n`; // Loop through each user and add their name and score to leaderboard content
+ }
- const leaderboardEmbed = new MessageEmbed()
- .setTitle("Top Ten!")
- .setDescription(lbMessageContent)
- .setColor("#ffffff");
+ const leaderboardEmbed = new MessageEmbed()
+ .setTitle('Top Ten!')
+ .setDescription(lbMessageContent)
+ .setColor('#ffffff');
- embeds.push(leaderboardEmbed);
+ embeds.push(leaderboardEmbed);
- let sMessageContent = "";
- const members = await interaction.guild?.members.fetch();
+ let sMessageContent = '';
+ const members = await interaction.guild?.members.fetch();
- const serverLeaderBoardArray = await obj.filter((o) =>
- members?.some((m) => m.user.id === o.authorID)
- );
- if (serverLeaderBoardArray.length > 10) {
- for (let i = 0; i < 10; i++) {
- sMessageContent += `${i + 1}: <@${
- serverLeaderBoardArray[i].authorID
- }>: ${serverLeaderBoardArray[i].score}\n`;
- }
+ const serverLeaderBoardArray = await obj.filter((o) =>
+ members?.some((m) => m.user.id === o.authorID)
+ );
+ if (serverLeaderBoardArray.length > 10) {
+ for (let i = 0; i < 10; i++) {
+ sMessageContent += `${i + 1}: <@${
+ serverLeaderBoardArray[i].authorID
+ }>: ${serverLeaderBoardArray[i].score}\n`;
+ }
- const sLeaderboardEmbed = new MessageEmbed()
- .setTitle(`Top Ten in ${interaction.guild?.name}!`)
- .setDescription(sMessageContent)
- .setColor("#ffffff");
+ const sLeaderboardEmbed = new MessageEmbed()
+ .setTitle(`Top Ten in ${interaction.guild?.name}!`)
+ .setDescription(sMessageContent)
+ .setColor('#ffffff');
- embeds.push(sLeaderboardEmbed);
- }
+ embeds.push(sLeaderboardEmbed);
+ }
- interaction.followUp({ embeds: embeds });
- });
+ interaction.followUp({ embeds: embeds });
+ });
}
diff --git a/src/commands/train.ts b/src/commands/train.ts
index 7f57201..7809e51 100644
--- a/src/commands/train.ts
+++ b/src/commands/train.ts
@@ -1,322 +1,322 @@
-import { SlashCommandBuilder } from "@discordjs/builders";
+import { SlashCommandBuilder } from '@discordjs/builders';
import {
- MessageEmbed,
- MessageActionRow,
- MessageButton,
- CommandInteraction,
- Message,
-} from "discord.js";
+ MessageEmbed,
+ MessageActionRow,
+ MessageButton,
+ CommandInteraction,
+ Message,
+} from 'discord.js';
-import { decode } from "html-entities";
-import axios from "axios";
+import { decode } from 'html-entities';
+import axios from 'axios';
-import userScore from "../models/userScore";
-import userConfig from "../models/userConfig";
+import userScore from '../models/userScore';
+import userConfig from '../models/userConfig';
-import log from "../helpers/log.js";
-import { updateScore } from "../helpers/db.js";
+import log from '../helpers/log.js';
+import { updateScore } from '../helpers/db.js';
export const data = new SlashCommandBuilder()
- .setName("train")
- .setDescription("Sends a training question to be answered")
- .addStringOption((option) => {
- option
- .setName("subject")
- .setDescription("Optional subject to be used as a filter")
- .setRequired(false)
- .addChoices(
- { name: "astro", value: "astro" },
- { name: "bio", value: "bio" },
- { name: "chem", value: "chem" },
- { name: "ess", value: "ess" },
- { name: "phys", value: "phys" },
- { name: "math", value: "math" },
- { name: "energy", value: "energy" }
- )
- .setRequired(false);
- return option;
- });
+ .setName('train')
+ .setDescription('Sends a training question to be answered')
+ .addStringOption((option) => {
+ option
+ .setName('subject')
+ .setDescription('Optional subject to be used as a filter')
+ .setRequired(false)
+ .addChoices(
+ { name: 'astro', value: 'astro' },
+ { name: 'bio', value: 'bio' },
+ { name: 'chem', value: 'chem' },
+ { name: 'ess', value: 'ess' },
+ { name: 'phys', value: 'phys' },
+ { name: 'math', value: 'math' },
+ { name: 'energy', value: 'energy' }
+ )
+ .setRequired(false);
+ return option;
+ });
export async function execute(interaction: CommandInteraction) {
- await interaction.deferReply();
+ await interaction.deferReply();
- const subject = interaction.options.get("subject")
- ? interaction.options.get("subject")?.value
- : null;
- const authorId = interaction.user.id;
- let score: number;
- userScore
- .findOne({ authorID: authorId })
- .lean()
- .then((obj: { score: number }, err: unknown) => {
- if (!obj) {
- score = 0;
- const firstTimeEmbed = new MessageEmbed()
- .setAuthor({
- name: interaction.client.user?.tag
- ? interaction.client.user?.tag
- : "",
- iconURL: interaction.client.user?.displayAvatarURL(),
- })
- .setDescription(
- "Hey! It seems like it's your first time using AwesomeSciBo. Here's some information regarding the bot if you need it (for issues, contributions, etc.):"
- )
- .addField("Creator", "<@745063586422063214> [@abheekd#3602]")
- .addField(
- "GitHub",
- "[Link](https://github.com/ADawesomeguy/AwesomeSciBo) (a star couldn't hurt...)"
- )
- .setColor("#ffffff")
- .setTimestamp();
- interaction.user
- .send({ embeds: [firstTimeEmbed] })
- .catch((err) =>
- log({ logger: "train", content: `${err}`, level: "error" })
- );
- } else if (obj) {
- score = obj.score;
- } else {
- log({
- logger: "train",
- content: `Getting user score failed: ${err}`,
- level: "error",
- });
- }
- });
+ const subject = interaction.options.get('subject')
+ ? interaction.options.get('subject')?.value
+ : null;
+ const authorId = interaction.user.id;
+ let score: number;
+ userScore
+ .findOne({ authorID: authorId })
+ .lean()
+ .then((obj: { score: number }, err: unknown) => {
+ if (!obj) {
+ score = 0;
+ const firstTimeEmbed = new MessageEmbed()
+ .setAuthor({
+ name: interaction.client.user?.tag
+ ? interaction.client.user?.tag
+ : '',
+ iconURL: interaction.client.user?.displayAvatarURL(),
+ })
+ .setDescription(
+ "Hey! It seems like it's your first time using AwesomeSciBo. Here's some information regarding the bot if you need it (for issues, contributions, etc.):"
+ )
+ .addField('Creator', '<@745063586422063214> [@abheekd#3602]')
+ .addField(
+ 'GitHub',
+ "[Link](https://github.com/ADawesomeguy/AwesomeSciBo) (a star couldn't hurt...)"
+ )
+ .setColor('#ffffff')
+ .setTimestamp();
+ interaction.user
+ .send({ embeds: [firstTimeEmbed] })
+ .catch((err) =>
+ log({ logger: 'train', content: `${err}`, level: 'error' })
+ );
+ } else if (obj) {
+ score = obj.score;
+ } else {
+ log({
+ logger: 'train',
+ content: `Getting user score failed: ${err}`,
+ level: 'error',
+ });
+ }
+ });
- let categoryArray: string[] = [];
- const allCategories = [
- "BIOLOGY",
- "PHYSICS",
- "CHEMISTRY",
- "EARTH AND SPACE",
- "ASTRONOMY",
- "MATH",
- ];
- const configCategories = await userConfig.findById(interaction.user.id);
+ let categoryArray: string[] = [];
+ const allCategories = [
+ 'BIOLOGY',
+ 'PHYSICS',
+ 'CHEMISTRY',
+ 'EARTH AND SPACE',
+ 'ASTRONOMY',
+ 'MATH',
+ ];
+ const configCategories = await userConfig.findById(interaction.user.id);
- switch (subject) {
- case null:
- categoryArray = configCategories
- ? configCategories.subjects || allCategories
- : allCategories;
- break;
- case "astro":
- case "astronomy":
- categoryArray = ["ASTRONOMY"];
- break;
- case "bio":
- case "biology":
- categoryArray = ["BIOLOGY"];
- break;
- case "ess":
- case "earth science":
- case "es":
- categoryArray = ["EARTH SCIENCE"];
- break;
- case "chem":
- case "chemistry":
- categoryArray = ["CHEMISTRY"];
- break;
- case "phys":
- case "physics":
- categoryArray = ["PHYSICS"];
- break;
- case "math":
- categoryArray = ["MATH"];
- break;
- case "energy":
- categoryArray = ["ENERGY"];
- break;
- default:
- interaction.followUp({
- embeds: [
- new MessageEmbed()
- .setDescription("<:red_x:816791117671825409> Not a valid subject!")
- .setColor("#ffffff"),
- ],
- });
- return;
- }
+ switch (subject) {
+ case null:
+ categoryArray = configCategories
+ ? configCategories.subjects || allCategories
+ : allCategories;
+ break;
+ case 'astro':
+ case 'astronomy':
+ categoryArray = ['ASTRONOMY'];
+ break;
+ case 'bio':
+ case 'biology':
+ categoryArray = ['BIOLOGY'];
+ break;
+ case 'ess':
+ case 'earth science':
+ case 'es':
+ categoryArray = ['EARTH SCIENCE'];
+ break;
+ case 'chem':
+ case 'chemistry':
+ categoryArray = ['CHEMISTRY'];
+ break;
+ case 'phys':
+ case 'physics':
+ categoryArray = ['PHYSICS'];
+ break;
+ case 'math':
+ categoryArray = ['MATH'];
+ break;
+ case 'energy':
+ categoryArray = ['ENERGY'];
+ break;
+ default:
+ interaction.followUp({
+ embeds: [
+ new MessageEmbed()
+ .setDescription('<:red_x:816791117671825409> Not a valid subject!')
+ .setColor('#ffffff'),
+ ],
+ });
+ return;
+ }
- axios
- .post("https://scibowldb.com/api/questions/random", {
- categories: categoryArray,
- })
- .then((res) => {
- const questionData = res.data.question;
- const tossupQuestion = questionData.tossup_question;
- const tossupAnswer = questionData.tossup_answer;
- const tossupFormat = questionData.tossup_format;
- let answers = tossupAnswer.split(" (ACCEPT: ");
- if (answers.length > 1) {
- answers[1] = answers[1].slice(0, answers[1].length - 1); // If there are multiple elements, it means there was an 'accept' and therefore a trailing ')' which should be removed
- answers = [answers[0], ...answers[1].split(new RegExp(" OR ", "i"))]; // Use the first element plus the last element split by 'OR' case insensitive
- }
- interaction
- .followUp({ content: decode(tossupQuestion), fetchReply: true })
- .then((q) => {
- const questionMessage = q as Message;
- const sourceButton = new MessageActionRow().addComponents(
- new MessageButton()
- .setURL(questionData.uri)
- .setLabel("Source")
- .setStyle("LINK")
- );
- switch (tossupFormat) {
- case "Short Answer": {
- // eslint-disable-next-line no-case-declarations
- const messageFilter = (m) =>
- m.author.id === interaction.user.id ||
- m.author.id === interaction.client.user?.id;
- interaction.channel
- ?.awaitMessages({
- filter: messageFilter,
- max: 1,
- })
- .then((collected) => {
- const answerMsg = collected.first();
+ axios
+ .post('https://scibowldb.com/api/questions/random', {
+ categories: categoryArray,
+ })
+ .then((res) => {
+ const questionData = res.data.question;
+ const tossupQuestion = questionData.tossup_question;
+ const tossupAnswer = questionData.tossup_answer;
+ const tossupFormat = questionData.tossup_format;
+ let answers = tossupAnswer.split(' (ACCEPT: ');
+ if (answers.length > 1) {
+ answers[1] = answers[1].slice(0, answers[1].length - 1); // If there are multiple elements, it means there was an 'accept' and therefore a trailing ')' which should be removed
+ answers = [answers[0], ...answers[1].split(new RegExp(' OR ', 'i'))]; // Use the first element plus the last element split by 'OR' case insensitive
+ }
+ interaction
+ .followUp({ content: decode(tossupQuestion), fetchReply: true })
+ .then((q) => {
+ const questionMessage = q as Message;
+ const sourceButton = new MessageActionRow().addComponents(
+ new MessageButton()
+ .setURL(questionData.uri)
+ .setLabel('Source')
+ .setStyle('LINK')
+ );
+ switch (tossupFormat) {
+ case 'Short Answer': {
+ // eslint-disable-next-line no-case-declarations
+ const messageFilter = (m) =>
+ m.author.id === interaction.user.id ||
+ m.author.id === interaction.client.user?.id;
+ interaction.channel
+ ?.awaitMessages({
+ filter: messageFilter,
+ max: 1,
+ })
+ .then((collected) => {
+ const answerMsg = collected.first();
- if (answerMsg?.author.id === interaction.client.user?.id)
- return;
+ if (answerMsg?.author.id === interaction.client.user?.id)
+ return;
- let predicted = "";
- if (
- answerMsg?.content.toLowerCase() ===
- tossupAnswer.toLowerCase() ||
- answers.includes(answerMsg?.content.toUpperCase())
- ) {
- predicted = "correct";
- } else {
- predicted = "incorrect";
- }
+ let predicted = '';
+ if (
+ answerMsg?.content.toLowerCase() ===
+ tossupAnswer.toLowerCase() ||
+ answers.includes(answerMsg?.content.toUpperCase())
+ ) {
+ predicted = 'correct';
+ } else {
+ predicted = 'incorrect';
+ }
- if (predicted === "correct") {
- updateScore(true, score, authorId).then((msgToReply) =>
- answerMsg?.reply(msgToReply)
- );
- } else {
- const overrideEmbed = new MessageEmbed()
- .setAuthor({
- name: answerMsg?.author.tag ? answerMsg.author.tag : "",
- iconURL: answerMsg?.author.displayAvatarURL(),
- })
- .addField("Correct answer", `\`${tossupAnswer}\``)
- .setDescription(
- "It seems your answer was incorrect. Please react with <:override:955265585086857236> to override your answer if you think you got it right."
- )
- .setColor("#ffffff")
- .setTimestamp();
- const overrideButton = new MessageActionRow().addComponents(
- new MessageButton()
- .setCustomId("override")
- .setEmoji("<:override:955265585086857236>")
- .setStyle("SECONDARY")
- );
- answerMsg?.channel
- .send({
- embeds: [overrideEmbed],
- components: [overrideButton],
- })
- .then((overrideMsg) => {
- const overrideFilter = (i) => {
- return (
- ["override"].includes(i.customId) &&
- i.user.id === answerMsg.author.id
- );
- };
- overrideMsg
- .awaitMessageComponent({
- filter: overrideFilter,
- })
- .then((i) => {
- updateScore(true, score, authorId).then(
- async (msgToReply) => {
- await i.reply(msgToReply);
- overrideMsg.edit({ components: [] });
- }
- );
- })
- .catch((err) =>
- log({
- logger: "train",
- content: `Failed to override score: ${err}`,
- level: "error",
- })
- );
- })
- .catch((err) =>
- log({
- logger: "train",
- content: `Failed to send override message: ${err}`,
- level: "error",
- })
- );
- }
- interaction.editReply({ components: [sourceButton] });
- })
- .catch((err) =>
- log({ logger: "train", content: `${err}`, level: "error" })
- );
- break;
- }
- case "Multiple Choice": {
- const choices = new MessageActionRow().addComponents(
- new MessageButton()
- .setCustomId("w")
- .setLabel("W")
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("x")
- .setLabel("X")
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("y")
- .setLabel("Y")
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("z")
- .setLabel("Z")
- .setStyle("SECONDARY")
- );
- interaction.editReply({ components: [choices] });
- const mcFilter = (i) =>
- ["w", "x", "y", "z"].includes(i.customId) &&
- i.user.id === interaction.user.id;
- questionMessage
- .awaitMessageComponent({ filter: mcFilter })
- .then((mcChoice) => {
- if (
- tossupAnswer.charAt(0).toLowerCase() === mcChoice.customId
- ) {
- updateScore(true, score, authorId).then((msgToReply) =>
- mcChoice.reply(msgToReply)
- );
- } else {
- const incorrectEmbed = new MessageEmbed()
- .setAuthor({
- name: interaction.user.tag,
- iconURL: interaction.user.displayAvatarURL(),
- })
- .addField("Correct answer", `\`${tossupAnswer}\``)
- .setDescription(
- `It seems your answer ${mcChoice.customId.toUpperCase()} was incorrect.`
- )
- .setColor("#ffffff")
- .setTimestamp();
- mcChoice.reply({ embeds: [incorrectEmbed] });
- }
- interaction.editReply({ components: [sourceButton] });
- });
- break;
- }
- }
- })
- .catch((err) =>
- log({ logger: "train", content: `${err}`, level: "error" })
- );
- })
- .catch((err) =>
- log({ logger: "train", content: `${err}`, level: "error" })
- );
+ if (predicted === 'correct') {
+ updateScore(true, score, authorId).then((msgToReply) =>
+ answerMsg?.reply(msgToReply)
+ );
+ } else {
+ const overrideEmbed = new MessageEmbed()
+ .setAuthor({
+ name: answerMsg?.author.tag ? answerMsg.author.tag : '',
+ iconURL: answerMsg?.author.displayAvatarURL(),
+ })
+ .addField('Correct answer', `\`${tossupAnswer}\``)
+ .setDescription(
+ 'It seems your answer was incorrect. Please react with <:override:955265585086857236> to override your answer if you think you got it right.'
+ )
+ .setColor('#ffffff')
+ .setTimestamp();
+ const overrideButton = new MessageActionRow().addComponents(
+ new MessageButton()
+ .setCustomId('override')
+ .setEmoji('<:override:955265585086857236>')
+ .setStyle('SECONDARY')
+ );
+ answerMsg?.channel
+ .send({
+ embeds: [overrideEmbed],
+ components: [overrideButton],
+ })
+ .then((overrideMsg) => {
+ const overrideFilter = (i) => {
+ return (
+ ['override'].includes(i.customId) &&
+ i.user.id === answerMsg.author.id
+ );
+ };
+ overrideMsg
+ .awaitMessageComponent({
+ filter: overrideFilter,
+ })
+ .then((i) => {
+ updateScore(true, score, authorId).then(
+ async (msgToReply) => {
+ await i.reply(msgToReply);
+ overrideMsg.edit({ components: [] });
+ }
+ );
+ })
+ .catch((err) =>
+ log({
+ logger: 'train',
+ content: `Failed to override score: ${err}`,
+ level: 'error',
+ })
+ );
+ })
+ .catch((err) =>
+ log({
+ logger: 'train',
+ content: `Failed to send override message: ${err}`,
+ level: 'error',
+ })
+ );
+ }
+ interaction.editReply({ components: [sourceButton] });
+ })
+ .catch((err) =>
+ log({ logger: 'train', content: `${err}`, level: 'error' })
+ );
+ break;
+ }
+ case 'Multiple Choice': {
+ const choices = new MessageActionRow().addComponents(
+ new MessageButton()
+ .setCustomId('w')
+ .setLabel('W')
+ .setStyle('SECONDARY'),
+ new MessageButton()
+ .setCustomId('x')
+ .setLabel('X')
+ .setStyle('SECONDARY'),
+ new MessageButton()
+ .setCustomId('y')
+ .setLabel('Y')
+ .setStyle('SECONDARY'),
+ new MessageButton()
+ .setCustomId('z')
+ .setLabel('Z')
+ .setStyle('SECONDARY')
+ );
+ interaction.editReply({ components: [choices] });
+ const mcFilter = (i) =>
+ ['w', 'x', 'y', 'z'].includes(i.customId) &&
+ i.user.id === interaction.user.id;
+ questionMessage
+ .awaitMessageComponent({ filter: mcFilter })
+ .then((mcChoice) => {
+ if (
+ tossupAnswer.charAt(0).toLowerCase() === mcChoice.customId
+ ) {
+ updateScore(true, score, authorId).then((msgToReply) =>
+ mcChoice.reply(msgToReply)
+ );
+ } else {
+ const incorrectEmbed = new MessageEmbed()
+ .setAuthor({
+ name: interaction.user.tag,
+ iconURL: interaction.user.displayAvatarURL(),
+ })
+ .addField('Correct answer', `\`${tossupAnswer}\``)
+ .setDescription(
+ `It seems your answer ${mcChoice.customId.toUpperCase()} was incorrect.`
+ )
+ .setColor('#ffffff')
+ .setTimestamp();
+ mcChoice.reply({ embeds: [incorrectEmbed] });
+ }
+ interaction.editReply({ components: [sourceButton] });
+ });
+ break;
+ }
+ }
+ })
+ .catch((err) =>
+ log({ logger: 'train', content: `${err}`, level: 'error' })
+ );
+ })
+ .catch((err) =>
+ log({ logger: 'train', content: `${err}`, level: 'error' })
+ );
}
diff --git a/src/events/interactionCreate.ts b/src/events/interactionCreate.ts
index 0c4c61a..bfc9d75 100644
--- a/src/events/interactionCreate.ts
+++ b/src/events/interactionCreate.ts
@@ -1,29 +1,29 @@
-import log from "../helpers/log";
+import log from '../helpers/log';
-export const name = "interactionCreate";
+export const name = 'interactionCreate';
export const once = false;
export async function execute(interaction) {
- const client = interaction.client;
+ const client = interaction.client;
- if (!interaction.isCommand()) return;
+ if (!interaction.isCommand()) return;
- const command = client.commands.get(interaction.commandName);
+ const command = client.commands.get(interaction.commandName);
- if (!command) return;
+ if (!command) return;
- try {
- await command.execute(interaction);
- } catch (error) {
- log({
- logger: "interaction",
- content: `Interaction ${interaction.commandName} failed!`,
- level: "error",
- });
- await interaction.followUp({
- content: "There was an error while executing this command!",
- ephemeral: true,
- });
- }
+ try {
+ await command.execute(interaction);
+ } catch (error) {
+ log({
+ logger: 'interaction',
+ content: `Interaction ${interaction.commandName} failed!`,
+ level: 'error',
+ });
+ await interaction.followUp({
+ content: 'There was an error while executing this command!',
+ ephemeral: true,
+ });
+ }
}
diff --git a/src/events/messageCreate.ts b/src/events/messageCreate.ts
index fa21848..ac5f5a9 100644
--- a/src/events/messageCreate.ts
+++ b/src/events/messageCreate.ts
@@ -1,36 +1,36 @@
-import axios from "axios";
-import { MessageEmbed } from "discord.js";
-import { decode } from "html-entities";
+import axios from 'axios';
+import { MessageEmbed } from 'discord.js';
+import { decode } from 'html-entities';
-import { testingGuild } from "../helpers/env";
+import { testingGuild } from '../helpers/env';
-export const name = "messageCreate";
+export const name = 'messageCreate';
export const once = false;
export async function execute(message) {
- if (message.author.bot || message.guild.id != testingGuild) return;
+ if (message.author.bot || message.guild.id != testingGuild) return;
- if (message.content.startsWith("!q")) {
- const questionId = message.content.split(" ")[1];
- axios
- .get(`https://scibowldb.com/api/questions/${questionId}`)
- .then((res) => {
- const data = res.data.question;
- const tossupQuestion = data.tossup_question;
- const tossupAnswer = data.tossup_answer;
- let answers = tossupAnswer.split(" (ACCEPT: ");
- if (answers.length > 1) {
- answers[1] = answers[1].slice(0, answers[1].length - 1); // If there are multiple elements, it means there was an 'accept' and therefore a trailing ')' which should be removed
- answers = [answers[0], ...answers[1].split(new RegExp(" OR ", "i"))]; // Use the first element plus the last element split by 'OR' case insensitive
- }
- const dataEmbed = new MessageEmbed()
- .setTitle("Data")
- .setDescription(`\`\`\`json\n${JSON.stringify(data, null, 2)}\`\`\``);
- message.reply({
- content: decode(tossupQuestion) + `\n\nAnswers: [${answers}]`,
- embeds: [dataEmbed],
- });
- });
- }
+ if (message.content.startsWith('!q')) {
+ const questionId = message.content.split(' ')[1];
+ axios
+ .get(`https://scibowldb.com/api/questions/${questionId}`)
+ .then((res) => {
+ const data = res.data.question;
+ const tossupQuestion = data.tossup_question;
+ const tossupAnswer = data.tossup_answer;
+ let answers = tossupAnswer.split(' (ACCEPT: ');
+ if (answers.length > 1) {
+ answers[1] = answers[1].slice(0, answers[1].length - 1); // If there are multiple elements, it means there was an 'accept' and therefore a trailing ')' which should be removed
+ answers = [answers[0], ...answers[1].split(new RegExp(' OR ', 'i'))]; // Use the first element plus the last element split by 'OR' case insensitive
+ }
+ const dataEmbed = new MessageEmbed()
+ .setTitle('Data')
+ .setDescription(`\`\`\`json\n${JSON.stringify(data, null, 2)}\`\`\``);
+ message.reply({
+ content: decode(tossupQuestion) + `\n\nAnswers: [${answers}]`,
+ embeds: [dataEmbed],
+ });
+ });
+ }
}
diff --git a/src/events/ready.ts b/src/events/ready.ts
index 9ff98b1..d0d5887 100644
--- a/src/events/ready.ts
+++ b/src/events/ready.ts
@@ -1,17 +1,17 @@
-import * as db from "../helpers/db";
-import { mongoUri } from "../helpers/env";
-import log from "../helpers/log";
+import * as db from '../helpers/db';
+import { mongoUri } from '../helpers/env';
+import log from '../helpers/log';
-export const name = "ready";
+export const name = 'ready';
export const once = true;
export async function execute(client) {
- await db.connect(mongoUri);
- log({
- logger: "status",
- content: `Logged in as ${client.user.tag}!`,
- level: "info",
- });
- client.user.setActivity("for /help", { type: "WATCHING" });
+ await db.connect(mongoUri);
+ log({
+ logger: 'status',
+ content: `Logged in as ${client.user.tag}!`,
+ level: 'info',
+ });
+ client.user.setActivity('for /help', { type: 'WATCHING' });
}
diff --git a/src/helpers/db.ts b/src/helpers/db.ts
index 7cde3d4..ee1b9a4 100644
--- a/src/helpers/db.ts
+++ b/src/helpers/db.ts
@@ -1,67 +1,67 @@
-import mongoose from "mongoose";
+import mongoose from 'mongoose';
-import log from "../helpers/log";
-import userScore from "../models/userScore";
+import log from '../helpers/log';
+import userScore from '../models/userScore';
export async function updateScore(
- isCorrect: boolean,
- score: number,
- authorId: string
+ isCorrect: boolean,
+ score: number,
+ authorId: string
) {
- if (!isCorrect) {
- return `Nice try! Your score is still ${score}.`;
- } else {
- // TODO: Error handling
- const doc = await userScore.findOne({
- authorID: authorId,
- });
- if (!doc) {
- const newUserScore = new userScore({
- authorID: authorId,
- score: score + 4,
- });
- newUserScore.save((err) => {
- if (err) {
- log({
- logger: "db",
- content: `Error creating new user ${authorId} for scoring`,
- level: "error",
- });
- } else {
- log({
- logger: "db",
- content: `Successfully created user ${authorId} for scoring`,
- level: "debug",
- });
- }
- });
- } else {
- doc.score = doc.score + 4;
- doc.save();
- }
+ if (!isCorrect) {
+ return `Nice try! Your score is still ${score}.`;
+ } else {
+ // TODO: Error handling
+ const doc = await userScore.findOne({
+ authorID: authorId,
+ });
+ if (!doc) {
+ const newUserScore = new userScore({
+ authorID: authorId,
+ score: score + 4,
+ });
+ newUserScore.save((err) => {
+ if (err) {
+ log({
+ logger: 'db',
+ content: `Error creating new user ${authorId} for scoring`,
+ level: 'error',
+ });
+ } else {
+ log({
+ logger: 'db',
+ content: `Successfully created user ${authorId} for scoring`,
+ level: 'debug',
+ });
+ }
+ });
+ } else {
+ doc.score = doc.score + 4;
+ doc.save();
+ }
- return `Great job! Your score is now ${score + 4}.`;
- }
+ return `Great job! Your score is now ${score + 4}.`;
+ }
}
export async function connect(mongoUri) {
- mongoose
- .connect(mongoUri, {
- useUnifiedTopology: true,
- useNewUrlParser: true,
- })
- .then(() =>
- log({
- logger: "db",
- content: `Connected to the database at ${mongoUri}!`,
- level: "info",
- })
- )
- .catch((err) =>
- log({
- logger: "db",
- content: `Failed to connect to the database at ${mongoUri}: ${err}`,
- level: "fatal",
- })
- );
+ mongoose
+ .connect(mongoUri, {
+ useUnifiedTopology: true,
+ useNewUrlParser: true,
+ })
+ .then(() =>
+ log({
+ logger: 'db',
+ content: `Connected to the database at ${mongoUri}!`,
+ level: 'info',
+ })
+ )
+ .catch((err) =>
+ log({
+ logger: 'db',
+ content: `Failed to connect to the database at ${mongoUri}: ${err}`,
+ level: 'fatal',
+ })
+ );
}
diff --git a/src/helpers/env.ts b/src/helpers/env.ts
index 8f79d7a..45f394d 100644
--- a/src/helpers/env.ts
+++ b/src/helpers/env.ts
@@ -1,7 +1,7 @@
-import "dotenv/config";
+import 'dotenv/config';
-export const clientId = process.env.CLIENT_ID || "";
-export const testingGuild = process.env.TESTING_GUILD || "";
-export const token = process.env.TOKEN || "";
+export const clientId = process.env.CLIENT_ID || '';
+export const testingGuild = process.env.TESTING_GUILD || '';
+export const token = process.env.TOKEN || '';
export const mongoUri = (process.env.MONGO_URI =
- "mongodb://mongo:27017/AWESOME");
+ 'mongodb://mongo:27017/AWESOME');
diff --git a/src/helpers/log.ts b/src/helpers/log.ts
index bc9a156..1ebc450 100644
--- a/src/helpers/log.ts
+++ b/src/helpers/log.ts
@@ -1,29 +1,29 @@
-import log4js from "log4js";
+import log4js from 'log4js';
export default function (config) {
- const logger = log4js.getLogger(config.logger);
- logger.level = "debug";
- switch (config.level) {
- case "trace":
- logger.trace(config.content);
- break;
- case "debug":
- logger.debug(config.content);
- break;
- case "info":
- logger.info(config.content);
- break;
- case "warn":
- logger.warn(config.content);
- break;
- case "error":
- logger.error(config.content);
- break;
- case "fatal":
- logger.fatal(config.content);
- break;
- default:
- logger.debug(config.content);
- break;
- }
+ const logger = log4js.getLogger(config.logger);
+ logger.level = 'debug';
+ switch (config.level) {
+ case 'trace':
+ logger.trace(config.content);
+ break;
+ case 'debug':
+ logger.debug(config.content);
+ break;
+ case 'info':
+ logger.info(config.content);
+ break;
+ case 'warn':
+ logger.warn(config.content);
+ break;
+ case 'error':
+ logger.error(config.content);
+ break;
+ case 'fatal':
+ logger.fatal(config.content);
+ break;
+ default:
+ logger.debug(config.content);
+ break;
+ }
}
diff --git a/src/helpers/util/pagination.ts b/src/helpers/util/pagination.ts
index 36f5342..64734ab 100644
--- a/src/helpers/util/pagination.ts
+++ b/src/helpers/util/pagination.ts
@@ -1,113 +1,113 @@
import {
- CommandInteraction,
- Message,
- MessageActionRow,
- MessageButton,
- MessageEmbed,
-} from "discord.js";
+ CommandInteraction,
+ Message,
+ MessageActionRow,
+ MessageButton,
+ MessageEmbed,
+} from 'discord.js';
export async function paginateMessage(
- message: Message,
- embeds: MessageEmbed[]
+ message: Message,
+ embeds: MessageEmbed[]
) {
- let index = 0;
+ let index = 0;
- const row = new MessageActionRow();
- row.addComponents(
- new MessageButton()
- .setCustomId("paginator-left")
- .setEmoji("868552005977788466")
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("paginator-right")
- .setEmoji("868551772887711754")
- .setStyle("SECONDARY")
- );
+ const row = new MessageActionRow();
+ row.addComponents(
+ new MessageButton()
+ .setCustomId('paginator-left')
+ .setEmoji('868552005977788466')
+ .setStyle('SECONDARY'),
+ new MessageButton()
+ .setCustomId('paginator-right')
+ .setEmoji('868551772887711754')
+ .setStyle('SECONDARY')
+ );
- await message
- .reply({
- content: `Page 1 of ${embeds.length}:`,
- embeds: [embeds[index]],
- components: [row],
- })
- .then(async (paginatorMessage) => {
- const filter = (m) => m.author.id === message.author.id;
+ await message
+ .reply({
+ content: `Page 1 of ${embeds.length}:`,
+ embeds: [embeds[index]],
+ components: [row],
+ })
+ .then(async (paginatorMessage) => {
+ const filter = (m) => m.author.id === message.author.id;
- const paginatorCollector =
- paginatorMessage.createMessageComponentCollector({
- componentType: "BUTTON",
- filter: filter,
- });
+ const paginatorCollector =
+ paginatorMessage.createMessageComponentCollector({
+ componentType: 'BUTTON',
+ filter: filter,
+ });
- paginatorCollector.on("collect", async (i) => {
- switch (i.customId) {
- case "paginator-left":
- index--;
- if (index < 0) index = embeds.length - 1;
- break;
- case "paginator-right":
- index++;
- if (index > embeds.length - 1) index = 0;
- break;
- }
- paginatorMessage.edit({
- content: `Page ${index + 1} of ${embeds.length}:`,
- embeds: [embeds[index]],
- });
- });
- });
+ paginatorCollector.on('collect', async (i) => {
+ switch (i.customId) {
+ case 'paginator-left':
+ index--;
+ if (index < 0) index = embeds.length - 1;
+ break;
+ case 'paginator-right':
+ index++;
+ if (index > embeds.length - 1) index = 0;
+ break;
+ }
+ paginatorMessage.edit({
+ content: `Page ${index + 1} of ${embeds.length}:`,
+ embeds: [embeds[index]],
+ });
+ });
+ });
}
export async function paginateInteraction(
- interaction: CommandInteraction,
- embeds: MessageEmbed[]
+ interaction: CommandInteraction,
+ embeds: MessageEmbed[]
) {
- let index = 0;
+ let index = 0;
- const row = new MessageActionRow();
- row.addComponents(
- new MessageButton()
- .setCustomId("paginator-left")
- .setEmoji("868552005977788466")
- .setStyle("SECONDARY"),
- new MessageButton()
- .setCustomId("paginator-right")
- .setEmoji("868551772887711754")
- .setStyle("SECONDARY")
- );
+ const row = new MessageActionRow();
+ row.addComponents(
+ new MessageButton()
+ .setCustomId('paginator-left')
+ .setEmoji('868552005977788466')
+ .setStyle('SECONDARY'),
+ new MessageButton()
+ .setCustomId('paginator-right')
+ .setEmoji('868551772887711754')
+ .setStyle('SECONDARY')
+ );
- await interaction
- .followUp({
- content: `Page 1 of ${embeds.length}:`,
- embeds: [embeds[index]],
- components: [row],
- fetchReply: true,
- })
- .then(async (p) => {
- const paginatorMessage = p as Message;
- const filter = (i) => i.user.id === interaction.user.id;
+ await interaction
+ .followUp({
+ content: `Page 1 of ${embeds.length}:`,
+ embeds: [embeds[index]],
+ components: [row],
+ fetchReply: true,
+ })
+ .then(async (p) => {
+ const paginatorMessage = p as Message;
+ const filter = (i) => i.user.id === interaction.user.id;
- const paginatorCollector =
- paginatorMessage.createMessageComponentCollector({
- componentType: "BUTTON",
- filter: filter,
- });
+ const paginatorCollector =
+ paginatorMessage.createMessageComponentCollector({
+ componentType: 'BUTTON',
+ filter: filter,
+ });
- paginatorCollector.on("collect", async (i) => {
- switch (i.customId) {
- case "paginator-left":
- index--;
- if (index < 0) index = embeds.length - 1;
- break;
- case "paginator-right":
- index++;
- if (index > embeds.length - 1) index = 0;
- break;
- }
- await i.update({
- content: `Page ${index + 1} of ${embeds.length}:`,
- embeds: [embeds[index]],
- });
- });
- });
+ paginatorCollector.on('collect', async (i) => {
+ switch (i.customId) {
+ case 'paginator-left':
+ index--;
+ if (index < 0) index = embeds.length - 1;
+ break;
+ case 'paginator-right':
+ index++;
+ if (index > embeds.length - 1) index = 0;
+ break;
+ }
+ await i.update({
+ content: `Page ${index + 1} of ${embeds.length}:`,
+ embeds: [embeds[index]],
+ });
+ });
+ });
}
diff --git a/src/index.ts b/src/index.ts
index 831e906..cb8843c 100755
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,54 +1,54 @@
#!/usr/bin/env node
-import fs from "node:fs";
-import { Client, Collection, Intents } from "discord.js";
-import { token } from "./helpers/env";
-import log from "./helpers/log";
+import fs from 'node:fs';
+import { Client, Collection, Intents } from 'discord.js';
+import { token } from './helpers/env';
+import log from './helpers/log';
const client = new Client({
- intents: [
- Intents.FLAGS.GUILDS,
- Intents.FLAGS.GUILD_MESSAGES,
- Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
- Intents.FLAGS.GUILD_MEMBERS,
- Intents.FLAGS.DIRECT_MESSAGES,
- Intents.FLAGS.DIRECT_MESSAGE_REACTIONS,
- ],
+ intents: [
+ Intents.FLAGS.GUILDS,
+ Intents.FLAGS.GUILD_MESSAGES,
+ Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
+ Intents.FLAGS.GUILD_MEMBERS,
+ Intents.FLAGS.DIRECT_MESSAGES,
+ Intents.FLAGS.DIRECT_MESSAGE_REACTIONS,
+ ],
});
-client["commands"] = new Collection();
+client['commands'] = new Collection();
const commandFiles = fs
- .readdirSync(`${__dirname}/commands`)
- .filter((file) => file.endsWith(".js"));
+ .readdirSync(`${__dirname}/commands`)
+ .filter((file) => file.endsWith('.js'));
const eventFiles = fs
- .readdirSync(`${__dirname}/events`)
- .filter((file) => file.endsWith(".js"));
+ .readdirSync(`${__dirname}/events`)
+ .filter((file) => file.endsWith('.js'));
for (const file of commandFiles) {
- import(`${__dirname}/commands/${file}`).then((command) => {
- client["commands"].set(command.data.name, command);
- log({
- logger: "command",
- content: `Registered command ${file}!`,
- level: "info",
- });
- });
+ import(`${__dirname}/commands/${file}`).then((command) => {
+ client['commands'].set(command.data.name, command);
+ log({
+ logger: 'command',
+ content: `Registered command ${file}!`,
+ level: 'info',
+ });
+ });
}
for (const file of eventFiles) {
- import(`${__dirname}/events/${file}`).then((event) => {
- if (event.once) {
- client.once(event.name, (...args) => event.execute(...args));
- } else {
- client.on(event.name, (...args) => event.execute(...args));
- }
- log({
- logger: "event",
- content: `Registered event ${file}!`,
- level: "info",
- });
- });
+ import(`${__dirname}/events/${file}`).then((event) => {
+ if (event.once) {
+ client.once(event.name, (...args) => event.execute(...args));
+ } else {
+ client.on(event.name, (...args) => event.execute(...args));
+ }
+ log({
+ logger: 'event',
+ content: `Registered event ${file}!`,
+ level: 'info',
+ });
+ });
}
client.login(token);
diff --git a/src/models/generatedRound.ts b/src/models/generatedRound.ts
index ad895b7..0fbd5f2 100644
--- a/src/models/generatedRound.ts
+++ b/src/models/generatedRound.ts
@@ -1,22 +1,22 @@
-import mongoose from "mongoose";
+import mongoose from 'mongoose';
const generatedRoundSchema = new mongoose.Schema({
- htmlContent: {
- type: String,
- required: true,
- },
- requestedBy: {
- type: String,
- required: true,
- },
- authorTag: {
- type: String,
- required: true,
- },
- timestamp: {
- type: String,
- required: true,
- },
+ htmlContent: {
+ type: String,
+ required: true,
+ },
+ requestedBy: {
+ type: String,
+ required: true,
+ },
+ authorTag: {
+ type: String,
+ required: true,
+ },
+ timestamp: {
+ type: String,
+ required: true,
+ },
});
-export default mongoose.model("GeneratedRound", generatedRoundSchema);
+export default mongoose.model('GeneratedRound', generatedRoundSchema);
diff --git a/src/models/userConfig.ts b/src/models/userConfig.ts
index 9443e02..5beff3f 100644
--- a/src/models/userConfig.ts
+++ b/src/models/userConfig.ts
@@ -1,17 +1,17 @@
-import mongoose from "mongoose";
+import mongoose from 'mongoose';
const userConfigSchema = new mongoose.Schema({
- _id: String,
- subjects: {
- type: [String],
- required: true,
- default: null,
- },
- gradeLevels: {
- type: [String],
- required: true,
- default: null,
- },
+ _id: String,
+ subjects: {
+ type: [String],
+ required: true,
+ default: null,
+ },
+ gradeLevels: {
+ type: [String],
+ required: true,
+ default: null,
+ },
});
-export default mongoose.model("UserConfig", userConfigSchema);
+export default mongoose.model('UserConfig', userConfigSchema);
diff --git a/src/models/userScore.ts b/src/models/userScore.ts
index 37f8c1a..3ef9a9a 100644
--- a/src/models/userScore.ts
+++ b/src/models/userScore.ts
@@ -1,14 +1,14 @@
-import mongoose from "mongoose";
+import mongoose from 'mongoose';
const userScoreSchema = new mongoose.Schema({
- authorID: {
- type: String,
- required: true,
- },
- score: {
- type: Number,
- required: true,
- },
+ authorID: {
+ type: String,
+ required: true,
+ },
+ score: {
+ type: Number,
+ required: true,
+ },
});
-export default mongoose.model("UserScore", userScoreSchema);
+export default mongoose.model('UserScore', userScoreSchema);