From e6e9453a024dff943ea52b4fb588f2cf7fec509b Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Mon, 26 Feb 2024 13:21:50 +0800 Subject: refactor(command): 命令词法解析器 (#82) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(command): 重构命令路由 * feat(lua): 包装异步方法`self.event.reply` => `msg:echo` * feat(lua): 包装异步输入流方法`self.event.ask` => `msg:ask` * 'Refactored by Sourcery' (#83) Co-authored-by: Sourcery AI <> * feat(Token|Lexer): 添加`Token`与`Lexer`类 * refactor(Lexer): 词法分析器添加`advance`方法 * chore: lint code * refactor: sync gensokyo adapter * feat: Cli parser (#85) * feat(cli): 添加`Cli`类,解析命令行参数 * fix: 修复错误的`dest`与`action` * feat(cli): 实现`install_package` 与 `build_template` * feat(cli): 实现`-c|--config`指令配置镜像常量等 * feat(cli): 使用高效率的异步网络库`aiohttp` * fix(cli): `TYPE_CHECKING` with partially module `typing` * refactor!: examples, tests, src... rewrite in rust --------- Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- examples/plugins/lua.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 examples/plugins/lua.py (limited to 'examples/plugins/lua.py') diff --git a/examples/plugins/lua.py b/examples/plugins/lua.py new file mode 100644 index 0000000..6a36827 --- /dev/null +++ b/examples/plugins/lua.py @@ -0,0 +1,64 @@ +from iamai import Plugin +from iamai.exceptions import GetEventTimeout +from numpy.random import Generator +from iamai.adapter.onebot11.message import CQHTTPMessage, CQHTTPMessageSegment +from iamai.log import logger +from lupa import LuaRuntime +from iamai.utils import sync_func_wrapper +import asyncio + +lua = LuaRuntime(unpack_returned_tuples=True) +ms = CQHTTPMessageSegment + + +class Lua(Plugin): + priority = 1 + prefix = "/lua" + + async def handle(self) -> None: + try: + self.suffix = self.event.message.get_plain_text()[len(self.prefix) + 1 :] + + class msg: + priority = self.priority + prefix = self.prefix + fromMsg = self.event.message + suffix = self.suffix + event = self.event + + def echo(self, message=None): + if not message: + return self.__str__ + + loop = asyncio.get_event_loop() + coro = self.event.reply(message) + asyncio.run_coroutine_threadsafe(coro, loop) + + def ask(self, message=None, timeout=10, **kwargs): + if not message: + return self.__str__ + + loop = asyncio.get_event_loop() + try: + coro = self.event.ask(message, timeout=timeout) + asyncio.run_coroutine_threadsafe(coro, loop) + except GetEventTimeout: + return self.__str__ + else: + coro = self.event.reply(**kwargs) + asyncio.run_coroutine_threadsafe(coro, loop) + + lua.globals().msg = msg + lua.globals().event = self.event + # logger.info(lua.eval(self.suffix)) + if result := lua.eval(self.suffix): + await self.event.reply(result) + except Exception as e: + await self.event.reply(f"ERROR!{e!r}") + logger.info(f"ERROR with message: {e}") + + async def rule(self) -> bool: + return ( + self.event.type == "message" + and self.event.message.get_plain_text().startswith(self.prefix) + ) -- cgit v1.2.3-70-g09d2