修复签到逻辑bug,并使代码更灵活以适应签到好感度等级配置 (#1606)

* 修复签到功能已知问题

* 修复签到功能已知问题

* 修改参数名称

* 修改uid判断

---------

Co-authored-by: HibiKier <45528451+HibiKier@users.noreply.github.com>
This commit is contained in:
Elaga 2024-09-07 12:35:39 +08:00 committed by GitHub
parent db9153f42c
commit 3f4787d4c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 30 deletions

View File

@ -36,7 +36,6 @@ level2attitude = {
weekdays = {1: "Mon", 2: "Tue", 3: "Wed", 4: "Thu", 5: "Fri", 6: "Sat", 7: "Sun"} weekdays = {1: "Mon", 2: "Tue", 3: "Wed", 4: "Thu", 5: "Fri", 6: "Sat", 7: "Sun"}
lik2level = { lik2level = {
9999: "9",
400: "8", 400: "8",
270: "7", 270: "7",
200: "6", 200: "6",

View File

@ -25,6 +25,7 @@ from .config import (
lik2level, lik2level,
lik2relation, lik2relation,
) )
assert len(level2attitude)==len(lik2level)==len(lik2relation), '好感度态度、等级、关系长度不匹配!'
AVA_URL = "http://q1.qlogo.cn/g?b=qq&nk={}&s=160" AVA_URL = "http://q1.qlogo.cn/g?b=qq&nk={}&s=160"
@ -106,7 +107,7 @@ async def get_card(
async def _generate_card( async def _generate_card(
user: SignUser, user: SignUser,
nickname: str, nickname: str,
impression: float, add_impression: float,
gold: int | None, gold: int | None,
gift: str, gift: str,
is_double: bool = False, is_double: bool = False,
@ -117,7 +118,7 @@ async def _generate_card(
参数: 参数:
user: SignUser user: SignUser
nickname: 用户昵称 nickname: 用户昵称
impression: 新增的好感度 add_impression: 新增的好感度
gold: 金币 gold: 金币
gift: 礼物 gift: 礼物
is_double: 是否触发双倍. is_double: 是否触发双倍.
@ -139,16 +140,12 @@ async def _generate_card(
await ava.circle() await ava.circle()
await ava_bk.paste(ava, (19, 18)) await ava_bk.paste(ava, (19, 18))
await ava_bk.paste(ava_border, center_type="center") await ava_bk.paste(ava_border, center_type="center")
add_impression = impression
impression = float(user.impression) impression = float(user.impression)
info_img = BuildImage(250, 150, color=(255, 255, 255, 0), font_size=15) info_img = BuildImage(250, 150, color=(255, 255, 255, 0), font_size=15)
level, next_impression, previous_impression = get_level_and_next_impression( level, next_impression, previous_impression = get_level_and_next_impression(
impression impression
) )
interpolation = next_impression - impression interpolation = next_impression - impression
if level == "9":
level = "8"
interpolation = 0
await info_img.text((0, 0), f"· 好感度等级:{level} [{lik2relation[level]}]") await info_img.text((0, 0), f"· 好感度等级:{level} [{lik2relation[level]}]")
await info_img.text( await info_img.text(
(0, 20), f"· {BotConfig.self_nickname}对你的态度:{level2attitude[level]}" (0, 20), f"· {BotConfig.self_nickname}对你的态度:{level2attitude[level]}"
@ -157,7 +154,7 @@ async def _generate_card(
bar_bk = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png") bar_bk = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png")
bar = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar.png") bar = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar.png")
ratio = 1 - (next_impression - user.impression) / ( ratio = 1 - (next_impression - impression) / (
next_impression - previous_impression next_impression - previous_impression
) )
if next_impression == 0: if next_impression == 0:
@ -191,7 +188,7 @@ async def _generate_card(
nickname, size=50, font_color=(255, 255, 255) nickname, size=50, font_color=(255, 255, 255)
) )
user_console = await user.user_console user_console = await user.user_console
if user_console and user_console.uid: if user_console and user_console.uid is not None:
uid = f"{user_console.uid}".rjust(12, "0") uid = f"{user_console.uid}".rjust(12, "0")
uid = uid[:4] + " " + uid[4:8] + " " + uid[8:] uid = uid[:4] + " " + uid[4:8] + " " + uid[8:]
else: else:
@ -336,22 +333,25 @@ async def generate_progress_bar_pic():
await bk.save(SIGN_RESOURCE_PATH / "bar_white.png") await bk.save(SIGN_RESOURCE_PATH / "bar_white.png")
def get_level_and_next_impression(impression: float) -> tuple[str, int, int]: def get_level_and_next_impression(impression: float) -> tuple[str, int | float, int]:
"""获取当前好感等级与下一等级的差距 """获取当前好感等级与下一等级的差距
参数: 参数:
impression: 好感度 impression: 好感度
返回: 返回:
tuple[str, int, int]: 好感度等级中文好感度等级下一等级好感差距 tuple[str, int, int]: 好感度等级下一等级好感度要求已达到的好感度要求
""" """
if impression == 0:
return lik2level[10], 10, 0
keys = list(lik2level.keys()) keys = list(lik2level.keys())
level, next_impression, previous_impression = lik2level[keys[-1]], keys[-2], keys[-1]
for i in range(len(keys)): for i in range(len(keys)):
if impression > keys[i]: if impression >= keys[i]:
return lik2level[keys[i]], keys[i - 1], keys[i] level, next_impression, previous_impression = lik2level[keys[i]], keys[i-1], keys[i]
return lik2level[10], 10, 0 if i==0:
next_impression = impression
break
return level, next_impression, previous_impression
def clear_sign_data_pic(): def clear_sign_data_pic():
@ -367,7 +367,7 @@ def clear_sign_data_pic():
async def _generate_html_card( async def _generate_html_card(
user: SignUser, user: SignUser,
nickname: str, nickname: str,
impression: float, add_impression: float,
gold: int | None, gold: int | None,
gift: str, gift: str,
is_double: bool = False, is_double: bool = False,
@ -378,7 +378,7 @@ async def _generate_html_card(
参数: 参数:
user: SignUser user: SignUser
nickname: 用户昵称 nickname: 用户昵称
impression: 新增的好感度 add_impression: 新增的好感度
gold: 金币 gold: 金币
gift: 礼物 gift: 礼物
is_double: 是否触发双倍. is_double: 是否触发双倍.
@ -387,33 +387,29 @@ async def _generate_html_card(
返回: 返回:
Path: 卡片路径 Path: 卡片路径
""" """
impression = float(user.impression)
user_console = await user.user_console user_console = await user.user_console
if user_console and user_console.uid: if user_console and user_console.uid is not None:
uid = f"{user_console.uid}".rjust(12, "0") uid = f"{user_console.uid}".rjust(12, "0")
uid = uid[:4] + " " + uid[4:8] + " " + uid[8:] uid = uid[:4] + " " + uid[4:8] + " " + uid[8:]
else: else:
uid = "XXXX XXXX XXXX" uid = "XXXX XXXX XXXX"
level, next_impression, previous_impression = get_level_and_next_impression( level, next_impression, previous_impression = get_level_and_next_impression(
float(user.impression) float(impression)
) )
interpolation = next_impression - impression interpolation = next_impression - impression
if level == "9":
level = "8"
interpolation = 0
message = f"{BotConfig.self_nickname}希望你开心!" message = f"{BotConfig.self_nickname}希望你开心!"
hour = datetime.now().hour hour = datetime.now().hour
if hour > 6 and hour < 10: if hour > 6 and hour < 10:
message = random.choice(MORNING_MESSAGE) message = random.choice(MORNING_MESSAGE)
elif hour >= 0 and hour < 6: elif hour >= 0 and hour < 6:
message = random.choice(LG_MESSAGE) message = random.choice(LG_MESSAGE)
_impression = impression _impression = add_impression
if is_double: if is_double:
_impression = f"{impression}(×2)" _impression = f"{add_impression}(×2)"
process = 1 - (next_impression - user.impression) / ( process = 1 - (next_impression - impression) / (
next_impression - previous_impression next_impression - previous_impression
) )
if next_impression == 0:
process = 0
now = datetime.now() now = datetime.now()
data = { data = {
"ava": AVA_URL.format(user.user_id), "ava": AVA_URL.format(user.user_id),
@ -421,7 +417,7 @@ async def _generate_html_card(
"uid": uid, "uid": uid,
"sign_count": f"{user.sign_count}", "sign_count": f"{user.sign_count}",
"message": f"{BotConfig.self_nickname}说: {message}", "message": f"{BotConfig.self_nickname}说: {message}",
"cur_impression": f"{user.impression:.2f}", "cur_impression": f"{impression:.2f}",
"impression": f"好感度+{_impression}", "impression": f"好感度+{_impression}",
"gold": f"金币+{gold}", "gold": f"金币+{gold}",
"gift": gift, "gift": gift,
@ -429,7 +425,7 @@ async def _generate_html_card(
"attitude": f"对你的态度: {level2attitude[level]}", "attitude": f"对你的态度: {level2attitude[level]}",
"interpolation": f"{interpolation:.2f}", "interpolation": f"{interpolation:.2f}",
"heart2": [1 for _ in range(int(level))], "heart2": [1 for _ in range(int(level))],
"heart1": [1 for _ in range(9 - int(level))], "heart1": [1 for _ in range(len(lik2level)-int(level)-1)],
"process": process * 100, "process": process * 100,
"date": str(now.replace(microsecond=0)), "date": str(now.replace(microsecond=0)),
"font_size": 45, "font_size": 45,