diff options
| author | 2024-01-29 18:08:01 +0800 | |
|---|---|---|
| committer | 2024-01-29 18:08:01 +0800 | |
| commit | 04f687aae332fd2d94b76cfa22afd49b647f39f5 (patch) | |
| tree | 7f4733da5a42fe8589b47d5cab5dcd28469f3a96 | |
| parent | 9ec09b4e7506ab533d52498abb432d5f00c0f276 (diff) | |
| download | infini-04f687aae332fd2d94b76cfa22afd49b647f39f5.tar.gz infini-04f687aae332fd2d94b76cfa22afd49b647f39f5.zip | |
fix(loader): fix queue pop a NoneType when loads same handler
| -rw-r--r-- | src/infini/loader.py | 23 | ||||
| -rw-r--r-- | src/infini/router.py | 18 |
2 files changed, 34 insertions, 7 deletions
diff --git a/src/infini/loader.py b/src/infini/loader.py index eabf0236..623476f9 100644 --- a/src/infini/loader.py +++ b/src/infini/loader.py @@ -132,11 +132,28 @@ class Loader: self.load_from_register(register) def load_from_register(self, register: Register): - self.pre_interceptors.extend(register.pre_interceptors) - self.handlers.extend(register.handlers) + self.pre_interceptors = self._update_list( + self.pre_interceptors, register.interceptors + ) + self.handlers = self._update_list(self.handlers, register.handlers) self.events.update(register.events) self.global_variables.update(register.global_variables) - self.interceptors.extend(register.interceptors) + self.interceptors = self._update_list(self.interceptors, register.interceptors) + + def _update_list(self, old_list: List[RouterType], new_list: List[RouterType]): + list = old_list.copy() + for value in new_list: + exists = False + for old_value in old_list: + if old_value["router"] == value["router"]: + if value["priority"] > old_value["priority"]: + list.remove(old_value) + else: + exists = True + break + if not exists: + list.append(value) + return list def close(self): uninstall() diff --git a/src/infini/router.py b/src/infini/router.py index 4b781ad9..127f83be 100644 --- a/src/infini/router.py +++ b/src/infini/router.py @@ -1,30 +1,40 @@ -from infini.typing import Sequence, List +from infini.typing import Sequence, Literal class Router: - signs: List[str] + type: Literal["normal"] = "normal" + signs: set[str] def __init__(self, sign: str, alias: Sequence[str] = []) -> None: - self.signs = [sign] - self.signs.extend(alias) + self.signs = {sign} + self.signs.update(alias) + + def __eq__(self, __router: "Router") -> bool: + return __router.type == self.type and __router.signs == self.signs def match(self, input: str) -> bool: return any([input == sign for sign in self.signs]) class Startswith(Router): + type: Literal["startswith"] = "startswith" + def match(self, input: str) -> bool: input = input.strip() return any([input.startswith(sign) for sign in self.signs]) class Contains(Router): + type: Literal["contains"] = "contains" + def match(self, input: str) -> bool: input = input.strip() return any([sign in input for sign in self.signs]) class Endswith(Router): + type: Literal["endswith"] = "endswith" + def match(self, input: str) -> bool: input = input.strip() return any([input.endswith(sign) for sign in self.signs]) |
