Ruby-Cogs/viewpermissions/view.py
2025-04-02 22:57:51 -04:00

228 lines
9 KiB
Python

from AAA3A_utils import CogsUtils # isort:skip
from redbot.core import commands # isort:skip
from redbot.core.i18n import Translator # isort:skip
import discord # isort:skip
import typing # isort:skip
import asyncio
_: Translator = Translator("ViewPermissions", __file__)
class PermissionsView(discord.ui.View):
def __init__(
self,
cog: commands.Cog,
guild: discord.Guild,
roles: typing.List[discord.Role] = None,
members: typing.List[discord.Member] = None,
channel: typing.Optional[discord.abc.GuildChannel] = None,
permissions: typing.List[str] = None,
advanced: bool = False,
) -> None:
roles = [] if roles is None else roles.copy()
if members is None:
members = []
if permissions is None:
permissions = []
super().__init__(timeout=180)
self.cog: commands.Cog = cog
self.ctx: commands.Context = None
self.guild: discord.Guild = guild
self.roles: typing.Optional[typing.List[discord.Role]] = roles
self.members: typing.Optional[typing.List[discord.Member]] = members
for member in self.members:
self.roles.extend(member.roles)
self.roles = sorted(set(self.roles))
self.channel: typing.Optional[discord.abc.GuildChannel] = channel
self.permissions: typing.List[str] = permissions
self.advanced: bool = advanced
self._message: discord.Message = None
self._ready: asyncio.Event = asyncio.Event()
self._current: int = 0
self._pages: typing.List[discord.Embed] = []
async def start(self, ctx: commands.Context) -> discord.Message:
self.ctx: commands.Context = ctx
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
roles=self.roles,
members=self.members,
channel=self.channel,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
# if self.permissions and self.channel is None:
# self.remove_item(self.channel_select)
# self.remove_item(self._server_permissions_button)
# self.remove_item(self._current_channel_permissions_button)
self._current: int = 0
self._message: discord.Message = await self.ctx.send(
embed=self._pages[self._current], view=self
)
self.cog.views[self._message] = self
await self._ready.wait()
return self._message
async def interaction_check(self, interaction: discord.Interaction) -> bool:
if interaction.user.id not in [self.ctx.author.id] + list(self.ctx.bot.owner_ids):
await interaction.response.send_message(
_("You are not allowed to use this interaction."), ephemeral=True
)
return False
return True
async def on_timeout(self) -> None:
for child in self.children:
child: discord.ui.Item
if hasattr(child, "disabled") and not (
isinstance(child, discord.ui.Button) and child.style == discord.ButtonStyle.url
):
child.disabled = True
try:
await self._message.edit(view=self)
except discord.HTTPException:
pass
self._ready.set()
@discord.ui.select(
cls=discord.ui.MentionableSelect,
placeholder="Select mentionables.",
min_values=0,
max_values=None,
)
async def mentionables_select(
self, interaction: discord.Interaction, select: discord.ui.MentionableSelect
):
await interaction.response.defer()
self.roles: typing.List[discord.Role] = [
mentionable for mentionable in select.values if isinstance(mentionable, discord.Role)
]
self.members: typing.List[discord.Member] = [
mentionable for mentionable in select.values if isinstance(mentionable, discord.Member)
]
for member in self.members:
self.roles.extend(member.roles)
self.roles = sorted(set(self.roles))
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
roles=self.roles,
members=self.members,
channel=self.channel,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
self._current: int = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.select(
cls=discord.ui.ChannelSelect, placeholder="Select channel.", min_values=0, max_values=1
)
async def channel_select(
self, interaction: discord.Interaction, select: discord.ui.ChannelSelect
):
await interaction.response.defer()
self.channel = await select.values[0].fetch() if select.values else None
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
channel=self.channel,
roles=self.roles,
members=self.members,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
self._current: int = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.button(emoji="◀️", custom_id="back_button", row=2)
async def _back_button(self, interaction: discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
if self._current == 0:
self._current = len(self._pages) - 1
else:
self._current -= 1
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.button(style=discord.ButtonStyle.danger, emoji="✖️", custom_id="close_page", row=2)
async def close_page(
self, interaction: discord.Interaction, button: discord.ui.Button
) -> None:
try:
await interaction.response.defer()
except discord.errors.NotFound:
pass
self.stop()
await CogsUtils.delete_message(self._message)
self._ready.set()
@discord.ui.button(emoji="▶️", custom_id="next_button", row=2)
async def _next_button(self, interaction: discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
if self._current < len(self._pages) - 1:
self._current += 1
else:
self._current = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.button(emoji="🔄", custom_id="reload_button", row=2)
async def _reload_button(self, interaction: discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
roles=self.roles,
members=self.members,
channel=self.channel,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
self._current: int = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.button(
label="Server Permissions", emoji="🌍", custom_id="server_permissions_button", row=3
)
async def _server_permissions_button(
self, interaction: discord.Interaction, button: discord.ui.Button
):
await interaction.response.defer()
self.channel: typing.Optional[discord.abc.GuildChannel] = None
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
roles=self.roles,
members=self.members,
channel=self.channel,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
self._current: int = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])
@discord.ui.button(
label="Current Channel Permissions",
emoji="📪",
custom_id="current_channel_permissions",
row=3,
)
async def _current_channel_permissions_button(
self, interaction: discord.Interaction, button: discord.ui.Button
):
await interaction.response.defer()
self.channel: typing.Optional[discord.abc.GuildChannel] = self.ctx.channel
self._pages: typing.List[discord.Embed] = await self.cog.get_embeds(
guild=self.guild,
roles=self.roles,
members=self.members,
channel=self.channel,
permissions=self.permissions,
advanced=self.advanced,
embed_color=await self.ctx.embed_color(),
)
self._current: int = 0
self._message: discord.Message = await self._message.edit(embed=self._pages[self._current])