From a815c3bcc59aedfb22e25d74b6ac5bd00d286999 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Wed, 31 Jul 2024 17:30:59 +0800 Subject: [PATCH] =?UTF-8?q?feat=E2=9C=A8:=20=E6=96=B0=E5=A2=9E=E5=A5=BD?= =?UTF-8?q?=E6=84=9F=E5=BA=A6=E6=80=BB=E6=8E=92=E8=A1=8C=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E4=BF=AE=E5=A4=8D=E7=9B=B8=E5=85=B3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zhenxun/builtin_plugins/sign_in/__init__.py | 36 +++++++++------- .../builtin_plugins/sign_in/_data_source.py | 42 +++++++++++++------ 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/zhenxun/builtin_plugins/sign_in/__init__.py b/zhenxun/builtin_plugins/sign_in/__init__.py index 964c1d5e..5818852f 100644 --- a/zhenxun/builtin_plugins/sign_in/__init__.py +++ b/zhenxun/builtin_plugins/sign_in/__init__.py @@ -30,6 +30,7 @@ __plugin_meta__ = PluginMetadata( 签到 我的签到 好感度排行 + 好感度总排行 * 签到时有 3% 概率 * 2 * """.strip(), extra=PluginExtraData( @@ -83,8 +84,12 @@ _sign_matcher = on_alconna( "签到", Option("--my", action=store_true, help_text="我的签到"), 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, block=True, @@ -104,11 +109,16 @@ _sign_matcher.shortcut( prefix=True, ) +_sign_matcher.shortcut( + "好感度总排行", + command="签到", + arguments=["--list", "--global"], + prefix=True, +) + @_sign_matcher.assign("$main") -async def _( - session: EventSession, arparma: Arparma, nickname: str = UserName() -): +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) @@ -117,9 +127,7 @@ async def _( @_sign_matcher.assign("my") -async def _( - session: EventSession, arparma: Arparma, nickname: str = UserName() -): +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) @@ -128,14 +136,14 @@ async def _( @_sign_matcher.assign("list") -async def _( - session: EventSession, - arparma: Arparma, - num: int, - nickname: str = UserName() -): +async def _(session: EventSession, arparma: Arparma, num: int): + gid = session.id3 or session.id2 + if not arparma.find("global") and not gid: + await Text("私聊中无法查看 '好感度排行',请发送 '好感度总排行'").finish() 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) await Image(image.pic2bytes()).finish() return Text("用户id为空...").send() diff --git a/zhenxun/builtin_plugins/sign_in/_data_source.py b/zhenxun/builtin_plugins/sign_in/_data_source.py index 0b769c43..0607619c 100644 --- a/zhenxun/builtin_plugins/sign_in/_data_source.py +++ b/zhenxun/builtin_plugins/sign_in/_data_source.py @@ -19,7 +19,7 @@ from zhenxun.utils.utils import get_user_avatar from ._random_event import random_event from .goods_register import driver -from .utils import SIGN_TODAY_CARD_PATH, get_card +from .utils import get_card ICON_PATH = IMAGE_PATH / "_icon" @@ -34,21 +34,33 @@ PLATFORM_PATH = { class SignManage: @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 = ( - await SignUser.annotate() + await query.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_list = await query.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") - ) column_name = ["排名", "-", "名称", "好感度", "签到次数", "平台"] friend_list = await FriendUser.filter(user_id__in=user_id_list).values_list( "user_id", "user_name" @@ -72,9 +84,13 @@ class SignManage: (PLATFORM_PATH.get(user.platform), 30, 30), ] ) - return await ImageTemplate.table_page( - "好感度排行", f"你的排名在第 {index} 位哦!", column_name, data_list - ) + if group_id: + title = "好感度群组内排行" + tip = f"你的排名在本群第 {index} 位哦!" + else: + title = "好感度全局排行" + tip = f"你的排名在全局第 {index} 位哦!" + return await ImageTemplate.table_page(title, tip, column_name, data_list) @classmethod async def sign(