Tagged release & minor clean up.
This commit is contained in:
1 parent
379c9ff9e6
commit
7d8a50bb5b
10 files changed
+148
-175
No files matched your search
@@ -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"]
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
# Quetza - 2205.3 <soundrewrite>
|
||||
|
||||
> _**Higher perfomance - better design.**_
|
||||
|
||||
# Quetza - 2210.1 <soundrewrite>
|
||||
|
||||
_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)**
|
||||
@@ -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()] });
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -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;
|
||||
}
|
||||
|
||||
+98
-133
@@ -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.";
|
||||
|
||||
|
||||
+6
-3
@@ -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;
|
||||
}
|
||||
|
||||
+6
-3
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user