Files
zyrarbot/zyrarbot/ui/bot/cogs/voice_cog.py
T

82 lines
3.5 KiB
Python

from __future__ import annotations
import discord
from discord.ext import commands
from zyrarbot.music.notification_channel_resolver import NotificationChannelResolver
from zyrarbot.ui.bot.cogs.common import MusicCogBase
from zyrarbot.ui.bot.discord_theme import message_embed
class VoiceCog(MusicCogBase, name="Voice"):
"""Obsługa zdarzeń i rozłączania z kanałów głosowych."""
@commands.Cog.listener()
async def on_voice_state_update(
self,
member: discord.Member,
before: discord.VoiceState,
after: discord.VoiceState,
) -> None:
is_bot_leaving = (
self.bot.user
and member.id == self.bot.user.id
and before.channel is not None
and after.channel is None
)
if is_bot_leaving:
self.player.save_queue(before.channel.guild.id)
self.player.clear(before.channel.guild.id)
await self.player.trigger_state_change()
@discord.app_commands.command(name="connect", description="Połącz bota z kanałem głosowym")
@discord.app_commands.describe(channel="Kanał głosowy")
async def connect(
self, interaction: discord.Interaction, channel: discord.VoiceChannel
) -> None:
existing = self.player.voice_client(interaction.guild.id)
if existing:
await existing.disconnect()
await channel.connect()
if not self.player.notification_channel(interaction.guild.id):
self.player.set_notification_channel(
interaction.guild.id, NotificationChannelResolver.first_writable(interaction.guild)
)
await self.player.trigger_state_change()
await interaction.response.send_message(
embed=message_embed("Kanał głosowy", f"Połączono z kanałem **{channel.name}**.")
)
@discord.app_commands.command(name="notificationchannel", description="Ustaw kanał logów")
@discord.app_commands.describe(channel="Kanał tekstowy")
async def notification_channel(
self, interaction: discord.Interaction, channel: discord.TextChannel
) -> None:
if channel not in NotificationChannelResolver.writable_channels(interaction.guild):
await interaction.response.send_message(
embed=message_embed("Kanał logów", "Bot nie może pisać na tym kanale."),
ephemeral=True,
)
return
self.player.set_notification_channel(interaction.guild.id, channel)
self.bot.config.set_notification_channel_id(interaction.guild.id, channel.id)
await self.player.trigger_state_change()
await interaction.response.send_message(
embed=message_embed("Kanał logów", f"Ustawiono kanał: {channel.mention}.")
)
@discord.app_commands.command(name="leave", description="Odłącz bota od kanału głosowego")
async def leave(self, interaction: discord.Interaction) -> None:
if interaction.guild.voice_client is None:
await interaction.response.send_message(
embed=message_embed("Kanał głosowy", "Bot nie jest na kanale głosowym."),
ephemeral=True,
)
return
self.player.save_queue(interaction.guild.id)
await interaction.guild.voice_client.disconnect()
self.player.clear(interaction.guild.id)
await interaction.response.send_message(
embed=message_embed("Kanał głosowy", "Rozłączono z kanału głosowego.")
)