142 lines
5.2 KiB
Python
142 lines
5.2 KiB
Python
import os
|
||
from PIL import Image, ImageDraw, ImageFont
|
||
from nonebot import logger
|
||
from functools import reduce
|
||
|
||
from .img_utils import png_resize
|
||
from .param import round_data, interval_table
|
||
|
||
filepath = os.path.dirname(__file__).replace("\\", "/")
|
||
|
||
|
||
# async def avatar_cache(avatar_url, player_id):
|
||
# if avatar_url:
|
||
# try:
|
||
# # 添加10s超时判断,如果超时直接使用默认头像
|
||
# res = BytesIO(requests.get(avatar_url, timeout=10).content)
|
||
# avatar = Image.open(res).convert('RGBA')
|
||
# avatar.save(f'{filepath}/avatar_cache/{player_id}.png', 'PNG')
|
||
# return avatar
|
||
# except requests.exceptions.RequestException as e:
|
||
# logger.warning(f"请求异常:{e}")
|
||
# else:
|
||
# return None
|
||
#
|
||
#
|
||
# async def get_avatar(avatar_url, player_id):
|
||
# img = Image.open(filepath + "/avatar_cache/0.png").convert('RGBA')
|
||
# path = filepath + "/avatar_cache/"
|
||
# try:
|
||
# avatar_list = os.listdir(path)
|
||
# if player_id in str(avatar_list):
|
||
# logger.info(f"本地已存在{player_id}头像")
|
||
# img = Image.open(f"{path}{player_id}.png").convert('RGBA')
|
||
# else:
|
||
# logger.info(f"未检测到{player_id}头像,缓存至本地")
|
||
# out_put = filepath + f"/avatar_cache/{player_id}.png"
|
||
# img = await avatar_cache(avatar_url, out_put)
|
||
# except Exception as err:
|
||
# logger.error(f"获取头像失败:{str(err)}")
|
||
# return img
|
||
|
||
|
||
async def get_best_weapon_and_best_vehicle(player_stat):
|
||
weapon = sorted(player_stat["weapons"], key=lambda k: k['kills'], reverse=True)[0]
|
||
vehicle = sorted(player_stat["vehicles"], key=lambda k: k['kills'], reverse=True)[0]
|
||
return weapon, vehicle
|
||
|
||
|
||
async def get_vehicle_destroyed(player_stat):
|
||
vehicle = reduce(lambda acc, x: acc + x['destroyed'], player_stat, 0)
|
||
return vehicle
|
||
|
||
|
||
async def stats_calculator(player_stat, game):
|
||
per500_data = round_data[game]
|
||
# 场次(无直接数值反馈,采用胜利数+失败数)
|
||
match_played = player_stat["wins"] + player_stat["loses"]
|
||
|
||
kd = player_stat["killDeath"]
|
||
kpm = player_stat["killsPerMinute"]
|
||
kill_assists = player_stat["killAssists"]
|
||
acc = float(player_stat["accuracy"].replace("%", ""))
|
||
if game == "bf3":
|
||
headshots = float(0)
|
||
else:
|
||
headshots = float(player_stat["headshots"].replace("%", ""))
|
||
spm = player_stat["scorePerMinute"]
|
||
revives = player_stat["revives"]
|
||
|
||
# second_play = player_stat["secondsPlayed"]
|
||
|
||
apr = kill_assists / match_played
|
||
rpr = revives / match_played
|
||
|
||
# SPM*秒数/60/场数=场均得分
|
||
# dpr = score_perMinute * (second_play / 60) / match_played
|
||
|
||
# 计算比值
|
||
# kd
|
||
ratio_kd = round(kd / per500_data["kd"], 2)
|
||
# kpm
|
||
ratio_kpm = round(kpm / per500_data["kpm"], 2)
|
||
# 爆头率
|
||
ratio_hs = round(headshots / 100 / per500_data["hs"], 2)
|
||
# 场均救援
|
||
ratio_rpr = round(rpr / per500_data["rpr"], 2)
|
||
# 场均助攻
|
||
ratio_apr = round(apr / per500_data["apr"], 2)
|
||
# 分钟得分
|
||
ratio_spm = round(spm / per500_data["spm"], 2)
|
||
logger.info(f"雷达图数据")
|
||
logger.info(f"生涯KD比值:{ratio_kd}")
|
||
logger.info(f"生涯Kpm比值:{ratio_kpm}")
|
||
logger.info(f"生涯准度比值:{ratio_hs}")
|
||
logger.info(f"场均救援比值:{ratio_rpr}")
|
||
logger.info(f"场均助攻比值:{ratio_apr}")
|
||
logger.info(f"分钟得分比值:{ratio_spm}")
|
||
|
||
stat_data = [ratio_kd, ratio_apr, ratio_hs, ratio_spm, ratio_kpm, ratio_rpr]
|
||
|
||
# 血腥度 kd*0.5 + kpm *0.4 +hs*0.1
|
||
player_blood = kd * 0.5 + kpm * 0.4 + headshots * 0.1
|
||
ratio_blood = player_blood / per500_data["blood"]
|
||
|
||
# 贡献度 场均助攻*0.4 + 场均救援*0.4 + spm*0.2
|
||
player_dedication = rpr * 0.4 + apr * 0.4 + spm * 0.2
|
||
ratio_dedication = player_dedication / per500_data["dedication"]
|
||
|
||
# 全能度 血腥度*0.5 + 贡献度*0.5
|
||
player_all_round = player_blood * 0.5 + player_dedication * 0.5
|
||
ratio_all_round = player_all_round / per500_data["all_round"]
|
||
|
||
logger.info(f"称号评级数据")
|
||
logger.info(f"血腥度:{player_blood} 比值:{ratio_blood}")
|
||
logger.info(f"贡献度:{player_dedication} 比值:{ratio_dedication}")
|
||
logger.info(f"全能度:{player_all_round} 比值:{ratio_all_round}")
|
||
level_designation = get_level_designation(ratio_blood, ratio_dedication, ratio_all_round)
|
||
return stat_data, level_designation
|
||
|
||
|
||
def get_level_designation(blood, dedication, all_round):
|
||
feature_type = ""
|
||
final_max = max([blood, dedication, all_round])
|
||
if final_max == blood:
|
||
feature_type = "blood"
|
||
elif final_max == dedication:
|
||
feature_type = "dedication"
|
||
elif final_max == all_round:
|
||
feature_type = "all_round"
|
||
logger.info(f"最高能力:{feature_type}")
|
||
logger.info(f"最高能力值:{final_max}")
|
||
final_info = get_feature(final_max, feature_type)
|
||
return final_info
|
||
|
||
|
||
def get_feature(value, feature_type):
|
||
"""根据输入值和数值类别,返回对应特征值"""
|
||
for (low, high), features in interval_table.items():
|
||
if low <= value < high:
|
||
return features[feature_type]
|
||
raise ValueError(f"数值 {value} 不在任何区间内")
|