diff --git a/src/discord/MusicPlayer/Join.ts b/src/discord/MusicPlayer/Join.ts index 870f23e..a6b2113 100644 --- a/src/discord/MusicPlayer/Join.ts +++ b/src/discord/MusicPlayer/Join.ts @@ -3,7 +3,7 @@ import { getEmotes, makeSuccessEmbed, makeErrorEmbed, sendMessage, sendMessageOr import DiscordProvider from "../../providers/Discord"; import Users from "../../services/Users" import Environment from "../../providers/Environment"; -import DiscordMusicPlayer, { PlayerPlayingEvent, ValidTracks, DiscordMusicPlayerInstance } from "../../providers/DiscordMusicPlayer"; +import DiscordMusicPlayer, { PlayerPlayingEvent, PlayerErrorEvent, VoiceDisconnectedEvent, ValidTracks, DiscordMusicPlayerInstance } from "../../providers/DiscordMusicPlayer"; import Discord from "../../providers/Discord"; const EMBEDS = { @@ -14,6 +14,13 @@ const EMBEDS = { user: (data instanceof Interaction) ? data.user : data.author }); }, + VOICECHANNEL_DISCONNECTED: (data: Message | Interaction) => { + return makeSuccessEmbed({ + title: `Disconnected`, + description: `I got disconnected from the voice channel`, + user: (data instanceof Interaction) ? data.user : data.author + }); + }, VOICECHANNEL_INUSE: (data: Message | Interaction) => { let haveForceMove = (data instanceof Message) ? (data as Message).member!.permissions.has([Permissions.FLAGS.MOVE_MEMBERS]) : ((data as Interaction).member! as GuildMember).permissions.has([Permissions.FLAGS.MOVE_MEMBERS]); @@ -40,6 +47,13 @@ const EMBEDS = { user: (data instanceof Interaction) ? data.user : data.author }); }, + MUSIC_ERROR: (data: Message | Interaction, err: Error) => { + return makeErrorEmbed({ + title: `Error`, + description: `${err.message}`, + user: (data instanceof Interaction) ? data.user : data.author + }); + }, NOW_PLAYING: (data: Message | Interaction, track: ValidTracks) => { const embed = makeInfoEmbed({ title: ' Now playing', @@ -151,7 +165,19 @@ export async function joinVoiceChannelProcedure (data: Interaction | Message, in if (event.instance.textChannel) { await sendMessage(event.instance.textChannel, undefined, { embeds: [EMBEDS.NOW_PLAYING(data, event.instance.queue.track[0])], components: [row] }); } - }) + }); + + instance.events.on('error', async (event: PlayerErrorEvent) => { + if (event.instance.textChannel) { + await sendMessage(event.instance.textChannel, undefined, { embeds: [EMBEDS.MUSIC_ERROR(data, event.error)] }); + } + }); + + instance.events.on('disconnect', async (event: VoiceDisconnectedEvent) => { + if (event.instance.textChannel) { + await sendMessage(event.instance.textChannel, undefined, { embeds: [EMBEDS.VOICECHANNEL_DISCONNECTED(data)] }); + } + }); } export default class Join { diff --git a/src/discord/MusicPlayer/Play.ts b/src/discord/MusicPlayer/Play.ts index 1a50b53..0b6e38d 100644 --- a/src/discord/MusicPlayer/Play.ts +++ b/src/discord/MusicPlayer/Play.ts @@ -3,7 +3,6 @@ import { makeErrorEmbed, makeSuccessEmbed, makeProcessingEmbed, sendMessage, sen import DiscordProvider from "../../providers/Discord"; import Environment from "../../providers/Environment"; import DiscordMusicPlayer, { ValidTracks } from "../../providers/DiscordMusicPlayer"; -import Prisma from "../../providers/Prisma"; import { joinVoiceChannelProcedure } from "./Join"; const EMBEDS = { @@ -70,6 +69,7 @@ export default class Play { data.r stands for data.requester data.v stands for data.voiceChannel */ + if (typeof payload.module === 'undefined' || typeof payload.action === 'undefined' || payload.module !== 'MP_SM' || diff --git a/src/providers/DiscordMusicPlayer.ts b/src/providers/DiscordMusicPlayer.ts index 7fb24fa..0575c18 100644 --- a/src/providers/DiscordMusicPlayer.ts +++ b/src/providers/DiscordMusicPlayer.ts @@ -1,6 +1,6 @@ import playdl, { YouTubeVideo, InfoData } from "play-dl"; import { Message, VoiceChannel, Snowflake, TextChannel, StageChannel, Guild } from "discord.js"; -import { AudioPlayer, VoiceConnection, createAudioPlayer, joinVoiceChannel, createAudioResource, StreamType, VoiceConnectionStatus, AudioPlayerStatus, NoSubscriberBehavior, VoiceConnectionDestroyedState, VoiceConnectionState, DiscordGatewayAdapterCreator, AudioResource } from "@discordjs/voice"; +import { AudioPlayer, VoiceConnection, createAudioPlayer, joinVoiceChannel, createAudioResource, StreamType, VoiceConnectionStatus, AudioPlayerStatus, NoSubscriberBehavior, VoiceConnectionDestroyedState, VoiceConnectionState, DiscordGatewayAdapterCreator, AudioResource, AudioPlayerError } from "@discordjs/voice"; import { EventEmitter } from "stream"; import DiscordProvider from "./Discord"; @@ -37,6 +37,23 @@ export class PlayerPlayingEvent { } } +export class PlayerErrorEvent { + public instance: DiscordMusicPlayerInstance; + public error: Error; + + constructor(instance: DiscordMusicPlayerInstance, error: Error) { + this.instance = instance; + this.error = error; + } +} + +export class VoiceDisconnectedEvent { + public instance: DiscordMusicPlayerInstance; + + constructor(instance: DiscordMusicPlayerInstance) { + this.instance = instance; + } +} export class DiscordMusicPlayerInstance { public queue: Queue; public player: AudioPlayer; @@ -72,6 +89,10 @@ export class DiscordMusicPlayerInstance { this.player.on(AudioPlayerStatus.Playing, (oldState: any, newState: any) => { this.events.emit('playing', new PlayerPlayingEvent(this)); }); + + this.player.on('error', (error: Error) => { + this.events.emit('error', new PlayerErrorEvent(this, error)); + }); } public isReady() { @@ -113,7 +134,11 @@ export class DiscordMusicPlayerInstance { }); this.voiceConnection.on(VoiceConnectionStatus.Disconnected, (oldState: VoiceConnectionState, newState: VoiceConnectionState) => { - // TODO: Handle on Disconnect by user (Right-click > Disconnect) + setTimeout(() => { + if (!DiscordProvider.client.guilds.cache.get(voiceChannel.guildId!)!.me!.voice.channelId) { + this.events.emit('disconnect', new VoiceDisconnectedEvent(this)); + } + }, 1000); }); } @@ -184,6 +209,10 @@ export class DiscordMusicPlayerInstance { this.voiceConnection = undefined; } + public async _fake_error_on_player() { + this.player.emit('error', new AudioPlayerError(new Error("fake error"), null!)); + } + } class DiscordMusicPlayer {