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))