From 4659717e5f314d061f9748331c79d507df971f7f Mon Sep 17 00:00:00 2001 From: Max Isom Date: Thu, 19 Mar 2020 17:39:55 -0500 Subject: [PATCH] Require user to be in voice channel --- src/bot.ts | 11 +++++++++-- src/commands/clear.ts | 2 ++ src/commands/disconnect.ts | 2 ++ src/commands/fseek.ts | 2 ++ src/commands/index.ts | 1 + src/commands/pause.ts | 2 ++ src/commands/play.ts | 9 +++------ src/commands/seek.ts | 2 ++ src/commands/shuffle.ts | 2 ++ src/commands/skip.ts | 2 ++ src/commands/unskip.ts | 2 ++ src/utils/channels.ts | 14 +++++++++++++- 12 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index b5bde3f..434a514 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -8,6 +8,8 @@ import debug from './utils/debug'; import NaturalLanguage from './services/natural-language-commands'; import handleGuildCreate from './events/guild-create'; import handleVoiceStateUpdate from './events/voice-state-update'; +import errorMsg from './utils/error-msg'; +import {isUserInVoice} from './utils/channels'; @injectable() export default class { @@ -81,10 +83,15 @@ export default class { } try { - handler.execute(msg, args); + if (handler.requiresVC && !isUserInVoice(msg.guild, msg.author)) { + await msg.channel.send(errorMsg('gotta be in a voice channel')); + return; + } + + await handler.execute(msg, args); } catch (error) { console.error(error); - msg.reply('there was an error trying to execute that command!'); + await msg.channel.send(errorMsg('¯\\_(ツ)_/¯')); } }); diff --git a/src/commands/clear.ts b/src/commands/clear.ts index d35cc8c..a585af4 100644 --- a/src/commands/clear.ts +++ b/src/commands/clear.ts @@ -12,6 +12,8 @@ export default class implements Command { ['clear', 'clears all songs in queue except currently playing'] ]; + public requiresVC = true; + private readonly queueManager: QueueManager; constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) { diff --git a/src/commands/disconnect.ts b/src/commands/disconnect.ts index 9b271a3..937fc2e 100644 --- a/src/commands/disconnect.ts +++ b/src/commands/disconnect.ts @@ -13,6 +13,8 @@ export default class implements Command { ['disconnect', 'pauses and disconnects player'] ]; + public requiresVC = true; + private readonly playerManager: PlayerManager; constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) { diff --git a/src/commands/fseek.ts b/src/commands/fseek.ts index 6eecdf3..584c581 100644 --- a/src/commands/fseek.ts +++ b/src/commands/fseek.ts @@ -15,6 +15,8 @@ export default class implements Command { ['fseek 10', 'skips forward in current song by 10 seconds'] ]; + public requiresVC = true; + private readonly playerManager: PlayerManager; private readonly queueManager: QueueManager; diff --git a/src/commands/index.ts b/src/commands/index.ts index dd16648..a945072 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -4,5 +4,6 @@ export default interface Command { name: string; aliases: string[]; examples: string[][]; + requiresVC?: boolean; execute: (msg: Message, args: string[]) => Promise; } diff --git a/src/commands/pause.ts b/src/commands/pause.ts index 406c084..0771e11 100644 --- a/src/commands/pause.ts +++ b/src/commands/pause.ts @@ -14,6 +14,8 @@ export default class implements Command { ['pause', 'pauses currently playing song'] ]; + public requiresVC = true; + private readonly playerManager: PlayerManager; constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) { diff --git a/src/commands/play.ts b/src/commands/play.ts index eb972a8..629a720 100644 --- a/src/commands/play.ts +++ b/src/commands/play.ts @@ -26,6 +26,8 @@ export default class implements Command { ['play https://open.spotify.com/playlist/37i9dQZF1DX94qaYRnkufr?si=r2fOVL_QQjGxFM5MWb84Xw', 'adds all songs from playlist to the queue'] ]; + public requiresVC = true; + private readonly queueManager: QueueManager; private readonly playerManager: PlayerManager; private readonly getSongs: GetSongs; @@ -37,16 +39,11 @@ export default class implements Command { } public async execute(msg: Message, args: string []): Promise { - const [targetVoiceChannel, nInChannel] = getMostPopularVoiceChannel(msg.guild!); + const [targetVoiceChannel] = getMostPopularVoiceChannel(msg.guild!); const res = new LoadingMessage(msg.channel as TextChannel); await res.start(); - if (nInChannel === 0) { - await res.stop(errorMsg('all voice channels are empty')); - return; - } - const queue = this.queueManager.get(msg.guild!.id); const player = this.playerManager.get(msg.guild!.id); diff --git a/src/commands/seek.ts b/src/commands/seek.ts index 4a1c62d..24fde7c 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -17,6 +17,8 @@ export default class implements Command { ['seek 1:00:00', 'seeks to 1 hour from beginning of song'] ]; + public requiresVC = true; + private readonly playerManager: PlayerManager; private readonly queueManager: QueueManager; diff --git a/src/commands/shuffle.ts b/src/commands/shuffle.ts index 524081e..a100b9b 100644 --- a/src/commands/shuffle.ts +++ b/src/commands/shuffle.ts @@ -13,6 +13,8 @@ export default class implements Command { ['shuffle', 'shuffles the current queue'] ]; + public requiresVC = true; + private readonly queueManager: QueueManager; constructor(@inject(TYPES.Managers.Queue) queueManager: QueueManager) { diff --git a/src/commands/skip.ts b/src/commands/skip.ts index bdf67b5..cc5c1c4 100644 --- a/src/commands/skip.ts +++ b/src/commands/skip.ts @@ -13,6 +13,8 @@ export default class implements Command { ['skip', 'skips the current song'] ]; + public requiresVC = true; + private readonly queueManager: QueueManager; private readonly playerManager: PlayerManager; diff --git a/src/commands/unskip.ts b/src/commands/unskip.ts index f5709c0..ff4718a 100644 --- a/src/commands/unskip.ts +++ b/src/commands/unskip.ts @@ -14,6 +14,8 @@ export default class implements Command { ['unskip', 'goes back in the queue by one song'] ]; + public requiresVC = true; + private readonly queueManager: QueueManager; private readonly playerManager: PlayerManager; diff --git a/src/utils/channels.ts b/src/utils/channels.ts index bd56dd4..b27f5a6 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -1,4 +1,16 @@ -import {Guild, VoiceChannel} from 'discord.js'; +import {Guild, VoiceChannel, User} from 'discord.js'; + +export const isUserInVoice = (guild: Guild, user: User): boolean => { + let inVoice = false; + + guild.channels.cache.filter(channel => channel.type === 'voice').forEach(channel => { + if (channel.members.array().find(member => member.id === user.id)) { + inVoice = true; + } + }); + + return inVoice; +}; export const getSizeWithoutBots = (channel: VoiceChannel): number => channel.members.array().reduce((s, member) => { if (!member.user.bot) {