feat(*): 多次培育时顺序循环使用偶像 & 优化 UI

1. 当指定了多个培育偶像时,按照设置顺序依次培育
2. 在 Gradio UI 的设置项目中加入了解释文本
This commit is contained in:
XcantloadX 2025-02-06 21:40:24 +08:00
parent 4154c5541e
commit 432823755f
3 changed files with 79 additions and 37 deletions

View File

@ -1,7 +1,7 @@
from typing import Literal, Dict
from enum import IntEnum, Enum
from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict
from kotonebot import config
@ -216,8 +216,10 @@ class DailyMoneyShopItems(IntEnum):
case _:
raise ValueError(f"Unknown daily shop item: {self}")
class ConfigBaseModel(BaseModel):
model_config = ConfigDict(use_attribute_docstrings=True)
class PurchaseConfig(BaseModel):
class PurchaseConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用商店购买"""
money_enabled: bool = False
@ -238,17 +240,17 @@ class PurchaseConfig(BaseModel):
"""AP商店要购买的物品"""
class ActivityFundsConfig(BaseModel):
class ActivityFundsConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用收取活动费"""
class PresentsConfig(BaseModel):
class PresentsConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用收取礼物"""
class AssignmentConfig(BaseModel):
class AssignmentConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用工作"""
@ -263,12 +265,11 @@ class AssignmentConfig(BaseModel):
"""OnlineLive 工作时长"""
class ContestConfig(BaseModel):
class ContestConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用竞赛"""
class ProduceConfig(BaseModel):
class ProduceConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用培育"""
mode: Literal['regular'] = 'regular'
@ -276,7 +277,10 @@ class ProduceConfig(BaseModel):
produce_count: int = 1
"""培育的次数。"""
idols: list[PIdol] = []
"""要培育的偶像。将会按顺序循环选择培育。"""
"""
要培育的偶像将会按顺序循环选择培育
若未选择任何偶像则使用游戏默认选择的偶像为上次培育偶像
"""
memory_sets: list[int] = []
"""要使用的回忆编成编号,从 1 开始。将会按顺序循环选择使用。"""
support_card_sets: list[int] = []
@ -294,12 +298,12 @@ class ProduceConfig(BaseModel):
"""是否关注租借了支援卡的制作人。"""
class MissionRewardConfig(BaseModel):
class MissionRewardConfig(ConfigBaseModel):
enabled: bool = False
"""是否启用领取任务奖励"""
class BaseConfig(BaseModel):
class BaseConfig(ConfigBaseModel):
purchase: PurchaseConfig = PurchaseConfig()
"""商店购买配置"""
@ -327,3 +331,6 @@ def conf() -> BaseConfig:
"""获取当前配置数据"""
c = config.to(BaseConfig).current
return c.options
if __name__ == '__main__':
print(PurchaseConfig.model_fields['money_refresh_on'].description)

View File

@ -1,6 +1,9 @@
import logging
from itertools import cycle
from typing import Optional
from kotonebot.ui import user
from . import R
from .common import conf, PIdol
from .actions.loading import wait_loading_end
@ -167,20 +170,29 @@ def do_produce(idol: PIdol | None = None):
hajime_regular()
@task('培育')
def produce_task(count: Optional[int] = None):
def produce_task(count: Optional[int] = None, idols: Optional[list[PIdol]] = None):
"""
培育任务
:param count:
培育次数若为 None则从配置文件中读入
:param idols:
要培育的偶像若为 None则从配置文件中读入
"""
import time
if count is None:
count = conf().produce.produce_count
if idols is None:
idols = conf().produce.idols
# 数据验证
if count < 0:
user.warning('培育次数不能小于 0。将跳过本次培育。')
return
idol_iterator = cycle(idols)
for _ in range(count):
start_time = time.time()
do_produce()
do_produce(next(idol_iterator))
end_time = time.time()
logger.info(f"Produce time used: {format_time(end_time - start_time)}")

View File

@ -224,12 +224,14 @@ class KotoneBotUI:
gr.Markdown("### 商店购买设置")
purchase_enabled = gr.Checkbox(
label="启用商店购买",
value=self.current_config.options.purchase.enabled
value=self.current_config.options.purchase.enabled,
info=PurchaseConfig.model_fields['enabled'].description
)
with gr.Group(visible=self.current_config.options.purchase.enabled) as purchase_group:
money_enabled = gr.Checkbox(
label="启用金币购买",
value=self.current_config.options.purchase.money_enabled
value=self.current_config.options.purchase.money_enabled,
info=PurchaseConfig.model_fields['money_enabled'].description
)
# 添加金币商店商品选择
@ -237,12 +239,14 @@ class KotoneBotUI:
multiselect=True,
choices=list(DailyMoneyShopItems.all()),
value=self.current_config.options.purchase.money_items,
label="金币商店购买物品"
label="金币商店购买物品",
info=PurchaseConfig.model_fields['money_items'].description
)
ap_enabled = gr.Checkbox(
label="启用AP购买",
value=self.current_config.options.purchase.ap_enabled
value=self.current_config.options.purchase.ap_enabled,
info=PurchaseConfig.model_fields['ap_enabled'].description
)
# 转换枚举值为显示文本
@ -262,7 +266,8 @@ class KotoneBotUI:
multiselect=True,
choices=list(ap_items_map.values()),
value=selected_items,
label="AP商店购买物品"
label="AP商店购买物品",
info=PurchaseConfig.model_fields['ap_items'].description
)
purchase_enabled.change(
@ -277,31 +282,36 @@ class KotoneBotUI:
gr.Markdown("### 工作设置")
assignment_enabled = gr.Checkbox(
label="启用工作",
value=self.current_config.options.assignment.enabled
value=self.current_config.options.assignment.enabled,
info=AssignmentConfig.model_fields['enabled'].description
)
with gr.Group(visible=self.current_config.options.assignment.enabled) as work_group:
with gr.Row():
with gr.Column():
mini_live_reassign = gr.Checkbox(
label="启用重新分配 MiniLive",
value=self.current_config.options.assignment.mini_live_reassign_enabled
value=self.current_config.options.assignment.mini_live_reassign_enabled,
info=AssignmentConfig.model_fields['mini_live_reassign_enabled'].description
)
mini_live_duration = gr.Dropdown(
choices=[4, 6, 12],
value=self.current_config.options.assignment.mini_live_duration,
label="MiniLive 工作时长",
interactive=True
interactive=True,
info=AssignmentConfig.model_fields['mini_live_duration'].description
)
with gr.Column():
online_live_reassign = gr.Checkbox(
label="启用重新分配 OnlineLive",
value=self.current_config.options.assignment.online_live_reassign_enabled
value=self.current_config.options.assignment.online_live_reassign_enabled,
info=AssignmentConfig.model_fields['online_live_reassign_enabled'].description
)
online_live_duration = gr.Dropdown(
choices=[4, 6, 12],
value=self.current_config.options.assignment.online_live_duration,
label="OnlineLive 工作时长",
interactive=True
interactive=True,
info=AssignmentConfig.model_fields['online_live_duration'].description
)
assignment_enabled.change(
@ -316,19 +326,22 @@ class KotoneBotUI:
gr.Markdown("### 培育设置")
produce_enabled = gr.Checkbox(
label="启用培育",
value=self.current_config.options.produce.enabled
value=self.current_config.options.produce.enabled,
info=ProduceConfig.model_fields['enabled'].description
)
with gr.Group(visible=self.current_config.options.produce.enabled) as produce_group:
produce_mode = gr.Dropdown(
choices=["regular"],
value=self.current_config.options.produce.mode,
label="培育模式"
label="培育模式",
info=ProduceConfig.model_fields['mode'].description
)
produce_count = gr.Number(
minimum=1,
value=self.current_config.options.produce.produce_count,
label="培育次数",
interactive=True
interactive=True,
info=ProduceConfig.model_fields['produce_count'].description
)
# 添加偶像选择
idol_choices = [idol.name for idol in PIdol]
@ -338,27 +351,33 @@ class KotoneBotUI:
value=selected_idols,
label="选择要培育的偶像",
multiselect=True,
interactive=True
interactive=True,
info=ProduceConfig.model_fields['idols'].description
)
auto_set_memory = gr.Checkbox(
label="自动编成回忆",
value=self.current_config.options.produce.auto_set_memory
value=self.current_config.options.produce.auto_set_memory,
info=ProduceConfig.model_fields['auto_set_memory'].description
)
auto_set_support = gr.Checkbox(
label="自动编成支援卡",
value=self.current_config.options.produce.auto_set_support_card
value=self.current_config.options.produce.auto_set_support_card,
info=ProduceConfig.model_fields['auto_set_support_card'].description
)
use_pt_boost = gr.Checkbox(
label="使用支援强化 Pt 提升",
value=self.current_config.options.produce.use_pt_boost
value=self.current_config.options.produce.use_pt_boost,
info=ProduceConfig.model_fields['use_pt_boost'].description
)
use_note_boost = gr.Checkbox(
label="使用笔记数提升",
value=self.current_config.options.produce.use_note_boost
value=self.current_config.options.produce.use_note_boost,
info=ProduceConfig.model_fields['use_note_boost'].description
)
follow_producer = gr.Checkbox(
label="关注租借了支援卡的制作人",
value=self.current_config.options.produce.follow_producer
value=self.current_config.options.produce.follow_producer,
info=ProduceConfig.model_fields['follow_producer'].description
)
produce_enabled.change(
@ -398,7 +417,8 @@ class KotoneBotUI:
gr.Markdown("### 活动费设置")
activity_funds = gr.Checkbox(
label="启用收取活动费",
value=self.current_config.options.activity_funds.enabled
value=self.current_config.options.activity_funds.enabled,
info=ActivityFundsConfig.model_fields['enabled'].description
)
# 礼物设置
@ -406,7 +426,8 @@ class KotoneBotUI:
gr.Markdown("### 礼物设置")
presents = gr.Checkbox(
label="启用收取礼物",
value=self.current_config.options.presents.enabled
value=self.current_config.options.presents.enabled,
info=PresentsConfig.model_fields['enabled'].description
)
# 工作设置
@ -417,7 +438,8 @@ class KotoneBotUI:
gr.Markdown("### 竞赛设置")
contest = gr.Checkbox(
label="启用竞赛",
value=self.current_config.options.contest.enabled
value=self.current_config.options.contest.enabled,
info=ContestConfig.model_fields['enabled'].description
)
# 培育设置
@ -428,7 +450,8 @@ class KotoneBotUI:
gr.Markdown("### 任务奖励设置")
mission_reward = gr.Checkbox(
label="启用领取任务奖励",
value=self.current_config.options.mission_reward.enabled
value=self.current_config.options.mission_reward.enabled,
info=MissionRewardConfig.model_fields['enabled'].description
)
save_btn = gr.Button("保存设置")