2022-04-26 14:45:04 +08:00
|
|
|
|
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:
|
|
|
|
|
|
发言记录统计
|
2022-07-29 19:08:16 +08:00
|
|
|
|
regex:(周|月|日)?消息排行(des|DES)?(n=[0-9]{1,2})?
|
2022-04-26 14:45:04 +08:00
|
|
|
|
指令:
|
|
|
|
|
|
消息统计?(des)?(n=?)
|
|
|
|
|
|
周消息统计?(des)?(n=?)
|
|
|
|
|
|
月消息统计?(des)?(n=?)
|
2022-07-29 19:08:16 +08:00
|
|
|
|
日消息统计?(des)?(n=?)
|
2022-04-26 14:45:04 +08:00
|
|
|
|
示例:
|
|
|
|
|
|
消息统计
|
|
|
|
|
|
消息统计des
|
|
|
|
|
|
消息统计DESn=15
|
|
|
|
|
|
消息统计n=15
|
|
|
|
|
|
""".strip()
|
|
|
|
|
|
__plugin_des__ = "发言消息排行"
|
|
|
|
|
|
__plugin_cmd__ = [
|
|
|
|
|
|
"消息统计",
|
|
|
|
|
|
"周消息统计",
|
2022-07-29 19:08:16 +08:00
|
|
|
|
"月消息统计",
|
|
|
|
|
|
"日消息统计"
|
2022-04-26 14:45:04 +08:00
|
|
|
|
]
|
|
|
|
|
|
__plugin_type__ = ("数据统计", 1)
|
|
|
|
|
|
__plugin_version__ = 0.1
|
|
|
|
|
|
__plugin_author__ = "HibiKier"
|
|
|
|
|
|
__plugin_settings__ = {
|
|
|
|
|
|
"level": 5,
|
|
|
|
|
|
"cmd": ["消息统计"],
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-29 19:08:16 +08:00
|
|
|
|
msg_handler = on_regex(r"^(周|月|日)?消息统计(des|DES)?(n=[0-9]{1,2})?$", priority=5, block=True)
|
2022-04-26 14:45:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@msg_handler.handle()
|
|
|
|
|
|
async def _(event: GroupMessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()):
|
|
|
|
|
|
gid = event.group_id
|
|
|
|
|
|
date_scope = None
|
|
|
|
|
|
date, order, num = reg_group
|
2022-04-26 15:16:26 +08:00
|
|
|
|
num = num.split("=")[-1] if num else 10
|
2022-04-26 14:45:04 +08:00
|
|
|
|
if num and is_number(num) and 10 < int(num) < 50:
|
|
|
|
|
|
num = int(num)
|
2022-07-29 19:08:16 +08:00
|
|
|
|
time_now = datetime.now()
|
|
|
|
|
|
zero_today = time_now - timedelta(hours=time_now.hour, minutes=time_now.minute, seconds=time_now.second)
|
|
|
|
|
|
if date in ["日"]:
|
|
|
|
|
|
date_scope = (zero_today, time_now)
|
|
|
|
|
|
elif date in ["周"]:
|
|
|
|
|
|
date_scope = (time_now - timedelta(days=7), time_now)
|
2022-04-26 14:45:04 +08:00
|
|
|
|
elif date in ["月"]:
|
2022-07-29 19:08:16 +08:00
|
|
|
|
date_scope = (time_now - timedelta(days=30), time_now)
|
2022-04-26 14:45:04 +08:00
|
|
|
|
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:
|
2022-07-29 19:08:16 +08:00
|
|
|
|
date_scope = time_now.replace(microsecond=0)
|
2022-04-26 14:45:04 +08:00
|
|
|
|
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))
|