Tagged release & minor clean up.
This commit is contained in:
1 parent
379c9ff9e6
commit
617be0d9a5
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 ./
|
COPY package*.json ./
|
||||||
RUN npm install
|
RUN npm ci
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
run npm run build
|
run npm run build
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
# Quetza - 2205.3 <soundrewrite>
|
# Quetza - 2210.1 <soundrewrite>
|
||||||
|
|
||||||
> _**Higher perfomance - better design.**_
|
_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
|
## 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);
|
player.connect(channel);
|
||||||
|
|
||||||
await ctx.editReply({ embeds: [I18n.en.okConnected(channel.name)] });
|
await ctx.editReply({ embeds: [I18n.en.okConnected(channel.name)] });
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
client.modules.music.del(ctx.guild.id);
|
client.modules.music.del(ctx.guild.id);
|
||||||
|
|
||||||
await ctx.editReply({ embeds: [I18n.en.notConnected()] });
|
await ctx.editReply({ embeds: [I18n.en.notConnected()] });
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
await ctx.editReply({ embeds: [I18n.en.wasConnected()] });
|
await ctx.editReply({ embeds: [I18n.en.wasConnected()] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -11,7 +11,8 @@ function argumentsResolver(args: ytdlArgs): string[] {
|
|||||||
return options.map(([key, value]) => {
|
return options.map(([key, value]) => {
|
||||||
if (typeof value === "boolean" && value) {
|
if (typeof value === "boolean" && value) {
|
||||||
return `--${key.split(/(?=[A-Z])/).join("-")}`.toLowerCase();
|
return `--${key.split(/(?=[A-Z])/).join("-")}`.toLowerCase();
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
return `--${key
|
return `--${key
|
||||||
.split(/(?=[A-Z])/)
|
.split(/(?=[A-Z])/)
|
||||||
.join("-")}=${value}`.toLowerCase();
|
.join("-")}=${value}`.toLowerCase();
|
||||||
@@ -29,7 +30,8 @@ async function ytdlExec(
|
|||||||
[query].concat(argumentsResolver(args))
|
[query].concat(argumentsResolver(args))
|
||||||
);
|
);
|
||||||
return JSON.parse(executable.stdout);
|
return JSON.parse(executable.stdout);
|
||||||
} catch (error) {
|
}
|
||||||
|
catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
+98
-133
@@ -7,74 +7,58 @@ import { EmbedBuilder } from "discord.js";
|
|||||||
|
|
||||||
export default class I18n {
|
export default class I18n {
|
||||||
public static en = {
|
public static en = {
|
||||||
nowPlaying: (track: track) => {
|
nowPlaying: (track: track) => new EmbedBuilder()
|
||||||
return new EmbedBuilder()
|
.setColor("LuminousVividPink")
|
||||||
.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({
|
.setAuthor({
|
||||||
iconURL: track.requester.avatarURL() || undefined,
|
iconURL: track.requester.avatarURL() || undefined,
|
||||||
name: track.requester.tag,
|
name: track.requester.tag,
|
||||||
})
|
})
|
||||||
.setTitle(track.title)
|
.setDescription("**has been added to the queue.**")
|
||||||
.setURL(track.url)
|
.setTimestamp(new Date()),
|
||||||
.setDescription("**playing now.**")
|
jumped: (state: boolean) => state
|
||||||
.setThumbnail(track.thumbnail);
|
? new EmbedBuilder()
|
||||||
},
|
|
||||||
cleared: (amount: number) => {
|
|
||||||
return new EmbedBuilder()
|
|
||||||
.setColor("Green")
|
.setColor("Green")
|
||||||
.setTitle(
|
.setTitle("_**Perfoming jump.**_")
|
||||||
`**♻️ ${amount} tracks have been cleared from the queue.**`
|
: new EmbedBuilder()
|
||||||
)
|
|
||||||
.setTimestamp(new Date());
|
|
||||||
},
|
|
||||||
okConnected: (channel: string) => {
|
|
||||||
return new EmbedBuilder()
|
|
||||||
.setColor("Green")
|
|
||||||
.setTitle(`**✅ Successfuly connected to:** _${channel}_.`);
|
|
||||||
},
|
|
||||||
notConnected: () => {
|
|
||||||
return new EmbedBuilder()
|
|
||||||
.setColor("Red")
|
.setColor("Red")
|
||||||
.setTitle(
|
.setTitle("**❗ Bad _jump_ request.**"),
|
||||||
"**🚫 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.**");
|
|
||||||
},
|
|
||||||
looped: (query: loopOption) => {
|
looped: (query: loopOption) => {
|
||||||
switch (query) {
|
switch (query) {
|
||||||
case "AUTO": {
|
case "AUTO": {
|
||||||
@@ -101,57 +85,43 @@ export default class I18n {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
skipped: () => {
|
skipped: () => new EmbedBuilder()
|
||||||
return new EmbedBuilder()
|
.setColor("Green")
|
||||||
|
.setTitle("**⏭️ Skipping.**"),
|
||||||
|
paused: (state: boolean) => state
|
||||||
|
? new EmbedBuilder()
|
||||||
.setColor("Green")
|
.setColor("Green")
|
||||||
.setTitle("**⏭️ Skipping.**");
|
.setTitle("_**▶️ Resumed.**_")
|
||||||
},
|
: new EmbedBuilder()
|
||||||
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()
|
|
||||||
.setColor("Yellow")
|
.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) => {
|
playerInfo: (player?: Player) => {
|
||||||
if (!player)
|
if (!player)
|
||||||
return new EmbedBuilder()
|
return new EmbedBuilder()
|
||||||
@@ -207,7 +177,8 @@ export default class I18n {
|
|||||||
inline: true,
|
inline: true,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
return new EmbedBuilder()
|
return new EmbedBuilder()
|
||||||
.setColor("Blue")
|
.setColor("Blue")
|
||||||
.setTitle("💿 Insert the disk...")
|
.setTitle("💿 Insert the disk...")
|
||||||
@@ -289,30 +260,24 @@ export default class I18n {
|
|||||||
)
|
)
|
||||||
.setFields(
|
.setFields(
|
||||||
queue.Tracks.slice(page * 10, page * 10 + 10).map(
|
queue.Tracks.slice(page * 10, page * 10 + 10).map(
|
||||||
(value, index) => {
|
(value, index) => ({
|
||||||
return {
|
name: `${
|
||||||
name: `${
|
page * 10 + index + 1
|
||||||
page * 10 + index + 1
|
}. ${value.title.padEnd(35)}`,
|
||||||
}. ${value.title.padEnd(35)}`,
|
value: `**[${secToISO(value.duration)}]**`,
|
||||||
value: `**[${secToISO(value.duration)}]**`,
|
})
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
fullyAlone: () => {
|
fullyAlone: () => new EmbedBuilder()
|
||||||
return new EmbedBuilder()
|
.setColor("LuminousVividPink")
|
||||||
.setColor("LuminousVividPink")
|
.setTitle("🥬 I have decided to leave to conserve my energy.")
|
||||||
.setTitle("🥬 I have decided to leave to conserve my energy.")
|
.setDescription(
|
||||||
.setDescription(
|
"_**Since there was nobody in the voice channel.**_"
|
||||||
"_**Since there was nobody in the voice channel.**_"
|
),
|
||||||
);
|
reshuffle: () => new EmbedBuilder()
|
||||||
},
|
.setColor("Green")
|
||||||
reshuffle: () => {
|
.setTitle("**✅ Successfuly reshuffled queue.**"),
|
||||||
return new EmbedBuilder()
|
|
||||||
.setColor("Green")
|
|
||||||
.setTitle("**✅ Successfuly reshuffled queue.**");
|
|
||||||
},
|
|
||||||
ping: (ping?: number) => {
|
ping: (ping?: number) => {
|
||||||
const title = ping ? `I have pinged ${ping} ms late.` : "There is no application.";
|
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,
|
requester: requester,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
tracks.push({
|
tracks.push({
|
||||||
url: `https://youtube.com/watch?v=${response.id}`,
|
url: `https://youtube.com/watch?v=${response.id}`,
|
||||||
title: response.title,
|
title: response.title,
|
||||||
@@ -218,7 +219,8 @@ export default class Player {
|
|||||||
10_000
|
10_000
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
} catch (error) {
|
}
|
||||||
|
catch (error) {
|
||||||
this.destroy();
|
this.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -307,7 +309,8 @@ export default class Player {
|
|||||||
if (this.player.state.status === AudioPlayerStatus.Paused) {
|
if (this.player.state.status === AudioPlayerStatus.Paused) {
|
||||||
this.player.unpause();
|
this.player.unpause();
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
this.player.pause();
|
this.player.pause();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -34,10 +34,12 @@ export default class Queue {
|
|||||||
if (this.position + 1 < this.tracks.length) {
|
if (this.position + 1 < this.tracks.length) {
|
||||||
this.position++;
|
this.position++;
|
||||||
return this.current();
|
return this.current();
|
||||||
} else if (this.loop === "LOOP") {
|
}
|
||||||
|
else if (this.loop === "LOOP") {
|
||||||
this.position = 0;
|
this.position = 0;
|
||||||
return this.current();
|
return this.current();
|
||||||
} else if (this.loop === "NONE") {
|
}
|
||||||
|
else if (this.loop === "NONE") {
|
||||||
this.position = 0;
|
this.position = 0;
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@@ -62,7 +64,8 @@ export default class Queue {
|
|||||||
public push(tracks: track[], index?: number): track {
|
public push(tracks: track[], index?: number): track {
|
||||||
if (!index || index >= this.tracks.length) {
|
if (!index || index >= this.tracks.length) {
|
||||||
this.tracks = this.tracks.concat(tracks);
|
this.tracks = this.tracks.concat(tracks);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
this.tracks.splice(Math.max(0, index), 0, ...tracks);
|
this.tracks.splice(Math.max(0, index), 0, ...tracks);
|
||||||
if (this.position >= index) this.position += tracks.length;
|
if (this.position >= index) this.position += tracks.length;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user