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

View File

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

View File

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