This commit is contained in:
qsc
2026-02-07 19:58:25 +08:00
parent bfb40c9160
commit f8205fdf61
22 changed files with 1085 additions and 910 deletions
+161 -184
View File
@@ -1,218 +1,195 @@
# pyright: reportOptionalMemberAccess=false
# pyright: reportCallIssue=false
# pyright: reportArgumentType=false
import json
import asyncio
import inspect
from pathlib import Path
from datetime import datetime
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
from .core.async_mysql import AsyncMySQL
from .core.WZRYFunction import WZRYFunction
from .core.sqlite import AsyncSQLiteDB
from .core.gok_data import GOKServer
from .core.gok_commands import GOKCommands
@register("astrbot_plugin_gok",
"飞翔大野猪",
"通过接口接口获取王者荣耀游戏数据",
"fxdyz",
"通过接口获取王者荣耀游戏数据",
"1.0.0",
"https://github.com/qsc20001102/astrbot_plugin_gok"
"https://github.com/qsc20001102/astrbot_plugin_gok.git"
)
class GokApiPlugin(Star):
def __init__(self, context: Context, config: AstrBotConfig):
super().__init__(context)
#获取配置
self.conf = config
# 本地数据存储路径
self.local_data_dir = StarTools.get_data_dir("astrbot_plugin_gok")
# api数据文件
self.api_file_path = Path(__file__).parent / "api_config.json"
# 读取文件内容
# SQLite本地路径
self.sqlite_path = Path(self.local_data_dir) /"sqlite.db"
logger.info(f"SQLite数据文件路径:{self.sqlite_path}")
# 读取API配置文件
self.api_file_path = Path(__file__).parent / "data" / "api_config.json"
with open(self.api_file_path, 'r', encoding='utf-8') as f:
self.api_config = json.load(f)
# 初始化数据
logger.info("王者荣耀插件初始化完成")
# 声明指令集
self.command_map = {}
# 指令前缀功能
self.prefix_en = self.conf.get("prefix").get("enable")
self.prefix_text = self.conf.get("prefix").get("text")
if not self.prefix_text:
self.prefix_text = "王者"
if self.prefix_en:
logger.info(f"已启用指令前缀功能,前缀为:{self.prefix_text}")
else:
logger.info(f"未启用指令前缀功能。")
logger.info("GOK 插件初始化完成")
async def initialize(self):
"""可选择实现异步的插件初始化方法,当实例化该插件类之后会自动调用该方法。"""
# 数据库配置
db_config = {
'host': '38.12.28.24',
'port': 3306,
'user': 'asrtbot',
'password': 'qsc102341',
'db': 'asrtbot',
'charset': 'utf8mb4',
'autocommit': True
}
#创建类实例
self.db = AsyncMySQL(db_config)
self.wzry = WZRYFunction(self.api_config,self.db)
# 周期函数调用
logger.info("王者荣耀插件创建实例完成")
@filter.command_group("王者")
def wz(self):
pass
@wz.command("列表")
async def wz_yingdilist(self, event: AstrMessageEvent):
"""王者 用户列表"""
try:
data = await self.wzry.all_user()
logger.info(f"王者荣耀营地列表查询结果{data}")
yield event.plain_result(data)
# sqlite 实例化
self.sql_db = AsyncSQLiteDB(self.sqlite_path)
await self.sql_db.connect()
await self.sql_db.execute("""
CREATE TABLE IF NOT EXISTS users(
gokid INTEGER,
name TEXT
)
""")
# 王者功能 实例化
self.gokfun = GOKServer(self.api_config, self.conf, self.sql_db)
# 发送消息实例化
self.gokmag = GOKCommands(self.gokfun)
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
logger.error(f"功能模块初始化失败: {e}")
raise
@wz.command("添加")
async def wz_adduesr(self, event: AstrMessageEvent,id: str,name: str):
"""王者 添加用户"""
try:
data = await self.wzry.add_user(id,name)
yield event.plain_result(data)
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@wz.command("修改")
async def wz_updateuser(self, event: AstrMessageEvent,id: str,name: str):
"""王者 修改用户"""
try:
data = await self.wzry.update_user(id,name)
yield event.plain_result(data)
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@wz.command("删除")
async def wz_deleteuser(self, event: AstrMessageEvent,id: str):
"""王者 删除用户"""
try:
data = await self.wzry.delete_user(id)
yield event.plain_result(data)
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@wz.command("战绩")
async def wz_zhanji(self, event: AstrMessageEvent,name: str = "飞翔大野猪",option: str = "0"):
"""王者 战绩 营地ID 对局类型"""
try:
data = await self.wzry.zhanji(name,option)
# logger.info(f"王者荣耀战绩查询结果{data}")
#prompt = f"{data['data']}\n"
#prompt += f"以上数据是获取到的王者荣耀战绩信息,请根据这些数据生成一两句话的战绩总结,突出玩家的优势和特点,语言风格轻松幽默,适合在游戏群内分享。"
if data["code"] == 200:
url = await self.html_render(data["temp"],{"data":data["data"]}, options={})
yield event.image_result(url)
else:
yield event.plain_result(data["msg"])
return
#provider_id = await self.context.get_current_chat_provider_id(umo=event.unified_msg_origin)
#llm_resp = await self.context.llm_generate(chat_provider_id=provider_id, prompt=prompt,)
#out = llm_resp.completion_text
#yield event.plain_result(f"{out}")
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@wz.command("资料")
async def wz_ziliao(self, event: AstrMessageEvent,name: str = "489048724"):
"""王者 战绩 营地ID 对局类型"""
try:
data = await self.wzry.ziliao(name)
logger.info(f"输出结果{data}")
if data["code"] == 200:
url = await self.html_render(data["temp"], data["data"], options={})
yield event.image_result(url)
else:
yield event.plain_result(data["msg"])
return
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@filter.command_group("仇人")
def bilei(self):
pass
@bilei.command("列表")
async def bilei_list(self, event: AstrMessageEvent,):
"""仇人 列表"""
try:
data = await self.wzry.bilei_all()
if data["code"] == 200:
url = await self.html_render(data["temp"], data["data"], options={})
yield event.image_result(url)
else:
yield event.plain_result(data["msg"])
return
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@bilei.command("添加")
async def bilei_add(self, event: AstrMessageEvent,name: str, text: str):
"""仇人 添加 名称 备注"""
try:
data = await self.wzry.bilei_add(name, text, event.get_sender_name())
yield event.plain_result(data["msg"])
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@bilei.command("查找")
async def bilei_select(self, event: AstrMessageEvent,name: str):
"""仇人 查找 名称(模糊查找)"""
try:
data = await self.wzry.bilei_select(name)
if data["code"] == 200:
url = await self.html_render(data["temp"], data["data"], options={})
yield event.image_result(url)
else:
yield event.plain_result(data["msg"])
return
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@bilei.command("修改")
async def bilei_update(self, event: AstrMessageEvent,id:int, name: str, text: str):
"""仇人 修改 ID 名称 备注"""
try:
data = await self.wzry.bilei_update(id, name, text, event.get_sender_name())
yield event.plain_result(data["msg"])
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
@bilei.command("删除")
async def bilei_delete(self, event: AstrMessageEvent,id:int):
"""仇人 删除 ID """
try:
data = await self.wzry.bilei_delete(id)
yield event.plain_result(data["msg"])
except Exception as e:
logger.error(f"功能函数执行错误: {e}")
yield event.plain_result("猪脑过载,请稍后再试")
# 指令集
self.ini_command_map()
logger.info("GOK 异步插件初始化完成")
async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
await self.db.close_pool()
# 后台进程销毁
logger.info("王者荣耀插件已卸载/停用")
if self.gokfun:
await self.gokfun.close()
self.gokfun = None
if self.sql_db:
await self.sql_db.close()
self.sql_db = None
logger.info("GOK 插件已卸载/停用")
def parse_message(self, text: str) -> list[str] | None:
"""消息解析"""
text = text.strip()
if not text:
return None
# 前缀模式
if self.prefix_en:
prefix = self.prefix_text
if text.startswith(prefix):
text = text[len(prefix):].strip()
else:
# 非前缀消息,直接忽略
return None
return text.split()
async def _call_with_auto_args(self, handler, event: AstrMessageEvent, args: list[str]):
"""指令执行函数"""
sig = inspect.signature(handler)
params = list(sig.parameters.values())
call_args = []
arg_index = 0
for p in params:
if p.name == "self":
continue
if p.name == "event":
call_args.append(event)
continue
if arg_index < len(args):
raw = args[arg_index]
arg_index += 1
try:
if p.annotation is int:
call_args.append(int(raw))
elif p.annotation is float:
call_args.append(float(raw))
else:
call_args.append(raw)
except Exception:
call_args.append(p.default)
else:
if p.default is not inspect._empty:
call_args.append(p.default)
else:
raise ValueError(f"缺少参数: {p.name}")
# 只允许 coroutine
return await handler(*call_args)
@filter.event_message_type(filter.EventMessageType.ALL)
async def on_all_message(self, event: AstrMessageEvent):
"""解析所有消息"""
if not self.command_map:
logger.debug("插件尚未初始化完成,忽略消息")
return
parts = self.parse_message(event.message_str)
if not parts:
logger.debug("未触发指令,忽略消息")
return
cmd, *args = parts
handler = self.command_map.get(cmd)
if not handler:
logger.debug("指令函数为空,忽略消息")
return
try:
event.stop_event()
ret = await self._call_with_auto_args(handler, event, args)
if ret is not None:
yield ret
except Exception as e:
logger.exception(f"指令执行失败: {cmd}, error={e}")
yield event.plain_result("参数错误或执行失败")
def ini_command_map(self):
"""初始化指令集"""
self.command_map = {
"王者功能": self.gokmag.gok_helps,
"王者战绩": self.gokmag.gok_zhanji,
"王者资料": self.gokmag.gok_ziliao,
"角色查看": 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
}