rewrite: New private Room system.

This commit is contained in:
2023-05-23 17:49:37 +03:00
parent 4aa2587c45
commit f0dd540876
19 changed files with 2114 additions and 8 deletions

View File

@@ -0,0 +1,156 @@
from settings import ModelData
from settings.groups import SettingGroup
from settings.setting_types import ChannelSetting, IntegerSetting, BoolSetting
from meta import conf
from core.data import CoreData
from babel.translator import ctx_translator
from . import babel
_p = babel._p
class RoomSettings(SettingGroup):
class Category(ModelData, ChannelSetting):
setting_id = 'rooms_category'
_event = 'guildset_rooms_category'
_display_name = _p(
'guildset:room_category', "rooms_category"
)
_desc = _p(
'guildset:rooms_category|desc',
"Category in which to create private voice channels."
)
_long_desc = _p(
'guildset:room_category|long_desc',
"When a member uses `/room rent` to rent a new private room, "
"a private voice channel will be created under this category, "
"manageable by the member. "
"I must have permission to create new channels in this category, "
"as well as to manage permissions."
)
_model = CoreData.Guild
_column = CoreData.Guild.renting_category.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
value = self.value
if value is None:
# Shut down renting system
resp = t(_p(
'guildset:rooms_category|set_response:unset',
"The private room category has been unset. Existing private rooms will not be affected. "
"Delete the channels manually to remove the private rooms."
))
else:
resp = t(_p(
'guildset:rooms_category|set_response:set',
"Private room category has been set to {channel}. Existing private rooms will be moved."
)).format(channel=self.value.mention)
return resp
class Rent(ModelData, IntegerSetting):
setting_id = 'rooms_price'
_event = 'guildset_rooms_price'
_display_name = _p(
'guildset:rooms_price', "room_rent"
)
_desc = _p(
'guildset:rooms_rent|desc',
"Daily rent price for a private room."
)
_long_desc = _p(
'guildset:rooms_rent|long_desc',
"Members will be charged this many LionCoins for each day they rent a private room."
)
_default = 1000
_model = CoreData.Guild
_column = CoreData.Guild.renting_price.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
resp = t(_p(
'guildset:rooms_price|set_response',
"Private rooms will now cost {coin}**{amount}}** per 24 hours."
)).format(
coin=conf.emojis.coin,
amount=self.value
)
return resp
class MemberLimit(ModelData, IntegerSetting):
setting_id = 'rooms_slots'
_event = 'guildset_rooms_slots'
_display_name = _p('guildset:rooms_slots', "room_member_cap")
_desc = _p(
'guildset:rooms_slots|desc',
"Maximum number of members in each private room."
)
_long_desc = _p(
'guildset:rooms_slots|long_desc',
"Private room owners may invite other members to their private room via the UI, "
"or through the `/room invite` command. "
"This setting limits the maximum number of members a private room may hold."
)
_default = 25
_model = CoreData.Guild
_column = CoreData.Guild.renting_cap.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
resp = t(_p(
'guildset:rooms_slots|set_response',
"Private rooms are now capped to **{amount}** members."
)).format(amount=self.value)
return resp
class Visible(ModelData, BoolSetting):
setting_id = 'rooms_visible'
_event = 'guildset_rooms_visible'
_display_name = _p('guildset:rooms_visible', "room_visibility")
_desc = _p(
'guildset:rooms_visible|desc',
"Whether private rented rooms are visible to non-members."
)
_long_desc = _p(
'guildset:rooms_visible|long_desc',
"If enabled, new private rooms will be created with the `VIEW_CHANNEL` permission "
"enabled for the `@everyone` role."
)
_default = False
_model = CoreData.Guild
_column = CoreData.Guild.renting_visible.name
@property
def update_message(self) -> str:
t = ctx_translator.get().t
if self.value:
resp = t(_p(
'guildset:rooms_visible|set_response:enabled',
"Private rooms will now be visible to everyone."
))
else:
resp = t(_p(
'guildset:rooms_visible|set_response:disabled',
"Private rooms will now only be visible to their members (and admins)."
))
return resp
model_settings = (
Category,
Rent,
MemberLimit,
Visible,
)