mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
feat✨: 新增好感度总排行功能及修复相关错误
This commit is contained in:
parent
0e0e37437e
commit
a815c3bcc5
@ -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()
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user