82 lines
3.5 KiB
Python
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.")
|
|
)
|