check both connect and speak permissions before performing audio actions (#5012)

This commit is contained in:
Draper 2021-05-19 21:29:40 +01:00 committed by GitHub
parent f3231682b0
commit 994137426f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 38 additions and 18 deletions

View File

@ -549,5 +549,10 @@ class MixinMeta(ABC):
async def icyparser(self, url: str) -> Optional[str]: async def icyparser(self, url: str) -> Optional[str]:
raise NotImplementedError() raise NotImplementedError()
@abstractmethod
async def self_deafen(self, player: lavalink.Player) -> None: async def self_deafen(self, player: lavalink.Player) -> None:
raise NotImplementedError() raise NotImplementedError()
@abstractmethod
def can_join_and_speak(self, channel: discord.VoiceChannel) -> bool:
raise NotImplementedError()

View File

@ -643,7 +643,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
@ -651,7 +651,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Join Voice Channel"), title=_("Unable To Join Voice Channel"),
description=_("I don't have permission to connect to your channel."), description=_("I don't have permission to connect and speak in your channel."),
) )
if not self._player_check(ctx): if not self._player_check(ctx):
player = await lavalink.connect( player = await lavalink.connect(

View File

@ -73,14 +73,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc) return await self.send_embed_msg(ctx, title=msg, description=desc)
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Play Tracks"), title=_("Unable To Play Tracks"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
await lavalink.connect( await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,
@ -179,14 +181,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc) return await self.send_embed_msg(ctx, title=msg, description=desc)
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Play Tracks"), title=_("Unable To Play Tracks"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
await lavalink.connect( await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,
@ -441,14 +445,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc) return await self.send_embed_msg(ctx, title=msg, description=desc)
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Play Tracks"), title=_("Unable To Play Tracks"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
await lavalink.connect( await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,
@ -555,14 +561,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc) return await self.send_embed_msg(ctx, title=msg, description=desc)
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Play Tracks"), title=_("Unable To Play Tracks"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
await lavalink.connect( await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,
@ -677,14 +685,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc) return await self.send_embed_msg(ctx, title=msg, description=desc)
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Search For Tracks"), title=_("Unable To Search For Tracks"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
await lavalink.connect( await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,

View File

@ -328,7 +328,7 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
) )
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
@ -336,7 +336,7 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg( return await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Shuffle Queue"), title=_("Unable To Shuffle Queue"),
description=_("I don't have permission to connect to your channel."), description=_("I don't have permission to connect and speak in your channel."),
) )
player = await lavalink.connect( player = await lavalink.connect(
ctx.author.voice.channel, ctx.author.voice.channel,

View File

@ -338,8 +338,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass):
self._ws_op_codes[guild_id]._init(self._ws_op_codes[guild_id]._maxsize) self._ws_op_codes[guild_id]._init(self._ws_op_codes[guild_id]._maxsize)
return return
if player.channel: if player.channel:
current_perms = player.channel.permissions_for(player.guild.me) has_perm = self.can_join_and_speak(player.channel)
has_perm = current_perms.speak and current_perms.connect
else: else:
has_perm = False has_perm = False
if code in (1000,) and has_perm and player.current and player.is_playing: if code in (1000,) and has_perm and player.current and player.is_playing:

View File

@ -532,14 +532,16 @@ class PlaylistUtilities(MixinMeta, metaclass=CompositeMetaClass):
return False return False
try: try:
if ( if (
not ctx.author.voice.channel.permissions_for(ctx.me).connect not self.can_join_and_speak(ctx.author.voice.channel)
or not ctx.author.voice.channel.permissions_for(ctx.me).move_members or not ctx.author.voice.channel.permissions_for(ctx.me).move_members
and self.is_vc_full(ctx.author.voice.channel) and self.is_vc_full(ctx.author.voice.channel)
): ):
await self.send_embed_msg( await self.send_embed_msg(
ctx, ctx,
title=_("Unable To Get Playlists"), title=_("Unable To Get Playlists"),
description=_("I don't have permission to connect to your channel."), description=_(
"I don't have permission to connect and speak in your channel."
),
) )
return False return False
await lavalink.connect( await lavalink.connect(

View File

@ -53,6 +53,10 @@ class ValidationUtilities(MixinMeta, metaclass=CompositeMetaClass):
def is_vc_full(self, channel: discord.VoiceChannel) -> bool: def is_vc_full(self, channel: discord.VoiceChannel) -> bool:
return not (channel.user_limit == 0 or channel.user_limit > len(channel.members)) return not (channel.user_limit == 0 or channel.user_limit > len(channel.members))
def can_join_and_speak(self, channel: discord.VoiceChannel) -> bool:
current_perms = channel.permissions_for(channel.guild.me)
return current_perms.speak and current_perms.connect
async def is_query_allowed( async def is_query_allowed(
self, self,
config: Config, config: Config,