From 1449807184026a796af244d20e01d7bfaf34d8f2 Mon Sep 17 00:00:00 2001 From: Lemon4ksan Date: Sat, 1 Feb 2025 23:05:51 +0300 Subject: [PATCH] impr: Minor code improvement. --- MusicBot/cogs/utils/voice_extension.py | 15 +++++++------ MusicBot/cogs/voice.py | 5 +++-- MusicBot/ui/menu.py | 31 ++++++++++++++++---------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/MusicBot/cogs/utils/voice_extension.py b/MusicBot/cogs/utils/voice_extension.py index e0366d7..354dcbc 100644 --- a/MusicBot/cogs/utils/voice_extension.py +++ b/MusicBot/cogs/utils/voice_extension.py @@ -273,7 +273,7 @@ class VoiceExtension: await self.stop_playing(ctx) return await self.play_track(ctx, next_tracks[0], button_callback=button_callback) - async def voice_check(self, ctx: ApplicationContext | Interaction) -> bool: + async def voice_check(self, ctx: ApplicationContext | Interaction, *, check_vibe_privilage: bool = True) -> bool: """Check if bot can perform voice tasks and respond if failed. Args: @@ -309,12 +309,13 @@ class VoiceExtension: await ctx.respond("❌ Добавьте бота в голосовой канал при помощи команды /voice join.", delete_after=15, ephemeral=True) return False - guild = self.db.get_guild(ctx.guild.id) - member = cast(discord.Member, ctx.user) - if guild['vibing'] and ctx.user.id != guild['current_viber_id'] and not member.guild_permissions.manage_channels: - logging.debug("[VIBE] Context user is not the current viber") - await ctx.respond("❌ Вы не можете взаимодействовать с чужой волной!", delete_after=15, ephemeral=True) - return False + if check_vibe_privilage: + guild = self.db.get_guild(ctx.guild.id) + member = cast(discord.Member, ctx.user) + if guild['vibing'] and ctx.user.id != guild['current_viber_id'] and not member.guild_permissions.manage_channels: + logging.debug("[VIBE] Context user is not the current viber") + await ctx.respond("❌ Вы не можете взаимодействовать с чужой волной!", delete_after=15, ephemeral=True) + return False logging.debug("[VC_EXT] Voice requirements met") return True diff --git a/MusicBot/cogs/voice.py b/MusicBot/cogs/voice.py index e9edced..72786c6 100644 --- a/MusicBot/cogs/voice.py +++ b/MusicBot/cogs/voice.py @@ -52,7 +52,7 @@ class Voice(Cog, VoiceExtension): if current_menu: logging.info(f"[VOICE] Disabling current menu for guild {gid} due to multiple members") - self.db.update(gid, {'current_menu': None, 'repeat': False, 'shuffle': False}) + self.db.update(gid, {'current_menu': None, 'repeat': False, 'shuffle': False, 'vibing': False}) try: message = await channel.fetch_message(current_menu) await message.delete() @@ -240,8 +240,9 @@ class Voice(Cog, VoiceExtension): await ctx.respond("❌ У вас нет прав для выполнения этой команды.", delete_after=15, ephemeral=True) return - if await self.voice_check(ctx): + if (vc := await self.get_voice_client(ctx)) and await self.voice_check(ctx): await self.stop_playing(ctx, full=True) + await vc.disconnect(force=True) await ctx.respond("Отключение успешно!", delete_after=15, ephemeral=True) logging.info(f"[VOICE] Successfully disconnected from voice channel in guild {ctx.guild.id}") diff --git a/MusicBot/ui/menu.py b/MusicBot/ui/menu.py index d05dae8..c31bd68 100644 --- a/MusicBot/ui/menu.py +++ b/MusicBot/ui/menu.py @@ -58,7 +58,11 @@ class PlayPauseButton(Button, VoiceExtension): if not vc or not interaction.message: return - embed = interaction.message.embeds[0] + try: + embed = interaction.message.embeds[0] + except IndexError: + await interaction.respond("❌ Нет воспроизводимого трека.", delete_after=15, ephemeral=True) + return if vc.is_paused(): vc.resume() @@ -80,7 +84,7 @@ class NextTrackButton(Button, VoiceExtension): return title = await self.next_track(interaction, button_callback=True) if not title: - await interaction.respond(f"Нет треков в очереди.", delete_after=15, ephemeral=True) + await interaction.respond(f"❌ Нет треков в очереди.", delete_after=15, ephemeral=True) class PrevTrackButton(Button, VoiceExtension): def __init__(self, **kwargs): @@ -102,7 +106,7 @@ class LikeButton(Button, VoiceExtension): async def callback(self, interaction: Interaction) -> None: logging.info('[MENU] Like button callback...') - if not await self.voice_check(interaction): + if not await self.voice_check(interaction, check_vibe_privilage=False): return if not interaction.guild: @@ -148,7 +152,7 @@ class LyricsButton(Button, VoiceExtension): async def callback(self, interaction: Interaction) -> None: logging.info('[MENU] Lyrics button callback...') - if not await self.voice_check(interaction) or not interaction.guild_id or not interaction.user: + if not await self.voice_check(interaction, check_vibe_privilage=False) or not interaction.guild_id or not interaction.user: return ym_token = self.users_db.get_ym_token(interaction.user.id) @@ -333,9 +337,9 @@ class AddToPlaylistSelect(Select, VoiceExtension): self.ym_client = ym_client async def callback(self, interaction: Interaction): - if not interaction.data or not interaction.guild_id: + if not await self.voice_check(interaction, check_vibe_privilage=False): return - if not interaction.data or 'values' not in interaction.data: + if not interaction.guild_id or not interaction.data or 'values' not in interaction.data: logging.warning('[MENU] No data in select callback') return @@ -358,8 +362,6 @@ class AddToPlaylistSelect(Select, VoiceExtension): except yandex_music.exceptions.NetworkError: res = None - # value=f"{playlist.kind or "-1"};{current_track['id']};{current_track['albums'][0]['id']};{playlist.revision};{playlist.uid}" - if res: await interaction.respond('✅ Добавлено в плейлист', delete_after=15, ephemeral=True) else: @@ -371,7 +373,7 @@ class AddToPlaylistButton(Button, VoiceExtension): VoiceExtension.__init__(self, None) async def callback(self, interaction: Interaction): - if not await self.voice_check(interaction) or not interaction.guild_id: + if not await self.voice_check(interaction, check_vibe_privilage=False) or not interaction.guild_id: return client = await self.init_ym_client(interaction) @@ -433,12 +435,17 @@ class MenuView(View, VoiceExtension): self.add_item(self.next_button) self.add_item(self.shuffle_button) - if isinstance(self.ctx, RawReactionActionEvent) or len(cast(VoiceChannel, self.ctx.channel).members) > 2: - self.like_button.disabled = True + if not isinstance(self.ctx, RawReactionActionEvent) and len(cast(VoiceChannel, self.ctx.channel).members) > 2: + self.dislike_button.disabled = True elif likes and current_track and str(current_track['id']) in [str(like.id) for like in likes]: self.like_button.style = ButtonStyle.success - if not current_track or not current_track['lyrics_available']: + if not current_track: + self.lyrics_button.disabled = True + self.like_button.disabled = True + self.dislike_button.disabled = True + self.add_to_playlist_button.disabled = True + elif not current_track['lyrics_available']: self.lyrics_button.disabled = True self.add_item(self.like_button)