diff --git a/README.md b/README.md index da39827..1e72a35 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,11 @@ ## 简介 -主要是自用,查询战绩,在游戏中隐藏的战绩也可以查。只有营地里面大号的ID才可查询。 +主要是自用,查询战绩,在游戏中隐藏的战绩也可以查,如果营地的战绩也隐藏了就查不了。只有营地里面大号的ID才可查询。 插件功能绝大部分都是用AI写的,又进行了调试。 -插件数据依赖应天API提供接口,需要自行支持创建token密钥才可使用。(每天免费10000次调用) +插件数据依赖外部接口提供,需要自行支持创建令牌才可使用。(免费调用) ## 更新记录 @@ -24,6 +24,8 @@ version: 1.0.0:大部分重要功能已经实现 version: 1.0.1:新增英雄的上榜战力查询,需要柠柚API。 +version: 1.0.2:新增战绩评价功能,参考最新10把战绩,调用模型进行简单的评价。 + ## 功能特点 - **处理接口数据**:将接口返回的数据处理成,玩家能读懂的消息发送 diff --git a/_conf_schema.json b/_conf_schema.json index 47d206b..072a60d 100644 --- a/_conf_schema.json +++ b/_conf_schema.json @@ -28,5 +28,24 @@ "type": "string", "default": "", "hint": "前往https://api.nycnm.cn 注册并创建令牌(免费)。" + }, + "comment": { + "description": "战绩锐评", + "type": "object", + "items": { + "enable": { + "description": "是否启用", + "type": "bool", + "default": false, + "hint": "是否启用战绩锐评功能" + }, + "select_provider": { + "description": "锐评模型", + "type": "string", + "hint": "锐评战绩的模型,留空使用会话默认模型", + "default": "", + "_special": "select_provider" + } + } } } \ No newline at end of file diff --git a/core/gok_commands.py b/core/gok_commands.py deleted file mode 100644 index e980662..0000000 --- a/core/gok_commands.py +++ /dev/null @@ -1,113 +0,0 @@ -# pyright: reportArgumentType=false -# pyright: reportAttributeAccessIssue=false -# pyright: reportIndexIssue=false -# pyright: reportOptionalMemberAccess=false -import json -import shutil -import pathlib -import inspect -from pathlib import Path -from typing import Union -import asyncio - -from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult, MessageChain -from astrbot.api.star import Context, Star, register, StarTools -from astrbot.api import logger -from astrbot.api import AstrBotConfig -import astrbot.api.message_components as Comp -from astrbot.core.utils.session_waiter import ( - SessionController, - session_waiter, -) - -from .gok_data import GOKServer - - -class GOKCommands(Star): - def __init__(self, gok_data:GOKServer): - self.gokfun = gok_data - - - async def plain_msg(self, event: AstrMessageEvent, action): - """最终将数据整理成文本发送""" - data= await action() - try: - if data["code"] == 200: - await event.send( event.plain_result(data["data"])) - else: - await event.send(event.plain_result(data["msg"])) - except Exception as e: - logger.error(f"功能函数执行错误: {e}") - await event.send(event.plain_result("猪脑过载,请稍后再试")) - - - async def T2I_image_msg(self, event: AstrMessageEvent, action): - """最终将数据渲染成图片发送""" - data = await action() - try: - if data["code"] == 200: - url = await self.html_render(data["temp"], data["data"], options={}) - await event.send(event.image_result(url)) - else: - await event.send(event.plain_result(data["msg"])) - - except Exception as e: - logger.error(f"功能函数执行错误: {e}") - await event.send(event.plain_result("猪脑过载,请稍后再试")) - - - async def image_msg(self, event: AstrMessageEvent, action): - """最终将数据整理成图片发送""" - data = await action() - try: - if data["code"] == 200: - await event.send(event.image_result(data["data"])) - else: - await event.send(event.plain_result(data["msg"])) - - except Exception as e: - logger.error(f"功能函数执行错误: {e}") - await event.send(event.plain_result("猪脑过载,请稍后再试")) - - - async def gok_helps(self, event: AstrMessageEvent): - """王者功能""" - return await self.T2I_image_msg(event, self.gokfun.helps) - - - async def gok_zhanji(self, event: AstrMessageEvent,name: str,option:str = 0): - """王者战绩""" - return await self.T2I_image_msg(event, lambda: self.gokfun.zhanji(name ,option)) - - - async def gok_ziliao(self, event: AstrMessageEvent,name: str): - """王者资料""" - return await self.T2I_image_msg(event, lambda: self.gokfun.ziliao(name)) - - async def gok_zhanli(self, event: AstrMessageEvent, hero: str, type: str = "aqq"): - """英雄战力 名称 大区""" - return await self.plain_msg(event, lambda: self.gokfun.zhanli(hero,type)) - - async def gok_user_all(self, event: AstrMessageEvent): - """角色查看""" - return await self.T2I_image_msg(event, self.gokfun.all) - - - async def gok_user_add(self, event: AstrMessageEvent, gokid: int, name: str): - """角色添加 王者营地ID 名称""" - return await self.plain_msg(event, lambda: self.gokfun.add(gokid,name)) - - - async def gok_user_update(self, event: AstrMessageEvent, gokid: int, name: str): - """角色修改 王者营地ID 名称""" - return await self.plain_msg(event, lambda: self.gokfun.update(gokid,name)) - - - async def gok_user_delete(self, event: AstrMessageEvent, gokid:int): - """角色删除 王者营地ID""" - return await self.plain_msg(event, lambda: self.gokfun.delete(gokid)) - - - async def gok_user_select(self, event: AstrMessageEvent, gokid): - """角色查询 王者营地ID""" - return await self.T2I_image_msg(event, lambda: self.gokfun.select(gokid)) \ No newline at end of file diff --git a/core/gok_data.py b/core/gok_data.py index 59e1495..0048c70 100644 --- a/core/gok_data.py +++ b/core/gok_data.py @@ -347,6 +347,11 @@ class GOKServer: return_data["msg"] = "系统未配置API访问Token" return return_data + self.comment_en = self._config.get("comment").get("enable") + logger.debug(self.comment_en) + self.comment_provider = self._config.get("comment").get("select_provider") + logger.debug(self.comment_provider) + # ID查询 gokid = await self.get_gokid(name) @@ -362,6 +367,8 @@ class GOKServer: "oldMasterMatchScore","newMasterMatchScore","usedTime","winNum","failNum","roleJobName","stars","desc", "gradeGame","heroIcon","godLikeCnt", "firstBlood","hero1TripleKillCnt","hero1UltraKillCnt","hero1RampageCnt","evaluateUrlV3","mvpUrlV3"] + + # 获取数据 data: Optional[List[Dict[str, Any]]] = await self._base_request("gok_zhanji", "GET", params=params) if not data: @@ -370,7 +377,16 @@ class GOKServer: # 处理返回数据 try: - + # 提取锐评数据 + if self.comment_en: + return_data["comment"] = {} + comment = ["gametime","killcnt","deadcnt","assistcnt","gameresult","mvpcnt","losemvp","gradeGame"] + comments = extract_fields(data['list'], comment) + comments = comments[:10] + return_data["comment"]["data"] = comments + return_data["comment"]["provider"] = self.comment_provider + return_data["comment"]["en"] = self.comment_en + # 提取字段 result = extract_fields(data['list'], fields) result = result[:25] @@ -381,6 +397,7 @@ class GOKServer: m["time_str"] = f"{minutes}:{seconds:02d}" return_data["data"]["data"] = result + except Exception as e: logger.error(f"处理数据时出错: {e}") return_data["msg"] = "处理接口返回信息时出错" diff --git a/main.py b/main.py index ec44196..887d1b4 100644 --- a/main.py +++ b/main.py @@ -14,7 +14,6 @@ from astrbot.api import AstrBotConfig from .core.sqlite import AsyncSQLiteDB from .core.gok_data import GOKServer -from .core.gok_commands import GOKCommands @register("astrbot_plugin_gok", @@ -71,8 +70,7 @@ class GokApiPlugin(Star): """) # 王者功能 实例化 self.gokfun = GOKServer(self.api_config, self.conf, self.sql_db) - # 发送消息实例化 - self.gokmag = GOKCommands(self.gokfun) + except Exception as e: logger.error(f"功能模块初始化失败: {e}") raise @@ -181,16 +179,138 @@ class GokApiPlugin(Star): def ini_command_map(self): """初始化指令集""" self.command_map = { - "王者功能": self.gokmag.gok_helps, - "王者战绩": self.gokmag.gok_zhanji, - "王者资料": self.gokmag.gok_ziliao, - "上榜战力": self.gokmag.gok_zhanli, - "角色查看": self.gokmag.gok_user_all, - "角色添加": self.gokmag.gok_user_add, - "角色修改": self.gokmag.gok_user_update, - "角色删除": self.gokmag.gok_user_delete, - "角色查询": self.gokmag.gok_user_select + "王者功能": self.gok_helps, + "王者战绩": self.gok_zhanji, + "王者资料": self.gok_ziliao, + "上榜战力": self.gok_zhanli, + "角色查看": self.gok_user_all, + "角色添加": self.gok_user_add, + "角色修改": self.gok_user_update, + "角色删除": self.gok_user_delete, + "角色查询": self.gok_user_select } + async def plain_msg(self, event: AstrMessageEvent, action): + """最终将数据整理成文本发送""" + data= await action() + try: + if data["code"] == 200: + await event.send( event.plain_result(data["data"])) + else: + await event.send(event.plain_result(data["msg"])) + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + await event.send(event.plain_result("猪脑过载,请稍后再试")) + + async def T2I_image_msg(self, event: AstrMessageEvent, action): + """最终将数据渲染成图片发送""" + data = await action() + try: + if data["code"] == 200: + url = await self.html_render(data["temp"], data["data"], options={}) + await event.send(event.image_result(url)) + else: + await event.send(event.plain_result(data["msg"])) + + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + await event.send(event.plain_result("猪脑过载,请稍后再试")) + + + async def image_msg(self, event: AstrMessageEvent, action): + """最终将数据整理成图片发送""" + data = await action() + try: + if data["code"] == 200: + await event.send(event.image_result(data["data"])) + else: + await event.send(event.plain_result(data["msg"])) + + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + await event.send(event.plain_result("猪脑过载,请稍后再试")) + + + async def T2I_image_and_plain_msg(self, event: AstrMessageEvent, action): + """战绩定制功能""" + data = await action() + # 发送渲染战绩图片 + try: + if data["code"] == 200: + url = await self.html_render(data["temp"], data["data"], options={}) + await event.send(event.image_result(url)) + else: + await event.send(event.plain_result(data["msg"])) + + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + await event.send(event.plain_result("猪脑过载,请稍后再试")) + # 对战绩进行锐评 + try: + if data["code"] == 200 and data["comment"]["en"]: + # 确定使用模型 + if data["comment"]["provider"] =="": + umo = event.unified_msg_origin + provider_id = await self.context.get_current_chat_provider_id(umo=umo) + else: + provider_id = data["comment"]["provider"] + + # 模型提示词构建 + prompt = "请根据下面提供的王者荣耀最近10把的战绩数据,用简短的一句话进行锐评吐槽。" + prompt += f"这是战绩列表\n{data['comment']['data']}\n" + prompt += f"gametime 字段 对局开始时间\n" + prompt += f"killcnt 字段 击杀数\n" + prompt += f"deadcnt 字段 死亡数\n" + prompt += f"assistcnt 字段 助攻数\n" + prompt += f"gameresult 字段 1代表胜利 2代表失败 3代表平局\n" + prompt += f"mvpcnt 字段 1代表是胜利方MVP 0表示不是\n" + prompt += f"losemvp 字段 1代表是失败方MVP 0表示不是\n" + prompt += f"gradeGame 字段 系统给的评分,满分16分\n" + + # 调用模型 + llm_resp = await self.context.llm_generate(chat_provider_id=provider_id, prompt=prompt) + # 发送消息 + await event.send(event.plain_result(llm_resp.completion_text)) + + except Exception as e: + logger.error(f"功能函数执行错误: {e}") + await event.send(event.plain_result("猪脑过载,请稍后再试")) + + + async def gok_helps(self, event: AstrMessageEvent): + """王者功能""" + return await self.T2I_image_msg(event, self.gokfun.helps) + + async def gok_zhanji(self, event: AstrMessageEvent,name: str,option:str = 0): + """王者战绩""" + return await self.T2I_image_and_plain_msg(event, lambda: self.gokfun.zhanji(name ,option)) + + async def gok_ziliao(self, event: AstrMessageEvent,name: str): + """王者资料""" + return await self.T2I_image_msg(event, lambda: self.gokfun.ziliao(name)) + + async def gok_zhanli(self, event: AstrMessageEvent, hero: str, type: str = "aqq"): + """英雄战力 名称 大区""" + return await self.plain_msg(event, lambda: self.gokfun.zhanli(hero,type)) + + async def gok_user_all(self, event: AstrMessageEvent): + """角色查看""" + return await self.T2I_image_msg(event, self.gokfun.all) + + async def gok_user_add(self, event: AstrMessageEvent, gokid: int, name: str): + """角色添加 王者营地ID 名称""" + return await self.plain_msg(event, lambda: self.gokfun.add(gokid,name)) + + async def gok_user_update(self, event: AstrMessageEvent, gokid: int, name: str): + """角色修改 王者营地ID 名称""" + return await self.plain_msg(event, lambda: self.gokfun.update(gokid,name)) + + async def gok_user_delete(self, event: AstrMessageEvent, gokid:int): + """角色删除 王者营地ID""" + return await self.plain_msg(event, lambda: self.gokfun.delete(gokid)) + + async def gok_user_select(self, event: AstrMessageEvent, gokid): + """角色查询 王者营地ID""" + return await self.T2I_image_msg(event, lambda: self.gokfun.select(gokid)) \ No newline at end of file diff --git a/metadata.yaml b/metadata.yaml index d87b8ef..cce9785 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -1,6 +1,6 @@ name: astrbot_plugin_gok display_name: 王者荣耀游戏数据查询工具 -desc: 王者荣耀的战绩、资料等内容的查询 -version: v1.0.1 +desc: 王者荣耀的战绩、资料等内容的查询。数据来源王者营地,可查询在游戏内隐藏的战绩,营地也隐藏就不行了。 +version: v1.0.2 author: 飞翔大野猪 repo: https://github.com/qsc20001102/astrbot_plugin_gok