aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-01-29 18:08:01 +0800
committer苏向夜 <fu050409@163.com>2024-01-29 18:08:01 +0800
commit04f687aae332fd2d94b76cfa22afd49b647f39f5 (patch)
tree7f4733da5a42fe8589b47d5cab5dcd28469f3a96
parent9ec09b4e7506ab533d52498abb432d5f00c0f276 (diff)
downloadinfini-04f687aae332fd2d94b76cfa22afd49b647f39f5.tar.gz
infini-04f687aae332fd2d94b76cfa22afd49b647f39f5.zip
fix(loader): fix queue pop a NoneType when loads same handler
-rw-r--r--src/infini/loader.py23
-rw-r--r--src/infini/router.py18
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])