mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-06 12:20:00 +08:00
update 0.0.7.0
This commit is contained in:
+12
-16
@@ -3,6 +3,7 @@ from .group_user_checkin import (
|
||||
group_user_check,
|
||||
group_impression_rank,
|
||||
impression_rank,
|
||||
check_in_all
|
||||
)
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
|
||||
@@ -45,26 +46,18 @@ __plugin_settings__ = {
|
||||
}
|
||||
__plugin_cd_limit__ = {}
|
||||
__plugin_configs__ = {
|
||||
"MAX_SIGN_GOLD": {
|
||||
"value": 200,
|
||||
"help": "签到好感度加成额外获得的最大金币数",
|
||||
"default_value": 200
|
||||
},
|
||||
"SIGN_CARD1_PROB": {
|
||||
"value": 0.2,
|
||||
"help": "签到好感度双倍加持卡Ⅰ掉落概率",
|
||||
"default_value": 0.2
|
||||
},
|
||||
"MAX_SIGN_GOLD": {"value": 200, "help": "签到好感度加成额外获得的最大金币数", "default_value": 200},
|
||||
"SIGN_CARD1_PROB": {"value": 0.2, "help": "签到好感度双倍加持卡Ⅰ掉落概率", "default_value": 0.2},
|
||||
"SIGN_CARD2_PROB": {
|
||||
"value": 0.09,
|
||||
"help": "签到好感度双倍加持卡Ⅱ掉落概率",
|
||||
"default_value": 0.09
|
||||
"default_value": 0.09,
|
||||
},
|
||||
"SIGN_CARD3_PROB": {
|
||||
"value": 0.05,
|
||||
"help": "签到好感度双倍加持卡Ⅲ掉落概率",
|
||||
"default_value": 0.05
|
||||
}
|
||||
"default_value": 0.05,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -98,6 +91,9 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
await group_user_check_in(nickname, event.user_id, event.group_id),
|
||||
at_sender=True,
|
||||
)
|
||||
if get_message_text(event.json()) == "all":
|
||||
await check_in_all(nickname, event.user_id)
|
||||
|
||||
|
||||
|
||||
@my_sign.handle()
|
||||
@@ -142,12 +138,12 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
'interval',
|
||||
"interval",
|
||||
hours=1,
|
||||
)
|
||||
async def _():
|
||||
try:
|
||||
clear_sign_data_pic()
|
||||
logger.info('清理日常签到图片数据数据完成....')
|
||||
logger.info("清理日常签到图片数据数据完成....")
|
||||
except Exception as e:
|
||||
logger.error(f'清理日常签到图片数据数据失败..{type(e)}: {e}')
|
||||
logger.error(f"清理日常签到图片数据数据失败..{type(e)}: {e}")
|
||||
|
||||
@@ -4,7 +4,7 @@ from models.group_member_info import GroupInfoUser
|
||||
from models.bag_user import BagUser
|
||||
from configs.config import NICKNAME
|
||||
from nonebot.adapters.cqhttp import MessageSegment
|
||||
from utils.image_utils import CreateImg, CreateMat
|
||||
from utils.image_utils import BuildImage, BuildMat
|
||||
from services.db_context import db
|
||||
from .utils import get_card, SIGN_TODAY_CARD_PATH
|
||||
from typing import Optional
|
||||
@@ -39,6 +39,26 @@ async def group_user_check_in(
|
||||
return await _handle_check_in(nickname, user_qq, group, present) # ok
|
||||
|
||||
|
||||
async def check_in_all(nickname: str, user_qq: int):
|
||||
"""
|
||||
说明:
|
||||
签到所有群
|
||||
参数:
|
||||
:param nickname: 昵称
|
||||
:param user_qq: 用户qq
|
||||
"""
|
||||
async with db.transaction():
|
||||
present = datetime.now()
|
||||
for u in await SignGroupUser.get_user_all_data(user_qq):
|
||||
group = u.belonging_group
|
||||
if not ((
|
||||
u.checkin_time_last + timedelta(hours=8)
|
||||
).date() >= present.date() or f"{u}_{group}_sign_{datetime.now().date()}" in os.listdir(
|
||||
SIGN_TODAY_CARD_PATH
|
||||
)):
|
||||
await _handle_check_in(nickname, user_qq, group, present)
|
||||
|
||||
|
||||
async def _handle_check_in(
|
||||
nickname: str, user_qq: int, group: int, present: datetime
|
||||
) -> MessageSegment:
|
||||
@@ -84,7 +104,7 @@ async def group_user_check(nickname: str, user_qq: int, group: int) -> MessageSe
|
||||
return await get_card(user, nickname, None, gold, "", is_card_view=True)
|
||||
|
||||
|
||||
async def group_impression_rank(group: int, num: int) -> Optional[CreateMat]:
|
||||
async def group_impression_rank(group: int, num: int) -> Optional[BuildMat]:
|
||||
user_qq_list, impression_list, _ = await SignGroupUser.get_all_impression(group)
|
||||
return await init_rank("好感度排行榜", user_qq_list, impression_list, group, num)
|
||||
|
||||
@@ -141,9 +161,9 @@ async def _pst(users: list, impressions: list, groups: list):
|
||||
count = math.ceil(lens / 33)
|
||||
width = 10
|
||||
idx = 0
|
||||
A = CreateImg(1740, 3300, color="#FFE4C4")
|
||||
A = BuildImage(1740, 3300, color="#FFE4C4")
|
||||
for _ in range(count):
|
||||
col_img = CreateImg(550, 3300, 550, 100, color="#FFE4C4")
|
||||
col_img = BuildImage(550, 3300, 550, 100, color="#FFE4C4")
|
||||
for _ in range(33 if int(lens / 33) >= 1 else lens % 33 - 1):
|
||||
idx += 1
|
||||
if idx > 100:
|
||||
@@ -164,13 +184,13 @@ async def _pst(users: list, impressions: list, groups: list):
|
||||
user_name = user_name if len(user_name) < 11 else user_name[:10] + "..."
|
||||
ava = await get_user_avatar(user)
|
||||
if ava:
|
||||
ava = CreateImg(
|
||||
ava = BuildImage(
|
||||
50, 50, background=BytesIO(ava)
|
||||
)
|
||||
else:
|
||||
ava = CreateImg(50, 50, color="white")
|
||||
ava = BuildImage(50, 50, color="white")
|
||||
ava.circle()
|
||||
bk = CreateImg(550, 100, color="#FFE4C4", font_size=30)
|
||||
bk = BuildImage(550, 100, color="#FFE4C4", font_size=30)
|
||||
font_w, font_h = bk.getsize(f"{idx}")
|
||||
bk.text((5, int((100 - font_h) / 2)), f"{idx}.")
|
||||
bk.paste(ava, (55, int((100 - 50) / 2)), True)
|
||||
@@ -180,7 +200,7 @@ async def _pst(users: list, impressions: list, groups: list):
|
||||
A.paste(col_img, (width, 0))
|
||||
lens -= 33
|
||||
width += 580
|
||||
W = CreateImg(1740, 3700, color="#FFE4C4", font_size=130)
|
||||
W = BuildImage(1740, 3700, color="#FFE4C4", font_size=130)
|
||||
W.paste(A, (0, 260))
|
||||
font_w, font_h = W.getsize(f"{NICKNAME}的好感度总榜")
|
||||
W.text((int((1740 - font_w) / 2), int((260 - font_h) / 2)), f"{NICKNAME}的好感度总榜")
|
||||
|
||||
+30
-30
@@ -12,7 +12,7 @@ from models.sign_group_user import SignGroupUser
|
||||
from models.group_member_info import GroupInfoUser
|
||||
from nonebot.adapters.cqhttp import MessageSegment
|
||||
from utils.utils import get_user_avatar
|
||||
from utils.image_utils import CreateImg
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.message_builder import image
|
||||
from configs.config import NICKNAME
|
||||
from pathlib import Path
|
||||
@@ -112,18 +112,18 @@ def _generate_card(
|
||||
is_double: bool = False,
|
||||
is_card_view: bool = False,
|
||||
) -> MessageSegment:
|
||||
ava_bk = CreateImg(140, 140, is_alpha=True)
|
||||
ava_border = CreateImg(
|
||||
ava_bk = BuildImage(140, 140, is_alpha=True)
|
||||
ava_border = BuildImage(
|
||||
140,
|
||||
140,
|
||||
background=SIGN_BORDER_PATH / "ava_border_01.png",
|
||||
)
|
||||
ava = CreateImg(102, 102, background=ava_bytes)
|
||||
ava = BuildImage(102, 102, background=ava_bytes)
|
||||
ava.circle()
|
||||
ava_bk.paste(ava, center_type="center")
|
||||
ava_bk.paste(ava_border, alpha=True, center_type="center")
|
||||
|
||||
info_img = CreateImg(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(
|
||||
user.impression
|
||||
)
|
||||
@@ -131,8 +131,8 @@ def _generate_card(
|
||||
info_img.text((0, 20), f"· {NICKNAME}对你的态度:{level2attitude[level]}")
|
||||
info_img.text((0, 40), f"· 距离升级还差 {next_impression - user.impression:.2f} 好感度")
|
||||
|
||||
bar_bk = CreateImg(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png")
|
||||
bar = CreateImg(220, 20, background=SIGN_RESOURCE_PATH / "bar.png")
|
||||
bar_bk = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar_white.png")
|
||||
bar = BuildImage(220, 20, background=SIGN_RESOURCE_PATH / "bar.png")
|
||||
bar_bk.paste(
|
||||
bar,
|
||||
(
|
||||
@@ -150,7 +150,7 @@ def _generate_card(
|
||||
font_size = 30
|
||||
if "好感度双倍加持卡" in gift:
|
||||
font_size = 20
|
||||
gift_border = CreateImg(
|
||||
gift_border = BuildImage(
|
||||
270,
|
||||
100,
|
||||
background=SIGN_BORDER_PATH / "gift_border_02.png",
|
||||
@@ -158,20 +158,20 @@ def _generate_card(
|
||||
)
|
||||
gift_border.text((0, 0), gift, center_type="center")
|
||||
|
||||
bk = CreateImg(
|
||||
bk = BuildImage(
|
||||
876,
|
||||
424,
|
||||
background=SIGN_BACKGROUND_PATH
|
||||
/ random.choice(os.listdir(SIGN_BACKGROUND_PATH)),
|
||||
font_size=25,
|
||||
)
|
||||
A = CreateImg(876, 274, background=SIGN_RESOURCE_PATH / "white.png")
|
||||
line = CreateImg(2, 180, color="black")
|
||||
A = BuildImage(876, 274, background=SIGN_RESOURCE_PATH / "white.png")
|
||||
line = BuildImage(2, 180, color="black")
|
||||
A.transparent(2)
|
||||
A.paste(ava_bk, (25, 80), True)
|
||||
A.paste(line, (200, 70))
|
||||
|
||||
nickname_img = CreateImg(
|
||||
nickname_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=nickname,
|
||||
@@ -184,7 +184,7 @@ def _generate_card(
|
||||
uid = uid[:4] + " " + uid[4:8] + " " + uid[8:]
|
||||
else:
|
||||
uid = "XXXX XXXX XXXX"
|
||||
uid_img = CreateImg(
|
||||
uid_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"UID: {uid}",
|
||||
@@ -192,7 +192,7 @@ def _generate_card(
|
||||
font_size=30,
|
||||
font_color=(255, 255, 255),
|
||||
)
|
||||
sign_day_img = CreateImg(
|
||||
sign_day_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"{user.checkin_count}",
|
||||
@@ -200,17 +200,17 @@ def _generate_card(
|
||||
font_size=40,
|
||||
font_color=(211, 64, 33),
|
||||
)
|
||||
lik_text1_img = CreateImg(
|
||||
lik_text1_img = BuildImage(
|
||||
0, 0, plain_text="当前", color=(255, 255, 255, 0), font_size=20
|
||||
)
|
||||
lik_text2_img = CreateImg(
|
||||
lik_text2_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"好感度:{user.impression:.2f}",
|
||||
color=(255, 255, 255, 0),
|
||||
font_size=30,
|
||||
)
|
||||
watermark = CreateImg(
|
||||
watermark = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"{NICKNAME}@{datetime.now().year}",
|
||||
@@ -218,15 +218,15 @@ def _generate_card(
|
||||
font_size=15,
|
||||
font_color=(155, 155, 155),
|
||||
)
|
||||
today_data = CreateImg(300, 300, color=(255, 255, 255, 0), font_size=20)
|
||||
today_data = BuildImage(300, 300, color=(255, 255, 255, 0), font_size=20)
|
||||
if is_card_view:
|
||||
today_sign_text_img = CreateImg(
|
||||
today_sign_text_img = BuildImage(
|
||||
0, 0, plain_text="", color=(255, 255, 255, 0), font_size=30
|
||||
)
|
||||
if impression_list:
|
||||
impression_list.sort(reverse=True)
|
||||
index = impression_list.index(user.impression)
|
||||
rank_img = CreateImg(
|
||||
rank_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"* 此群好感排名第 {index + 1} 位",
|
||||
@@ -247,7 +247,7 @@ def _generate_card(
|
||||
_type = "view"
|
||||
else:
|
||||
A.paste(gift_border, (570, 140), True)
|
||||
today_sign_text_img = CreateImg(
|
||||
today_sign_text_img = BuildImage(
|
||||
0, 0, plain_text="今日签到", color=(255, 255, 255, 0), font_size=30
|
||||
)
|
||||
if is_double:
|
||||
@@ -262,7 +262,7 @@ def _generate_card(
|
||||
hour = current_date.hour
|
||||
minute = current_date.minute
|
||||
second = current_date.second
|
||||
data_img = CreateImg(
|
||||
data_img = BuildImage(
|
||||
0,
|
||||
0,
|
||||
plain_text=f"时间:{data} {weekdays[week]} {hour}:{minute}:{second}",
|
||||
@@ -296,14 +296,14 @@ def generate_progress_bar_pic():
|
||||
bg_2 = (254, 1, 254)
|
||||
bg_1 = (0, 245, 246)
|
||||
|
||||
bk = CreateImg(1000, 50, is_alpha=True)
|
||||
img_x = CreateImg(50, 50, color=bg_2)
|
||||
bk = BuildImage(1000, 50, is_alpha=True)
|
||||
img_x = BuildImage(50, 50, color=bg_2)
|
||||
img_x.circle()
|
||||
img_x.crop((25, 0, 50, 50))
|
||||
img_y = CreateImg(50, 50, color=bg_1)
|
||||
img_y = BuildImage(50, 50, color=bg_1)
|
||||
img_y.circle()
|
||||
img_y.crop((0, 0, 25, 50))
|
||||
A = CreateImg(950, 50)
|
||||
A = BuildImage(950, 50)
|
||||
width, height = A.size
|
||||
|
||||
step_r = (bg_2[0] - bg_1[0]) / width
|
||||
@@ -321,12 +321,12 @@ def generate_progress_bar_pic():
|
||||
bk.paste(img_x, (975, 0), True)
|
||||
bk.save(SIGN_RESOURCE_PATH / "bar.png")
|
||||
|
||||
A = CreateImg(950, 50)
|
||||
bk = CreateImg(1000, 50, is_alpha=True)
|
||||
img_x = CreateImg(50, 50)
|
||||
A = BuildImage(950, 50)
|
||||
bk = BuildImage(1000, 50, is_alpha=True)
|
||||
img_x = BuildImage(50, 50)
|
||||
img_x.circle()
|
||||
img_x.crop((25, 0, 50, 50))
|
||||
img_y = CreateImg(50, 50)
|
||||
img_y = BuildImage(50, 50)
|
||||
img_y.circle()
|
||||
img_y.crop((0, 0, 25, 50))
|
||||
bk.paste(img_y, (0, 0), True)
|
||||
|
||||
Reference in New Issue
Block a user