Files
Yumi/src/discord/MusicPlayer/Queue.ts
T

144 lines
5.7 KiB
TypeScript
Raw Normal View History

2022-07-05 14:58:27 +07:00
import { Message, CommandInteraction } from 'discord.js';
2022-06-07 03:08:27 +07:00
import { I18n } from 'i18n';
2022-03-03 20:56:49 +07:00
2024-08-18 15:40:46 +07:00
import DiscordMusicPlayer, { DiscordMusicPlayerInstance, TrackUtils } from '../../providers/DiscordMusicPlayer';
2022-06-07 03:08:27 +07:00
import Locale from '../../services/Locale';
2022-02-28 11:50:47 +07:00
2022-06-07 03:08:27 +07:00
import DiscordModule, { HybridInteractionMessage } from '../../utils/DiscordModule';
2022-07-18 14:18:58 +07:00
import {
makeErrorEmbed,
sendHybridInteractionMessageResponse,
makeSuccessEmbed,
makeInfoEmbed
} from '../../utils/DiscordMessage';
2024-08-18 15:40:46 +07:00
import { LoopMode } from '../../../NekoMelody/src/player';
2022-01-30 20:10:36 +07:00
const EMBEDS = {
2022-06-07 03:08:27 +07:00
QUEUE: (data: HybridInteractionMessage, locale: I18n, instance: DiscordMusicPlayerInstance) => {
2024-08-17 21:11:09 +07:00
const queue = instance.nekoPlayer.getQueue();
const current = instance.nekoPlayer.getCurrentAudioInformation();
2022-03-03 23:57:30 +07:00
2024-08-17 21:11:09 +07:00
if (!current)
2022-01-30 20:10:36 +07:00
return makeInfoEmbed({
2022-06-07 03:08:27 +07:00
title: locale.__('musicplayer_queue.title'),
description: locale.__('musicplayer_queue.empty'),
user: data.getUser()
2022-01-30 20:10:36 +07:00
});
2022-06-07 03:08:27 +07:00
2024-08-17 21:11:09 +07:00
const nowPlayingText = `${
2024-08-18 15:40:46 +07:00
instance.nekoPlayer.getLoopMode() === LoopMode.Current
2024-08-17 21:11:09 +07:00
? ` ${locale.__('musicplayer_queue.looping_current')}`
: ''
}: [${current.metadata.title}](${current.metadata.url})`;
let description;
if (queue.length == 0) {
let queueString = `1. [${current.metadata.title}](${current.metadata.url})`;
description = `${locale.__('musicplayer_queue.now_playing')}${nowPlayingText}\n
${locale.__('musicplayer_queue.empty')}`;
} else if (queue.length >= 10) {
const upcomingText = `[${queue[0].metadata.title}](${queue[0].metadata.url})`;
const first10 = queue.slice(0, 10);
let queueString = first10
.map((track, index) => `${index + 1}. [${track.metadata.title}](${track.metadata.url})`)
.join('\n');
description = `${locale.__('musicplayer_queue.now_playing')}${nowPlayingText}
2022-07-18 14:18:58 +07:00
${locale.__('musicplayer_queue.upcoming_song')} ${upcomingText}\n
2024-08-17 21:11:09 +07:00
${locale.__('musicplayer_queue.song_x_in_queue', { COUNT: queue.length.toString() })}
${queueString}\n${queue.length > 10 ? `...${queue.length - 10} more songs` : ''}`;
} else {
const upcomingText = `[${queue[0].metadata.title}](${queue[0].metadata.url})`;
const queueString = queue
.map((track, index) => `${index + 1}. [${track.metadata.title}](${track.metadata.url})`)
.join('\n');
description = `${locale.__('musicplayer_queue.now_playing')}${nowPlayingText}
2022-07-18 14:18:58 +07:00
${locale.__('musicplayer_queue.upcoming_song')} ${upcomingText}\n
2024-08-17 21:11:09 +07:00
${locale.__('musicplayer_queue.song_x_in_queue', { COUNT: queue.length.toString() })}
2022-07-18 14:18:58 +07:00
${queueString}`;
2022-02-05 00:00:01 +07:00
}
2024-08-17 21:11:09 +07:00
return makeInfoEmbed({
title: locale.__('musicplayer_queue.title'),
description: description,
fields: [
{
name: locale.__('common.available_args'),
value: locale.__('musicplayer_queue.valid_args')
}
],
user: data.getUser()
});
2022-01-30 22:42:00 +07:00
},
2022-07-18 14:16:26 +07:00
QUEUE_CLEARED: (data: HybridInteractionMessage, locale: I18n) => {
return makeSuccessEmbed({
title: locale.__('musicplayer_queue.cleared'),
user: data.getUser()
});
},
2022-07-18 14:53:35 +07:00
QUEUE_SHUFFLED: (data: HybridInteractionMessage, locale: I18n) => {
return makeSuccessEmbed({
title: locale.__('musicplayer_queue.shuffled'),
user: data.getUser()
});
},
2022-06-07 03:08:27 +07:00
NO_MUSIC_PLAYING: (data: HybridInteractionMessage, locale: I18n) => {
2022-01-30 22:42:00 +07:00
return makeErrorEmbed({
2022-06-07 03:08:27 +07:00
title: locale.__('musicplayer.no_music_playing'),
user: data.getUser()
2022-01-30 22:42:00 +07:00
});
2022-01-30 20:10:36 +07:00
}
2022-06-07 03:08:27 +07:00
};
2022-01-30 20:10:36 +07:00
2022-03-03 20:56:49 +07:00
export default class QueueCommand extends DiscordModule {
2022-06-07 03:08:27 +07:00
public id = 'Discord_MusicPlayer_Queue';
public commands = ['queue', 'q'];
public commandInteractionName = 'queue';
2022-03-03 20:56:49 +07:00
async GuildOnModuleCommand(args: any, message: Message) {
await this.run(new HybridInteractionMessage(message), args);
2022-01-30 20:10:36 +07:00
}
2022-03-03 20:56:49 +07:00
async GuildModuleCommandInteractionCreate(interaction: CommandInteraction) {
await this.run(new HybridInteractionMessage(interaction), interaction.options);
2022-01-30 20:10:36 +07:00
}
2022-03-03 20:56:49 +07:00
async run(data: HybridInteractionMessage, args: any) {
2022-07-18 14:16:26 +07:00
const guild = data.getGuild();
2022-06-07 03:08:27 +07:00
if (!guild) return;
2022-07-18 14:16:26 +07:00
let query;
2022-06-07 03:08:27 +07:00
const locale = await Locale.getGuildLocale(guild.id);
2022-01-30 20:10:36 +07:00
2022-03-03 20:56:49 +07:00
const instance = DiscordMusicPlayer.getGuildInstance(guild.id);
2022-06-07 03:08:27 +07:00
if (!instance)
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.NO_MUSIC_PLAYING(data, locale)]
});
2022-01-30 20:10:36 +07:00
2022-07-18 14:16:26 +07:00
if (data.isMessage()) {
if (args.length === 0)
2022-07-18 14:18:58 +07:00
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.QUEUE(data, locale, instance)]
});
2022-07-18 14:16:26 +07:00
query = args.join(' ');
} else if (data.isApplicationCommand()) {
//query = data.getSlashCommand().options.get('query', true).value?.toString();
}
2022-07-18 14:18:58 +07:00
2022-07-18 14:16:26 +07:00
if (!query) return;
2022-07-18 14:53:35 +07:00
switch (query.toLowerCase()) {
case 'clear':
instance.clearQueue();
2023-03-05 14:46:25 +07:00
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.QUEUE_CLEARED(data, locale)]
});
2022-07-18 14:53:35 +07:00
case 'shuffle':
instance.shuffleQueue();
2023-03-05 14:46:25 +07:00
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.QUEUE_SHUFFLED(data, locale)]
});
2022-07-18 14:53:35 +07:00
}
2022-01-30 20:10:36 +07:00
}
2022-06-07 03:08:27 +07:00
}