mirror of
https://github.com/LiteyukiStudio/LiteyukiBot.git
synced 2024-11-13 17:57:24 +08:00
112 lines
2.7 KiB
Python
112 lines
2.7 KiB
Python
|
"""
|
|||
|
liteyuki function是一种类似于mcfunction的函数,用于在liteyuki中实现一些功能,例如自定义指令等,也可与Python函数绑定
|
|||
|
使用 /function function_name *args **kwargs来调用
|
|||
|
例如 /function test/hello user_id=123456
|
|||
|
可以用于一些轻量级插件的编写,无需Python代码
|
|||
|
SnowyKami
|
|||
|
"""
|
|||
|
import functools
|
|||
|
# cmd *args **kwargs
|
|||
|
# api api_name **kwargs
|
|||
|
import os
|
|||
|
from typing import Any, Awaitable, Callable, Coroutine
|
|||
|
|
|||
|
from nonebot import Bot
|
|||
|
from nonebot.adapters.satori import bot
|
|||
|
|
|||
|
ly_function_extensions = (
|
|||
|
"lyf",
|
|||
|
"lyfunction",
|
|||
|
"mcfunction"
|
|||
|
)
|
|||
|
|
|||
|
loaded_functions = dict()
|
|||
|
|
|||
|
|
|||
|
class LiteyukiFunction:
|
|||
|
def __init__(self, name: str, path: str):
|
|||
|
self.name = name
|
|||
|
self.path = path
|
|||
|
self.functions = list()
|
|||
|
|
|||
|
self.bot: Bot = None
|
|||
|
|
|||
|
self.var_data = dict()
|
|||
|
self.macro_data = dict()
|
|||
|
|
|||
|
def __call__(self, *args, **kwargs):
|
|||
|
for _callable in self.functions:
|
|||
|
if _callable is not None:
|
|||
|
_callable(*args, **kwargs)
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return f"LiteyukiFunction({self.name}, {self.path})"
|
|||
|
|
|||
|
def __repr__(self):
|
|||
|
return self.__str__()
|
|||
|
|
|||
|
async def execute_line(self, line: str) -> Callable[[tuple, dict], Coroutine[Any, Any, Any] | Any] | None:
|
|||
|
"""
|
|||
|
解析一行轻雪函数
|
|||
|
Args:
|
|||
|
line:
|
|||
|
Returns:
|
|||
|
"""
|
|||
|
|
|||
|
args: list[str] = line.split(" ")
|
|||
|
head = args.pop(0)
|
|||
|
if head.startswith("#"):
|
|||
|
# 注释
|
|||
|
return None
|
|||
|
|
|||
|
elif head == "var":
|
|||
|
# 变量定义
|
|||
|
for arg in args:
|
|||
|
self.var_data[arg.split("=", 1)[0]] = eval(arg.split("=", 1)[1])
|
|||
|
|
|||
|
elif head == "cmd":
|
|||
|
# 在当前计算机上执行命令
|
|||
|
os.system(line.split(" ", 1)[1])
|
|||
|
|
|||
|
elif head == "api":
|
|||
|
# 调用Bot API 需要Bot实例
|
|||
|
await self.bot.call_api(line.split(" ", 1)[1])
|
|||
|
|
|||
|
elif head == "function":
|
|||
|
# 调用轻雪函数
|
|||
|
return functools.partial(get_function, line.split(" ", 1)[1])
|
|||
|
|
|||
|
|
|||
|
def get_function(name: str) -> LiteyukiFunction | None:
|
|||
|
"""
|
|||
|
获取一个轻雪函数
|
|||
|
Args:
|
|||
|
name: 函数名
|
|||
|
Returns:
|
|||
|
"""
|
|||
|
return loaded_functions.get(name)
|
|||
|
|
|||
|
|
|||
|
def load_from_dir(path: str):
|
|||
|
"""
|
|||
|
从目录中加载轻雪函数,类似mcfunction
|
|||
|
|
|||
|
Args:
|
|||
|
path: 目录路径
|
|||
|
"""
|
|||
|
for f in os.listdir(path):
|
|||
|
f = os.path.join(path, f)
|
|||
|
if os.path.isfile(f):
|
|||
|
if f.endswith(ly_function_extensions):
|
|||
|
load_from_file(f)
|
|||
|
|
|||
|
|
|||
|
def load_from_file(path: str):
|
|||
|
"""
|
|||
|
从文件中加载轻雪函数
|
|||
|
Args:
|
|||
|
path:
|
|||
|
Returns:
|
|||
|
"""
|
|||
|
pass
|