zhenxun_bot/plugins/statistics_handle.py
2021-06-30 19:50:55 +08:00

135 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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