🐛 修复Web UI中配置项修改后不生效的问题,优化UID记录逻辑

This commit is contained in:
CMHopeSunshine 2022-11-07 18:50:54 +08:00
parent c8c0ed4b7a
commit 4375a835e1
12 changed files with 185 additions and 142 deletions

View File

@ -1,4 +1,2 @@
from .config.manage import ConfigManager, ConfigModel
from .config.manage import ConfigManager, ConfigModel, config
from .plugin.manage import PluginManager, HIDDEN_PLUGINS, MatcherInfo, PluginInfo
config = ConfigManager.config

View File

@ -25,8 +25,13 @@ class ConfigManager:
value = value in ['', 'true', 'on']
elif config_name != 'CookieWeb地址' and not value.isdigit():
return '配置项不合法,必须为数字'
temp = cls.config.dict(by_alias=True)
temp[config_name] = value
cls.config = ConfigModel.parse_obj(temp)
save_yaml(cls.config.dict(by_alias=True), PAIMON_CONFIG)
cls.config.update(config_name=value)
cls.save()
return f'成功设置{config_name}{value}'
@classmethod
def save(cls):
save_yaml(cls.config.dict(by_alias=True), PAIMON_CONFIG)
config = ConfigManager.config

View File

@ -41,3 +41,14 @@ class ConfigModel(BaseModel):
admin_enable: bool = Field(True, alias='启用Web端')
admin_password: str = Field('admin', alias='Web端管理员密码')
secret_key: str = Field('49c294d32f69b732ef6447c18379451ce1738922a75cd1d4812ef150318a2ed0', alias='Web端token密钥')
@property
def alias_dict(self):
return {v.alias: k for k, v in self.__fields__.items()}
def update(self, **kwargs):
for key, value in kwargs.items():
if key in self.__fields__:
self.__setattr__(key, value)
elif key in self.alias_dict:
self.__setattr__(self.alias_dict[key], value)

View File

@ -58,7 +58,7 @@
"10000070": ["妮露", "舞女"],
"10000071": ["赛诺", "风纪官"],
"10000072": ["坎蒂丝", "潘森"],
"10000073": ["纳西妲", "草神", "艹神", "小草王", "小吉祥草王", "草萝莉", "艹萝莉"],
"10000073": ["纳西妲", "草神", "艹神", "小草王", "小吉祥草王", "草萝莉", "艹萝莉", "羽毛球"],
"10000074": ["莱依拉", "莱伊拉"],
"10000075": ["散兵", "伞兵", "国崩", "卢本伟", "大炮", "sb", "流浪者"],
"10000103": ["迪希雅"],

View File

@ -58,6 +58,21 @@ class LastQuery(Model):
table = 'last_query'
table_description = '用户最后查询的uid'
@classmethod
async def update_last_query(cls, user_id: str, uid: str):
"""
更新用户最后查询的uid
:param user_id: 用户id
:param uid: 原神uid
"""
if await PrivateCookie.filter(user_id=user_id).exists():
if await PrivateCookie.filter(user_id=user_id, uid=uid).exists():
await LastQuery.update_or_create(user_id=user_id,
defaults={'uid': uid, 'last_time': datetime.datetime.now()})
else:
await LastQuery.update_or_create(user_id=user_id,
defaults={'uid': uid, 'last_time': datetime.datetime.now()})
class CookieCache(Model):
"""

View File

@ -1,5 +1,5 @@
import datetime
from collections import defaultdict
from collections import Counter
from typing import Dict, Any, Tuple
import pytz
@ -33,7 +33,6 @@ async def get_group_avatar(group_id: str):
return PMImage(size=(110, 110), color=(255, 255, 255, 255))
async def get_statistics(group_id: int):
if not (info_list := await AbyssInfo.all()):
return '本群还没有深渊战斗数据哦!'
@ -99,10 +98,10 @@ async def get_statistics(group_id: int):
} for info in max_take_damage[:3]
]
# 11、12层阵容
battle_characters_up11 = defaultdict(lambda: 0)
battle_characters_down11 = defaultdict(lambda: 0)
battle_characters_up12 = defaultdict(lambda: 0)
battle_characters_down12 = defaultdict(lambda: 0)
battle_characters_up11 = Counter()
battle_characters_down11 = Counter()
battle_characters_up12 = Counter()
battle_characters_down12 = Counter()
for info in info_list:
if floor11 := info.floors.get(11):
for battles in floor11.battles_up:
@ -118,10 +117,10 @@ async def get_statistics(group_id: int):
for battles in floor12.battles_down:
for character in battles.characters:
battle_characters_down12[f'{character.icon}-{character.rarity}'] += 1
data['11层上半'] = sorted(battle_characters_up11.items(), key=lambda x: x[1], reverse=True)[:4]
data['11层下半'] = sorted(battle_characters_down11.items(), key=lambda x: x[1], reverse=True)[:4]
data['12层上半'] = sorted(battle_characters_up12.items(), key=lambda x: x[1], reverse=True)[:4]
data['12层下半'] = sorted(battle_characters_down12.items(), key=lambda x: x[1], reverse=True)[:4]
data['11层上半'] = battle_characters_up11.most_common(4)
data['11层下半'] = battle_characters_down11.most_common(4)
data['12层上半'] = battle_characters_up12.most_common(4)
data['12层下半'] = battle_characters_down12.most_common(4)
return await draw_statistics_img(data)
@ -143,26 +142,32 @@ async def draw_statistics_img(data: Dict[str, Any]):
1033, 195, fm.get('bahnschrift_regular.ttf', 30), '#8c4c2e', 'right')
await img.text(str(data['总人数']), (233, 352), 296, fm.get('bahnschrift_regular.ttf', 48), '#040404', 'center')
await img.text(str(data['平均星数']), (492, 586), 296, fm.get('bahnschrift_regular.ttf', 48), '#040404', 'center')
await img.text(str(data['平均战斗次数']), (698, 840), 296, fm.get('bahnschrift_regular.ttf', 48), '#040404', 'center')
await img.text(str(data['平均战斗次数']), (698, 840), 296, fm.get('bahnschrift_regular.ttf', 48), '#040404',
'center')
# 满星人数
full_num = [data['满星人数'] / data['总人数'], 1 - data['满星人数'] / data['总人数']]
now_used_width = 36
if full_num[0] > 0.03:
await img.draw_rectangle((now_used_width, 402, now_used_width + int(1007 * full_num[0]), 449), '#b6d6f2')
await img.text(str(data['满星人数']), now_used_width + 18, 413, fm.get('bahnschrift_regular.ttf', 30), '#3d6e99')
await img.text(str(data['满星人数']), now_used_width + 18, 413, fm.get('bahnschrift_regular.ttf', 30),
'#3d6e99')
now_used_width += int(1007 * full_num[0])
if full_num[1] > 0.03:
await img.draw_rectangle((now_used_width, 402, now_used_width + int(1007 * full_num[1]), 449), '#c8b6f2')
await img.text(str(data['总人数'] - data['满星人数']), now_used_width + 18, 413, fm.get('bahnschrift_regular.ttf', 30), '#593d99')
await img.text(str(data['总人数'] - data['满星人数']), now_used_width + 18, 413,
fm.get('bahnschrift_regular.ttf', 30), '#593d99')
# 最高伤害
await img.paste(box[f'{data["最高伤害"][0]["稀有度"]}big'], (39, 512))
await img.paste(box[f'{data["最高伤害"][1]["稀有度"]}small'], (39, 664))
await img.paste(box[f'{data["最高伤害"][2]["稀有度"]}small'], (296, 664))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][0]["图标"]}.png', size=(124, 124)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][0]["图标"]}.png', size=(124, 124)),
(44, 525))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][1]["图标"]}.png', size=(82, 82)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][1]["图标"]}.png', size=(82, 82)),
(45, 673))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][2]["图标"]}.png', size=(82, 82)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高伤害"][2]["图标"]}.png', size=(82, 82)),
(300, 673))
await img.paste(await get_user_avatar(data['最高伤害'][0]['qq号']), (112, 588))
await img.paste(await get_user_avatar(data['最高伤害'][1]['qq号'], (42, 42)), (87, 713))
@ -181,11 +186,14 @@ async def draw_statistics_img(data: Dict[str, Any]):
await img.paste(box[f'{data["最高承受伤害"][0]["稀有度"]}big'], (554, 512))
await img.paste(box[f'{data["最高承受伤害"][1]["稀有度"]}small'], (552, 664))
await img.paste(box[f'{data["最高承受伤害"][2]["稀有度"]}small'], (808, 664))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][0]["图标"]}.png', size=(124, 124)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][0]["图标"]}.png', size=(124, 124)),
(560, 525))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][1]["图标"]}.png', size=(82, 82)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][1]["图标"]}.png', size=(82, 82)),
(557, 673))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][2]["图标"]}.png', size=(82, 82)),
await img.paste(
await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{data["最高承受伤害"][2]["图标"]}.png', size=(82, 82)),
(815, 673))
await img.paste(await get_user_avatar(data['最高承受伤害'][0]['qq号']), (623, 588))
await img.paste(await get_user_avatar(data['最高承受伤害'][1]['qq号'], (42, 42)), (600, 713))
@ -204,33 +212,43 @@ async def draw_statistics_img(data: Dict[str, Any]):
# 角色出场率
for i in range(4):
try:
icon, rarity, count = data['11层上半'][i][0].split('-')[0], data['11层上半'][i][0].split('-')[1], data['11层上半'][i][1]
icon, rarity, count = data['11层上半'][i][0].split('-')[0], data['11层上半'][i][0].split('-')[1], \
data['11层上半'][i][1]
await img.paste(box[f'{rarity}bg'], (182 + i * 101, 867))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)), (182 + i * 101, 867))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)),
(182 + i * 101, 867))
await img.paste(tag, (236 + i * 101, 942))
await img.text(str(count), (236 + i * 101, 277 + i * 101), 943, fm.get('bahnschrift_regular.ttf', 19), 'white', 'center')
await img.text(str(count), (236 + i * 101, 277 + i * 101), 943, fm.get('bahnschrift_regular.ttf', 19),
'white', 'center')
icon, rarity, count = data['11层下半'][i][0].split('-')[0], data['11层下半'][i][0].split('-')[1], data['11层下半'][i][1]
icon, rarity, count = data['11层下半'][i][0].split('-')[0], data['11层下半'][i][0].split('-')[1], \
data['11层下半'][i][1]
await img.paste(box[f'{rarity}bg'], (642 + i * 101, 867))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)), (642 + i * 101, 867))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)),
(642 + i * 101, 867))
await img.paste(tag, (696 + i * 101, 942))
await img.text(str(count), (696 + i * 101, 737 + i * 101), 943, fm.get('bahnschrift_regular.ttf', 19), 'white', 'center')
await img.text(str(count), (696 + i * 101, 737 + i * 101), 943, fm.get('bahnschrift_regular.ttf', 19),
'white', 'center')
icon, rarity, count = data['12层上半'][i][0].split('-')[0], data['12层上半'][i][0].split('-')[1], data['12层上半'][i][1]
icon, rarity, count = data['12层上半'][i][0].split('-')[0], data['12层上半'][i][0].split('-')[1], \
data['12层上半'][i][1]
await img.paste(box[f'{rarity}bg'], (182 + i * 101, 983))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)), (182 + i * 101, 983))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)),
(182 + i * 101, 983))
await img.paste(tag, (236 + i * 101, 1058))
await img.text(str(count), (236 + i * 101, 278 + i * 101), 1059, fm.get('bahnschrift_regular.ttf', 19), 'white', 'center')
await img.text(str(count), (236 + i * 101, 278 + i * 101), 1059, fm.get('bahnschrift_regular.ttf', 19),
'white', 'center')
icon, rarity, count = data['12层下半'][i][0].split('-')[0], data['12层下半'][i][0].split('-')[1], data['12层下半'][i][1]
icon, rarity, count = data['12层下半'][i][0].split('-')[0], data['12层下半'][i][0].split('-')[1], \
data['12层下半'][i][1]
await img.paste(box[f'{rarity}bg'], (642 + i * 101, 983))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)), (642 + i * 101, 983))
await img.paste(await load_image(RESOURCE_BASE_PATH / 'avatar' / f'{icon}.png', size=(95, 95)),
(642 + i * 101, 983))
await img.paste(tag, (696 + i * 101, 1058))
await img.text(str(count), (696 + i * 101, 737 + i * 101), 1059, fm.get('bahnschrift_regular.ttf', 19), 'white', 'center')
await img.text(str(count), (696 + i * 101, 737 + i * 101), 1059, fm.get('bahnschrift_regular.ttf', 19),
'white', 'center')
i += 1
except IndexError:
pass
return MessageBuild.Image(img, mode='RGB', quality=80)

View File

@ -10,7 +10,7 @@ from nonebot.adapters.onebot.v11 import Message
from nonebot.params import CommandArg, Depends
from LittlePaimon.config import config
from LittlePaimon.database import DailyNoteSub, Player
from LittlePaimon.database import DailyNoteSub, Player, LastQuery
from LittlePaimon.utils import logger, scheduler
from LittlePaimon.utils.api import get_mihoyo_private_data
from .draw import draw_daily_note_card
@ -46,6 +46,7 @@ async def get_subs(**kwargs) -> str:
async def handle_ssbq(player: Player):
await LastQuery.update_last_query(player.user_id, player.uid)
data = await get_mihoyo_private_data(player.uid, player.user_id, 'daily_note')
if isinstance(data, str):
logger.info('原神实时便签', '', {'用户': player.user_id, 'UID': player.uid}, f'获取数据失败, {data}', False)
@ -77,17 +78,12 @@ async def handle_ssbq(player: Player):
async def check_note():
if not config.ssbq_enable:
return
# 0点到6点间不做检查
# 特定时间段不做检查
if config.ssbq_begin <= datetime.datetime.now().hour <= config.ssbq_end:
return
t = time.time()
try:
subs = await DailyNoteSub.all()
except Exception as e:
logger.info('原神实时便签', '获取检查列表时<r>出错</r>,结束任务')
return
if not subs:
if not (subs := await DailyNoteSub.all()):
return
time_now = time.time()
logger.info('原神实时便签', f'开始执行定时检查,共<m>{len(subs)}</m>个任务,预计花费<m>{round(6 * len(subs) / 60, 2)}</m>分钟')
for sub in subs:
limit_num = 5 if sub.resin_num and sub.coin_num else 3
@ -138,4 +134,4 @@ async def check_note():
logger.info('原神实时便签', '➤➤', {'用户': sub.user_id, 'UID': sub.uid}, f'发送提醒失败,{e}', False)
# 等待一会再检查下一个,防止检查过快
await asyncio.sleep(random.randint(4, 8))
logger.info('原神实时便签', f'树脂检查完成,共花费<m>{round((time.time() - t) / 60, 2)}</m>分钟')
logger.info('原神实时便签', f'树脂检查完成,共花费<m>{round((time.time() - time_now) / 60, 2)}</m>分钟')

View File

@ -9,7 +9,7 @@ from nonebot.adapters.onebot.v11 import GroupUploadNoticeEvent, NoticeEvent
from nonebot.rule import Rule
from LittlePaimon import __version__
from LittlePaimon.database import PlayerInfo
from LittlePaimon.database import PlayerInfo, LastQuery
from LittlePaimon.utils import logger
from LittlePaimon.utils.requests import aiorequests
from LittlePaimon.utils.api import get_authkey_by_stoken
@ -118,6 +118,7 @@ async def get_gacha_log_data(user_id: str, uid: str):
:param uid: 原神uid
:return: 更新结果
"""
await LastQuery.update_last_query(user_id, uid)
new_num = 0
server_id = 'cn_qd01' if uid[0] == '5' else 'cn_gf01'
authkey, state, cookie_info = await get_authkey_by_stoken(user_id, uid)
@ -166,11 +167,11 @@ async def get_gacha_log_data(user_id: str, uid: str):
async def get_gacha_log_img(user_id: str, uid: str, nickname: str):
await LastQuery.update_last_query(user_id, uid)
data, state = load_history_info(user_id, uid)
if not state:
return f'UID{uid}还没有抽卡记录数据,请先更新'
player_info = await PlayerInfo.get_or_none(user_id=user_id, uid=uid)
if player_info:
if player_info := await PlayerInfo.get_or_none(user_id=user_id, uid=uid):
return await draw_gacha_log(player_info.user_id, player_info.uid, player_info.nickname, player_info.signature,
data)
else:

View File

@ -7,7 +7,7 @@ from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon import NICKNAME
from LittlePaimon.database import PlayerAlias
from LittlePaimon.database import PlayerAlias, LastQuery
from LittlePaimon.utils import logger
from LittlePaimon.utils.path import YSC_TEMP_IMG_PATH
from LittlePaimon.utils.message import CommandPlayer, CommandCharacter, CommandUID
@ -156,7 +156,7 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
if len(players) == 1:
# 当查询对象只有一个时,查询所有角色
gim = GenshinInfoManager(players[0].user_id, players[0].uid)
await gim.set_last_query()
await LastQuery.update_last_query(players[0].user_id, players[0].uid)
logger.info('原神角色卡片', '', {'用户': players[0].user_id, 'UID': players[0].uid})
for character in characters:
character_info = await gim.get_character(name=character)
@ -171,7 +171,7 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
# 当查询对象有多个时,只查询第一个角色
for player in players:
gim = GenshinInfoManager(player.user_id, player.uid)
await gim.set_last_query()
await LastQuery.update_last_query(player.user_id, player.uid)
logger.info('原神角色卡片', '', {'用户': player.user_id, 'UID': player.uid})
character_info = await gim.get_character(name=characters[0])
if not character_info:
@ -199,7 +199,7 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
if len(players) == 1:
# 当查询对象只有一个时,查询所有角色
gim = GenshinInfoManager(players[0].user_id, players[0].uid)
await gim.set_last_query()
await LastQuery.update_last_query(players[0].user_id, players[0].uid)
logger.info('原神角色面板', '', {'用户': players[0].user_id, 'UID': players[0].uid})
for character in characters:
character_info = await gim.get_character(name=character, data_source='enka')
@ -214,7 +214,7 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
# 当查询对象有多个时,只查询第一个角色
for player in players:
gim = GenshinInfoManager(player.user_id, player.uid)
await gim.set_last_query()
await LastQuery.update_last_query(player.user_id, player.uid)
logger.info('原神角色面板', '', {'用户': player.user_id, 'UID': player.uid})
character_info = await gim.get_character(name=characters[0], data_source='enka')
if not character_info:

View File

@ -28,10 +28,6 @@ class GenshinInfoManager:
self.user_id = user_id
self.uid = uid
async def set_last_query(self):
await LastQuery.update_or_create(user_id=self.user_id,
defaults={'uid': self.uid, 'last_time': datetime.datetime.now()})
async def is_bind(self) -> bool:
"""
检查是否已绑定私人cookie
@ -44,17 +40,19 @@ class GenshinInfoManager:
更新所有原神信息
"""
result = ''
await self.set_last_query()
await LastQuery.update_last_query(self.user_id, self.uid)
mihoyo_result = await self.update_from_mihoyo()
if mihoyo_result != '更新成功':
result += f'{mihoyo_result}\n'
enka_result = await self.update_from_enka()
if not enka_result.startswith('更新成功'):
result += f'{enka_result}\n'
if include_talent and await self.is_bind():
result += f'米游社数据:\n{mihoyo_result}\n'
if include_talent:
if await self.is_bind():
talent_result = await self.update_talent()
if talent_result not in ['更新成功', mihoyo_result]:
result += f'{talent_result}\n'
result += f'天赋数据:\n{talent_result}\n'
else:
result += '天赋数据:\n未绑定私人Cookie\n'
enka_result = await self.update_from_enka()
result += f'Enka数据\n{enka_result}'
return result or enka_result
async def update_from_enka(self) -> str:
@ -72,7 +70,7 @@ class GenshinInfoManager:
for character in data['avatarInfoList']:
await Character.update_info(self.user_id, self.uid, character, 'enka')
logger.info('原神信息', f'➤UID<m>{self.uid}</m><g>更新Enka成功</g>')
return '更新成功,本次更新的角色有\n' + ' '.join(
return '更新以下角色成功:\n' + ' '.join(
[get_name_by_id(str(c['avatarId'])) for c in data['playerInfo']['showAvatarInfoList']])
async def update_talent(self) -> str:
@ -117,8 +115,8 @@ class GenshinInfoManager:
if not isinstance(data, dict):
return data
elif data['retcode'] == 1034:
logger.info('原神信息', f'更新<m>{self.uid}</m>的玩家数据时出错状态码为1034疑似验证码</r>')
return '疑似遇米游社验证码阻拦,请稍后再试'
logger.info('原神信息', f'更新<m>{self.uid}</m>的玩家数据时出错状态码为1034<r>疑似验证码</r>')
return '疑似遇验证码阻拦,请稍后再试'
elif data['retcode'] != 0:
logger.info('原神信息', f'更新<m>{self.uid}</m>的玩家数据时出错,消息为<r>{data["message"]}</r>')
return data['message']
@ -150,7 +148,7 @@ class GenshinInfoManager:
获取原神玩家总体信息
:return: 玩家信息
"""
await self.set_last_query()
await LastQuery.update_last_query(self.user_id, self.uid)
return await PlayerInfo.get_or_none(user_id=self.user_id, uid=self.uid)
async def get_character(self, name: Optional[str] = None, character_id: Optional[int] = None,
@ -172,13 +170,15 @@ class GenshinInfoManager:
if data_source == 'enka':
"""如果角色不存在或者角色的更新时间在6小时前则更新角色信息"""
character = await Character.get_or_none(**query, data_source='enka')
if not character or character.update_time < (datetime.datetime.now() - datetime.timedelta(hours=config.ysd_auto_update)).replace(
if not character or character.update_time < (
datetime.datetime.now() - datetime.timedelta(hours=config.ysd_auto_update)).replace(
tzinfo=pytz.timezone('UTC')):
await self.update_from_enka()
if character := await Character.get_or_none(**query, data_source='enka'):
logger.info('原神角色面板', '➤➤', {'角色': name or character_id}, '数据更新成功', True)
else:
logger.info('原神角色面板', '➤➤', {'角色': name or character_id}, '不在游戏内展示柜中,更新失败', False)
logger.info('原神角色面板', '➤➤', {'角色': name or character_id}, '不在游戏内展示柜中,更新失败',
False)
else:
logger.info('原神角色面板', '➤➤', {'角色': name or character_id}, '数据获取成功', True)
return character
@ -193,7 +193,7 @@ class GenshinInfoManager:
获取原神角色背包信息
:return: 原神玩家信息和角色列表
"""
await self.set_last_query()
await LastQuery.update_last_query(self.user_id, self.uid)
player_info = await PlayerInfo.get_or_none(user_id=self.user_id, uid=self.uid)
if player_info is None or player_info.update_time is None or player_info.update_time < (
datetime.datetime.now() - datetime.timedelta(hours=config.ysa_auto_update)).replace(
@ -210,7 +210,7 @@ class GenshinInfoManager:
return player_info, character_list
async def get_player_info(self) -> Tuple[Union[PlayerInfo, str], Optional[List[Character]]]:
await self.set_last_query()
await LastQuery.update_last_query(self.user_id, self.uid)
player_info = await PlayerInfo.get_or_none(user_id=self.user_id, uid=self.uid)
if player_info is None or player_info.update_time is None or player_info.update_time < (
datetime.datetime.now() - datetime.timedelta(hours=config.ys_auto_update)).replace(
@ -228,7 +228,7 @@ class GenshinInfoManager:
return player_info, characters_list
async def get_abyss_info(self, abyss_index: int = 1) -> Union[AbyssInfo, str]:
await self.set_last_query()
await LastQuery.update_last_query(self.user_id, self.uid)
await AbyssInfo.filter(user_id=self.user_id, uid=self.uid).delete()
result = await self.update_abyss_info(abyss_index)
if result != '更新成功':
@ -263,13 +263,15 @@ class GenshinTools:
:param effective: 有效词条列表
:return: 评分
"""
prop_map = {'攻击力': 4.975, '生命值': 4.975, '防御力': 6.2, '暴击率': 3.3, '暴击伤害': 6.6, '元素精通': 19.75, '元素充能效率': 5.5}
prop_map = {'攻击力': 4.975, '生命值': 4.975, '防御力': 6.2, '暴击率': 3.3, '暴击伤害': 6.6,
'元素精通': 19.75, '元素充能效率': 5.5}
if prop_name in effective and prop_name in {'攻击力', '生命值', '防御力'}:
return round(prop_value / role_prop[prop_name] * 100 / prop_map[prop_name] * effective[prop_name], 2)
if prop_name.replace('百分比', '') in effective:
return round(prop_value / prop_map[prop_name.replace('百分比', '')] * effective[prop_name.replace('百分比', '')],
return round(
prop_value / prop_map[prop_name.replace('百分比', '')] * effective[prop_name.replace('百分比', '')],
2)
return 0

View File

@ -22,7 +22,6 @@ async def get_status():
bot_status = await bot.get_status()
status_result['bot_id'] = bot.self_id
if bot_status := bot_status.get('stat'):
print(bot_status)
status_result['msg_received'] = bot_status.get('message_received', '未知')
status_result['msg_sent'] = bot_status.get('message_sent', '未知')
except Exception:

View File

@ -4,7 +4,7 @@ from pathlib import Path
from fastapi import APIRouter
from fastapi.responses import JSONResponse
from LittlePaimon.config import ConfigManager, ConfigModel, PluginManager, PluginInfo
from LittlePaimon.config import ConfigManager, PluginManager, PluginInfo
from LittlePaimon.database import PluginPermission
try:
@ -130,10 +130,8 @@ async def set_config(data: dict):
data['实时便签停止检查结束时间'] = int(temp_time_split[1][:2])
if '云原神签到开始时间' in data:
data['云原神签到时间(小时)'] = int(data['云原神签到开始时间'])
config = ConfigManager.config.dict(by_alias=True)
config.update(**data)
ConfigManager.config = ConfigModel.parse_obj(config)
PluginManager.save()
ConfigManager.config.update(**data)
ConfigManager.save()
return {
'status': 0,
'msg': '保存成功'