From 38f89e85a74b04a810de7d8fa24430b2a4d2bae8 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Mon, 18 Jul 2022 14:16:26 +0700 Subject: [PATCH] Added clear queue feature --- locales/en.json | 3 ++- locales/jp.json | 3 ++- locales/th.json | 3 ++- src/discord/MusicPlayer/Queue.ts | 27 ++++++++++++++++++---- src/providers/DiscordMusicPlayer.ts | 35 +++++++++++++++++------------ 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/locales/en.json b/locales/en.json index 2bb2361..9484d8c 100644 --- a/locales/en.json +++ b/locales/en.json @@ -119,7 +119,8 @@ "now_playing": "Now playing", "upcoming_song": "Upcoming song", "looping_current": "(Looping current)", - "song_x_in_queue": "There are {{COUNT}} song in the queue!" + "song_x_in_queue": "There are {{COUNT}} song in the queue!", + "cleared": "Queue cleared~ (。•ˇ‸ˇ•。)" }, "musicplayer_search": { "title": "Search", diff --git a/locales/jp.json b/locales/jp.json index 4ad38dd..0fd10bd 100644 --- a/locales/jp.json +++ b/locales/jp.json @@ -119,7 +119,8 @@ "now_playing": "再生中", "upcoming_song": "次の曲", "looping_current": "(この曲の繰り返し)", - "song_x_in_queue": "{{COUNT}}曲も並んでいますよ。" + "song_x_in_queue": "{{COUNT}}曲も並んでいますよ。", + "cleared": "キューがクリアされました (。•ˇ‸ˇ•。)" }, "musicplayer_search": { "title": "検索", diff --git a/locales/th.json b/locales/th.json index be8e3cf..e1319bb 100644 --- a/locales/th.json +++ b/locales/th.json @@ -119,7 +119,8 @@ "now_playing": "กำลังเล่น", "upcoming_song": "เพลงต่อไป", "looping_current": "(กำลังวนซ้ำเพลงนี้)", - "song_x_in_queue": "ตอนนี้มี {{COUNT}} เพลงอยู่ในคิว!" + "song_x_in_queue": "ตอนนี้มี {{COUNT}} เพลงอยู่ในคิว!", + "cleared": "เคลียร์คิวเรียบร้อยละ~ (。•ˇ‸ˇ•。)" }, "musicplayer_search": { "title": "ค้นหา", diff --git a/src/discord/MusicPlayer/Queue.ts b/src/discord/MusicPlayer/Queue.ts index 4f084d9..38a6338 100644 --- a/src/discord/MusicPlayer/Queue.ts +++ b/src/discord/MusicPlayer/Queue.ts @@ -9,7 +9,7 @@ import DiscordMusicPlayer, { import Locale from '../../services/Locale'; import DiscordModule, { HybridInteractionMessage } from '../../utils/DiscordModule'; -import { makeErrorEmbed, sendHybridInteractionMessageResponse, makeInfoEmbed } from '../../utils/DiscordMessage'; +import { makeErrorEmbed, sendHybridInteractionMessageResponse, makeSuccessEmbed, makeInfoEmbed } from '../../utils/DiscordMessage'; const EMBEDS = { QUEUE: (data: HybridInteractionMessage, locale: I18n, instance: DiscordMusicPlayerInstance) => { @@ -67,6 +67,12 @@ const EMBEDS = { } } }, + QUEUE_CLEARED: (data: HybridInteractionMessage, locale: I18n) => { + return makeSuccessEmbed({ + title: locale.__('musicplayer_queue.cleared'), + user: data.getUser() + }); + }, NO_MUSIC_PLAYING: (data: HybridInteractionMessage, locale: I18n) => { return makeErrorEmbed({ title: locale.__('musicplayer.no_music_playing'), @@ -89,10 +95,11 @@ export default class QueueCommand extends DiscordModule { } async run(data: HybridInteractionMessage, args: any) { - const guild = data.getGuild(); + const guild = data.getGuild(); if (!guild) return; + let query; const locale = await Locale.getGuildLocale(guild.id); const instance = DiscordMusicPlayer.getGuildInstance(guild.id); @@ -101,8 +108,20 @@ export default class QueueCommand extends DiscordModule { embeds: [EMBEDS.NO_MUSIC_PLAYING(data, locale)] }); - await sendHybridInteractionMessageResponse(data, { embeds: [EMBEDS.QUEUE(data, locale, instance)] }); + if (data.isMessage()) { + if (args.length === 0) + return await sendHybridInteractionMessageResponse(data, { embeds: [EMBEDS.QUEUE(data, locale, instance)] }); + + query = args.join(' '); + } else if (data.isApplicationCommand()) { + //query = data.getSlashCommand().options.get('query', true).value?.toString(); + } + + if (!query) return; + if(query.toLowerCase() !== 'clear') return; - return; + instance.clearQueue(); + + return await sendHybridInteractionMessageResponse(data, { embeds: [EMBEDS.QUEUE_CLEARED(data, locale)] }); } } diff --git a/src/providers/DiscordMusicPlayer.ts b/src/providers/DiscordMusicPlayer.ts index 7fbfa08..a6e3971 100644 --- a/src/providers/DiscordMusicPlayer.ts +++ b/src/providers/DiscordMusicPlayer.ts @@ -217,20 +217,6 @@ export class DiscordMusicPlayerInstance { }); } - public isReady() { - if (!this.voiceConnection) return false; - return this.voiceConnection.state.status === VoiceConnectionStatus.Ready; - } - - public isConnected() { - if (!this.voiceConnection) return false; - - if (this.voiceConnection.state.status === VoiceConnectionStatus.Destroyed) return false; - if (this.voiceConnection.state.status === VoiceConnectionStatus.Disconnected) return false; - - return true; - } - public joinVoiceChannel(voiceChannel: VoiceChannel | StageChannel, textChannel?: BaseGuildTextChannel | BaseGuildVoiceChannel) { const permissions = voiceChannel.permissionsFor(DiscordProvider.client.user!); @@ -350,6 +336,13 @@ export class DiscordMusicPlayerInstance { } } + public clearQueue() { + if (!this.voiceConnection) throw new Error('No voice connection'); + + if(!this.queue.track || this.queue.track.length === 0) return; + this.queue.track = [this.queue.track[0]]; + } + public setLoopMode(mode: DiscordMusicPlayerLoopMode) { this.loopMode = mode; } @@ -366,6 +359,20 @@ export class DiscordMusicPlayerInstance { return this.actualPlaybackURL; } + public isReady() { + if (!this.voiceConnection) return false; + return this.voiceConnection.state.status === VoiceConnectionStatus.Ready; + } + + public isConnected() { + if (!this.voiceConnection) return false; + + if (this.voiceConnection.state.status === VoiceConnectionStatus.Destroyed) return false; + if (this.voiceConnection.state.status === VoiceConnectionStatus.Disconnected) return false; + + return true; + } + public isPaused() { return this.paused; }