108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
import asyncio
|
|
|
|
import discord
|
|
from discord.ui.button import button, Button, ButtonStyle
|
|
from discord.ui.select import select, ChannelSelect
|
|
|
|
from meta import LionBot
|
|
|
|
from utils.ui import ConfigUI, DashboardSection
|
|
from utils.lib import MessageArgs
|
|
|
|
from .settings import RoomSettings
|
|
from . import babel
|
|
|
|
_p = babel._p
|
|
|
|
|
|
class RoomSettingUI(ConfigUI):
|
|
setting_classes = RoomSettings.model_settings
|
|
|
|
def __init__(self, bot: LionBot, guildid: int, channelid: int, **kwargs):
|
|
self.settings = bot.get_cog('RoomCog').settings
|
|
super().__init__(bot, guildid, channelid, **kwargs)
|
|
|
|
# ----- UI Components -----
|
|
@select(cls=ChannelSelect, channel_types=[discord.ChannelType.category],
|
|
min_values=0, max_values=1,
|
|
placeholder='CATEGORY_PLACEHOLDER')
|
|
async def category_menu(self, selection: discord.Interaction, selected: ChannelSelect):
|
|
await selection.response.defer()
|
|
setting = self.instances[0]
|
|
await setting.interaction_check(setting.parent_id, selection)
|
|
setting.value = selected.values[0] if selected.values else None
|
|
await setting.write()
|
|
|
|
async def category_menu_refresh(self):
|
|
self.category_menu.placeholder = self.bot.translator.t(_p(
|
|
'ui:room_config|menu:category|placeholder',
|
|
"Select Private Room Category"
|
|
))
|
|
|
|
@button(label="VISIBLE_BUTTON_PLACEHOLDER", style=ButtonStyle.grey)
|
|
async def visible_button(self, press: discord.Interaction, pressed: Button):
|
|
await press.response.defer()
|
|
setting = next(inst for inst in self.instances if inst.setting_id == RoomSettings.Visible.setting_id)
|
|
await setting.interaction_check(setting.parent_id, press)
|
|
setting.value = not setting.value
|
|
await setting.write()
|
|
|
|
async def visible_button_refresh(self):
|
|
button = self.visible_button
|
|
button.label = self.bot.translator.t(_p(
|
|
'ui:room_config|button:visible|label',
|
|
"Toggle Room Visibility"
|
|
))
|
|
setting = next(inst for inst in self.instances if inst.setting_id == RoomSettings.Visible.setting_id)
|
|
button.style = ButtonStyle.green if setting.value else ButtonStyle.grey
|
|
|
|
# ----- UI Flow -----
|
|
async def make_message(self) -> MessageArgs:
|
|
t = self.bot.translator.t
|
|
title = t(_p(
|
|
'ui:rooms_config|embed|title',
|
|
"Private Room System Configuration Panel"
|
|
))
|
|
embed = discord.Embed(
|
|
colour=discord.Colour.orange(),
|
|
title=title
|
|
)
|
|
for setting in self.instances:
|
|
embed.add_field(**setting.embed_field, inline=False)
|
|
|
|
args = MessageArgs(embed=embed)
|
|
return args
|
|
|
|
async def reload(self):
|
|
lguild = await self.bot.core.lions.fetch_guild(self.guildid)
|
|
self.instances = tuple(
|
|
lguild.config.get(setting.setting_id)
|
|
for setting in self.settings.model_settings
|
|
)
|
|
|
|
async def refresh_components(self):
|
|
await asyncio.gather(
|
|
self.category_menu_refresh(),
|
|
self.visible_button_refresh(),
|
|
self.edit_button_refresh(),
|
|
self.close_button_refresh(),
|
|
self.reset_button_refresh(),
|
|
)
|
|
self.set_layout(
|
|
(self.category_menu,),
|
|
(self.visible_button, self.edit_button, self.reset_button, self.close_button)
|
|
)
|
|
|
|
|
|
class RoomDashboard(DashboardSection):
|
|
section_name = _p(
|
|
'dash:rooms|title',
|
|
"Private Room Configuration ({commands[admin config rooms]})"
|
|
)
|
|
_option_name = _p(
|
|
"dash:economy|dropdown|placeholder",
|
|
"Private Room Panel"
|
|
)
|
|
configui = RoomSettingUI
|
|
setting_classes = RoomSettingUI.setting_classes
|