From 617be0d9a5fd2cddd6973c76ce2a642883cf4416 Mon Sep 17 00:00:00 2001 From: Vladimir Eremin <60275123+unknowableshade@users.noreply.github.com> Date: Sat, 22 Oct 2022 03:01:06 +0300 Subject: [PATCH] Tagged release & minor clean up. --- .eslintrc.json | 15 +++ .eslintrc.yml | 25 ----- Dockerfile | 2 +- Procfile | 1 - README.md | 19 +++- src/commands/connect.ts | 6 +- src/lib/Fetch.ts | 6 +- src/lib/I18n.ts | 231 +++++++++++++++++----------------------- src/lib/Player.ts | 9 +- src/lib/Queue.ts | 9 +- 10 files changed, 148 insertions(+), 175 deletions(-) create mode 100644 .eslintrc.json delete mode 100644 .eslintrc.yml delete mode 100644 Procfile diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..c00c324 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,15 @@ +{ + "env": { "browser": true, "es2021": true }, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, + "plugins": ["@typescript-eslint"], + "rules": { + "indent": ["error", 4], + "linebreak-style": ["error", "windows"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + "brace-style": ["error", "stroustrup"], + "arrow-body-style": ["error", "as-needed"] + } +} diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index fad2a71..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,25 +0,0 @@ -env: - browser: true - es2021: true -extends: - - eslint:recommended - - plugin:@typescript-eslint/recommended -parser: '@typescript-eslint/parser' -parserOptions: - ecmaVersion: latest - sourceType: module -plugins: - - '@typescript-eslint' -rules: - indent: - - error - - 4 - linebreak-style: - - error - - windows - quotes: - - error - - double - semi: - - error - - always diff --git a/Dockerfile b/Dockerfile index 4ea9773..07516aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN chmod a+rx /usr/src/app/bin/youtube-dl COPY package*.json ./ -RUN npm install +RUN npm ci COPY . . run npm run build diff --git a/Procfile b/Procfile deleted file mode 100644 index e70f6c1..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -worker: npm run start diff --git a/README.md b/README.md index 2fd54d4..5f1fd14 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,16 @@ -# Quetza - 2205.3 - -> _**Higher perfomance - better design.**_ - +# Quetza - 2210.1 + +_Neat typescript discord bot._ + +## About + +- Base player features. +- Play music from YouTube and many other sites. +- Lots of different filters _(nightcore, earrape etc.)_. +- Slash commands. + ## Links -**[Licence](https://github.com/unknowableshade/5a0b-bot/blob/master/LICENSE)** +- **[Dependencies](https://github.com/unknowableshade/quetza-bot/blob/master/package.json)** +- **[Docker](https://hub.docker.com/repository/docker/unknowableshade/quetza-bot)** +- **[Licence](https://github.com/unknowableshade/5a0b-bot/blob/master/LICENSE)** diff --git a/src/commands/connect.ts b/src/commands/connect.ts index 2a9bbbc..0ae5744 100644 --- a/src/commands/connect.ts +++ b/src/commands/connect.ts @@ -18,13 +18,15 @@ export async function run(client: Client, ctx: CommandInteraction) { player.connect(channel); await ctx.editReply({ embeds: [I18n.en.okConnected(channel.name)] }); - } else { + } + else { client.modules.music.del(ctx.guild.id); await ctx.editReply({ embeds: [I18n.en.notConnected()] }); return undefined; } - } else { + } + else { await ctx.editReply({ embeds: [I18n.en.wasConnected()] }); } diff --git a/src/lib/Fetch.ts b/src/lib/Fetch.ts index 8dea95a..319dd81 100644 --- a/src/lib/Fetch.ts +++ b/src/lib/Fetch.ts @@ -11,7 +11,8 @@ function argumentsResolver(args: ytdlArgs): string[] { return options.map(([key, value]) => { if (typeof value === "boolean" && value) { return `--${key.split(/(?=[A-Z])/).join("-")}`.toLowerCase(); - } else { + } + else { return `--${key .split(/(?=[A-Z])/) .join("-")}=${value}`.toLowerCase(); @@ -29,7 +30,8 @@ async function ytdlExec( [query].concat(argumentsResolver(args)) ); return JSON.parse(executable.stdout); - } catch (error) { + } + catch (error) { console.log(error); return undefined; } diff --git a/src/lib/I18n.ts b/src/lib/I18n.ts index 6dc8ea4..af707ed 100644 --- a/src/lib/I18n.ts +++ b/src/lib/I18n.ts @@ -7,74 +7,58 @@ import { EmbedBuilder } from "discord.js"; export default class I18n { public static en = { - nowPlaying: (track: track) => { - return new EmbedBuilder() - .setColor("LuminousVividPink") + nowPlaying: (track: track) => new EmbedBuilder() + .setColor("LuminousVividPink") + .setAuthor({ + iconURL: track.requester.avatarURL() || undefined, + name: track.requester.tag, + }) + .setTitle(track.title) + .setURL(track.url) + .setDescription("**playing now.**") + .setThumbnail(track.thumbnail), + cleared: (amount: number) => new EmbedBuilder() + .setColor("Green") + .setTitle( + `**♻️ ${amount} tracks have been cleared from the queue.**` + ) + .setTimestamp(new Date()), + okConnected: (channel: string) => new EmbedBuilder() + .setColor("Green") + .setTitle(`**βœ… Successfuly connected to:** _${channel}_.`), + notConnected: () => new EmbedBuilder() + .setColor("Red") + .setTitle( + "**🚫 Make yourself connected to a voice channel beforehand.**" + ), + wasConnected: () => new EmbedBuilder() + .setColor("Yellow") + .setTitle("**⚠️ Already connected to a voice channel.**"), + filtered: (filter?: string) => new EmbedBuilder() + .setColor("Green") + .setTitle(filter ? `**βœ… ${filter} was applied to the player.**` : "**βœ… All filters were declined.**"), + appended: (track?: track) => !track + ? new EmbedBuilder() + .setColor("Red") + .setTitle("**🚫 Could not add track to the queue.**") + : new EmbedBuilder() + .setColor("Green") + .setTitle(track.title) + .setURL(track.url) + .setThumbnail(track.thumbnail) .setAuthor({ iconURL: track.requester.avatarURL() || undefined, name: track.requester.tag, }) - .setTitle(track.title) - .setURL(track.url) - .setDescription("**playing now.**") - .setThumbnail(track.thumbnail); - }, - cleared: (amount: number) => { - return new EmbedBuilder() + .setDescription("**has been added to the queue.**") + .setTimestamp(new Date()), + jumped: (state: boolean) => state + ? new EmbedBuilder() .setColor("Green") - .setTitle( - `**♻️ ${amount} tracks have been cleared from the queue.**` - ) - .setTimestamp(new Date()); - }, - okConnected: (channel: string) => { - return new EmbedBuilder() - .setColor("Green") - .setTitle(`**βœ… Successfuly connected to:** _${channel}_.`); - }, - notConnected: () => { - return new EmbedBuilder() + .setTitle("_**Perfoming jump.**_") + : new EmbedBuilder() .setColor("Red") - .setTitle( - "**🚫 Make yourself connected to a voice channel beforehand.**" - ); - }, - wasConnected: () => { - return new EmbedBuilder() - .setColor("Yellow") - .setTitle("**⚠️ Already connected to a voice channel.**"); - }, - filtered: (filter?: string) => { - return new EmbedBuilder() - .setColor("Green") - .setTitle(filter ? `**βœ… ${filter} was applied to the player.**` : "**βœ… All filters were declined.**"); - }, - appended: (track?: track) => { - return !track - ? new EmbedBuilder() - .setColor("Red") - .setTitle("**🚫 Could not add track to the queue.**") - : new EmbedBuilder() - .setColor("Green") - .setTitle(track.title) - .setURL(track.url) - .setThumbnail(track.thumbnail) - .setAuthor({ - iconURL: track.requester.avatarURL() || undefined, - name: track.requester.tag, - }) - .setDescription("**has been added to the queue.**") - .setTimestamp(new Date()); - }, - jumped: (state: boolean) => { - return state - ? new EmbedBuilder() - .setColor("Green") - .setTitle("_**Perfoming jump.**_") - : new EmbedBuilder() - .setColor("Red") - .setTitle("**❗ Bad _jump_ request.**"); - }, + .setTitle("**❗ Bad _jump_ request.**"), looped: (query: loopOption) => { switch (query) { case "AUTO": { @@ -101,57 +85,43 @@ export default class I18n { } } }, - skipped: () => { - return new EmbedBuilder() + skipped: () => new EmbedBuilder() + .setColor("Green") + .setTitle("**⏭️ Skipping.**"), + paused: (state: boolean) => state + ? new EmbedBuilder() .setColor("Green") - .setTitle("**⏭️ Skipping.**"); - }, - paused: (state: boolean) => { - return state - ? new EmbedBuilder() - .setColor("Green") - .setTitle("_**▢️ Resumed.**_") - : new EmbedBuilder() - .setColor("Yellow") - .setTitle("_**⏸️ Paused.**_"); - }, - removed: (track?: track) => { - return track - ? new EmbedBuilder() - .setColor("Green") - .setTitle(track.title) - .setDescription("**was removed from the queue.**") - .setTimestamp(new Date()) - .setURL(track.url) - .setThumbnail(track.thumbnail) - : new EmbedBuilder() - .setColor("Red") - .setTitle("**❗ Bad _remove_ request.**"); - }, - fastForwarded: (amount: number) => { - return new EmbedBuilder() - .setColor("Blue") - .setTitle( - `**⏩ Fast-forwarding to ${secToISO( - amount - )}**` - ); - }, - destroyed: () => { - return new EmbedBuilder() - .setColor("Red") - .setTitle("**πŸ’€ Destroying the player.**"); - }, - volumeSet: (amount: number) => { - return new EmbedBuilder() - .setColor("Green") - .setTitle(`**${volumeMoji(amount)} Volume has been set to ${amount}%**`); - }, - queueEmpty: () => { - return new EmbedBuilder() + .setTitle("_**▢️ Resumed.**_") + : new EmbedBuilder() .setColor("Yellow") - .setTitle("**❎ Queue is empty.**"); - }, + .setTitle("_**⏸️ Paused.**_"), + removed: (track?: track) => track + ? new EmbedBuilder() + .setColor("Green") + .setTitle(track.title) + .setDescription("**was removed from the queue.**") + .setTimestamp(new Date()) + .setURL(track.url) + .setThumbnail(track.thumbnail) + : new EmbedBuilder() + .setColor("Red") + .setTitle("**❗ Bad _remove_ request.**"), + fastForwarded: (amount: number) => new EmbedBuilder() + .setColor("Blue") + .setTitle( + `**⏩ Fast-forwarding to ${secToISO( + amount + )}**` + ), + destroyed: () => new EmbedBuilder() + .setColor("Red") + .setTitle("**πŸ’€ Destroying the player.**"), + volumeSet: (amount: number) => new EmbedBuilder() + .setColor("Green") + .setTitle(`**${volumeMoji(amount)} Volume has been set to ${amount}%**`), + queueEmpty: () => new EmbedBuilder() + .setColor("Yellow") + .setTitle("**❎ Queue is empty.**"), playerInfo: (player?: Player) => { if (!player) return new EmbedBuilder() @@ -207,7 +177,8 @@ export default class I18n { inline: true, }, ]); - } else { + } + else { return new EmbedBuilder() .setColor("Blue") .setTitle("πŸ’Ώ Insert the disk...") @@ -289,30 +260,24 @@ export default class I18n { ) .setFields( queue.Tracks.slice(page * 10, page * 10 + 10).map( - (value, index) => { - return { - name: `${ - page * 10 + index + 1 - }. ${value.title.padEnd(35)}`, - value: `**[${secToISO(value.duration)}]**`, - }; - } + (value, index) => ({ + name: `${ + page * 10 + index + 1 + }. ${value.title.padEnd(35)}`, + value: `**[${secToISO(value.duration)}]**`, + }) ) ); }, - fullyAlone: () => { - return new EmbedBuilder() - .setColor("LuminousVividPink") - .setTitle("πŸ₯¬ I have decided to leave to conserve my energy.") - .setDescription( - "_**Since there was nobody in the voice channel.**_" - ); - }, - reshuffle: () => { - return new EmbedBuilder() - .setColor("Green") - .setTitle("**βœ… Successfuly reshuffled queue.**"); - }, + fullyAlone: () => new EmbedBuilder() + .setColor("LuminousVividPink") + .setTitle("πŸ₯¬ I have decided to leave to conserve my energy.") + .setDescription( + "_**Since there was nobody in the voice channel.**_" + ), + reshuffle: () => new EmbedBuilder() + .setColor("Green") + .setTitle("**βœ… Successfuly reshuffled queue.**"), ping: (ping?: number) => { const title = ping ? `I have pinged ${ping} ms late.` : "There is no application."; diff --git a/src/lib/Player.ts b/src/lib/Player.ts index f961fbe..693885d 100644 --- a/src/lib/Player.ts +++ b/src/lib/Player.ts @@ -167,7 +167,8 @@ export default class Player { requester: requester, }); } - } else { + } + else { tracks.push({ url: `https://youtube.com/watch?v=${response.id}`, title: response.title, @@ -218,7 +219,8 @@ export default class Player { 10_000 ), ]); - } catch (error) { + } + catch (error) { this.destroy(); } } @@ -307,7 +309,8 @@ export default class Player { if (this.player.state.status === AudioPlayerStatus.Paused) { this.player.unpause(); return false; - } else { + } + else { this.player.pause(); return true; } diff --git a/src/lib/Queue.ts b/src/lib/Queue.ts index f01ea76..5085fdb 100644 --- a/src/lib/Queue.ts +++ b/src/lib/Queue.ts @@ -34,10 +34,12 @@ export default class Queue { if (this.position + 1 < this.tracks.length) { this.position++; return this.current(); - } else if (this.loop === "LOOP") { + } + else if (this.loop === "LOOP") { this.position = 0; return this.current(); - } else if (this.loop === "NONE") { + } + else if (this.loop === "NONE") { this.position = 0; return undefined; } @@ -62,7 +64,8 @@ export default class Queue { public push(tracks: track[], index?: number): track { if (!index || index >= this.tracks.length) { this.tracks = this.tracks.concat(tracks); - } else { + } + else { this.tracks.splice(Math.max(0, index), 0, ...tracks); if (this.position >= index) this.position += tracks.length; }