mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
135 lines
5.3 KiB
Python
135 lines
5.3 KiB
Python
from nonebot import on_command
|
||
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, GROUP
|
||
from models.group_info import GroupInfo
|
||
from nonebot.typing import T_State
|
||
from pathlib import Path
|
||
from configs.path_config import DATA_PATH, TTF_PATH
|
||
import matplotlib.pyplot as plt
|
||
from utils.utils import get_message_text
|
||
from utils.img_utils import fig2b64
|
||
from utils.init_result import image
|
||
from configs.config import plugins2info_dict
|
||
from matplotlib.font_manager import FontProperties
|
||
|
||
plt.rcParams['font.family'] = ['SimHei', 'FangSong', 'KaiTi']
|
||
plt.rcParams['font.sans-serif'] = ['SimHei', 'FangSong', 'KaiTi']
|
||
plt.rcParams['axes.unicode_minus'] = False
|
||
|
||
font = FontProperties(fname=f'{TTF_PATH}/yz.ttf', size=10)
|
||
|
||
try:
|
||
import ujson as json
|
||
except ModuleNotFoundError:
|
||
import json
|
||
|
||
__plugin_name__ = '功能调用统计'
|
||
__plugin_usage__ = '用法: 无'
|
||
|
||
statistics = on_command("功能调用统计", aliases={'日功能调用统计', '周功能调用统计', '月功能调用统计'}, permission=GROUP, priority=5, block=True)
|
||
|
||
statistics_file = Path(f'{DATA_PATH}/_prefix_count.json')
|
||
|
||
|
||
@statistics.handle()
|
||
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||
msg = get_message_text(event.json())
|
||
plugin = ''
|
||
if not statistics_file.exists():
|
||
await statistics.finish('统计文件不存在...', at_sender=True)
|
||
if state["_prefix"]["raw_command"][0] == '日':
|
||
arg = 'day_statistics'
|
||
elif state["_prefix"]["raw_command"][0] == '周':
|
||
arg = 'week_statistics'
|
||
elif state["_prefix"]["raw_command"][0] == '月':
|
||
arg = 'month_statistics'
|
||
else:
|
||
arg = 'total_statistics'
|
||
if msg:
|
||
for key in plugins2info_dict.keys():
|
||
if msg in plugins2info_dict[key]['cmd']:
|
||
plugin = plugins2info_dict[key]['cmd'][0]
|
||
break
|
||
else:
|
||
if arg not in ['day_statistics', 'total_statistics']:
|
||
await statistics.finish('未找到此功能的调用...', at_sender=True)
|
||
data: dict = json.load(open(statistics_file, 'r', encoding='utf8'))
|
||
if not data[arg].get(str(event.group_id)):
|
||
await statistics.finish('该群统计数据不存在...', at_sender=True)
|
||
day_index = data['day_index']
|
||
data = data[arg][str(event.group_id)]
|
||
group_name = await GroupInfo.get_group_info(event.group_id)
|
||
group_name = group_name.group_name if group_name else str(event.group_id)
|
||
img = generate_statistics_img(data, arg, group_name, plugin, day_index)
|
||
await statistics.send(image(b64=img))
|
||
plt.cla()
|
||
|
||
|
||
def generate_statistics_img(data: dict, arg: str, group_name: str, plugin: str, day_index: int):
|
||
if arg == 'day_statistics':
|
||
init_bar_graph(data, f'{group_name} 日功能调用统计')
|
||
elif arg == 'week_statistics':
|
||
if plugin:
|
||
current_week = day_index % 7
|
||
week_lst = []
|
||
if current_week == 0:
|
||
week_lst = [1, 2, 3, 4, 5, 6, 7]
|
||
else:
|
||
for i in range(current_week + 1, 7):
|
||
week_lst.append(str(i))
|
||
for i in range(current_week + 1):
|
||
week_lst.append(str(i))
|
||
count = []
|
||
for i in range(7):
|
||
if int(week_lst[i]) == 7:
|
||
count.append(data[str(0)][plugin])
|
||
else:
|
||
count.append(data[str(week_lst[i])][plugin])
|
||
week_lst = ['7' if i == '0' else i for i in week_lst]
|
||
plt.plot(week_lst, count)
|
||
plt.title(f'{group_name} 周 {plugin} 功能调用统计【为7天统计】', FontProperties=font)
|
||
else:
|
||
init_bar_graph(update_data(data), f'{group_name} 周功能调用统计【为7天统计】')
|
||
elif arg == 'month_statistics':
|
||
if plugin:
|
||
day_index = day_index % 30
|
||
day_lst = []
|
||
for i in range(day_index + 1, 30):
|
||
day_lst.append(i)
|
||
for i in range(day_index + 1):
|
||
day_lst.append(i)
|
||
count = [data[str(day_lst[i])][plugin] for i in range(30)]
|
||
day_lst = [str(x + 1) for x in day_lst]
|
||
plt.title(f'{group_name} 月 {plugin} 功能调用统计【为30天统计】', FontProperties=font)
|
||
plt.plot(day_lst, count)
|
||
else:
|
||
init_bar_graph(update_data(data), f'{group_name} 月功能调用统计【为30天统计】')
|
||
elif arg == 'total_statistics':
|
||
init_bar_graph(data, f'{group_name} 功能调用统计')
|
||
|
||
return fig2b64(plt)
|
||
|
||
|
||
def init_bar_graph(data: dict, title: str, ha: str = 'left', va: str = 'center'):
|
||
plt.tick_params(axis='y', labelsize=7)
|
||
tmp_x = list(data.keys())
|
||
tmp_y = list(data.values())
|
||
x = [tmp_x[i] for i in range(len(tmp_y)) if tmp_y[i]]
|
||
y = [tmp_y[i] for i in range(len(tmp_y)) if tmp_y[i]]
|
||
plt.barh(x, y)
|
||
plt.title(f'{title}', FontProperties=font)
|
||
for y, x in zip(y, x):
|
||
plt.text(y, x, s=str(y), ha=ha, va=va, fontsize=8)
|
||
|
||
|
||
def update_data(data: dict):
|
||
tmp_dict = {}
|
||
for day in data.keys():
|
||
for plugin_name in data[day].keys():
|
||
# print(f'{day}:{plugin_name} = {data[day][plugin_name]}')
|
||
if data[day][plugin_name] is not None:
|
||
if tmp_dict.get(plugin_name) is None:
|
||
tmp_dict[plugin_name] = 1
|
||
else:
|
||
tmp_dict[plugin_name] += data[day][plugin_name]
|
||
return tmp_dict
|