feat✨: 更新内置插件

This commit is contained in:
HibiKier
2024-02-25 03:18:34 +08:00
parent 131200a28e
commit eb0572ea77
83 changed files with 7588 additions and 450 deletions
+148
View File
@@ -0,0 +1,148 @@
from nonebot.plugin import PluginMetadata
from nonebot_plugin_alconna import (
Alconna,
Args,
Arparma,
Option,
on_alconna,
store_true,
)
from nonebot_plugin_apscheduler import scheduler
from nonebot_plugin_saa import Image, Text
from nonebot_plugin_session import EventSession
from nonebot_plugin_userinfo import EventUserInfo, UserInfo
from zhenxun.configs.utils import PluginCdBlock, PluginExtraData, RegisterConfig
from zhenxun.services.log import logger
from ._data_source import SignManage
from .goods_register import driver
from .utils import clear_sign_data_pic
__plugin_meta__ = PluginMetadata(
name="签到",
description="每日签到,证明你在这里",
usage="""
每日签到
会影响色图概率和开箱次数,以及签到的随机道具获取
指令:
我的签到
好感度排行
* 签到时有 3% 概率 * 2 *
""".strip(),
extra=PluginExtraData(
author="HibiKier",
version="0.1",
configs=[
RegisterConfig(
module="send_setu",
key="INITIAL_SETU_PROBABILITY",
value=0.7,
help="初始色图概率,总概率 = 初始色图概率 + 好感度",
default_value=0.7,
type=float,
),
RegisterConfig(
key="MAX_SIGN_GOLD",
value=200,
help="签到好感度加成额外获得的最大金币数",
default_value=200,
type=int,
),
RegisterConfig(
key="SIGN_CARD1_PROB",
value=0.2,
help="签到好感度双倍加持卡Ⅰ掉落概率",
default_value=0.2,
type=float,
),
RegisterConfig(
key="SIGN_CARD2_PROB",
value=0.09,
help="签到好感度双倍加持卡Ⅲ掉落概率",
default_value=0.09,
type=float,
),
RegisterConfig(
key="SIGN_CARD3_PROB",
value=0.05,
help="签到好感度双倍加持卡Ⅲ掉落概率",
default_value=0.05,
type=float,
),
],
limits=[PluginCdBlock()],
).dict(),
)
_sign_matcher = on_alconna(
Alconna(
"签到",
Option("--my", action=store_true, help_text="我的签到"),
Option(
"-l|--list", Args["num", int, 10], action=store_true, help_text="好感度排行"
),
),
priority=5,
block=True,
)
# TODO: shortcut
@_sign_matcher.assign("$main")
async def _(
session: EventSession, arparma: Arparma, user_info: UserInfo = EventUserInfo()
):
nickname = (
user_info.user_displayname or user_info.user_remark or user_info.user_name
)
if session.id1:
if path := await SignManage.sign(session, nickname):
logger.info("签到成功", arparma.header_result, session=session)
await Image(path).finish(reply=True)
return Text("用户id为空...").send()
@_sign_matcher.assign("my")
async def _(
session: EventSession, arparma: Arparma, user_info: UserInfo = EventUserInfo()
):
nickname = (
user_info.user_displayname or user_info.user_remark or user_info.user_name
)
if session.id1:
if image := await SignManage.sign(session, nickname, True):
logger.info("查看我的签到", arparma.header_result, session=session)
await Image(image).finish(reply=True)
return Text("用户id为空...").send()
@_sign_matcher.assign("list")
async def _(
session: EventSession,
arparma: Arparma,
num: int,
user_info: UserInfo = EventUserInfo(),
):
nickname = (
user_info.user_displayname or user_info.user_remark or user_info.user_name
)
if session.id1:
if image := await SignManage.rank(session.id1, num):
logger.info("查看签到排行", arparma.header_result, session=session)
await Image(image.pic2bs4()).finish()
return Text("用户id为空...").send()
@scheduler.scheduled_job(
"interval",
hours=1,
)
async def _():
try:
clear_sign_data_pic()
logger.info("清理日常签到图片数据数据完成...", "签到")
except Exception as e:
logger.error(f"清理日常签到图片数据数据失败...", e=e)
@@ -0,0 +1,175 @@
import os
import random
import secrets
from datetime import datetime
from pathlib import Path
import pytz
from nonebot_plugin_session import EventSession
from tortoise.functions import Count
from zhenxun.configs.path_config import IMAGE_PATH
from zhenxun.models.friend_user import FriendUser
from zhenxun.models.group_member_info import GroupInfoUser
from zhenxun.models.sign_log import SignLog
from zhenxun.models.sign_user import SignUser
from zhenxun.models.user_console import UserConsole
from zhenxun.services.log import logger
from zhenxun.utils.image_utils import BuildImage, ImageTemplate
from zhenxun.utils.utils import get_user_avatar
from ._random_event import random_event
from .utils import SIGN_TODAY_CARD_PATH, get_card
ICON_PATH = IMAGE_PATH / "_icon"
PLATFORM_PATH = {
"dodo": ICON_PATH / "dodo.png",
"discord": ICON_PATH / "discord.png",
"kaiheila": ICON_PATH / "kook.png",
"qq": ICON_PATH / "qq.png",
}
class SignManage:
@classmethod
async def rank(cls, user_id: str, num: int) -> BuildImage:
all_list = (
await SignUser.annotate()
.order_by("impression")
.values_list("user_id", flat=True)
)
index = all_list.index(user_id) + 1 # type: ignore
user_list = await SignUser.annotate().order_by("impression").limit(num).all()
user_id_list = [u.user_id for u in user_list]
log_list = (
await SignLog.filter(user_id__in=user_id_list)
.annotate(count=Count("id"))
.group_by("user_id")
.values_list("user_id", "count")
)
uid2cnt = {l[0]: l[1] for l in log_list}
column_name = ["排名", "-", "名称", "好感度", "签到次数", "平台"]
friend_list = await FriendUser.filter(user_id__in=user_id_list).values_list(
"user_id", "user_name"
)
uid2name = {f[0]: f[1] for f in friend_list}
group_member_list = await GroupInfoUser.filter(
user_id__in=user_id_list
).values_list("user_id", "user_name")
for gm in group_member_list:
uid2name[gm[0]] = gm[1]
data_list = []
for i, user in enumerate(user_list):
bytes = await get_user_avatar(user.user_id)
data_list.append(
[
f"{i+1}",
(bytes, 30, 30) if user.platform == "qq" else "",
uid2name.get(user.user_id),
user.impression,
uid2cnt.get(user.user_id) or 0,
(PLATFORM_PATH.get(user.platform), 30, 30),
]
)
return await ImageTemplate.table_page(
"好感度排行", f"你的排名在第 {index} 位哦!", column_name, data_list
)
@classmethod
async def sign(
cls, session: EventSession, nickname: str, is_view_card: bool = False
) -> Path | None:
"""签到
参数:
session: Session
nickname: 用户昵称
is_view_card: 是否展示卡片
返回:
Path: 卡片路径
"""
if not session.id1:
return None
now = datetime.now(pytz.timezone("Asia/Shanghai"))
user_console, _ = await UserConsole.get_or_create(
user_id=session.id1,
defaults={
"uid": await UserConsole.get_new_uid(),
"platform": session.platform,
},
)
user, _ = await SignUser.get_or_create(
user_id=session.id1,
defaults={"user_console": user_console, "platform": session.platform},
)
new_log = await SignLog.filter(user_id=session.id1).first()
file_name = f"{user}_sign_{datetime.now().date()}.png"
if (
user.sign_count != 0
or (new_log and now > new_log.create_time)
or file_name in os.listdir(SIGN_TODAY_CARD_PATH)
):
user_console, _ = await UserConsole.get_or_create(user_id=session.id1)
path = await get_card(user, nickname, -1, user_console.gold, "")
else:
path = await cls._handle_sign_in(user, nickname, session, is_view_card)
return path
@classmethod
async def _handle_sign_in(
cls,
user: SignUser,
nickname: str,
session: EventSession,
is_view_card: bool,
) -> Path:
"""签到处理
参数:
user: SignUser
nickname: 用户昵称
session: Session
is_view_card: 是否展示卡片
返回:
Path: 卡片路径
"""
impression_added = (secrets.randbelow(99) + 1) / 100
rand = random.random()
add_probability = float(user.add_probability)
specify_probability = user.specify_probability
if rand + add_probability > 0.97:
impression_added *= 2
elif rand < specify_probability:
impression_added *= 2
await SignUser.sign(user, impression_added, session.bot_id, session.platform)
gold = random.randint(1, 100)
gift = random_event(float(user.impression))
if isinstance(gift, int):
gold += gift
await UserConsole.add_gold(
user.user_id, gold + gift, "sign_in", session.platform
)
gift = f"额外金币 +{gift}"
else:
await UserConsole.add_gold(user.user_id, gold, "sign_in", session.platform)
await UserConsole.add_props(user.user_id, gift, 1, session.platform)
gift += " + 1"
logger.info(
f"签到成功. score: {user.impression:.2f} "
f"(+{impression_added:.2f}).获取金币/道具: {gold}",
"签到",
session=session,
)
return await get_card(
user,
nickname,
impression_added,
gold,
gift,
rand + add_probability > 0.97 or rand < specify_probability,
is_view_card,
)
@@ -0,0 +1,33 @@
import random
from zhenxun.configs.config import Config
PROB_DATA = None
def random_event(impression: float) -> str | int:
"""签到随机事件
参数:
impression: 好感度
返回:
额外奖励 和 类型
"""
global PROB_DATA
if not PROB_DATA:
PROB_DATA = {
Config.get_config("sign_in", "SIGN_CARD3_PROB"): "好感度双倍加持卡Ⅲ",
Config.get_config("sign_in", "SIGN_CARD2_PROB"): "好感度双倍加持卡Ⅱ",
Config.get_config("sign_in", "SIGN_CARD1_PROB"): "好感度双倍加持卡Ⅰ",
}
rand = random.random() - impression / 1000
for prob in PROB_DATA.keys():
if rand <= prob:
return PROB_DATA[prob]
gold = random.randint(
1, random.randint(1, int(1 if impression < 1 else impression))
)
max_sign_gold = Config.get_config("sign_in", "MAX_SIGN_GOLD")
gold = max_sign_gold if gold > max_sign_gold else gold
return gold
+49
View File
@@ -0,0 +1,49 @@
from zhenxun.configs.path_config import IMAGE_PATH
SIGN_RESOURCE_PATH = IMAGE_PATH / "sign" / "sign_res"
SIGN_TODAY_CARD_PATH = IMAGE_PATH / "sign" / "today_card"
SIGN_BORDER_PATH = SIGN_RESOURCE_PATH / "border"
SIGN_BACKGROUND_PATH = SIGN_RESOURCE_PATH / "background"
SIGN_BORDER_PATH.mkdir(exist_ok=True, parents=True)
SIGN_BACKGROUND_PATH.mkdir(exist_ok=True, parents=True)
lik2relation = {
"0": "路人",
"1": "陌生",
"2": "初识",
"3": "普通",
"4": "熟悉",
"5": "信赖",
"6": "相知",
"7": "厚谊",
"8": "亲密",
}
level2attitude = {
"0": "排斥",
"1": "警惕",
"2": "可以交流",
"3": "一般",
"4": "是个好人",
"5": "好朋友",
"6": "可以分享小秘密",
"7": "喜欢",
"8": "恋人",
}
weekdays = {1: "Mon", 2: "Tue", 3: "Wed", 4: "Thu", 5: "Fri", 6: "Sat", 7: "Sun"}
lik2level = {
9999: "9",
400: "8",
270: "7",
200: "6",
140: "5",
90: "4",
50: "3",
25: "2",
10: "1",
0: "0",
}
@@ -0,0 +1,75 @@
from decimal import Decimal
import nonebot
from nonebot.drivers import Driver
from nonebot_plugin_session import EventSession
from zhenxun.configs.config import Config
from zhenxun.models.sign_user import SignUser
from zhenxun.models.user_console import UserConsole
from zhenxun.utils.decorator.shop import NotMeetUseConditionsException, shop_register
driver: Driver = nonebot.get_driver()
@driver.on_startup
async def _():
"""
导入内置的三个商品
"""
@shop_register(
name=("好感度双倍加持卡Ⅰ", "好感度双倍加持卡Ⅱ", "好感度双倍加持卡Ⅲ"),
price=(30, 150, 250),
des=(
"下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)",
"下次签到双倍好感度概率 + 20%(平平庸庸)(同类商品将覆盖)",
"下次签到双倍好感度概率 + 30%(金币才是真命天子!)(同类商品将覆盖)",
),
load_status=bool(Config.get_config("shop", "IMPORT_DEFAULT_SHOP_GOODS")),
icon=(
"favorability_card_1.png",
"favorability_card_2.png",
"favorability_card_3.png",
),
**{"好感度双倍加持卡Ⅰ_prob": 0.1, "好感度双倍加持卡Ⅱ_prob": 0.2, "好感度双倍加持卡Ⅲ_prob": 0.3}, # type: ignore
)
async def _(session: EventSession, user_id: int, group_id: int, prob: float):
user_console, _ = await UserConsole.get_or_create(
user_id=session.id1,
defaults={
"uid": await UserConsole.get_new_uid(),
"platform": session.platform,
},
)
user, _ = await SignUser.get_or_create(
user_id=user_id,
defaults={"platform": session.platform, "user_console": user_console},
)
user.add_probability = Decimal(prob)
await user.save(update_fields=["add_probability"])
@shop_register(
name="测试道具A",
price=99,
des="随便侧而出",
load_status=False,
icon="sword.png",
)
async def _(user_id: int, group_id: int):
print(user_id, group_id, "使用测试道具")
@shop_register.before_handle(name="测试道具A", load_status=False)
async def _(user_id: int, group_id: int):
print(user_id, group_id, "第一个使用前函数(before handle)")
@shop_register.before_handle(name="测试道具A", load_status=False)
async def _(user_id: int, group_id: int):
print(user_id, group_id, "第二个使用前函数(before handle)222")
raise NotMeetUseConditionsException(
"太笨了!"
) # 抛出异常,阻断使用,并返回信息
@shop_register.after_handle(name="测试道具A", load_status=False)
async def _(user_id: int, group_id: int):
print(user_id, group_id, "第一个使用后函数(after handle)")
+326
View File
@@ -0,0 +1,326 @@
import os
import random
from datetime import datetime
from io import BytesIO
from pathlib import Path
import nonebot
import pytz
from nonebot.drivers import Driver
from zhenxun.configs.config import NICKNAME, Config
from zhenxun.configs.path_config import IMAGE_PATH
from zhenxun.models.sign_log import SignLog
from zhenxun.models.sign_user import SignUser
from zhenxun.utils.image_utils import BuildImage
from zhenxun.utils.utils import get_user_avatar
from .config import (
SIGN_BACKGROUND_PATH,
SIGN_BORDER_PATH,
SIGN_RESOURCE_PATH,
SIGN_TODAY_CARD_PATH,
level2attitude,
lik2level,
lik2relation,
)
driver: Driver = nonebot.get_driver()
@driver.on_startup
async def init_image():
SIGN_RESOURCE_PATH.mkdir(parents=True, exist_ok=True)
SIGN_TODAY_CARD_PATH.mkdir(exist_ok=True, parents=True)
await generate_progress_bar_pic()
clear_sign_data_pic()
async def get_card(
user: SignUser,
nickname: str,
add_impression: float,
gold: int | None,
gift: str,
is_double: bool = False,
is_card_view: bool = False,
) -> Path:
"""获取好感度卡片
参数:
user: SignUser
nickname: 用户昵称
impression: 新增的好感度
gold: 金币
gift: 礼物
is_double: 是否触发双倍.
is_card_view: 是否展示好感度卡片.
返回:
Path: 卡片路径
"""
user_id = user.user_id
date = datetime.now().date()
_type = "view" if is_card_view else "sign"
file_name = f"{user_id}_{_type}_{date}.png"
view_name = f"{user_id}_view_{date}.png"
card_file = Path(SIGN_TODAY_CARD_PATH) / file_name
if card_file.exists():
return IMAGE_PATH / "sign" / "today_card" / file_name
else:
if add_impression == -1:
card_file = Path(SIGN_TODAY_CARD_PATH) / view_name
if card_file.exists():
return card_file
is_card_view = True
return await _generate_card(
user, nickname, add_impression, gold, gift, is_double, is_card_view
)
async def _generate_card(
user: SignUser,
nickname: str,
impression: float,
gold: int | None,
gift: str,
is_double: bool = False,
is_card_view: bool = False,
) -> Path:
"""生成签到卡片
参数:
user: SignUser
nickname: 用户昵称
impression: 新增的好感度
gold: 金币
gift: 礼物
is_double: 是否触发双倍.
is_card_view: 是否展示好感度卡片.
返回:
Path: 卡片路径
"""
ava_bk = BuildImage(140, 140, (255, 255, 255, 0))
ava_border = BuildImage(
140,
140,
background=SIGN_BORDER_PATH / "ava_border_01.png",
)
if user.platform == "qq" and (byt := await get_user_avatar(user.user_id)):
ava = BuildImage(107, 107, background=BytesIO(byt))
else:
ava = BuildImage(107, 107, (0, 0, 0))
await ava.circle()
await ava_bk.paste(ava, (19, 18))
await ava_bk.paste(ava_border, center_type="center")
add_impression = impression
impression = float(user.impression)
info_img = BuildImage(250, 150, color=(255, 255, 255, 0), font_size=15)
level, next_impression, previous_impression = get_level_and_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, 20), f"· {NICKNAME}对你的态度:{level2attitude[level]}")
await info_img.text((0, 40), f"· 距离升级还差 {interpolation:.2f} 好感度")
bar_bk = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png")
bar = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar.png")
ratio = 1 - (next_impression - user.impression) / (
next_impression - previous_impression
)
if next_impression == 0:
ratio = 0
await bar.resize(width=int(bar.width * ratio) or bar.width, height=bar.height)
await bar_bk.paste(bar)
font_size = 30
if "好感度双倍加持卡" in gift:
font_size = 20
gift_border = BuildImage(
270,
100,
background=SIGN_BORDER_PATH / "gift_border_02.png",
font_size=font_size,
)
await gift_border.text((0, 0), gift, center_type="center")
bk = BuildImage(
876,
424,
background=SIGN_BACKGROUND_PATH
/ random.choice(os.listdir(SIGN_BACKGROUND_PATH)),
font_size=25,
)
A = BuildImage(876, 274, background=SIGN_RESOURCE_PATH / "white.png")
line = BuildImage(2, 180, color="black")
await A.transparent(2)
await A.paste(ava_bk, (25, 80))
await A.paste(line, (200, 70))
nickname_img = await BuildImage.build_text_image(
nickname, size=50, font_color=(255, 255, 255)
)
user_console = await user.user_console.first()
if user_console and user_console.uid:
uid = f"{user_console.uid}".rjust(12, "0")
uid = uid[:4] + " " + uid[4:8] + " " + uid[8:]
else:
uid = "XXXX XXXX XXXX"
uid_img = await BuildImage.build_text_image(
f"UID: {uid}", size=30, font_color=(255, 255, 255)
)
sign_count = await SignLog.filter(user_id=user.user_id).count()
sign_day_img = await BuildImage.build_text_image(
f"{sign_count}", size=40, font_color=(211, 64, 33)
)
lik_text1_img = await BuildImage.build_text_image("当前", size=20)
lik_text2_img = await BuildImage.build_text_image(
f"好感度:{user.impression:.2f}", size=30
)
watermark = await BuildImage.build_text_image(
f"{NICKNAME}@{datetime.now().year}", size=15, font_color=(155, 155, 155)
)
today_data = BuildImage(300, 300, color=(255, 255, 255, 0), font_size=20)
if is_card_view:
today_sign_text_img = await BuildImage.build_text_image("", size=30)
value_list = (
await SignUser.annotate()
.order_by("impression")
.values_list("user_id", flat=True)
)
index = value_list.index(user.user_id) + 1 # type: ignore
rank_img = await BuildImage.build_text_image(
f"* 好感度排名第 {index} 位", size=30
)
await A.paste(rank_img, ((A.width - rank_img.width - 32), 20))
last_log = (
await SignLog.filter(user_id=user.user_id).order_by("create_time").first()
)
last_date = "从未"
if last_log:
last_date = last_log.create_time.astimezone(
pytz.timezone("Asia/Shanghai")
).date()
await today_data.text(
(0, 0),
f"上次签到日期:{last_date}",
)
await today_data.text((0, 25), f"总金币:{gold}")
default_setu_prob = (
Config.get_config("send_setu", "INITIAL_SETU_PROBABILITY") * 100 # type: ignore
)
await today_data.text(
(0, 50),
f"色图概率:{(default_setu_prob + float(user.impression) if user.impression < 100 else 100):.2f}%",
)
await today_data.text((0, 75), f"开箱次数:{(20 + int(user.impression / 3))}")
_type = "view"
else:
await A.paste(gift_border, (570, 140))
today_sign_text_img = await BuildImage.build_text_image("今日签到", size=30)
if is_double:
await today_data.text((0, 0), f"好感度 + {add_impression / 2:.2f} × 2")
else:
await today_data.text((0, 0), f"好感度 + {add_impression:.2f}")
await today_data.text((0, 25), f"金币 + {gold}")
_type = "sign"
current_date = datetime.now()
current_datetime_str = current_date.strftime("%Y-%m-%d %a %H:%M:%S")
data = current_date.date()
data_img = await BuildImage.build_text_image(
f"时间:{current_datetime_str}", size=20
)
await bk.paste(nickname_img, (30, 15))
await bk.paste(uid_img, (30, 85))
await bk.paste(A, (0, 150))
await bk.text((30, 167), "Accumulative check-in for")
_x = bk.getsize("Accumulative check-in for")[0] + sign_day_img.width + 45
await bk.paste(sign_day_img, (380, 158))
await bk.text((_x, 167), "days")
await bk.paste(data_img, (220, 370))
await bk.paste(lik_text1_img, (220, 240))
await bk.paste(lik_text2_img, (262, 234))
await bk.paste(bar_bk, (225, 275))
await bk.paste(info_img, (220, 305))
await bk.paste(today_sign_text_img, (550, 180))
await bk.paste(today_data, (580, 220))
await bk.paste(watermark, (15, 400))
await bk.save(SIGN_TODAY_CARD_PATH / f"{user.user_id}_{_type}_{data}.png")
return IMAGE_PATH / "sign" / "today_card" / f"{user.user_id}_{_type}_{data}.png"
async def generate_progress_bar_pic():
"""
初始化进度条图片
"""
bg_2 = (254, 1, 254)
bg_1 = (0, 245, 246)
bk = BuildImage(1000, 50)
img_x = BuildImage(50, 50, color=bg_2)
await img_x.circle()
await img_x.crop((25, 0, 50, 50))
img_y = BuildImage(50, 50, color=bg_1)
await img_y.circle()
await img_y.crop((0, 0, 25, 50))
A = BuildImage(950, 50)
width, height = A.size
step_r = (bg_2[0] - bg_1[0]) / width
step_g = (bg_2[1] - bg_1[1]) / width
step_b = (bg_2[2] - bg_1[2]) / width
for y in range(0, width):
bg_r = round(bg_1[0] + step_r * y)
bg_g = round(bg_1[1] + step_g * y)
bg_b = round(bg_1[2] + step_b * y)
for x in range(0, height):
await A.point((y, x), fill=(bg_r, bg_g, bg_b))
await bk.paste(img_y, (0, 0))
await bk.paste(A, (25, 0))
await bk.paste(img_x, (975, 0))
await bk.save(SIGN_RESOURCE_PATH / "bar.png")
A = BuildImage(950, 50)
bk = BuildImage(1000, 50)
img_x = BuildImage(50, 50)
await img_x.circle()
await img_x.crop((25, 0, 50, 50))
img_y = BuildImage(50, 50)
await img_y.circle()
await img_y.crop((0, 0, 25, 50))
await bk.paste(img_y, (0, 0))
await bk.paste(A, (25, 0))
await bk.paste(img_x, (975, 0))
await bk.save(SIGN_RESOURCE_PATH / "bar_white.png")
def get_level_and_next_impression(impression: float) -> tuple[str, int, int]:
"""获取当前好感等级与下一等级的差距
参数:
impression: 好感度
返回:
tuple[str, int, int]: 好感度等级中文,好感度等级,下一等级好感差距
"""
if impression == 0:
return lik2level[10], 10, 0
keys = list(lik2level.keys())
for i in range(len(keys)):
if impression > keys[i]:
return lik2level[keys[i]], keys[i - 1], keys[i]
return lik2level[10], 10, 0
def clear_sign_data_pic():
"""
清空当前签到图片数据
"""
date = datetime.now().date()
for file in os.listdir(SIGN_TODAY_CARD_PATH):
if str(date) not in file:
os.remove(SIGN_TODAY_CARD_PATH / file)