Source code for pylav.extension.red.utils.decorators

from __future__ import annotations

from pathlib import Path

import discord
from discord import app_commands
from redbot.core import commands
from redbot.core.i18n import Translator

from pylav.core.context import PyLavContext
from pylav.extension.red import errors
from pylav.extension.red.errors import NotDJError, UnauthorizedChannelError
from pylav.type_hints.bot import DISCORD_BOT_TYPE, DISCORD_INTERACTION_TYPE

_ = Translator("PyLav", Path(__file__))


[docs] def always_hidden(slash: bool = False): async def pred(__: DISCORD_INTERACTION_TYPE | PyLavContext) -> bool: return False return app_commands.check(pred) if slash else commands.check(pred)
[docs] def requires_player(slash: bool = False): async def pred(context: PyLavContext | DISCORD_INTERACTION_TYPE): if isinstance(context, discord.Interaction): if not context.response.is_done(): await context.response.defer(ephemeral=True) bot = context.client _lavalink = getattr(bot, "pylav", None) player = _lavalink.get_player(context.guild) if _lavalink else None else: bot = context.bot _lavalink = getattr(bot, "pylav", None) player = _lavalink.get_player(context.guild) if _lavalink else None if not _lavalink: return False if not player: raise errors.MediaPlayerNotFoundError(context) return True return app_commands.check(pred) if slash else commands.check(pred)
[docs] def can_run_command_in_channel(slash: bool = False): async def pred(context: PyLavContext | DISCORD_INTERACTION_TYPE): if isinstance(context, discord.Interaction): if not context.response.is_done(): await context.response.defer(ephemeral=True) bot = context.client _lavalink = getattr(bot, "pylav", None) player = _lavalink.get_player(context.guild) if _lavalink else None else: bot = context.bot _lavalink = getattr(bot, "pylav", None) player = _lavalink.get_player(context.guild) if _lavalink else None if not _lavalink: return False if not context.guild: return True if player: config = player.config else: config = bot.pylav.player_config_manager.get_config(context.guild.id) if (channel_id := await config.fetch_text_channel_id()) != 0 and channel_id != context.channel.id: raise UnauthorizedChannelError(channel=channel_id) return True return app_commands.check(pred) if slash else commands.check(pred)
[docs] async def is_dj_logic( context: PyLavContext | DISCORD_INTERACTION_TYPE | discord.Message, bot: DISCORD_BOT_TYPE | None = None ) -> bool | None: guild = context.guild if isinstance(context, discord.Interaction): if not context.response.is_done(): await context.response.defer(ephemeral=True) bot = bot or context.client author = context.user else: bot = bot or context.bot author = context.author return await bot.pylav.is_dj(user=author, guild=guild, additional_role_ids=None, additional_user_ids={*bot.owner_ids, guild.owner_id}) if guild else False # type: ignore
[docs] def invoker_is_dj(slash: bool = False): async def pred(context: PyLavContext | DISCORD_INTERACTION_TYPE): is_dj = await is_dj_logic(context) if is_dj is False: raise NotDJError( context, ) return True return app_commands.check(pred) if slash else commands.check(pred)