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(), 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()