ok
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user