feat: 新增好感度总排行功能及修复相关错误

This commit is contained in:
HibiKier 2024-07-31 17:30:59 +08:00
parent 0e0e37437e
commit a815c3bcc5
2 changed files with 51 additions and 27 deletions

View File

@ -30,6 +30,7 @@ __plugin_meta__ = PluginMetadata(
签到 签到
我的签到 我的签到
好感度排行 好感度排行
好感度总排行
* 签到时有 3% 概率 * 2 * * 签到时有 3% 概率 * 2 *
""".strip(), """.strip(),
extra=PluginExtraData( extra=PluginExtraData(
@ -83,8 +84,12 @@ _sign_matcher = on_alconna(
"签到", "签到",
Option("--my", action=store_true, help_text="我的签到"), Option("--my", action=store_true, help_text="我的签到"),
Option( Option(
"-l|--list", Args["num", int, 10], action=store_true, help_text="好感度排行" "-l|--list",
Args["num", int, 10],
action=store_true,
help_text="好感度排行",
), ),
Option("-g|--global", action=store_true, help_text="全局排行"),
), ),
priority=5, priority=5,
block=True, block=True,
@ -104,11 +109,16 @@ _sign_matcher.shortcut(
prefix=True, prefix=True,
) )
_sign_matcher.shortcut(
"好感度总排行",
command="签到",
arguments=["--list", "--global"],
prefix=True,
)
@_sign_matcher.assign("$main") @_sign_matcher.assign("$main")
async def _( async def _(session: EventSession, arparma: Arparma, nickname: str = UserName()):
session: EventSession, arparma: Arparma, nickname: str = UserName()
):
if session.id1: if session.id1:
if path := await SignManage.sign(session, nickname): if path := await SignManage.sign(session, nickname):
logger.info("签到成功", arparma.header_result, session=session) logger.info("签到成功", arparma.header_result, session=session)
@ -117,9 +127,7 @@ async def _(
@_sign_matcher.assign("my") @_sign_matcher.assign("my")
async def _( async def _(session: EventSession, arparma: Arparma, nickname: str = UserName()):
session: EventSession, arparma: Arparma, nickname: str = UserName()
):
if session.id1: if session.id1:
if image := await SignManage.sign(session, nickname, True): if image := await SignManage.sign(session, nickname, True):
logger.info("查看我的签到", arparma.header_result, session=session) logger.info("查看我的签到", arparma.header_result, session=session)
@ -128,14 +136,14 @@ async def _(
@_sign_matcher.assign("list") @_sign_matcher.assign("list")
async def _( async def _(session: EventSession, arparma: Arparma, num: int):
session: EventSession, gid = session.id3 or session.id2
arparma: Arparma, if not arparma.find("global") and not gid:
num: int, await Text("私聊中无法查看 '好感度排行',请发送 '好感度总排行'").finish()
nickname: str = UserName()
):
if session.id1: if session.id1:
if image := await SignManage.rank(session.id1, num): if arparma.find("global"):
gid = None
if image := await SignManage.rank(session.id1, num, gid):
logger.info("查看签到排行", arparma.header_result, session=session) logger.info("查看签到排行", arparma.header_result, session=session)
await Image(image.pic2bytes()).finish() await Image(image.pic2bytes()).finish()
return Text("用户id为空...").send() return Text("用户id为空...").send()

View File

@ -19,7 +19,7 @@ from zhenxun.utils.utils import get_user_avatar
from ._random_event import random_event from ._random_event import random_event
from .goods_register import driver from .goods_register import driver
from .utils import SIGN_TODAY_CARD_PATH, get_card from .utils import get_card
ICON_PATH = IMAGE_PATH / "_icon" ICON_PATH = IMAGE_PATH / "_icon"
@ -34,21 +34,33 @@ PLATFORM_PATH = {
class SignManage: class SignManage:
@classmethod @classmethod
async def rank(cls, user_id: str, num: int) -> BuildImage: async def rank(
cls, user_id: str, num: int, group_id: str | None = None
) -> BuildImage:
"""好感度排行
参数:
user_id: 用户id
num: 排行榜数量
group_id: 群组id
返回:
BuildImage: 构造图片
"""
query = SignUser
if group_id:
user_list = await GroupInfoUser.filter(group_id=group_id).values_list(
"user_id", flat=True
)
query = query.filter(user_id__in=user_list)
all_list = ( all_list = (
await SignUser.annotate() await query.annotate()
.order_by("-impression") .order_by("-impression")
.values_list("user_id", flat=True) .values_list("user_id", flat=True)
) )
index = all_list.index(user_id) + 1 # type: ignore index = all_list.index(user_id) + 1 # type: ignore
user_list = await SignUser.annotate().order_by("-impression").limit(num).all() user_list = await query.annotate().order_by("-impression").limit(num).all()
user_id_list = [u.user_id for u in user_list] 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")
)
column_name = ["排名", "-", "名称", "好感度", "签到次数", "平台"] column_name = ["排名", "-", "名称", "好感度", "签到次数", "平台"]
friend_list = await FriendUser.filter(user_id__in=user_id_list).values_list( friend_list = await FriendUser.filter(user_id__in=user_id_list).values_list(
"user_id", "user_name" "user_id", "user_name"
@ -72,9 +84,13 @@ class SignManage:
(PLATFORM_PATH.get(user.platform), 30, 30), (PLATFORM_PATH.get(user.platform), 30, 30),
] ]
) )
return await ImageTemplate.table_page( if group_id:
"好感度排行", f"你的排名在第 {index} 位哦!", column_name, data_list title = "好感度群组内排行"
) tip = f"你的排名在本群第 {index} 位哦!"
else:
title = "好感度全局排行"
tip = f"你的排名在全局第 {index} 位哦!"
return await ImageTemplate.table_page(title, tip, column_name, data_list)
@classmethod @classmethod
async def sign( async def sign(