Files
croccybot/src/modules/moderation/settingui.py

190 lines
6.2 KiB
Python

import asyncio
import discord
from discord.ui.button import button, Button, ButtonStyle
from discord.ui.select import select, ChannelSelect, RoleSelect
from meta import LionBot
from utils.ui import ConfigUI, DashboardSection
from utils.lib import MessageArgs
from . import babel
from .settings import ModerationSettings
_p = babel._p
class ModerationSettingUI(ConfigUI):
setting_classes = (
ModerationSettings.ModRole,
ModerationSettings.AdminRole,
ModerationSettings.TicketLog,
ModerationSettings.AlertChannel,
)
def __init__(self, bot: LionBot, guildid: int, channelid, **kwargs):
self.settings = bot.get_cog('ModerationCog').settings
super().__init__(bot, guildid, channelid, **kwargs)
# ----- UI Components -----
# Ticket Log selector
@select(
cls=ChannelSelect,
placeholder="TICKET_LOG_MENU_PLACEHOLDER",
min_values=0, max_values=1
)
async def ticket_log_menu(self, selection: discord.Interaction, selected: ChannelSelect):
"""
Single channel selector for the `ticket_log` setting.
"""
await selection.response.defer(thinking=True, ephemeral=True)
setting = self.get_instance(ModerationSettings.TicketLog)
await setting.interaction_check(setting.parent_id, selection)
setting.value = selected.values[0] if selected.values else None
await setting.write()
await selection.delete_original_response()
async def ticket_log_menu_refresh(self):
menu = self.ticket_log_menu
t = self.bot.translator.t
menu.placeholder = t(_p(
'ui:moderation_config|menu:ticket_log|placeholder',
"Select Ticket Log"
))
# Alert Channel selector
@select(
cls=ChannelSelect,
placeholder="ALERT_CHANNEL_MENU_PLACEHOLDER",
min_values=0, max_values=1
)
async def alert_channel_menu(self, selection: discord.Interaction, selected: ChannelSelect):
"""
Single channel selector for the `alert_channel` setting.
"""
await selection.response.defer(thinking=True, ephemeral=True)
setting = self.get_instance(ModerationSettings.AlertChannel)
await setting.interaction_check(setting.parent_id, selection)
setting.value = selected.values[0] if selected.values else None
await setting.write()
await selection.delete_original_response()
async def alert_channel_menu_refresh(self):
menu = self.alert_channel_menu
t = self.bot.translator.t
menu.placeholder = t(_p(
'ui:moderation_config|menu:alert_channel|placeholder',
"Select Alert Channel"
))
# Moderation Role Selector
@select(
cls=RoleSelect,
placeholder="MODROLE_MENU_PLACEHOLDER",
min_values=0, max_values=1
)
async def modrole_menu(self, selection: discord.Interaction, selected: RoleSelect):
"""
Single role selector for the `moderation_role` setting.
"""
await selection.response.defer(thinking=True, ephemeral=True)
setting = self.get_instance(ModerationSettings.ModRole)
await setting.interaction_check(setting.parent_id, selection)
setting.value = selected.values[0] if selected.values else None
await setting.write()
await selection.delete_original_response()
async def modrole_menu_refresh(self):
menu = self.modrole_menu
t = self.bot.translator.t
menu.placeholder = t(_p(
'ui:moderation_config|menu:modrole|placeholder',
"Select Moderator Role"
))
# Admin Role Selector
@select(
cls=RoleSelect,
placeholder="ADMINROLE_MENU_PLACEHOLDER",
min_values=0, max_values=1
)
async def adminrole_menu(self, selection: discord.Interaction, selected: RoleSelect):
"""
Single role selector for the `admin_role` setting.
"""
await selection.response.defer(thinking=True, ephemeral=True)
setting = self.get_instance(ModerationSettings.AdminRole)
await setting.interaction_check(setting.parent_id, selection)
setting.value = selected.values[0] if selected.values else None
await setting.write()
await selection.delete_original_response()
async def adminrole_menu_refresh(self):
menu = self.adminrole_menu
t = self.bot.translator.t
menu.placeholder = t(_p(
'ui:moderation_config|menu:adminrole|placeholder',
"Select Admin Role"
))
# ----- UI Flow -----
async def make_message(self) -> MessageArgs:
t = self.bot.translator.t
title = t(_p(
'ui:moderation_config|embed|title',
"Moderation Configuration Panel"
))
embed = discord.Embed(
title=title,
colour=discord.Colour.orange(),
)
for setting in self.instances:
embed.add_field(**setting.embed_field, inline=False)
return MessageArgs(embed=embed)
async def reload(self):
self.instances = [
await setting.get(self.guildid)
for setting in self.setting_classes
]
async def refresh_components(self):
component_refresh = (
self.edit_button_refresh(),
self.close_button_refresh(),
self.reset_button_refresh(),
self.ticket_log_menu_refresh(),
self.alert_channel_menu_refresh(),
self.modrole_menu_refresh(),
self.adminrole_menu_refresh(),
)
await asyncio.gather(*component_refresh)
self.set_layout(
(self.adminrole_menu,),
(self.modrole_menu,),
(self.ticket_log_menu,),
(self.alert_channel_menu,),
(self.edit_button, self.reset_button, self.close_button,)
)
class ModerationDashboard(DashboardSection):
section_name = _p(
"dash:moderation|title",
"Moderation Settings ({commands[admin config moderation]})"
)
_option_name = _p(
"dash:moderation|dropdown|placeholder",
"Moderation Panel"
)
configui = ModerationSettingUI
setting_classes = ModerationSettingUI.setting_classes