2026-09-01 13:13:40 +08:00
|
|
|
|
from nonebot import on_command, require
|
|
|
|
|
|
from nonebot.adapters import Message, Event, Bot
|
|
|
|
|
|
from nonebot.log import logger
|
|
|
|
|
|
from nonebot.matcher import Matcher
|
|
|
|
|
|
from nonebot.params import CommandArg
|
|
|
|
|
|
from nonebot.plugin import PluginMetadata
|
|
|
|
|
|
from nonebot.rule import to_me
|
|
|
|
|
|
import time
|
|
|
|
|
|
from .user_data.data_utils import UserManager
|
|
|
|
|
|
|
|
|
|
|
|
require("nonebot_plugin_alconna")
|
|
|
|
|
|
from nonebot_plugin_alconna import UniMessage
|
|
|
|
|
|
from .data import *
|
|
|
|
|
|
from .data_utils import *
|
|
|
|
|
|
from .image_builder import *
|
|
|
|
|
|
from .text_utils import *
|
|
|
|
|
|
|
|
|
|
|
|
__plugin_meta__ = PluginMetadata(
|
|
|
|
|
|
name="BF查询",
|
|
|
|
|
|
description="战地3,4,1,5,2042,6",
|
|
|
|
|
|
usage="""
|
|
|
|
|
|
bf3: /bf3 EAID (查询BF3数据)
|
|
|
|
|
|
bf4: /bf4 EAID (查询BF4数据)
|
|
|
|
|
|
bf1: /bf1 EAID (查询BF5数据)
|
|
|
|
|
|
bfv: /bfv EAID (查询BF6数据)
|
|
|
|
|
|
bf2042: /bf2042 EAID (查询BF2042数据)
|
|
|
|
|
|
bf6: /bf6 EAID (查询BF6数据)
|
|
|
|
|
|
绑定: /绑定 EAID (绑定你的QQ与EAID)
|
|
|
|
|
|
解绑: /解绑 (解除你的QQ与当前绑定的EAID)
|
|
|
|
|
|
修改绑定: /修改绑定 EAID (修改你的QQ与当前绑定的EAID)
|
|
|
|
|
|
""".strip(),
|
2026-09-08 14:25:32 +08:00
|
|
|
|
type="application",
|
2026-09-01 13:13:40 +08:00
|
|
|
|
extra={
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
query = on_command("bft", rule=to_me(), aliases={"bf3", "bf4", "bfv", "bf1", "bf2042", "bf6"}, block=True)
|
|
|
|
|
|
bind = on_command("bfbind", rule=to_me(), aliases={"绑定"}, block=True)
|
|
|
|
|
|
unbind = on_command("unbind", rule=to_me(), aliases={"解绑"}, block=True)
|
|
|
|
|
|
update_bind = on_command("update_bind", rule=to_me(), aliases={"修改绑定"}, block=True)
|
|
|
|
|
|
|
|
|
|
|
|
bf_dict = {
|
|
|
|
|
|
"bf3": "战地3",
|
|
|
|
|
|
"bf4": "战地4",
|
|
|
|
|
|
"bf1": "战地1",
|
|
|
|
|
|
"bfv": "战地5",
|
|
|
|
|
|
"bf2042": "战地2042",
|
|
|
|
|
|
"bf6": "战地6",
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@query.handle()
|
|
|
|
|
|
async def handle_function(event: Event, matcher: Matcher, msg: Message = CommandArg()):
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
usermanager = UserManager()
|
|
|
|
|
|
cmd = matcher.state["_prefix"]["command"][0]
|
|
|
|
|
|
game = cmd
|
|
|
|
|
|
input_text = msg.extract_plain_text().strip()
|
|
|
|
|
|
logger.info(f"{type(input_text)}, {repr(input_text)}")
|
|
|
|
|
|
if input_text is None or input_text == "":
|
|
|
|
|
|
content = usermanager.get_user_by_qq(event.get_user_id())
|
|
|
|
|
|
if not content:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text(
|
|
|
|
|
|
"未检测到id,也未检测到绑定记录,请使用 绑定 EAID 进行绑定操作").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
player_id = content['ea_player_id']
|
|
|
|
|
|
user_id = content['ea_user_id']
|
|
|
|
|
|
player = content['ea_player_name']
|
|
|
|
|
|
platform = "pc"
|
|
|
|
|
|
else:
|
|
|
|
|
|
content = await get_player_info_by_name(input_text, "pc")
|
|
|
|
|
|
if 'errors' in content:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text("未找到玩家,请检查是否拼写正确").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
player_id = content['personaId']
|
|
|
|
|
|
user_id = content['userId']
|
|
|
|
|
|
player = content.get('personaName') or content.get('displayName') or content.get('username', 'error')
|
|
|
|
|
|
if 'errors' in player:
|
|
|
|
|
|
await UniMessage.text(f"请检查id是否正确!").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
platform = "pc"
|
|
|
|
|
|
await UniMessage.text(f"正在查询 {player} 的 {bf_dict[cmd]} 数据,请耐心等待").send()
|
|
|
|
|
|
play_stat = ""
|
|
|
|
|
|
try:
|
|
|
|
|
|
if cmd == "bf3":
|
|
|
|
|
|
play_stat = await get_data_bf3(player, player_id, user_id, platform)
|
|
|
|
|
|
elif cmd == "bf4":
|
|
|
|
|
|
play_stat = await get_data_bf4(player, player_id, user_id, platform)
|
|
|
|
|
|
elif cmd == "bf1":
|
|
|
|
|
|
play_stat = await get_data_bf1(player, player_id, user_id, platform)
|
|
|
|
|
|
elif cmd == "bfv":
|
|
|
|
|
|
play_stat = await get_data_bfv(player, player_id, user_id, platform)
|
|
|
|
|
|
elif cmd == "bf2042":
|
|
|
|
|
|
await UniMessage.at(event.get_user_id()).text("正在开发中,敬请期待!").send()
|
|
|
|
|
|
elif cmd == "bf6":
|
|
|
|
|
|
play_stat, rank = await asyncio.gather(
|
|
|
|
|
|
get_data_bf6(player, player_id, user_id, platform),
|
|
|
|
|
|
get_bf6_rank(player)
|
|
|
|
|
|
)
|
|
|
|
|
|
logger.info(f"等级:{rank}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
await UniMessage.at(event.get_user_id()).text("指令异常").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
if "errors" in play_stat:
|
|
|
|
|
|
logger.warning(play_stat['errors'][0])
|
|
|
|
|
|
msg = play_stat['errors'][0]
|
|
|
|
|
|
await UniMessage.text(f"{msg}").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
|
|
|
# logger.info(f"结果{play_stat}")
|
|
|
|
|
|
# player = play_stat['userName']
|
|
|
|
|
|
weapon, vehicle = await get_best_weapon_and_best_vehicle(play_stat)
|
|
|
|
|
|
pid = play_stat['userId']
|
|
|
|
|
|
kd = play_stat['killDeath']
|
|
|
|
|
|
kpm = play_stat['killsPerMinute']
|
|
|
|
|
|
acc = play_stat['accuracy']
|
|
|
|
|
|
# 战地3 特化
|
|
|
|
|
|
if cmd == 'bf3':
|
|
|
|
|
|
head_shots = play_stat['headShots']
|
|
|
|
|
|
else:
|
|
|
|
|
|
head_shots = play_stat['headshots']
|
|
|
|
|
|
time_play = convert_to_hours(play_stat['timePlayed'])
|
|
|
|
|
|
logger.info(f"游玩时长监测:{time_play}")
|
|
|
|
|
|
if time_play == 0:
|
|
|
|
|
|
await UniMessage.at(event.get_user_id()).text("查询接口异常,请等待一段时间后查询").send()
|
|
|
|
|
|
return
|
|
|
|
|
|
kills = int(play_stat['kills'])
|
|
|
|
|
|
kill_assists = int(play_stat['killAssists'])
|
|
|
|
|
|
revives = int(play_stat['revives'])
|
|
|
|
|
|
wins = int(play_stat['wins'])
|
|
|
|
|
|
loses = int(play_stat['loses'])
|
|
|
|
|
|
best_weapon = weapon
|
|
|
|
|
|
best_vehicle = vehicle
|
|
|
|
|
|
best_class = play_stat['bestClass']
|
|
|
|
|
|
destroyed = await get_vehicle_destroyed(play_stat["vehicles"])
|
|
|
|
|
|
if cmd == 'bf6':
|
|
|
|
|
|
best_class = await get_best_classes(play_stat)
|
|
|
|
|
|
captured = play_stat['objective']['captured']
|
|
|
|
|
|
score = sum(item.get("score", 0) for item in play_stat['classes'])
|
|
|
|
|
|
# 计算4兵种游玩时长
|
|
|
|
|
|
seconds = sum(item.get("secondsPlayed", 0) for item in play_stat['classes'])
|
|
|
|
|
|
kpm = round(kills / (int(seconds) / 60), 2)
|
|
|
|
|
|
logger.info(f"击杀数:{kills},游玩分钟数:{seconds / 60},计算kpm值:{kpm}")
|
|
|
|
|
|
spm = int(score / (int(seconds) / 60))
|
|
|
|
|
|
logger.info(f"计算spm值:{spm}")
|
|
|
|
|
|
repairs = play_stat['repairs']
|
|
|
|
|
|
img = await build_bf6_stats_card(game='bf6',
|
|
|
|
|
|
qq_id=event.get_user_id(),
|
|
|
|
|
|
player=player,
|
|
|
|
|
|
pid=pid,
|
|
|
|
|
|
rank=rank,
|
|
|
|
|
|
kd=kd,
|
|
|
|
|
|
kpm=kpm,
|
|
|
|
|
|
spm=spm,
|
|
|
|
|
|
acc=acc,
|
|
|
|
|
|
head_shots=head_shots,
|
|
|
|
|
|
time_play=time_play,
|
|
|
|
|
|
kills=kills,
|
|
|
|
|
|
kill_assists=kill_assists,
|
|
|
|
|
|
revives=revives,
|
|
|
|
|
|
repairs=repairs,
|
|
|
|
|
|
captured=captured,
|
|
|
|
|
|
score=score,
|
|
|
|
|
|
wins=wins,
|
|
|
|
|
|
loses=loses,
|
|
|
|
|
|
destroyed=destroyed,
|
|
|
|
|
|
best_weapon=best_weapon,
|
|
|
|
|
|
best_vehicle=best_vehicle,
|
|
|
|
|
|
best_class=best_class)
|
|
|
|
|
|
else:
|
|
|
|
|
|
spm = play_stat['scorePerMinute']
|
|
|
|
|
|
rank = play_stat['rank']
|
|
|
|
|
|
longest_head_shot = play_stat['longestHeadShot']
|
|
|
|
|
|
highest_ill_streak = play_stat['highestKillStreak']
|
|
|
|
|
|
stat_data, level_designation = await stats_calculator(play_stat, cmd)
|
|
|
|
|
|
img = await build_stats_card(game, player, pid, kd, kpm, spm, acc, head_shots, rank, time_play, kills,
|
|
|
|
|
|
kill_assists, revives, wins, loses, destroyed, best_weapon, best_vehicle,
|
|
|
|
|
|
best_class,
|
|
|
|
|
|
longest_head_shot, highest_ill_streak, stat_data, level_designation)
|
|
|
|
|
|
end_time = time.time()
|
|
|
|
|
|
duration = round(end_time - start_time, 3)
|
|
|
|
|
|
await UniMessage.image(raw=img.getvalue()).at(user_id=event.get_user_id()).text(
|
|
|
|
|
|
f"本次查询耗时:{duration}s").send()
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.exception(f"异常:{e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@bind.handle()
|
|
|
|
|
|
async def bind_user(event: Event, matcher: Matcher, msg: Message = CommandArg()):
|
|
|
|
|
|
user_manager = UserManager()
|
|
|
|
|
|
player_name = msg.extract_plain_text()
|
|
|
|
|
|
qq_id = event.get_user_id()
|
|
|
|
|
|
|
|
|
|
|
|
# 执行已有数据查询操作
|
|
|
|
|
|
user_record = user_manager.get_user_by_qq(qq_id)
|
|
|
|
|
|
if user_record:
|
|
|
|
|
|
user_info = await get_player_info_by_ea_id(user_record['ea_player_id'], user_record['ea_user_id'], 'pc')
|
|
|
|
|
|
await (UniMessage.at(user_id=event.get_user_id())
|
|
|
|
|
|
.text(f"您已经将账号绑定到: {user_info['personaName']},如果你需要更改绑定请发送 修改绑定 EAID ").send())
|
|
|
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
|
|
|
user_info_json = await get_player_info_by_name(player_name, "pc")
|
|
|
|
|
|
if 'errors' in user_info_json:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text("未找到玩家,请检查是否拼写正确").send()
|
|
|
|
|
|
player_id = user_info_json['personaId']
|
|
|
|
|
|
user_id = user_info_json['userId']
|
|
|
|
|
|
player_name = user_info_json.get('personaName') or user_info_json.get('displayName') or user_info_json.get(
|
|
|
|
|
|
'username', 'error')
|
|
|
|
|
|
avatar_url = user_info_json['avatar']
|
|
|
|
|
|
logger.info(f"QQ号:{qq_id},EA双ID:{player_id}-{user_id}")
|
|
|
|
|
|
|
|
|
|
|
|
# 检测ea账号 是否被绑定至其他qq
|
|
|
|
|
|
bind_record = user_manager.get_user_by_ea_id(user_id)
|
|
|
|
|
|
if bind_record:
|
|
|
|
|
|
await (UniMessage.at(user_id=event.get_user_id())
|
|
|
|
|
|
.text(
|
|
|
|
|
|
f"您的EA账号 {bind_record['ea_player_name']} 已经绑定到: {bind_record['qq_id']},请您确认绑定的EAID").send())
|
|
|
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 执行绑定操作
|
|
|
|
|
|
record = user_manager.add_user(qq_id, player_name, player_id, user_id, "[]", "[]")
|
|
|
|
|
|
logger.info(f"插入数据返回结果:{record}")
|
|
|
|
|
|
if record > 0:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text(f"您已经成功绑定至: {player_name}").send()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@unbind.handle()
|
|
|
|
|
|
async def bind_user(event: Event, matcher: Matcher, msg: Message = CommandArg()):
|
|
|
|
|
|
user_manager = UserManager()
|
|
|
|
|
|
qq_id = event.get_user_id()
|
|
|
|
|
|
|
|
|
|
|
|
# 执行已有数据查询操作
|
|
|
|
|
|
user_record = user_manager.get_user_by_qq(qq_id)
|
|
|
|
|
|
if user_record:
|
|
|
|
|
|
user_info = await get_player_info_by_ea_id(user_record['ea_player_id'], user_record['ea_user_id'], 'pc')
|
|
|
|
|
|
rows = user_manager.delete_user_by_qq(qq_id)
|
|
|
|
|
|
if rows > 0:
|
|
|
|
|
|
await (UniMessage.at(user_id=event.get_user_id())
|
|
|
|
|
|
.text(
|
|
|
|
|
|
f"您已经与: {user_info['personaName']} 成功解除绑定,如果你需要重新绑定请发送 修改绑定 EAID ").send())
|
|
|
|
|
|
return
|
|
|
|
|
|
else:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text(f"未查询到绑定记录").send()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@update_bind.handle()
|
|
|
|
|
|
async def bind_user(event: Event, matcher: Matcher, msg: Message = CommandArg()):
|
|
|
|
|
|
user_manager = UserManager()
|
|
|
|
|
|
player_name = msg.extract_plain_text()
|
|
|
|
|
|
qq_id = event.get_user_id()
|
|
|
|
|
|
|
|
|
|
|
|
# 执行已有数据查询操作
|
|
|
|
|
|
user_record = user_manager.get_user_by_qq(qq_id)
|
|
|
|
|
|
if user_record:
|
|
|
|
|
|
user_info_json = await get_player_info_by_name(player_name, "pc")
|
|
|
|
|
|
if 'errors' in user_info_json:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text("未找到玩家,请检查是否拼写正确").send()
|
|
|
|
|
|
player_id = user_info_json['personaId']
|
|
|
|
|
|
user_id = user_info_json['userId']
|
|
|
|
|
|
player_name = user_info_json.get('personaName') or user_info_json.get('displayName') or user_info_json.get(
|
|
|
|
|
|
'username', 'error')
|
|
|
|
|
|
avatar_url = user_info_json['avatar']
|
|
|
|
|
|
logger.info(f"QQ号:{qq_id},EA双ID:{player_id}-{user_id}")
|
|
|
|
|
|
|
|
|
|
|
|
# 执行修改绑定操作
|
|
|
|
|
|
record = user_manager.update_user(qq_id, player_name, player_id, user_id, "[]", "[]")
|
|
|
|
|
|
logger.info(f"修改数据返回结果:{record}")
|
|
|
|
|
|
if record > 0 and record == 1:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text(
|
|
|
|
|
|
f"您已经成功从:{user_record['ea_player_name']}修改绑定至: {player_name}").send()
|
|
|
|
|
|
else:
|
|
|
|
|
|
await UniMessage.at(user_id=event.get_user_id()).text(
|
|
|
|
|
|
f"未查询到绑定记录: {player_name},如果需要绑定,请@机器人并发送 绑定 {player_name} ").send()
|