Files
croccybot/src/modules/rolemenus/menuoptions.py

268 lines
9.0 KiB
Python

from typing import Optional
import discord
from meta.errors import UserInputError
from babel.translator import ctx_translator
from settings import ModelData
from settings.groups import SettingGroup, ModelConfig, SettingDotDict
from settings.setting_types import (
RoleSetting, BoolSetting, StringSetting, IntegerSetting, DurationSetting
)
from core.setting_types import MessageSetting
from .data import RoleMenuData
from . import babel
_p = babel._p
class RoleMenuConfig(ModelConfig):
settings = SettingDotDict()
_model_settings = set()
model = RoleMenuData.RoleMenu
@property
def name(self):
return self.get(RoleMenuOptions.Name.setting_id)
@property
def required_role(self):
return self.get(RoleMenuOptions.RequiredRole.setting_id)
@property
def sticky(self):
return self.get(RoleMenuOptions.Sticky.setting_id)
@property
def refunds(self):
return self.get(RoleMenuOptions.Refunds.setting_id)
@property
def obtainable(self):
return self.get(RoleMenuOptions.Obtainable.setting_id)
@property
def rawmessage(self):
return self.get(RoleMenuOptions.Message.setting_id)
class RoleMenuOptions(SettingGroup):
@RoleMenuConfig.register_model_setting
class Name(ModelData, StringSetting):
setting_id = 'name'
_display_name = _p('menuset:name', "name")
_desc = _p(
'menuset:name|desc',
"Brief name for this role menu."
)
_accepts = _desc
_long_desc = _p(
'menuset:name|long_desc',
"The role menu name is displayed when selecting the menu in commands, "
"and as the title of most default menu layouts."
)
_default = 'Untitled'
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.name.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
resp = t(_p(
'menuset:name|set_response',
"This role menu will now be called **{new_name}**."
)).format(new_name=value)
return resp
@RoleMenuConfig.register_model_setting
class Sticky(ModelData, BoolSetting):
setting_id = 'sticky'
_display_name = _p('menuset:sticky', "sticky_roles")
_desc = _p(
'menuset:sticky|desc',
"Whether the menu can be used to unequip roles."
)
_accepts = _desc
_long_desc = _p(
'menuset:sticky|long_desc',
"When enabled, members will not be able to remove equipped roles by selecting them in this menu. "
"Note that when disabled, "
"members will be able to unequip the menu roles even if they were not obtained from the menu."
)
_default = False
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.sticky.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value:
resp = t(_p(
'menuset:sticky|set_response:true',
"Members will no longer be able to remove roles with this menu."
))
else:
resp = t(_p(
'menuset:sticky|set_response:false',
"Members will now be able to remove roles with this menu."
))
return resp
@RoleMenuConfig.register_model_setting
class Refunds(ModelData, BoolSetting):
setting_id = 'refunds'
_display_name = _p('menuset:refunds', "refunds")
_desc = _p(
'menuset:refunds|desc',
"Whether removing a role will refund the purchase price for that role."
)
_accepts = _desc
_long_desc = _p(
'menuset:refunds|long_desc',
"When enabled, members who *purchased a role through this role menu* will obtain a full refund "
"when they remove the role through the menu.\n"
"**Refunds will only be given for roles purchased through the same menu.**\n"
"**The `sticky` option must be disabled to allow members to remove roles.**"
)
_default = True
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.refunds.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value:
resp = t(_p(
'menuset:refunds|set_response:true',
"Members will now be refunded when removing a role with this menu."
))
else:
resp = t(_p(
'menuset:refunds|set_response:false',
"Members will no longer be refunded when removing a role with this menu."
))
return resp
@RoleMenuConfig.register_model_setting
class Obtainable(ModelData, IntegerSetting):
setting_id = 'obtainable'
_display_name = _p('menuset:obtainable', "obtainable")
_desc = _p(
'menuset:obtainable|desc',
"The maximum number of roles equippable from this menu."
)
_accepts = _desc
_long_desc = _p(
'menuset:obtainable|long_desc',
"Members will not be able to obtain more than this number of roles from this menu. "
"This counts roles that were not obtained through the rolemenu system."
)
_notset_str = _p(
'menuset:obtainable|notset',
"Unlimited."
)
_default = None
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.obtainable.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value:
resp = t(_p(
'menuset:obtainable|set_response:set',
"Members will be able to select a maximum of **{value}** roles from this menu."
)).format(value=value)
else:
resp = t(_p(
'menuset:obtainable|set_response:unset',
"Members will be able to select any number of roles from this menu."
))
return resp
@RoleMenuConfig.register_model_setting
class RequiredRole(ModelData, RoleSetting):
setting_id = 'required_role'
_display_name = _p('menuset:required_role', "required_role")
_desc = _p(
'menuset:required_role|desc',
"Initial role required to use this menu."
)
_accepts = _desc
_long_desc = _p(
'menuset:required_role|long_desc',
"If set, only members who have the `required_role` will be able to obtain or remove roles using this menu."
)
_default = None
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.required_roleid.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value:
resp = t(_p(
'menuset:required_role|set_response:set',
"Members will need to have the {role} role to use this menu."
)).format(role=self.formatted)
else:
resp = t(_p(
'menuset:required_role|set_response:unset',
"Any member who can see the menu may use it."
))
return resp
@RoleMenuConfig.register_model_setting
class Message(ModelData, MessageSetting):
setting_id = 'message'
_display_name = _p('menuset:message', "custom_message")
_desc = _p(
'menuset:message|desc',
"Custom message data used to display the menu."
)
_long_desc = _p(
'menuset:message|long_desc',
"This setting determines the body of the menu message, "
"including the message content and the message embed(s). "
"While most easily modifiable through the `Edit Message` button, "
"raw JSON-formatted message data may also be uploaded via command."
)
_default = None
_model = RoleMenuData.RoleMenu
_column = RoleMenuData.RoleMenu.rawmessage.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value:
resp = t(_p(
'menuset:message|set_response:set',
"The role menu message has been set. Edit through the menu editor."
)).format(value=value.mention)
else:
resp = t(_p(
'menuset:message|set_response:unset',
"The role menu message has been unset. Select a template through the menu editor."
))
return resp