aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/infini/core.py2
-rw-r--r--src/infini/loader.py23
-rw-r--r--src/infini/router.py32
3 files changed, 49 insertions, 8 deletions
diff --git a/src/infini/core.py b/src/infini/core.py
index 40ed6f4c..87066370 100644
--- a/src/infini/core.py
+++ b/src/infini/core.py
@@ -30,9 +30,9 @@ class Core:
yield self.generate(stream)
continue
outcome = stream
+ yield outcome
if handled_stream.block:
return
- yield outcome
def pre_intercept(self, input: Input) -> Generator[Output | Input, Any, None]:
return self.pre_interceptor.input(input)
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..c84e11a4 100644
--- a/src/infini/router.py
+++ b/src/infini/router.py
@@ -1,30 +1,54 @@
-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])
+
+
+class Command(Router):
+ type: Literal["command"] = "command"
+ prefix: tuple = (".", "/")
+
+ def match(self, input: str) -> bool:
+ input = input.strip()
+ if input:
+ if input.startswith(self.prefix):
+ input = input[1:]
+ return any([input.startswith(sign) for sign in self.signs])
+
+ return False