From 4e8eb366f375b22085a3c706877b0f35f7d6e473 Mon Sep 17 00:00:00 2001 From: Conatum Date: Tue, 10 Oct 2023 08:43:39 +0300 Subject: [PATCH] feat(economy): Implement starting_funds setting. --- src/core/lion.py | 9 ++++++--- src/modules/economy/cog.py | 16 +++++++++++++--- src/modules/economy/settings.py | 32 +++++++++++++++++++++++++++++++- src/modules/economy/settingui.py | 15 +++++++-------- src/utils/ui/config.py | 3 +++ 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/core/lion.py b/src/core/lion.py index 0531a84c..5e695d88 100644 --- a/src/core/lion.py +++ b/src/core/lion.py @@ -150,7 +150,10 @@ class Lions(LionCog): if (lmember := self.lion_members.get(key, None)) is None: lguild = await self.fetch_guild(guildid, member.guild if member is not None else None) luser = await self.fetch_user(userid, member) - data = await self.data.Member.fetch_or_create(guildid, userid) + data = await self.data.Member.fetch_or_create( + guildid, userid, + coins=lguild.config.get('starting_funds').value + ) lmember = LionMember(self.bot, data, lguild, luser, member) self.lion_members[key] = lmember return lmember @@ -182,8 +185,8 @@ class Lions(LionCog): # Create any member rows that are still missing if missing: new_rows = await self.data.Member.table.insert_many( - ('guildid', 'userid'), - *missing + ('guildid', 'userid', 'coins'), + *((gid, uid, lguilds[gid].config.get('starting_funds').value) for gid, uid in missing) ).with_adapter(self.data.Member._make_rows) rows = itertools.chain(rows, new_rows) diff --git a/src/modules/economy/cog.py b/src/modules/economy/cog.py index 9e72e4ce..cb7a37e9 100644 --- a/src/modules/economy/cog.py +++ b/src/modules/economy/cog.py @@ -56,6 +56,7 @@ class Economy(LionCog): self.bot.core.guild_config.register_model_setting(self.settings.AllowTransfers) self.bot.core.guild_config.register_model_setting(self.settings.CoinsPerXP) + self.bot.core.guild_config.register_model_setting(self.settings.StartingFunds) configcog = self.bot.get_cog('ConfigCog') if configcog is None: @@ -847,11 +848,13 @@ class Economy(LionCog): ) @appcmds.rename( allow_transfers=EconomySettings.AllowTransfers._display_name, - coins_per_xp=EconomySettings.CoinsPerXP._display_name + coins_per_xp=EconomySettings.CoinsPerXP._display_name, + starting_funds=EconomySettings.StartingFunds._display_name, ) @appcmds.describe( allow_transfers=EconomySettings.AllowTransfers._desc, - coins_per_xp=EconomySettings.CoinsPerXP._desc + coins_per_xp=EconomySettings.CoinsPerXP._desc, + starting_funds=EconomySettings.StartingFunds._desc, ) @appcmds.choices( allow_transfers=[ @@ -863,7 +866,9 @@ class Economy(LionCog): @moderator_ward async def configure_economy(self, ctx: LionContext, allow_transfers: Optional[appcmds.Choice[int]] = None, - coins_per_xp: Optional[appcmds.Range[int, 0, 2**15]] = None): + coins_per_xp: Optional[appcmds.Range[int, 0, MAX_COINS]] = None, + starting_funds: Optional[appcmds.Range[int, 0, MAX_COINS]] = None, + ): t = self.bot.translator.t if not ctx.interaction: return @@ -872,6 +877,7 @@ class Economy(LionCog): setting_allow_transfers = ctx.lguild.config.get('allow_transfers') setting_coins_per_xp = ctx.lguild.config.get('coins_per_xp') + setting_starting_funds = ctx.lguild.config.get('starting_funds') modified = [] if allow_transfers is not None: @@ -882,6 +888,10 @@ class Economy(LionCog): setting_coins_per_xp.data = coins_per_xp await setting_coins_per_xp.write() modified.append(setting_coins_per_xp) + if starting_funds is not None: + setting_starting_funds.data = starting_funds + await setting_starting_funds.write() + modified.append(setting_starting_funds) if modified: desc = '\n'.join(f"{conf.emojis.tick} {setting.update_message}" for setting in modified) diff --git a/src/modules/economy/settings.py b/src/modules/economy/settings.py index 4d1fb815..076710d4 100644 --- a/src/modules/economy/settings.py +++ b/src/modules/economy/settings.py @@ -15,6 +15,7 @@ from meta.config import conf from meta.sharding import THIS_SHARD from meta.logger import log_wrap from core.data import CoreData +from core.setting_types import CoinSetting from babel.translator import ctx_translator from . import babel, logger @@ -29,7 +30,7 @@ class EconomySettings(SettingGroup): coins_per_100xp allow_transfers """ - class CoinsPerXP(ModelData, IntegerSetting): + class CoinsPerXP(ModelData, CoinSetting): setting_id = 'coins_per_xp' _display_name = _p('guildset:coins_per_xp', "coins_per_100xp") @@ -111,3 +112,32 @@ class EconomySettings(SettingGroup): coin=conf.emojis.coin ) return formatted + + class StartingFunds(ModelData, CoinSetting): + setting_id = 'starting_funds' + + _display_name = _p('guildset:starting_funds', "starting_funds") + _desc = _p( + 'guildset:starting_funds|desc', + "How many LionCoins should a member start with." + ) + _long_desc = _p( + 'guildset:starting_funds|long_desc', + "Members will be given this number of coins when they first interact with me, or first join the server." + ) + _accepts = _p( + 'guildset:starting_funds|accepts', + "Number of coins to give to new members." + ) + _default = 0 + + _model = CoreData.Guild + _column = CoreData.Guild.starting_funds.name + + @property + def update_message(self): + t = ctx_translator.get().t + return t(_p( + 'guildset:starting_funds|set_response', + "New members will now start with {amount}" + )).format(amount=self.formatted) diff --git a/src/modules/economy/settingui.py b/src/modules/economy/settingui.py index 16254d1a..f357d6e5 100644 --- a/src/modules/economy/settingui.py +++ b/src/modules/economy/settingui.py @@ -17,8 +17,9 @@ _p = babel._p class EconomyConfigUI(ConfigUI): setting_classes = ( + EconomySettings.StartingFunds, EconomySettings.CoinsPerXP, - EconomySettings.AllowTransfers + EconomySettings.AllowTransfers, ) def __init__(self, bot: LionBot, @@ -44,11 +45,9 @@ class EconomyConfigUI(ConfigUI): async def reload(self): lguild = await self.bot.core.lions.fetch_guild(self.guildid) - coins_per_xp = lguild.config.get(self.settings.CoinsPerXP.setting_id) - allow_transfers = lguild.config.get(self.settings.AllowTransfers.setting_id) - self.instances = ( - coins_per_xp, - allow_transfers + self.instances = tuple( + lguild.config.get(cls.setting_id) + for cls in self.setting_classes ) async def refresh_components(self): @@ -57,9 +56,9 @@ class EconomyConfigUI(ConfigUI): self.close_button_refresh(), self.reset_button_refresh(), ) - self._layout = [ + self.set_layout( (self.edit_button, self.reset_button, self.close_button), - ] + ) class EconomyDashboard(DashboardSection): diff --git a/src/utils/ui/config.py b/src/utils/ui/config.py index 59dd4a98..e1567e1f 100644 --- a/src/utils/ui/config.py +++ b/src/utils/ui/config.py @@ -108,6 +108,9 @@ class ConfigUI(LeoUI): # Filter out settings which don't have input fields items = [item for item in items if item][:5] strings = [item.value for item in items] + if not items: + raise ValueError("Cannot make Config edit modal with no editable instances.") + modal = ConfigEditor(*items, title=t(self.edit_modal_title)) @modal.submit_callback()