228 lines
9 KiB
Python
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])
|