mirror of
https://github.com/kirameki-cafe/Yumi.git
synced 2026-09-14 03:09:59 +00:00
Handle manual disconnect
This commit is contained in:
@@ -3,7 +3,7 @@ import { getEmotes, makeSuccessEmbed, makeErrorEmbed, sendMessage, sendMessageOr
|
|||||||
import DiscordProvider from "../../providers/Discord";
|
import DiscordProvider from "../../providers/Discord";
|
||||||
import Users from "../../services/Users"
|
import Users from "../../services/Users"
|
||||||
import Environment from "../../providers/Environment";
|
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";
|
import Discord from "../../providers/Discord";
|
||||||
|
|
||||||
const EMBEDS = {
|
const EMBEDS = {
|
||||||
@@ -14,6 +14,13 @@ const EMBEDS = {
|
|||||||
user: (data instanceof Interaction) ? data.user : data.author
|
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) => {
|
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]);
|
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
|
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) => {
|
NOW_PLAYING: (data: Message | Interaction, track: ValidTracks) => {
|
||||||
const embed = makeInfoEmbed({
|
const embed = makeInfoEmbed({
|
||||||
title: ' Now playing',
|
title: ' Now playing',
|
||||||
@@ -151,7 +165,19 @@ export async function joinVoiceChannelProcedure (data: Interaction | Message, in
|
|||||||
if (event.instance.textChannel) {
|
if (event.instance.textChannel) {
|
||||||
await sendMessage(event.instance.textChannel, undefined, { embeds: [EMBEDS.NOW_PLAYING(data, event.instance.queue.track[0])], components: [row] });
|
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 {
|
export default class Join {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { makeErrorEmbed, makeSuccessEmbed, makeProcessingEmbed, sendMessage, sen
|
|||||||
import DiscordProvider from "../../providers/Discord";
|
import DiscordProvider from "../../providers/Discord";
|
||||||
import Environment from "../../providers/Environment";
|
import Environment from "../../providers/Environment";
|
||||||
import DiscordMusicPlayer, { ValidTracks } from "../../providers/DiscordMusicPlayer";
|
import DiscordMusicPlayer, { ValidTracks } from "../../providers/DiscordMusicPlayer";
|
||||||
import Prisma from "../../providers/Prisma";
|
|
||||||
import { joinVoiceChannelProcedure } from "./Join";
|
import { joinVoiceChannelProcedure } from "./Join";
|
||||||
|
|
||||||
const EMBEDS = {
|
const EMBEDS = {
|
||||||
@@ -70,6 +69,7 @@ export default class Play {
|
|||||||
data.r stands for data.requester
|
data.r stands for data.requester
|
||||||
data.v stands for data.voiceChannel
|
data.v stands for data.voiceChannel
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (typeof payload.module === 'undefined' ||
|
if (typeof payload.module === 'undefined' ||
|
||||||
typeof payload.action === 'undefined' ||
|
typeof payload.action === 'undefined' ||
|
||||||
payload.module !== 'MP_SM' ||
|
payload.module !== 'MP_SM' ||
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import playdl, { YouTubeVideo, InfoData } from "play-dl";
|
import playdl, { YouTubeVideo, InfoData } from "play-dl";
|
||||||
import { Message, VoiceChannel, Snowflake, TextChannel, StageChannel, Guild } from "discord.js";
|
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 { EventEmitter } from "stream";
|
||||||
|
|
||||||
import DiscordProvider from "./Discord";
|
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 {
|
export class DiscordMusicPlayerInstance {
|
||||||
public queue: Queue;
|
public queue: Queue;
|
||||||
public player: AudioPlayer;
|
public player: AudioPlayer;
|
||||||
@@ -72,6 +89,10 @@ export class DiscordMusicPlayerInstance {
|
|||||||
this.player.on(AudioPlayerStatus.Playing, (oldState: any, newState: any) => {
|
this.player.on(AudioPlayerStatus.Playing, (oldState: any, newState: any) => {
|
||||||
this.events.emit('playing', new PlayerPlayingEvent(this));
|
this.events.emit('playing', new PlayerPlayingEvent(this));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.player.on('error', (error: Error) => {
|
||||||
|
this.events.emit('error', new PlayerErrorEvent(this, error));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public isReady() {
|
public isReady() {
|
||||||
@@ -113,7 +134,11 @@ export class DiscordMusicPlayerInstance {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.voiceConnection.on(VoiceConnectionStatus.Disconnected, (oldState: VoiceConnectionState, newState: VoiceConnectionState) => {
|
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;
|
this.voiceConnection = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async _fake_error_on_player() {
|
||||||
|
this.player.emit('error', new AudioPlayerError(new Error("fake error"), null!));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DiscordMusicPlayer {
|
class DiscordMusicPlayer {
|
||||||
|
|||||||
Reference in New Issue
Block a user