From 8ccb6dc0d002f7959556cd6c5a8601cabc002fa7 Mon Sep 17 00:00:00 2001 From: Pukimaa Date: Mon, 6 Nov 2023 12:51:22 +0000 Subject: [PATCH] initial commit --- .env.example | 3 + .eslintrc.json | 8 ++ .github/workflows/crowdin.yml | 31 ++++++ .gitignore | 3 + .prettierrc.json | 8 ++ .vscode/settings.json | 6 ++ .vscode/tako.code-snippets | 19 ++++ LICENSE.md | 21 ++++ README.md | 52 +++++++++ bun.lockb | Bin 0 -> 296987 bytes config.ts | 34 ++++++ crowdin.yml | 127 ++++++++++++++++++++++ package.json | 44 ++++++++ prisma/schema.prisma | 16 +++ src/@types/general.d.ts | 19 ++++ src/@types/i18next.d.ts | 9 ++ src/@types/utility.ts | 61 +++++++++++ src/commands/index.ts | 39 +++++++ src/commands/info/ping.ts | 26 +++++ src/commands/secret/sync.ts | 71 +++++++++++++ src/commands/utility/changeLanguage.ts | 140 +++++++++++++++++++++++++ src/database.ts | 5 + src/events/index.ts | 33 ++++++ src/events/ready.ts | 31 ++++++ src/i18n.ts | 25 +++++ src/index.ts | 26 +++++ src/locales/de/errors.json | 18 ++++ src/locales/de/info.json | 8 ++ src/locales/de/secret.json | 6 ++ src/locales/de/utility.json | 21 ++++ src/locales/en/errors.json | 18 ++++ src/locales/en/info.json | 9 ++ src/locales/en/secret.json | 6 ++ src/locales/en/utility.json | 21 ++++ src/util/checks.ts | 5 + src/util/deploy.ts | 43 ++++++++ src/util/general.ts | 83 +++++++++++++++ src/util/loaders.ts | 76 ++++++++++++++ src/util/logger.ts | 24 +++++ src/util/registerEvents.ts | 52 +++++++++ tsconfig.eslint.json | 8 ++ tsconfig.json | 28 +++++ 42 files changed, 1283 insertions(+) create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .github/workflows/crowdin.yml create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tako.code-snippets create mode 100644 LICENSE.md create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 config.ts create mode 100644 crowdin.yml create mode 100644 package.json create mode 100644 prisma/schema.prisma create mode 100644 src/@types/general.d.ts create mode 100644 src/@types/i18next.d.ts create mode 100644 src/@types/utility.ts create mode 100644 src/commands/index.ts create mode 100644 src/commands/info/ping.ts create mode 100644 src/commands/secret/sync.ts create mode 100644 src/commands/utility/changeLanguage.ts create mode 100644 src/database.ts create mode 100644 src/events/index.ts create mode 100644 src/events/ready.ts create mode 100644 src/i18n.ts create mode 100644 src/index.ts create mode 100644 src/locales/de/errors.json create mode 100644 src/locales/de/info.json create mode 100644 src/locales/de/secret.json create mode 100644 src/locales/de/utility.json create mode 100644 src/locales/en/errors.json create mode 100644 src/locales/en/info.json create mode 100644 src/locales/en/secret.json create mode 100644 src/locales/en/utility.json create mode 100644 src/util/checks.ts create mode 100644 src/util/deploy.ts create mode 100644 src/util/general.ts create mode 100644 src/util/loaders.ts create mode 100644 src/util/logger.ts create mode 100644 src/util/registerEvents.ts create mode 100644 tsconfig.eslint.json create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..22df07e --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +DISCORD_TOKEN="" +APPLICATION_ID="" +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..f6842f3 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,8 @@ +{ + "root": true, + "extends": ["neon/common", "neon/node", "neon/typescript", "neon/prettier"], + "parserOptions": { + "project": ["./tsconfig.eslint.json"] + }, + "ignorePatterns": ["dist/*"] +} diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml new file mode 100644 index 0000000..75ce195 --- /dev/null +++ b/.github/workflows/crowdin.yml @@ -0,0 +1,31 @@ +name: Crowdin Action + +on: + # Uncomment to run on every push to master, this is recommended but turned off by default, in case you haven't set up your Crowdin project yet + # push: + # branches: [master] + workflow_dispatch: + +jobs: + synchronize-with-crowdin: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: crowdin action + uses: crowdin/github-action@v1 + with: + upload_translations: true + download_translations: true + auto_approve_imported: true + create_pull_request: true + skip_untranslated_strings: true + crowdin_branch_name: 'BRANCH_IN_CROWDIN' + commit_message: 'i18n: update crowdin translations' + env: + # Add these secrets to your repository's secrets + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33f55e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +bot.log diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..eba3f40 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "printWidth": 120, + "useTabs": true, + "singleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "endOfLine": "lf" +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..49d335f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "i18n-ally.localesPaths": [ + "src/locales" + ], + "i18n-ally.keystyle": "nested" +} \ No newline at end of file diff --git a/.vscode/tako.code-snippets b/.vscode/tako.code-snippets new file mode 100644 index 0000000..0764222 --- /dev/null +++ b/.vscode/tako.code-snippets @@ -0,0 +1,19 @@ +{ + "Slash Command Template": { + "scope": "javascript,typescript", + "body": [ + "import { SlashCommandBuilder } from 'discord.js';", + "import type { Command } from '../index.ts';", + "", + "export default {", + "data: new SlashCommandBuilder()", + ".setName('NAME')", + ".setDescription('DESC')", + ".toJSON(),", + "async execute(interaction) {},", + "} satisfies Command;" + + ], + "description": "Template for a slash command. Be sure to save after inserting, to format the code." + } +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e8b8069 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2023 Jaron Ain + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3d995d0 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# TypeScript Discord Bot Template + +This is a template for creating a Discord bot using TypeScript and the Bun framework. Please note that the documentation isn't really written yet and you should come with some technical knowledge about the tech used here or at least know how to read their documentations. + +## Prerequisites +- [Bun](https://bun.sh) +- A database compatible with [Prisma](https://prisma.io). The schema file is currently set for [PostgreSQL](https://www.postgresql.org/). + +## Getting Started + +1. Clone this repository. +2. Install dependencies with `bun install`. +3. Create a `.env` file with your Discord bot token and any other necessary configuration variables as outlined in `.env.example` +4. If you want automatic uploads and downloads to Crowdin, check out `.github/workflows/crowdin.yml`! + +## Database +You can just import `prisma` from `src/database.ts` to get access to the fully typesafe database. + +## Translation +Import `i18next` from `src/i18n.ts` to get an i18next object that is already fully equipped with all the translations in `src/locales`. It's recommended to use the *i18n Ally* extension by Lokalise for a nice integration into VS Code, in order to check if your translations exist. + +## Scripts +You can run these scripts by using `bun run ` as a prefix. + +`commit`: Commit your changes using commitizen + +`format`: Lint and attempt to autofix all your files. It's recommended to use a Prettier ESLint Plugin for your Editor or to create a GitHub Workflow or similiar to lint everything. + +`deploy`: Deploy/Sync the application commands (Slash-Commands) if the regular sync command does not work. + +`start`: Start the bot. + +`dev`: Start the bot with hot-reloading on file changes. + +## Features + +- Bun instead of Node for way faster code execution +- TypeScript support, to prevent errors before going into production +- Reliable translation with i18next and Crowdin Support +- Consistency using custom helpers and a robust configuration system. + +## To-Do +- [ ] Better logging +- [ ] Documentation for a foolproof setup + +## Contributing + +Contributions are welcome! Please open an issue or pull request for any requests, changes or additions. + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..837b059354069ea00b752d9082513b1fc657e25e GIT binary patch literal 296987 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э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 +type paginationEmojis = keyof (typeof config.emojis)['pagination']; + +export type EmbedOptions = { + author?: EmbedAuthorOptions; + color: number | keyof typeof config.colors; + description?: string; + emoji?: (typeof config.emojis.pagination)[paginationEmojis] | (typeof config.emojis)[baseEmojis]; + fields?: APIEmbedField[]; + footer?: EmbedFooterOptions | null | undefined; + image?: string | null; + thumbnail?: string; + timestamp?: Date | number | null | undefined; + title?: string; +}; diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts new file mode 100644 index 0000000..e761fe0 --- /dev/null +++ b/src/@types/i18next.d.ts @@ -0,0 +1,9 @@ +import type { resources, defaultNS, fallbackNS } from '../i18n'; + +declare module 'i18next' { + type CustomTypeOptions = { + defaultNS: typeof defaultNS; + fallbackNS: typeof fallbackNS; + resources: typeof resources; + }; +} diff --git a/src/@types/utility.ts b/src/@types/utility.ts new file mode 100644 index 0000000..715d61d --- /dev/null +++ b/src/@types/utility.ts @@ -0,0 +1,61 @@ +export const languages = { + af: 'Afrikaans', + ar: 'Arabic (عربي)', + az: 'Azerbaijani (Azərbaycan)', + be: 'Belarusian (беларускі)', + bg: 'Bulgarian (български)', + bn: 'Bengali (বাংলা)', + ca: 'Catalan (Català)', + cs: 'Czech (Čeština)', + cy: 'Welsh (Cymraeg)', + da: 'Danish (Dansk)', + de: 'German (Deutsch)', + el: 'Greek (Ελληνικά)', + en: 'English', + es: 'Spanish (Español)', + et: 'Estonian (Eesti keel)', + eu: 'Basque (Euskara)', + fa: 'Persian (فارسی)', + fi: 'Finnish (Suomalainen)', + fr: 'French (Français)', + ga: 'Irish (Gaeilge)', + gl: 'Galician (Galego)', + gu: 'Gujarati (ગુજરાતી)', + hi: 'Hindi (हिंदी)', + hr: 'Croatian (Hrvatski)', + ht: 'Haitian Creole (Kreyòl ayisyen)', + hu: 'Hungarian (Magyar)', + id: 'Indonesian (bahasa Indonesia)', + is: 'Icelandic (Íslenskur)', + it: 'Italian (Italiano)', + iw: 'Hebrew (עִברִית)', + ja: 'Japanese (日本語)', + ka: 'Georgian (ქართული)', + kn: 'Kannada (ಕನ್ನಡ)', + ko: 'Korean (한국인)', + la: 'Latin (Latinus)', + lt: 'Lithuanian (Lietuvių)', + lv: 'Latvian (Latviski)', + mk: 'Macedonian (Македонски)', + ms: 'Malay (Melayu)', + nl: 'Dutch (Nederlands)', + no: 'Norwegian (Norsk)', + pl: 'Polish (Polski)', + pt: 'Portuguese (Português)', + ru: 'Russian (Русский)', + sk: 'Slovak (Slovenský)', + sl: 'Slovenian (Slovenščina)', + sq: 'Albanian (Shqiptare)', + sv: 'Swedish (Svenska)', + sw: 'Swahili (Kiswahili)', + ta: 'Tamil (தமிழ்)', + te: 'Telugu (తెలుగు)', + th: 'Thai (แบบไทย)', + tl: 'Talagog/Filipino', + tr: 'Turkish (Türkçe)', + uk: 'Ukrainian (Українська)', + ur: 'Urdu (اردو)', + vi: 'Vietnamese (Tiếng Việt)', + yi: 'Yiddish (יידיש)', + 'zh-CN': 'Chinese Simplified (简体中文)', +}; diff --git a/src/commands/index.ts b/src/commands/index.ts new file mode 100644 index 0000000..ae544e8 --- /dev/null +++ b/src/commands/index.ts @@ -0,0 +1,39 @@ +import type { RESTPostAPIApplicationCommandsJSONBody, CommandInteraction, AutocompleteInteraction, ModalSubmitInteraction, ContextMenuCommandInteraction, MessageContextMenuCommandInteraction } from 'discord.js'; +import type { StructurePredicate } from '../util/loaders.ts'; + +/** + * Defines the structure of a command + */ +export type Command = { + /** + * The function to execute when autocomplete is called + * + * @param interaction - The interaction of the command + */ + autocomplete?(interaction: AutocompleteInteraction): Promise | void; + /** + * The data for the command + */ + data: RESTPostAPIApplicationCommandsJSONBody; + /** + * The function to execute when the command is called + * + * @param interaction - The interaction of the command + */ + execute(interaction: CommandInteraction): Promise | void; + /** + * The function to execute when a modal is submitted + * + * @param interaction - The interaction of the command + */ + modalSubmit?(interaction: ModalSubmitInteraction): Promise | void; +}; + +// Defines the predicate to check if an object is a valid Command type +export const predicate: StructurePredicate = (structure): structure is Command => + Boolean(structure) && + typeof structure === 'object' && + 'data' in structure! && + 'execute' in structure && + typeof structure.data === 'object' && + typeof structure.execute === 'function'; diff --git a/src/commands/info/ping.ts b/src/commands/info/ping.ts new file mode 100644 index 0000000..570ebca --- /dev/null +++ b/src/commands/info/ping.ts @@ -0,0 +1,26 @@ +import { SlashCommandBuilder } from 'discord.js'; +import config from '../../../config.ts'; +import i18next from '../../i18n.ts'; +import { createEmbed, getLanguage, slashCommandTranslator } from '../../util/general.ts'; +import type { Command } from '../index.ts'; + +export default { + data: new SlashCommandBuilder() + .setName(i18next.t('ping.name', { ns: 'info' })) + .setNameLocalizations(slashCommandTranslator('ping.name', 'info')) + .setDescription(i18next.t('ping.description', { ns: 'info' })) + .setDescriptionLocalizations(slashCommandTranslator('ping.description', 'info')) + .toJSON(), + async execute(interaction) { + const ping = interaction.client.ws.ping; + const language = await getLanguage(interaction.guildId); + + const embed = createEmbed({ + color: ping < 200 ? 'green' : ping < 400 ? 'yellow' : 'red', + title: i18next.t('ping.title', { ns: 'info', lng: language }), + emoji: config.emojis.ping, + description: i18next.t('ping.response', { ns: 'info', lng: language, latency: ping }), + }); + await interaction.reply({ embeds: [embed] }); + }, +} satisfies Command; diff --git a/src/commands/secret/sync.ts b/src/commands/secret/sync.ts new file mode 100644 index 0000000..d094aa4 --- /dev/null +++ b/src/commands/secret/sync.ts @@ -0,0 +1,71 @@ +import { readdir } from 'node:fs/promises'; +import { API } from '@discordjs/core/http-only'; +import { REST, SlashCommandBuilder } from 'discord.js'; +import config from '../../../config.ts'; +import i18next from '../../i18n.ts'; +import { isDev } from '../../util/checks.ts'; +import { createEmbed, getLanguage, slashCommandTranslator } from '../../util/general.ts'; +import { loadCommands } from '../../util/loaders.ts'; +import type { Command } from '../index.ts'; + +export default { + data: new SlashCommandBuilder() + .setName(i18next.t('sync.name', { ns: 'secret' })) + .setNameLocalizations(slashCommandTranslator('sync.name', 'secret')) + .setDescription(i18next.t('sync.description', { ns: 'secret' })) + .setDescriptionLocalizations(slashCommandTranslator('sync.description', 'secret')) + .setDefaultMemberPermissions(0) + .toJSON(), + async execute(interaction) { + await interaction.deferReply({ ephemeral: true }); + const language = await getLanguage(interaction.guildId, interaction.user.id); + + // Check if the user is a developer based on the config + if (!isDev(interaction.user.id)) { + const embed = createEmbed({ + color: 'red', + description: i18next.t('checks.devOnly.title', { ns: 'errors', lng: language }), + emoji: config.emojis.error, + title: i18next.t('checks.devOnly.title', { ns: 'errors', lng: language }), + }); + await interaction.editReply({ embeds: [embed] }); + return; + } + + const commands = []; + const commandData = []; + + const directory = `${import.meta.dir.slice(0, Math.max(0, import.meta.dir.length - 7))}`; + for (const file of (await readdir(directory, { withFileTypes: true })) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name)) { + commands.push(await loadCommands(Bun.pathToFileURL(`${directory}/${file}`))); + } + + for (const command of commands) { + for (const cmd of [...command.values()].map((command) => command.data)) { + commandData.push(cmd); + } + } + + const rest = new REST({ version: '10' }).setToken(Bun.env.DISCORD_TOKEN!); + const api = new API(rest); + + let result; + if (config.dev && config.guilds.dev) { + result = await api.applicationCommands.bulkOverwriteGuildCommands( + Bun.env.APPLICATION_ID!, + config.guilds.dev, + commandData, + ); + } else { + result = await api.applicationCommands.bulkOverwriteGlobalCommands(Bun.env.APPLICATION_ID!, commandData); + } + + await interaction.editReply({ + content: `Successfully registered ${result.length} commands.${ + config.dev ? ` On the guild ${config.guilds.dev}` : '' + }`, + }); + }, +} satisfies Command; diff --git a/src/commands/utility/changeLanguage.ts b/src/commands/utility/changeLanguage.ts new file mode 100644 index 0000000..5495276 --- /dev/null +++ b/src/commands/utility/changeLanguage.ts @@ -0,0 +1,140 @@ +import type { ChatInputCommandInteraction } from 'discord.js'; +import { PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { isLangCode } from 'is-language-code'; +import config from '../../../config.ts'; +import { languages } from '../../@types/utility.ts'; +import prisma from '../../database.ts'; +import i18next from '../../i18n.ts'; +import { createEmbed, getLanguage, slashCommandTranslator } from '../../util/general.ts'; +import type { Command } from '../index.ts'; + +async function logic( + interaction: ChatInputCommandInteraction, + language: string, + responseLanguage: string, + personal: boolean, +) { + if (!personal && !interaction.guildId) { + const invalidLanguage = createEmbed({ + color: 'red', + title: i18next.t('serverRequired.title', { ns: 'errors', lng: responseLanguage }), + description: i18next.t('serverRequired.description', { ns: 'errors', lng: responseLanguage }), + emoji: config.emojis.error, + }); + await interaction.reply({ embeds: [invalidLanguage], ephemeral: true }); + return; + } + + if (!isLangCode(language).res) { + const invalidLanguage = createEmbed({ + color: 'red', + title: i18next.t('language.invalidLanguage.title', { ns: 'errors', lng: responseLanguage }), + description: i18next.t('language.invalidLanguage.description', { ns: 'errors', lng: responseLanguage }), + emoji: config.emojis.error, + }); + await interaction.reply({ embeds: [invalidLanguage], ephemeral: true }); + return; + } + + if (!personal && interaction.guildId) { + await prisma.guild.upsert({ + where: { id: interaction.guildId }, + create: { id: interaction.guildId, language }, + update: { language }, + }); + } else if (personal) { + await prisma.user.upsert({ + where: { id: interaction.user.id }, + create: { id: interaction.user.id, language }, + update: { language }, + }); + } + + const success = createEmbed({ + color: 'green', + title: i18next.t('changeLanguage.response', { ns: 'utility', language }), + emoji: config.emojis.success, + }); + + await interaction.reply({ embeds: [success], ephemeral: true }); +} + +export default { + data: new SlashCommandBuilder() + .setName(i18next.t('changeLanguage.name', { ns: 'utility' })) + .setNameLocalizations(slashCommandTranslator('changeLanguage.name', 'utility')) + .setDescription(i18next.t('changeLanguage.description', { ns: 'utility' })) + .setDescriptionLocalizations(slashCommandTranslator('changeLanguage.description', 'utility')) + .addSubcommand((subcommand) => + subcommand + .setName(i18next.t('changeLanguage.personal.name', { ns: 'utility' })) + .setNameLocalizations(slashCommandTranslator('changeLanguage.personal.name', 'utility')) + .setDescription(i18next.t('changeLanguage.personal.description', { ns: 'utility' })) + .setDescriptionLocalizations(slashCommandTranslator('changeLanguage.personal.description', 'utility')) + .addStringOption((option) => + option + .setName(i18next.t('changeLanguage.options.language.name', { ns: 'utility' })) + .setNameLocalizations(slashCommandTranslator('changeLanguage.options.language.name', 'utility')) + .setDescription(i18next.t('changeLanguage.options.language.description', { ns: 'utility' })) + .setDescriptionLocalizations( + slashCommandTranslator('changeLanguage.options.language.description', 'utility'), + ) + .setAutocomplete(true) + .setRequired(true), + ), + ) + .addSubcommand((subcommand) => + subcommand + .setName(i18next.t('changeLanguage.server.name', { ns: 'utility' })) + .setNameLocalizations(slashCommandTranslator('changeLanguage.server.name', 'utility')) + .setDescription(i18next.t('changeLanguage.server.description', { ns: 'utility' })) + .setDescriptionLocalizations(slashCommandTranslator('changeLanguage.server.description', 'utility')) + .addStringOption((option) => + option + .setName(i18next.t('changeLanguage.options.language.name', { ns: 'utility' })) + .setNameLocalizations(slashCommandTranslator('changeLanguage.options.language.name', 'utility')) + .setDescription(i18next.t('changeLanguage.options.language.description', { ns: 'utility' })) + .setDescriptionLocalizations( + slashCommandTranslator('changeLanguage.options.language.description', 'utility'), + ) + .setAutocomplete(true) + .setRequired(true), + ), + ) + .setDefaultMemberPermissions(PermissionsBitField.Flags.ManageGuild) + .toJSON(), + async execute(interaction: ChatInputCommandInteraction) { + const subcommand = interaction.options.getSubcommand(); + const language = + interaction.options.getString(i18next.t('changeLanguage.options.language.name', { ns: 'utility' })) ?? 'en'; + const responseLanguage = await getLanguage( + interaction.guildId, + subcommand === i18next.t('changeLanguage.personal.name', { ns: 'utility' }) ? interaction.user.id : undefined, + ); + + if (subcommand === i18next.t('changeLanguage.server.name', { ns: 'utility' })) { + await logic(interaction, language, responseLanguage, false); + } else { + await logic(interaction, language, responseLanguage, true); + } + }, + async autocomplete(interaction) { + const focusedValue = interaction.options.getFocused(); + const filtered = []; + for (const key in languages) { + if (Object.hasOwn(languages, key)) { + // @ts-expect-error This value cannot be undefined, because the key is directly from the object. + const value: string = languages[key]; + if ( + value.toLowerCase().includes(focusedValue.toLowerCase()) || + key.toLowerCase().includes(focusedValue.toLowerCase()) + ) { + filtered.push({ name: value, value: key }); + } + } + } + + const limited = filtered.slice(0, 25); + await interaction.respond(limited); + }, +} satisfies Command; diff --git a/src/database.ts b/src/database.ts new file mode 100644 index 0000000..4e54f7a --- /dev/null +++ b/src/database.ts @@ -0,0 +1,5 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +export default prisma; diff --git a/src/events/index.ts b/src/events/index.ts new file mode 100644 index 0000000..f6d7287 --- /dev/null +++ b/src/events/index.ts @@ -0,0 +1,33 @@ +import type { ClientEvents } from 'discord.js'; +import type { StructurePredicate } from '../util/loaders.ts'; + +/** + * Defines the structure of an event. + */ +export type Event = { + /** + * The function to execute when the event is emitted. + * + * @param parameters - The parameters of the event + */ + execute(...parameters: ClientEvents[T]): Promise | void; + /** + * The name of the event to listen to + */ + name: T; + /** + * Whether or not the event should only be listened to once + * + * @defaultValue false + */ + once?: boolean; +}; + +// Defines the predicate to check if an object is a valid Event type. +export const predicate: StructurePredicate = (structure): structure is Event => + Boolean(structure) && + typeof structure === 'object' && + 'name' in structure! && + 'execute' in structure && + typeof structure.name === 'string' && + typeof structure.execute === 'function'; diff --git a/src/events/ready.ts b/src/events/ready.ts new file mode 100644 index 0000000..b682dbc --- /dev/null +++ b/src/events/ready.ts @@ -0,0 +1,31 @@ +import { setInterval } from 'node:timers'; +import { ActivityType, Events } from 'discord.js'; +import { logger } from '../util/logger.ts'; +import type { Event } from './index.ts'; + +export default { + name: Events.ClientReady, + once: true, + async execute(client) { + logger.info(`Ready! Logged in as ${client.user.tag}`); + + setInterval(() => { + const activities = [ + { activity: `with version ${Bun.env.npm_package_version}`, type: ActivityType.Playing }, + { activity: `/ Commands`, type: ActivityType.Listening }, + { + activity: `${client.users.cache.size} user${client.users.cache.size > 1 ? 's' : ''}`, + type: ActivityType.Listening, + }, + { + activity: `over ${client.guilds.cache.size} server${client.guilds.cache.size > 1 ? 's' : ''}`, + type: ActivityType.Watching, + }, + ]; + + const randomIndex = Math.floor(Math.random() * activities.length); + + client.user.setActivity(activities[randomIndex].activity, { type: activities[randomIndex].type }); + }, 7_500); + }, +} satisfies Event<'ready'>; diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000..dde211e --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,25 @@ +import { readdirSync } from 'node:fs'; +import i18next from 'i18next'; +import type { FsBackendOptions } from 'i18next-fs-backend'; +import FsBackend from 'i18next-fs-backend'; + +await i18next + .use(FsBackend) + .init({ + fallbackLng: 'en', + returnEmptyString: false, + backend: { + loadPath: (import.meta.dir + '/locales/{{lng}}/{{ns}}.json') + } + }); + +const locales = readdirSync(import.meta.dir + '/locales') +const namespaces = readdirSync(import.meta.dir + '/locales/en') +for (const ns of namespaces) { + namespaces[namespaces.indexOf(ns)] = ns.split('.')[0] +} + +await i18next.loadNamespaces(namespaces); +await i18next.loadLanguages(locales); + +export { default } from 'i18next'; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..515a9d8 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,26 @@ +import { readdir } from 'node:fs/promises'; +import { URL } from 'node:url'; +import { Client, GatewayIntentBits } from 'discord.js'; +import { loadCommands, loadEvents } from './util/loaders.ts'; +import { registerEvents } from './util/registerEvents.ts'; + +const client = new Client({ intents: [GatewayIntentBits.Guilds] }); + +const commandArray = []; +for (const dir of (await readdir(`${import.meta.dir}/commands`, { withFileTypes: true })) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name)) { + commandArray.push(await loadCommands(Bun.pathToFileURL(`${import.meta.dir}/commands/${dir}`))); +} + +const commands = new Map(); +for (const cmd of commandArray) { + for (const [key, value] of cmd) { + commands.set(key, value); + } +} + +const events = await loadEvents(new URL('events/', import.meta.url)); +registerEvents(client, commands, events); + +void client.login(Bun.env.DISCORD_TOKEN); diff --git a/src/locales/de/errors.json b/src/locales/de/errors.json new file mode 100644 index 0000000..52570d7 --- /dev/null +++ b/src/locales/de/errors.json @@ -0,0 +1,18 @@ +{ + "checks": { + "devOnly": { + "title": "Geheime Sachen", + "description": "Du musst ein Entwickler sein, um diesen Befehl zu benutzen." + } + }, + "language": { + "invalidLanguage": { + "title": "Ungültige Sprache", + "description": "Das ist keine gültige Sprache. Bitte folge dem Format `xx` (`en`, `de`, etc.), oder `xx-XX` (`en-US`, `zh-CN`, etc.), während `x` einen Teil deines Sprachcodes darstellt." + } + }, + "serverRequired": { + "title": "Server erforderlich", + "description": "Du musst diesen Befehl auf einem Server ausführen." + } +} diff --git a/src/locales/de/info.json b/src/locales/de/info.json new file mode 100644 index 0000000..ded60d9 --- /dev/null +++ b/src/locales/de/info.json @@ -0,0 +1,8 @@ +{ + "ping": { + "name": "ping", + "description": "Pinge den Bot", + "title": "Pong!", + "response": "{{latency, number}}ms." + } +} \ No newline at end of file diff --git a/src/locales/de/secret.json b/src/locales/de/secret.json new file mode 100644 index 0000000..1d9155e --- /dev/null +++ b/src/locales/de/secret.json @@ -0,0 +1,6 @@ +{ + "sync": { + "name": "synchronisiere", + "description": "Synchronisiere die Befehle mit Discord" + } +} diff --git a/src/locales/de/utility.json b/src/locales/de/utility.json new file mode 100644 index 0000000..baf8829 --- /dev/null +++ b/src/locales/de/utility.json @@ -0,0 +1,21 @@ +{ + "changeLanguage": { + "name": "sprache-setzen", + "description": "Ändere die Sprache des Bots", + "personal": { + "name": "persönlich", + "description": "Ändern Sie die Sprache des Bots für dich selbst und persönliche Nachrichten" + }, + "server": { + "name": "server", + "description": "Wechselt die Sprache des Bots für den gesamten Server" + }, + "options": { + "language": { + "name": "sprache", + "description": "Die Sprache, die du für den Bot verwenden möchtest" + } + }, + "response": "Die Sprache wurde erfolgreich zu `{{language}}` geändert" + } +} diff --git a/src/locales/en/errors.json b/src/locales/en/errors.json new file mode 100644 index 0000000..b39b0b6 --- /dev/null +++ b/src/locales/en/errors.json @@ -0,0 +1,18 @@ +{ + "checks": { + "devOnly": { + "title": "Secret Stuff", + "description": "You need to be a Developer of the bot in order to run this command." + } + }, + "language": { + "invalidLanguage": { + "title": "Invalid Language", + "description": "That is not a valid language. Please follow the format of `xx` (`en`, `de`, etc.) or `xx-XX` (`en-US`, `zh-CN`, etc.), while `x` represents a part of your language code." + } + }, + "serverRequired": { + "title": "Server Required", + "description": "You need to run this command in a server." + } +} diff --git a/src/locales/en/info.json b/src/locales/en/info.json new file mode 100644 index 0000000..b9a1f47 --- /dev/null +++ b/src/locales/en/info.json @@ -0,0 +1,9 @@ +{ + "ping": { + "name": "ping", + "description": "Ping the bot", + "title": "Pong!", + "response": "{{latency, number}}ms." + } + +} \ No newline at end of file diff --git a/src/locales/en/secret.json b/src/locales/en/secret.json new file mode 100644 index 0000000..7f39956 --- /dev/null +++ b/src/locales/en/secret.json @@ -0,0 +1,6 @@ +{ + "sync": { + "name": "sync", + "description": "Sync application commands with Discord" + } +} diff --git a/src/locales/en/utility.json b/src/locales/en/utility.json new file mode 100644 index 0000000..2694b7f --- /dev/null +++ b/src/locales/en/utility.json @@ -0,0 +1,21 @@ +{ + "changeLanguage": { + "name": "set-language", + "description": "Change the language of the bot", + "personal": { + "name": "personal", + "description": "Change the language of the bot for yourself and personal messages" + }, + "server": { + "name": "server", + "description": "Change the language of the bot for the whole server" + }, + "options": { + "language": { + "name": "language", + "description": "The language you want to use for the bot" + } + }, + "response": "Successfully changed the language to `{{language}}`" + } +} diff --git a/src/util/checks.ts b/src/util/checks.ts new file mode 100644 index 0000000..5c8dfb2 --- /dev/null +++ b/src/util/checks.ts @@ -0,0 +1,5 @@ +import config from '../../config.ts'; + +export function isDev(id: string) { + return config.devs.includes(id); +} diff --git a/src/util/deploy.ts b/src/util/deploy.ts new file mode 100644 index 0000000..9dd1c2a --- /dev/null +++ b/src/util/deploy.ts @@ -0,0 +1,43 @@ +import { readdir } from 'node:fs/promises'; +import { API } from '@discordjs/core/http-only'; +import { REST } from 'discord.js'; +import config from '../../config.ts'; +import { loadCommands } from './loaders.ts'; + +const commands = []; +const commandData = []; + +for (const dir of ( + await readdir(`${import.meta.dir.slice(0, import.meta.dir.length - 5)}/commands`, { withFileTypes: true }) +) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name)) { + commands.push( + await loadCommands(Bun.pathToFileURL(`${import.meta.dir.slice(0, import.meta.dir.length - 5)}/commands/${dir}`)), + ); +} + +for (const command of commands) { + for (const cmd of [...command.values()].map((command) => command.data)) { + commandData.push(cmd); + } +} + +const rest = new REST({ version: '10' }).setToken(Bun.env.DISCORD_TOKEN!); +const api = new API(rest); + +let result; +if (config.dev && config.guilds.dev) { + result = await api.applicationCommands.bulkOverwriteGuildCommands( + Bun.env.APPLICATION_ID!, + config.guilds.dev, + commandData, + ); +} else { + result = await api.applicationCommands.bulkOverwriteGlobalCommands(Bun.env.APPLICATION_ID!, commandData); + await api.applicationCommands.bulkOverwriteGuildCommands(Bun.env.APPLICATION_ID!, config.guilds.dev!, []); +} + +console.info( + `Successfully registered ${result.length} commands.${config.dev ? ` In the guild ${config.guilds.dev}!` : ''}`, +); diff --git a/src/util/general.ts b/src/util/general.ts new file mode 100644 index 0000000..a129fd6 --- /dev/null +++ b/src/util/general.ts @@ -0,0 +1,83 @@ +import type { Client } from 'discord.js'; +import { EmbedBuilder, Locale } from 'discord.js'; +import config from '../../config.ts'; +import type { EmbedOptions } from '../@types/general'; +import prisma from '../database.ts'; +import i18next from '../i18n.ts'; + +export function createEmbed({ + author, + color = 'primary', + description, + emoji, + fields, + footer, + image, + thumbnail, + timestamp, + title, +}: EmbedOptions) { + const embedTitle = emoji ? `${emoji} ${title ?? ''}` : title; + const embed = new EmbedBuilder().setColor(typeof color === 'string' ? config.colors[color] : color); + + if (embedTitle) embed.setTitle(embedTitle); + if (description) embed.setDescription(description); + if (fields) embed.setFields(fields); + if (thumbnail) embed.setThumbnail(thumbnail); + if (image) embed.setImage(image); + if (timestamp) embed.setTimestamp(timestamp); + if (footer) embed.setFooter(footer); + if (author) embed.setAuthor(author); + + return embed; +} + +export async function getColor(guildId: string | null, userId?: string, client?: Client) { + let color = config.colors.primary; + if (guildId) { + const guild = await prisma.guild.findFirst({ where: { id: guildId } }); + if (guild?.color) color = guild.color; + } + + if (userId) { + const user = await prisma.user.findFirst({ where: { id: userId } }); + + if (!user?.color && client) { + const user = await client.users.fetch(userId, { force: true }); + if (user) color = user.accentColor ?? color; + return color; + } + + color = user?.color ?? color; + } + + return color; +} + +export async function getLanguage(guildId: string | null, userId?: string, prioritizeGuild = false) { + let language = 'en'; + let guildAvailable = false; + if (guildId) { + const guild = await prisma.guild.findFirst({ where: { id: guildId } }); + if (guild?.language) language = guild.language; + if (guild?.language && prioritizeGuild) guildAvailable = true; + } + + if (userId && !guildAvailable) { + const user = await prisma.user.findFirst({ where: { id: userId } }); + if (user?.language) language = user.language; + } + + return language; +} + +export function slashCommandTranslator(key: string, ns: string) { + const translation: { [index: string]: string } = {}; + const locales = Object.values(Locale); + + for (const locale of locales) { + translation[locale] = i18next.t(key, { ns, lng: locale }); + } + + return translation; +} diff --git a/src/util/loaders.ts b/src/util/loaders.ts new file mode 100644 index 0000000..0338b2c --- /dev/null +++ b/src/util/loaders.ts @@ -0,0 +1,76 @@ +import type { PathLike } from 'node:fs'; +import { readdir, stat } from 'node:fs/promises'; +import { URL } from 'node:url'; +import type { Command } from '../commands/index.ts'; +import { predicate as commandPredicate } from '../commands/index.ts'; +import type { Event } from '../events/index.ts'; +import { predicate as eventPredicate } from '../events/index.ts'; + +/** + * A predicate to check if the structure is valid + */ +export type StructurePredicate = (structure: unknown) => structure is T; + +/** + * Loads all the structures in the provided directory + * + * @param dir - The directory to load the structures from + * @param predicate - The predicate to check if the structure is valid + * @param recursive - Whether to recursively load the structures in the directory + * @returns + */ +export async function loadStructures( + dir: PathLike, + predicate: StructurePredicate, + recursive = true, +): Promise { + // Get the stats of the directory + const statDir = await stat(dir); + + // If the provided directory path is not a directory, throw an error + if (!statDir.isDirectory()) { + throw new Error(`The directory '${dir}' is not a directory.`); + } + + // Get all the files in the directory + const files = await readdir(dir); + + // Create an empty array to store the structures + const structures: T[] = []; + + // Loop through all the files in the directory + for (const file of files) { + // If the file is index.ts or the file does not end with .ts, skip the file + if (file === 'index.ts' || !file.endsWith('.ts')) { + continue; + } + + // Get the stats of the file + const statFile = await stat(new URL(`${dir}/${file}`)); + + // If the file is a directory and recursive is true, recursively load the structures in the directory + if (statFile.isDirectory() && recursive) { + structures.push(...(await loadStructures(`${dir}/${file}`, predicate, recursive))); + continue; + } + + // Import the structure dynamically from the file + const structure = (await import(`${dir}/${file}`)).default; + + // If the structure is a valid structure, add it + if (predicate(structure)) structures.push(structure); + } + + return structures; +} + +export async function loadCommands(dir: PathLike, recursive = true): Promise> { + return (await loadStructures(dir, commandPredicate, recursive)).reduce( + (acc, cur) => acc.set(cur.data.name, cur), + new Map(), + ); +} + +export async function loadEvents(dir: PathLike, recursive = true): Promise { + return loadStructures(dir, eventPredicate, recursive); +} diff --git a/src/util/logger.ts b/src/util/logger.ts new file mode 100644 index 0000000..3bd8129 --- /dev/null +++ b/src/util/logger.ts @@ -0,0 +1,24 @@ +import type { ILogObj } from 'tslog'; +import { Logger } from 'tslog'; +import config from '../../config.ts'; + +const file = Bun.file('./bot.log'); +await Bun.write(file, ''); +const writer = file.writer(); + +export const logger: Logger = new Logger({ + minLevel: config.dev ? 2 : 3, + type: 'hidden', +}); +logger.attachTransport(async (logObj) => { + writer.ref(); + // eslint-disable-next-line @typescript-eslint/no-base-to-string + writer.write( + `${logObj._meta.date.toUTCString()} | ${logObj._meta.logLevelName} | ${ + // eslint-disable-next-line @typescript-eslint/no-base-to-string + logObj['0'] + }\n`, + ); + await writer.flush(); + writer.unref(); +}); diff --git a/src/util/registerEvents.ts b/src/util/registerEvents.ts new file mode 100644 index 0000000..2e68c26 --- /dev/null +++ b/src/util/registerEvents.ts @@ -0,0 +1,52 @@ +import { Events, type Client } from 'discord.js'; +import type { Command } from '../commands/index.ts'; +import type { Event } from '../events/index.ts'; + +export function registerEvents(client: Client, commands?: Map, events?: Event[]): void { + if (commands) { + const interactionCreateEvent: Event = { + name: Events.InteractionCreate, + async execute(interaction) { + if (interaction.isCommand() || interaction.isContextMenuCommand()) { + const command = commands.get(interaction.commandName); + + if (!command) { + throw new Error(`Command '${interaction.commandName}' not found.`); + } + + await command.execute(interaction); + } + + if (interaction.isAutocomplete()) { + const command = commands.get(interaction.commandName); + + if (!command?.autocomplete) { + throw new Error(`Command '${interaction.commandName}' not found.`); + } + + await command.autocomplete(interaction); + } + + if (interaction.isModalSubmit()) { + const command = commands.get(interaction.customId); + + if (!command?.modalSubmit) { + throw new Error(`Command '${interaction.customId}' not found.`); + } + + await command.modalSubmit(interaction); + } + }, + }; + + client[interactionCreateEvent.once ? 'once' : 'on'](interactionCreateEvent.name, async (...args) => + interactionCreateEvent.execute(...args), + ); + } + + if (events) { + for (const event of events) { + client[event.once ? 'once' : 'on'](event.name, async (...args) => event.execute(...args)); + } + } +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..11bd8ea --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true + }, + "include": ["**/*.ts", "**/*.js", "**/*.test.ts", "**/*.test.js"], + "exclude": [] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0856b2d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // add Bun type definitions + "types": ["bun-types"], + + // enable latest features + "lib": ["esnext"], + "module": "esnext", + "target": "esnext", + + // if TS 5.x+ + "moduleResolution": "bundler", + "noEmit": true, + "allowImportingTsExtensions": true, + "moduleDetection": "force", + // if TS 4.x or earlier + // "moduleResolution": "nodenext", + + "jsx": "react-jsx", // support JSX + "allowJs": true, // allow importing `.js` from `.ts` + "esModuleInterop": true, // allow default imports for CommonJS modules + + // best practices + "strict": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + } +}