feat(economy): Implement starting_funds setting.

This commit is contained in:
2023-10-10 08:43:39 +03:00
parent aa29dd48be
commit 4e8eb366f3
5 changed files with 60 additions and 15 deletions

View File

@@ -150,7 +150,10 @@ class Lions(LionCog):
if (lmember := self.lion_members.get(key, None)) is None: 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) lguild = await self.fetch_guild(guildid, member.guild if member is not None else None)
luser = await self.fetch_user(userid, member) 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) lmember = LionMember(self.bot, data, lguild, luser, member)
self.lion_members[key] = lmember self.lion_members[key] = lmember
return lmember return lmember
@@ -182,8 +185,8 @@ class Lions(LionCog):
# Create any member rows that are still missing # Create any member rows that are still missing
if missing: if missing:
new_rows = await self.data.Member.table.insert_many( new_rows = await self.data.Member.table.insert_many(
('guildid', 'userid'), ('guildid', 'userid', 'coins'),
*missing *((gid, uid, lguilds[gid].config.get('starting_funds').value) for gid, uid in missing)
).with_adapter(self.data.Member._make_rows) ).with_adapter(self.data.Member._make_rows)
rows = itertools.chain(rows, new_rows) rows = itertools.chain(rows, new_rows)

View File

@@ -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.AllowTransfers)
self.bot.core.guild_config.register_model_setting(self.settings.CoinsPerXP) 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') configcog = self.bot.get_cog('ConfigCog')
if configcog is None: if configcog is None:
@@ -847,11 +848,13 @@ class Economy(LionCog):
) )
@appcmds.rename( @appcmds.rename(
allow_transfers=EconomySettings.AllowTransfers._display_name, 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( @appcmds.describe(
allow_transfers=EconomySettings.AllowTransfers._desc, allow_transfers=EconomySettings.AllowTransfers._desc,
coins_per_xp=EconomySettings.CoinsPerXP._desc coins_per_xp=EconomySettings.CoinsPerXP._desc,
starting_funds=EconomySettings.StartingFunds._desc,
) )
@appcmds.choices( @appcmds.choices(
allow_transfers=[ allow_transfers=[
@@ -863,7 +866,9 @@ class Economy(LionCog):
@moderator_ward @moderator_ward
async def configure_economy(self, ctx: LionContext, async def configure_economy(self, ctx: LionContext,
allow_transfers: Optional[appcmds.Choice[int]] = None, 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 t = self.bot.translator.t
if not ctx.interaction: if not ctx.interaction:
return return
@@ -872,6 +877,7 @@ class Economy(LionCog):
setting_allow_transfers = ctx.lguild.config.get('allow_transfers') setting_allow_transfers = ctx.lguild.config.get('allow_transfers')
setting_coins_per_xp = ctx.lguild.config.get('coins_per_xp') setting_coins_per_xp = ctx.lguild.config.get('coins_per_xp')
setting_starting_funds = ctx.lguild.config.get('starting_funds')
modified = [] modified = []
if allow_transfers is not None: if allow_transfers is not None:
@@ -882,6 +888,10 @@ class Economy(LionCog):
setting_coins_per_xp.data = coins_per_xp setting_coins_per_xp.data = coins_per_xp
await setting_coins_per_xp.write() await setting_coins_per_xp.write()
modified.append(setting_coins_per_xp) 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: if modified:
desc = '\n'.join(f"{conf.emojis.tick} {setting.update_message}" for setting in modified) desc = '\n'.join(f"{conf.emojis.tick} {setting.update_message}" for setting in modified)

View File

@@ -15,6 +15,7 @@ from meta.config import conf
from meta.sharding import THIS_SHARD from meta.sharding import THIS_SHARD
from meta.logger import log_wrap from meta.logger import log_wrap
from core.data import CoreData from core.data import CoreData
from core.setting_types import CoinSetting
from babel.translator import ctx_translator from babel.translator import ctx_translator
from . import babel, logger from . import babel, logger
@@ -29,7 +30,7 @@ class EconomySettings(SettingGroup):
coins_per_100xp coins_per_100xp
allow_transfers allow_transfers
""" """
class CoinsPerXP(ModelData, IntegerSetting): class CoinsPerXP(ModelData, CoinSetting):
setting_id = 'coins_per_xp' setting_id = 'coins_per_xp'
_display_name = _p('guildset:coins_per_xp', "coins_per_100xp") _display_name = _p('guildset:coins_per_xp', "coins_per_100xp")
@@ -111,3 +112,32 @@ class EconomySettings(SettingGroup):
coin=conf.emojis.coin coin=conf.emojis.coin
) )
return formatted 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)

View File

@@ -17,8 +17,9 @@ _p = babel._p
class EconomyConfigUI(ConfigUI): class EconomyConfigUI(ConfigUI):
setting_classes = ( setting_classes = (
EconomySettings.StartingFunds,
EconomySettings.CoinsPerXP, EconomySettings.CoinsPerXP,
EconomySettings.AllowTransfers EconomySettings.AllowTransfers,
) )
def __init__(self, bot: LionBot, def __init__(self, bot: LionBot,
@@ -44,11 +45,9 @@ class EconomyConfigUI(ConfigUI):
async def reload(self): async def reload(self):
lguild = await self.bot.core.lions.fetch_guild(self.guildid) lguild = await self.bot.core.lions.fetch_guild(self.guildid)
coins_per_xp = lguild.config.get(self.settings.CoinsPerXP.setting_id) self.instances = tuple(
allow_transfers = lguild.config.get(self.settings.AllowTransfers.setting_id) lguild.config.get(cls.setting_id)
self.instances = ( for cls in self.setting_classes
coins_per_xp,
allow_transfers
) )
async def refresh_components(self): async def refresh_components(self):
@@ -57,9 +56,9 @@ class EconomyConfigUI(ConfigUI):
self.close_button_refresh(), self.close_button_refresh(),
self.reset_button_refresh(), self.reset_button_refresh(),
) )
self._layout = [ self.set_layout(
(self.edit_button, self.reset_button, self.close_button), (self.edit_button, self.reset_button, self.close_button),
] )
class EconomyDashboard(DashboardSection): class EconomyDashboard(DashboardSection):

View File

@@ -108,6 +108,9 @@ class ConfigUI(LeoUI):
# Filter out settings which don't have input fields # Filter out settings which don't have input fields
items = [item for item in items if item][:5] items = [item for item in items if item][:5]
strings = [item.value for item in items] 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 = ConfigEditor(*items, title=t(self.edit_modal_title))
@modal.submit_callback() @modal.submit_callback()