aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/examples/plugins/HydroRoll/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/plugins/HydroRoll/__init__.py')
-rw-r--r--examples/plugins/HydroRoll/__init__.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/examples/plugins/HydroRoll/__init__.py b/examples/plugins/HydroRoll/__init__.py
new file mode 100644
index 0000000..8a5cd74
--- /dev/null
+++ b/examples/plugins/HydroRoll/__init__.py
@@ -0,0 +1,151 @@
+"""中间件"""
+import re
+import json
+import joblib
+import os
+import shutil
+
+import oneroll
+from iamai import ConfigModel, Plugin
+from iamai.log import logger
+from iamai.exceptions import GetEventTimeout
+from iamai.event import MessageEvent, Event
+from iamai.typing import StateT
+
+from .config import Directory, GlobalConfig, Models
+from .utils import *
+from .models.Transformer import query
+
+from .config import (
+ BasePluginConfig,
+ CommandPluginConfig,
+ RegexPluginConfig,
+ GlobalConfig,
+)
+
+from ast import literal_eval
+from os.path import dirname, join, abspath
+from abc import ABC, abstractmethod
+from typing import Any, Generic, TypeVar
+from typing_extensions import Annotated
+
+ConfigT = TypeVar("ConfigT", bound=BasePluginConfig)
+RegexPluginConfigT = TypeVar("RegexPluginConfigT", bound=RegexPluginConfig)
+CommandPluginConfigT = TypeVar("CommandPluginConfigT", bound=CommandPluginConfig)
+
+
+BASE_DIR = dirname(abspath("__file__"))
+HYDRO_DIR = dirname(abspath(__file__))
+APP_DIR = join(BASE_DIR, "HydroRoll")
+
+# logger.info(GlobalConfig._copyright)
+
+
+class Dice(Plugin[MessageEvent, Annotated[dict, {}], RegexPluginConfig]):
+ """中间件"""
+
+ priority = 0
+
+ # TODO: infini should be able to handle all signals and tokens from Psi.
+ logger.info("Loading infini...")
+
+ def __post_init__(self):
+ self.state = {}
+ self.model_path_list = []
+ self.bot.global_state["HydroRoll"] = {}
+ self.model_dict = Models().get_models_dict()
+
+ self.model_path_list.append(join(BASE_DIR, "models"))
+ self.model_path_list.append(join(HYDRO_DIR, "models"))
+ self.model_path_list.append(join(BASE_DIR, "HydroRoll", "models"))
+
+ self.load_models()
+
+ async def handle(self) -> None:
+ """
+ @TODO: infini should be able to handle all signals and tokens from Psi.
+ @BODY: infini actives the rule-packages.
+ """
+ global flag
+
+ args = self.event.get_plain_text().split(" ")
+ command_list = ["/r", ".root", ".roots", ".core", ".set", ".get", ".test"]
+ current_cmd = args[0]
+ text = (
+ self.event.get_plain_text()[2:]
+ if len(self.event.get_plain_text()) >= 2
+ else None
+ )
+ flag = True in [cmd.startswith(current_cmd) for cmd in command_list]
+ # logger.info(f"Command {current_cmd} not found with flag {flag}")
+ logger.info(f"text: {text}")
+ if text and self.event.get_plain_text().startswith("/r"):
+ logger.info(text)
+ try:
+ await self.event.reply(f"{oneroll.roll(text)}")
+ except Exception as e:
+ await self.event.reply(f"{e!r}")
+ if args[0] in [".root", ".roots"]:
+ try:
+ import aiohttp
+
+ async with aiohttp.ClientSession() as session:
+ async with session.get(
+ "https://api.hydroroll.team/api/roots"
+ ) as response:
+ data = await response.json()
+ await self.event.reply(data["line"])
+ except Exception as e:
+ await self.event.reply(f"{e!r}")
+ elif args[0] == ".core":
+ await self.event.reply(f"{self.state}")
+ # if args[0].startswith(".set"):
+ # resolve = Set(args[1:]) # TODO: handle multiple sets
+ # elif args[0].startswith(".get"):
+ # resolve = Get(args[1:]) # TODO: handle multiple gets
+ elif args[0].startswith(".test"):
+ try:
+ result = eval(self.event.message.get_plain_text()[5:])
+ await self.event.reply(str(result))
+ except Exception as error:
+ await self.event.reply(f"{error!r}")
+
+ async def rule(self) -> bool:
+ """
+ @TODO: Psi should be able to handle all message first.
+ @BODY: lexer module will return a list of tokens, parser module will parse the tokens into a tree, and executor module will execute the tokens with a stack with a bool return value.
+ """
+ logger.info("loading psi...")
+ return isinstance(self.event, MessageEvent)
+
+ def _init_directory(self, _prefix: str = ""):
+ """初始化水系目录"""
+ for _ in Directory(BASE_DIR).get_dice_dir_list(_prefix):
+ if not os.path.exists(_):
+ os.makedirs(_)
+
+ def _init_file(self, _prefix: str = ""):
+ """初始化文件"""
+
+ def init_directory(self, _prefix: str = "HydroRoll"):
+ """在指定目录生成水系文件结构"""
+ self._init_directory(_prefix=_prefix)
+
+ def _load_model(self, path: str, model_file: str):
+ if model_file is None:
+ model_file = ""
+ return joblib.load(join(path, f"{model_file}"))
+
+ def _load_models(self, model_path_list: list, model_dict: dict) -> dict:
+ """加载指定模型, 当然也可能是数据集"""
+ models = {}
+ for path in model_path_list:
+ for model_name, model_file in model_dict.items():
+ if os.path.exists(join(path, model_file)):
+ models[model_name] = self._load_model(path, model_file)
+ logger.success(f'Succeeded to load model "{model_name}"')
+ return models
+
+ def load_models(self):
+ """我想睡觉, 但我失眠了。"""
+ self.models = self._load_models(self.model_path_list, self.model_dict)