mirror of
https://github.com/Genshin-bots/gsuid_core.git
synced 2025-05-31 20:50:28 +08:00
* ⬆️ `pre-commit-ci`自动升级 updates: - [github.com/psf/black: 23.12.1 → 24.1.1](https://github.com/psf/black/compare/23.12.1...24.1.1) - [github.com/pycqa/flake8: 6.1.0 → 7.0.0](https://github.com/pycqa/flake8/compare/6.1.0...7.0.0) * 🚨 `pre-commit-ci`修复格式错误 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
188 lines
5.1 KiB
Python
188 lines
5.1 KiB
Python
import json
|
|
import datetime
|
|
from copy import deepcopy
|
|
from typing import Dict, List, Optional, TypedDict
|
|
|
|
import aiofiles
|
|
|
|
from gsuid_core.data_store import get_res_path
|
|
|
|
global_val_path = get_res_path(['GsCore', 'global'])
|
|
|
|
|
|
class PlatformVal(TypedDict):
|
|
receive: int
|
|
send: int
|
|
command: int
|
|
image: int
|
|
group: Dict[str, Dict[str, int]]
|
|
user: Dict[str, Dict[str, int]]
|
|
|
|
|
|
GlobalVal = Dict[str, PlatformVal]
|
|
BotVal = Dict[str, GlobalVal]
|
|
|
|
platform_val: PlatformVal = {
|
|
'receive': 0,
|
|
'send': 0,
|
|
'command': 0,
|
|
'image': 0,
|
|
'group': {},
|
|
'user': {},
|
|
}
|
|
|
|
bot_val: BotVal = {}
|
|
|
|
|
|
def get_platform_val(bot_id: str, bot_self_id: str):
|
|
global bot_val
|
|
|
|
if bot_id not in bot_val:
|
|
bot_val[bot_id] = {}
|
|
if bot_self_id not in bot_val[bot_id]:
|
|
bot_val[bot_id][bot_self_id] = deepcopy(platform_val)
|
|
|
|
return bot_val[bot_id][bot_self_id]
|
|
|
|
|
|
def get_all_bot_dict():
|
|
data = {}
|
|
for bot_id_path in global_val_path.iterdir():
|
|
if bot_id_path.is_dir():
|
|
data[bot_id_path.name] = []
|
|
for self_id_path in bot_id_path.iterdir():
|
|
if self_id_path.is_dir():
|
|
data[bot_id_path.name].append(self_id_path.name)
|
|
return data
|
|
|
|
|
|
async def get_value_analysis(
|
|
bot_id: str, bot_self_id: str, day: int = 7
|
|
) -> Dict[str, PlatformVal]:
|
|
result = {}
|
|
for day in range(day):
|
|
today = datetime.date.today()
|
|
endday = today - datetime.timedelta(days=day)
|
|
endday_format = endday.strftime("%Y_%d_%b")
|
|
|
|
local_val = await get_global_val(bot_id, bot_self_id, day)
|
|
result[endday_format] = local_val
|
|
return result
|
|
|
|
|
|
async def get_global_analysis(bot_id: str, bot_self_id: str):
|
|
seven_data = await get_value_analysis(bot_id, bot_self_id)
|
|
|
|
group_data = []
|
|
user_data = []
|
|
|
|
user_list: List[List[str]] = []
|
|
user_all_list: List[str] = []
|
|
|
|
for day in seven_data:
|
|
local_val = seven_data[day]
|
|
if local_val['receive'] == 0 and local_val['send'] == 0:
|
|
continue
|
|
|
|
_user_list = list(local_val['user'].keys())
|
|
|
|
user_list.append(_user_list)
|
|
user_all_list.extend(_user_list)
|
|
|
|
group_data.append(len(local_val['group']))
|
|
user_data.append(len(local_val['user']))
|
|
|
|
user_before_list = [user for users in user_list[:-1] for user in users]
|
|
user_after_list = [user for users in user_list[1:] for user in users]
|
|
|
|
out_user = []
|
|
new_user = []
|
|
for i in user_list[0]:
|
|
if i not in user_before_list:
|
|
out_user.append(i)
|
|
|
|
for i in user_list[-1]:
|
|
if i not in user_after_list:
|
|
new_user.append(i)
|
|
|
|
_user_all_list = list(set(user_all_list))
|
|
|
|
data = {
|
|
'DAU': '{0:.2f}'.format(sum(user_data) / len(user_data)),
|
|
'DAG': '{0:.2f}'.format(sum(group_data) / len(group_data)),
|
|
'NU': str(len(new_user)),
|
|
'OU': (
|
|
'{0:.2f}%'.format((len(out_user) / len(_user_all_list)) * 100)
|
|
if len(_user_all_list) != 0
|
|
else "0.00%"
|
|
),
|
|
}
|
|
return data
|
|
|
|
|
|
async def load_all_global_val():
|
|
global bot_val
|
|
today = datetime.date.today()
|
|
date_format = today.strftime("%Y_%d_%b")
|
|
|
|
for bot_id_path in global_val_path.iterdir():
|
|
if bot_id_path.stem not in bot_val:
|
|
bot_val[bot_id_path.stem] = {}
|
|
for self_id_path in bot_id_path.iterdir():
|
|
path = self_id_path / f'GlobalVal_{date_format}.json'
|
|
if self_id_path.is_dir() and path.exists():
|
|
async with aiofiles.open(path, 'rb') as fp:
|
|
data = json.loads(await fp.read())
|
|
bot_val[bot_id_path.stem][self_id_path.stem] = data
|
|
|
|
|
|
async def save_all_global_val():
|
|
global bot_val
|
|
for bot_id in bot_val:
|
|
for bot_self_id in bot_val[bot_id]:
|
|
await save_global_val(bot_id, bot_self_id)
|
|
|
|
|
|
async def get_global_val(
|
|
bot_id: str, bot_self_id: str, day: Optional[int] = None
|
|
) -> PlatformVal:
|
|
if day is None or day == 0:
|
|
return get_platform_val(bot_id, bot_self_id)
|
|
else:
|
|
today = datetime.date.today()
|
|
endday = today - datetime.timedelta(days=day)
|
|
endday_format = endday.strftime("%Y_%d_%b")
|
|
_path = global_val_path / bot_id / bot_self_id
|
|
path = _path / f'GlobalVal_{endday_format}.json'
|
|
if path.exists():
|
|
async with aiofiles.open(path, 'rb') as fp:
|
|
data = json.loads(await fp.read())
|
|
return data
|
|
else:
|
|
return platform_val
|
|
|
|
|
|
async def save_global_val(bot_id: str, bot_self_id: str):
|
|
if not bot_self_id:
|
|
return
|
|
|
|
local_val = get_platform_val(bot_id, bot_self_id)
|
|
|
|
today = datetime.date.today()
|
|
date_format = today.strftime("%Y_%d_%b")
|
|
|
|
path = global_val_path / bot_id / bot_self_id
|
|
if not path.exists():
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
|
|
async with aiofiles.open(
|
|
path / f'GlobalVal_{date_format}.json', 'w', encoding='utf8'
|
|
) as fp:
|
|
await fp.write(
|
|
json.dumps(
|
|
local_val,
|
|
indent=4,
|
|
ensure_ascii=False,
|
|
)
|
|
)
|