✨ 部分功能适配QQ BOT (#1701)

This commit is contained in:
HibiKier
2024-10-18 18:57:55 +08:00
committed by GitHub
parent 7567bfb732
commit 3d3a2a5f7f
29 changed files with 528 additions and 310 deletions
+30 -21
View File
@@ -1,3 +1,4 @@
from nonebot_plugin_uninfo import Uninfo
from nonebot.plugin import PluginMetadata
from nonebot_plugin_session import EventSession
from nonebot_plugin_apscheduler import scheduler
@@ -115,6 +116,13 @@ _sign_matcher.shortcut(
prefix=True,
)
_sign_matcher.shortcut(
"签到排行",
command="签到",
arguments=["--list"],
prefix=True,
)
_sign_matcher.shortcut(
"好感度总排行",
command="签到",
@@ -122,43 +130,44 @@ _sign_matcher.shortcut(
prefix=True,
)
_sign_matcher.shortcut(
"签到总排行",
command="签到",
arguments=["--global", "--list"],
prefix=True,
)
@_sign_matcher.assign("$main")
async def _(session: EventSession, arparma: Arparma, nickname: str = UserName()):
if session.id1:
if path := await SignManage.sign(session, nickname):
logger.info("签到成功", arparma.header_result, session=session)
await MessageUtils.build_message(path).finish()
return MessageUtils.build_message("用户id为空...").send()
async def _(session: Uninfo, arparma: Arparma, nickname: str = UserName()):
path = await SignManage.sign(session, nickname)
logger.info("签到成功", arparma.header_result, session=session)
await MessageUtils.build_message(path).finish()
@_sign_matcher.assign("my")
async def _(session: EventSession, arparma: Arparma, nickname: str = UserName()):
if session.id1:
if image := await SignManage.sign(session, nickname, True):
logger.info("查看我的签到", arparma.header_result, session=session)
await MessageUtils.build_message(image).finish()
return MessageUtils.build_message("用户id为空...").send()
async def _(session: Uninfo, arparma: Arparma, nickname: str = UserName()):
path = await SignManage.sign(session, nickname, True)
logger.info("查看我的签到", arparma.header_result, session=session)
await MessageUtils.build_message(path).finish()
@_sign_matcher.assign("list")
async def _(
session: EventSession, arparma: Arparma, num: Query[int] = AlconnaQuery("num", 10)
session: Uninfo, arparma: Arparma, num: Query[int] = AlconnaQuery("num", 10)
):
if num.result > 50:
await MessageUtils.build_message("排行榜人数不能超过50哦...").finish()
gid = session.id3 or session.id2
gid = session.group.id if session.group else None
if not arparma.find("global") and not gid:
await MessageUtils.build_message(
"私聊中无法查看 '好感度排行',请发送 '好感度总排行'"
).finish()
if session.id1:
if arparma.find("global"):
gid = None
if image := await SignManage.rank(session.id1, num.result, gid):
logger.info("查看签到排行", arparma.header_result, session=session)
await MessageUtils.build_message(image).finish()
return MessageUtils.build_message("用户id为空...").send()
if arparma.find("global"):
gid = None
image = await SignManage.rank(session, num.result, gid)
logger.info("查看签到排行", arparma.header_result, session=session)
await MessageUtils.build_message(image).send()
@scheduler.scheduled_job(
+36 -25
View File
@@ -4,12 +4,12 @@ from pathlib import Path
from datetime import datetime
import pytz
from nonebot_plugin_session import EventSession
from nonebot_plugin_uninfo import Uninfo
from zhenxun.services.log import logger
from zhenxun.models.sign_log import SignLog
from zhenxun.models.sign_user import SignUser
from zhenxun.utils.utils import get_user_avatar
from zhenxun.utils.platform import PlatformUtils
from zhenxun.models.friend_user import FriendUser
from zhenxun.configs.path_config import IMAGE_PATH
from zhenxun.models.user_console import UserConsole
@@ -32,12 +32,12 @@ PLATFORM_PATH = {
class SignManage:
@classmethod
async def rank(
cls, user_id: str, num: int, group_id: str | None = None
cls, session: Uninfo, num: int, group_id: str | None = None
) -> BuildImage: # sourcery skip: avoid-builtin-shadow
"""好感度排行
参数:
user_id: 用户id
session: Uninfo
num: 排行榜数量
group_id: 群组id
@@ -49,14 +49,15 @@ class SignManage:
user_list = await GroupInfoUser.filter(group_id=group_id).values_list(
"user_id", flat=True
)
query = query.filter(user_id__in=user_list)
if user_list:
query = query.filter(user_id__in=user_list)
user_list = (
await query.annotate()
.order_by("-impression")
.values_list("user_id", "impression", "sign_count", "platform")
)
user_id_list = [user[0] for user in user_list]
index = user_id_list.index(user_id) + 1
index = user_id_list.index(session.user.id) + 1
user_list = user_list[:num] if num < len(user_list) else user_list
column_name = ["排名", "-", "名称", "好感度", "签到次数", "平台"]
friend_list = await FriendUser.filter(user_id__in=user_id_list).values_list(
@@ -70,8 +71,11 @@ class SignManage:
for g in group_user:
uid2name[g[0]] = g[1]
data_list = []
platform = PlatformUtils.get_platform(session)
for i, user in enumerate(user_list):
bytes = await get_user_avatar(user[0])
bytes = await PlatformUtils.get_user_avatar(
user[0], platform, session.self_id
)
data_list.append(
[
f"{i+1}",
@@ -92,28 +96,29 @@ class SignManage:
@classmethod
async def sign(
cls, session: EventSession, nickname: str, is_card_view: bool = False
) -> Path | None:
cls, session: Uninfo, nickname: str, is_card_view: bool = False
) -> Path:
"""签到
参数:
session: Session
session: Uninfo
nickname: 用户昵称
is_card_view: 是否展示卡片
返回:
Path: 卡片路径
"""
if not session.id1:
return None
platform = PlatformUtils.get_platform(session)
now = datetime.now(pytz.timezone("Asia/Shanghai"))
user_console = await UserConsole.get_user(session.id1, session.platform)
user_console = await UserConsole.get_user(session.user.id, platform)
user, _ = await SignUser.get_or_create(
user_id=session.id1,
defaults={"user_console": user_console, "platform": session.platform},
user_id=session.user.id,
defaults={"user_console": user_console, "platform": platform},
)
new_log = (
await SignLog.filter(user_id=session.id1).order_by("-create_time").first()
await SignLog.filter(user_id=session.user.id)
.order_by("-create_time")
.first()
)
log_time = None
if new_log:
@@ -123,7 +128,13 @@ class SignManage:
if not is_card_view and (not new_log or (log_time and log_time != now.date())):
return await cls._handle_sign_in(user, nickname, session)
return await get_card(
user, nickname, -1, user_console.gold, "", is_card_view=is_card_view
user,
session,
nickname,
-1,
user_console.gold,
"",
is_card_view=is_card_view,
)
@classmethod
@@ -131,36 +142,35 @@ class SignManage:
cls,
user: SignUser,
nickname: str,
session: EventSession,
session: Uninfo,
) -> Path:
"""签到处理
参数:
user: SignUser
nickname: 用户昵称
session: Session
session: Uninfo
返回:
Path: 卡片路径
"""
platform = PlatformUtils.get_platform(session)
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 or rand < specify_probability:
impression_added *= 2
await SignUser.sign(user, impression_added, session.bot_id, session.platform)
await SignUser.sign(user, impression_added, session.self_id, 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
)
await UserConsole.add_gold(user.user_id, gold + gift, "sign_in", platform)
gift = f"额外金币 +{gift}"
else:
await UserConsole.add_gold(user.user_id, gold, "sign_in", session.platform)
await UserConsole.add_props_by_name(user.user_id, gift, 1, session.platform)
await UserConsole.add_gold(user.user_id, gold, "sign_in", platform)
await UserConsole.add_props_by_name(user.user_id, gift, 1, platform)
gift += " + 1"
logger.info(
f"签到成功. score: {user.impression:.2f} "
@@ -170,6 +180,7 @@ class SignManage:
)
return await get_card(
user,
session,
nickname,
impression_added,
gold,
+14 -11
View File
@@ -7,13 +7,13 @@ from datetime import datetime
import pytz
import nonebot
from nonebot.drivers import Driver
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_htmlrender import template_to_pic
from zhenxun.models.sign_log import SignLog
from zhenxun.models.sign_user import SignUser
from zhenxun.utils.utils import get_user_avatar
from zhenxun.utils.http_utils import AsyncHttpx
from zhenxun.utils.image_utils import BuildImage
from zhenxun.utils.platform import PlatformUtils
from zhenxun.configs.config import Config, BotConfig
from zhenxun.configs.path_config import IMAGE_PATH, TEMPLATE_PATH
@@ -63,6 +63,7 @@ async def init_image():
async def get_card(
user: SignUser,
session: Uninfo,
nickname: str,
add_impression: float,
gold: int | None,
@@ -74,6 +75,7 @@ async def get_card(
参数:
user: SignUser
session: Uninfo
nickname: 用户昵称
impression: 新增的好感度
gold: 金币
@@ -99,17 +101,18 @@ async def get_card(
is_card_view = True
return (
await _generate_html_card(
user, nickname, add_impression, gold, gift, is_double, is_card_view
user, session, nickname, add_impression, gold, gift, is_double, is_card_view
)
if base_config.get("IMAGE_STYLE") == "zhenxun"
else await _generate_card(
user, nickname, add_impression, gold, gift, is_double, is_card_view
user, session, nickname, add_impression, gold, gift, is_double, is_card_view
)
)
async def _generate_card(
user: SignUser,
session: Uninfo,
nickname: str,
add_impression: float,
gold: int | None,
@@ -121,6 +124,7 @@ async def _generate_card(
参数:
user: SignUser
session: Uninfo
nickname: 用户昵称
add_impression: 新增的好感度
gold: 金币
@@ -137,7 +141,9 @@ async def _generate_card(
140,
background=SIGN_BORDER_PATH / "ava_border_01.png",
)
if user.platform == "qq" and (byt := await get_user_avatar(user.user_id)):
if session.user.avatar and (
byt := await AsyncHttpx.get_content(session.user.avatar)
):
ava = BuildImage(107, 107, background=BytesIO(byt))
else:
ava = BuildImage(107, 107, (0, 0, 0))
@@ -273,10 +279,6 @@ async def _generate_card(
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, (398, 158))
# await bk.text((_x, 167), "days")
await bk.paste(tip_image, (10, 167))
await bk.paste(date_img, (220, 370))
await bk.paste(lik_text1_img, (220, 240))
@@ -377,6 +379,7 @@ def clear_sign_data_pic():
async def _generate_html_card(
user: SignUser,
session: Uninfo,
nickname: str,
add_impression: float,
gold: int | None,
@@ -388,6 +391,7 @@ async def _generate_html_card(
参数:
user: SignUser
session: Uninfo
nickname: 用户昵称
add_impression: 新增的好感度
gold: 金币
@@ -420,9 +424,8 @@ async def _generate_html_card(
next_impression - previous_impression
)
now = datetime.now()
ava_url = PlatformUtils.get_user_avatar_url(user.user_id, "qq")
data = {
"ava_url": ava_url,
"ava_url": session.user.avatar,
"name": nickname,
"uid": uid,
"sign_count": f"{user.sign_count}",