Files
zyrarbot/zyrarbot/music/notification_channel_resolver.py
T
mmacierzanka 6f50fce3f9 feat: introduce database as a persistent storage for settings and history
refactor: arrange persistence layer as a port-adapter schema
2026-09-30 17:42:09 +02:00

49 lines
1.5 KiB
Python

from __future__ import annotations
import discord
from discord.ext import commands
from zyrarbot.storage.ports.guild_config import GuildConfigRepository
class NotificationChannelResolver:
"""Wskazuje kanał tekstowy, na który trafiają powiadomienia o odtwarzaniu.
Kolejność: kanał zapamiętany w stanie -> kanał z konfiguracji -> pierwszy
kanał serwera, na którym bot może pisać.
"""
def __init__(self, bot: commands.Bot, config: GuildConfigRepository):
self._bot = bot
self._config = config
def resolve(
self, guild_id: int, remembered: discord.abc.Messageable | None
) -> discord.abc.Messageable | None:
if remembered:
return remembered
saved_id = self._config.get_notification_channel_id(guild_id)
if saved_id:
channel = self._bot.get_channel(saved_id)
if channel:
return channel
return self.first_writable(self._bot.get_guild(guild_id))
@staticmethod
def first_writable(guild: discord.Guild | None) -> discord.TextChannel | None:
for channel in NotificationChannelResolver.writable_channels(guild):
return channel
return None
@staticmethod
def writable_channels(guild: discord.Guild | None) -> list[discord.TextChannel]:
if not guild or not guild.me:
return []
return [
channel
for channel in guild.text_channels
if channel.permissions_for(guild.me).send_messages
]