mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
109 lines
3.8 KiB
Python
109 lines
3.8 KiB
Python
from datetime import datetime, timedelta
|
||
|
||
import pytz
|
||
from models.chat_history import ChatHistory
|
||
from models.group_member_info import GroupInfoUser
|
||
from nonebot import on_regex
|
||
from nonebot.adapters.onebot.v11 import GroupMessageEvent
|
||
from nonebot.params import RegexGroup
|
||
from utils.image_utils import BuildImage, text2image
|
||
from utils.utils import is_number
|
||
from utils.message_builder import image
|
||
from typing import Tuple, Any
|
||
|
||
|
||
__zx_plugin_name__ = "消息统计"
|
||
__plugin_usage__ = """
|
||
usage:
|
||
发言记录统计
|
||
regex:(周|月)?消息排行(des|DES)?(n=[0-9]{1,2})?
|
||
指令:
|
||
消息统计?(des)?(n=?)
|
||
周消息统计?(des)?(n=?)
|
||
月消息统计?(des)?(n=?)
|
||
示例:
|
||
消息统计
|
||
消息统计des
|
||
消息统计DESn=15
|
||
消息统计n=15
|
||
""".strip()
|
||
__plugin_des__ = "发言消息排行"
|
||
__plugin_cmd__ = [
|
||
"消息统计",
|
||
"周消息统计",
|
||
"月消息统计"
|
||
]
|
||
__plugin_type__ = ("数据统计", 1)
|
||
__plugin_version__ = 0.1
|
||
__plugin_author__ = "HibiKier"
|
||
__plugin_settings__ = {
|
||
"level": 5,
|
||
"cmd": ["消息统计"],
|
||
}
|
||
|
||
|
||
msg_handler = on_regex(r"(周|月)?消息统计(des|DES)?(n=[0-9]{1,2})?", priority=5, block=True)
|
||
|
||
|
||
@msg_handler.handle()
|
||
async def _(event: GroupMessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()):
|
||
gid = event.group_id
|
||
date_scope = None
|
||
date, order, num = reg_group
|
||
num = num.split("=")[-1] or 10
|
||
if num and is_number(num) and 10 < int(num) < 50:
|
||
num = int(num)
|
||
if date in ["周"]:
|
||
date_scope = (datetime.now() - timedelta(days=7), datetime.now())
|
||
elif date in ["月"]:
|
||
date_scope = (datetime.now() - timedelta(days=30), datetime.now())
|
||
if rank_data := await ChatHistory.get_group_msg_rank(
|
||
gid, num, order or "DESC", date_scope
|
||
):
|
||
name = "昵称:\n\n"
|
||
num_str = "发言次数:\n\n"
|
||
idx = 1
|
||
for uid, num in rank_data:
|
||
try:
|
||
user_name = (await GroupInfoUser.get_member_info(uid, gid)).user_name
|
||
except AttributeError:
|
||
user_name = uid
|
||
name += f"\t{idx}.{user_name} \n\n"
|
||
num_str += f"\t{num}\n\n"
|
||
idx += 1
|
||
name_img = await text2image(name.strip(), padding=10, color="#f9f6f2")
|
||
num_img = await text2image(num_str.strip(), padding=10, color="#f9f6f2")
|
||
if not date_scope:
|
||
if date_scope := await ChatHistory.get_group_first_msg_datetime(gid):
|
||
date_scope = date_scope.astimezone(
|
||
pytz.timezone("Asia/Shanghai")
|
||
).replace(microsecond=0)
|
||
else:
|
||
date_scope = datetime.now().replace(microsecond=0)
|
||
date_str = f"日期:{date_scope} - 至今"
|
||
else:
|
||
date_str = f"日期:{date_scope[0].replace(microsecond=0)} - {date_scope[1].replace(microsecond=0)}"
|
||
date_w = BuildImage(0, 0, font_size=15).getsize(date_str)[0]
|
||
img_w = date_w if date_w > name_img.w + num_img.w else name_img.w + num_img.w
|
||
A = BuildImage(
|
||
img_w + 15,
|
||
num_img.h + 30,
|
||
color="#f9f6f2",
|
||
font="CJGaoDeGuo.otf",
|
||
font_size=15,
|
||
)
|
||
await A.atext((10, 10), date_str)
|
||
await A.apaste(name_img, (0, 30))
|
||
await A.apaste(num_img, (name_img.w, 30))
|
||
await msg_handler.send(image(b64=A.pic2bs4()))
|
||
|
||
|
||
# @test.handle()
|
||
# async def _(event: MessageEvent):
|
||
# print(await ChatHistory.get_user_msg(event.user_id, "private"))
|
||
# print(await ChatHistory.get_user_msg_count(event.user_id, "private"))
|
||
# print(await ChatHistory.get_user_msg(event.user_id, "group"))
|
||
# print(await ChatHistory.get_user_msg_count(event.user_id, "group"))
|
||
# print(await ChatHistory.get_group_msg(event.group_id))
|
||
# print(await ChatHistory.get_group_msg_count(event.group_id))
|