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]:
raise NotImplementedError()
@abstractmethod
async def self_deafen(self, player: lavalink.Player) -> None:
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:
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
and self.is_vc_full(ctx.author.voice.channel)
):
@ -651,7 +651,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(
ctx,
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):
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)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
return await self.send_embed_msg(
ctx,
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(
ctx.author.voice.channel,
@ -179,14 +181,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
return await self.send_embed_msg(
ctx,
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(
ctx.author.voice.channel,
@ -441,14 +445,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
return await self.send_embed_msg(
ctx,
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(
ctx.author.voice.channel,
@ -555,14 +561,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
return await self.send_embed_msg(
ctx,
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(
ctx.author.voice.channel,
@ -677,14 +685,16 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(ctx, title=msg, description=desc)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
return await self.send_embed_msg(
ctx,
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(
ctx.author.voice.channel,

View File

@ -328,7 +328,7 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
)
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
@ -336,7 +336,7 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
return await self.send_embed_msg(
ctx,
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(
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)
return
if player.channel:
current_perms = player.channel.permissions_for(player.guild.me)
has_perm = current_perms.speak and current_perms.connect
has_perm = self.can_join_and_speak(player.channel)
else:
has_perm = False
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
try:
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
and self.is_vc_full(ctx.author.voice.channel)
):
await self.send_embed_msg(
ctx,
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
await lavalink.connect(

View File

@ -53,6 +53,10 @@ class ValidationUtilities(MixinMeta, metaclass=CompositeMetaClass):
def is_vc_full(self, channel: discord.VoiceChannel) -> bool:
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(
self,
config: Config,