ErisPulse 2.3.8.dev0__tar.gz → 2.3.9.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/PKG-INFO +5 -2
  2. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/README.md +3 -0
  3. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/pyproject.toml +2 -2
  4. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/adapter.py +60 -2
  5. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/adapter.pyi +21 -1
  6. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/manager.py +28 -0
  7. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/manager.pyi +22 -0
  8. erispulse-2.3.9.dev1/src/ErisPulse/Core/Event/__init__.py +85 -0
  9. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/__init__.pyi +1 -0
  10. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/command.py +18 -18
  11. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/command.pyi +1 -0
  12. erispulse-2.3.9.dev1/src/ErisPulse/Core/Event/session_type.py +418 -0
  13. erispulse-2.3.9.dev1/src/ErisPulse/Core/Event/session_type.pyi +196 -0
  14. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/wrapper.py +6 -76
  15. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/wrapper.pyi +2 -15
  16. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/adapter.py +33 -0
  17. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/adapter.pyi +23 -0
  18. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/logger.py +39 -0
  19. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/logger.pyi +33 -0
  20. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/module.py +25 -0
  21. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/module.pyi +23 -0
  22. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/router.py +54 -39
  23. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/router.pyi +12 -5
  24. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/storage.py +7 -17
  25. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/storage.pyi +6 -17
  26. erispulse-2.3.8.dev0/src/ErisPulse/Core/Event/__init__.py +0 -41
  27. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/.gitignore +0 -0
  28. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/LICENSE +0 -0
  29. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/__init__.py +0 -0
  30. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/__init__.pyi +0 -0
  31. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/base.py +0 -0
  32. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/base.pyi +0 -0
  33. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/cli.py +0 -0
  34. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/cli.pyi +0 -0
  35. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/__init__.py +0 -0
  36. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
  37. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/init.py +0 -0
  38. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/init.pyi +0 -0
  39. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/install.py +0 -0
  40. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/install.pyi +0 -0
  41. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/list.py +0 -0
  42. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/list.pyi +0 -0
  43. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
  44. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
  45. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/run.py +0 -0
  46. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/run.pyi +0 -0
  47. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/self_update.py +0 -0
  48. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
  49. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
  50. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
  51. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
  52. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
  53. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/console.py +0 -0
  54. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/console.pyi +0 -0
  55. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/registry.py +0 -0
  56. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/registry.pyi +0 -0
  57. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/utils/__init__.py +0 -0
  58. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
  59. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/utils/package_manager.py +0 -0
  60. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/CLI/utils/package_manager.pyi +0 -0
  61. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/__init__.py +0 -0
  62. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
  63. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/module.py +0 -0
  64. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Bases/module.pyi +0 -0
  65. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/base.py +0 -0
  66. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/base.pyi +0 -0
  67. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/message.py +0 -0
  68. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/message.pyi +0 -0
  69. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/meta.py +0 -0
  70. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/meta.pyi +0 -0
  71. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/notice.py +0 -0
  72. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/notice.pyi +0 -0
  73. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/request.py +0 -0
  74. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/Event/request.pyi +0 -0
  75. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/__init__.py +0 -0
  76. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/__init__.pyi +0 -0
  77. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/config.py +0 -0
  78. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/config.pyi +0 -0
  79. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/lifecycle.py +0 -0
  80. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/Core/lifecycle.pyi +0 -0
  81. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/__init__.py +0 -0
  82. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/__init__.pyi +0 -0
  83. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/__main__.py +0 -0
  84. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/__main__.pyi +0 -0
  85. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/__init__.py +0 -0
  86. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/__init__.pyi +0 -0
  87. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/adapter.py +0 -0
  88. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/adapter.pyi +0 -0
  89. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/bases/__init__.py +0 -0
  90. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
  91. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/bases/finder.py +0 -0
  92. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/bases/finder.pyi +0 -0
  93. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/cli.py +0 -0
  94. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/cli.pyi +0 -0
  95. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/module.py +0 -0
  96. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/finders/module.pyi +0 -0
  97. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/__init__.py +0 -0
  98. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/__init__.pyi +0 -0
  99. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/adapter.py +0 -0
  100. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/adapter.pyi +0 -0
  101. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/bases/__init__.py +0 -0
  102. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
  103. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/bases/loader.py +0 -0
  104. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
  105. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/module.py +0 -0
  106. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/module.pyi +0 -0
  107. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/strategy.py +0 -0
  108. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/loaders/strategy.pyi +0 -0
  109. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/__init__.py +0 -0
  110. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/__init__.pyi +0 -0
  111. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/cleanup.py +0 -0
  112. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/cleanup.pyi +0 -0
  113. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/exceptions.py +0 -0
  114. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/exceptions.pyi +0 -0
  115. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/frame_config.py +0 -0
  116. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/runtime/frame_config.pyi +0 -0
  117. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/sdk.py +0 -0
  118. {erispulse-2.3.8.dev0 → erispulse-2.3.9.dev1}/src/ErisPulse/sdk.pyi +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.3.8.dev0
3
+ Version: 2.3.9.dev1
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
- Author-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
5
+ Author-email: ErisDev <erisdev@88.com>
6
6
  Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
7
7
  License: MIT License
8
8
 
@@ -105,6 +105,9 @@ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ErisPulse
105
105
  # 使用 `uv` 安装
106
106
  uv install ErisPulse
107
107
  ```
108
+
109
+ ![安装演示](.github/assets/docs/install_pip.gif)
110
+
108
111
  > 如果您的 Python 版本低于 3.10,可以使用一键安装脚本自动配置环境。详见 [安装脚本说明](scripts/install/)。
109
112
 
110
113
  ### 初始化项目
@@ -45,6 +45,9 @@ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ErisPulse
45
45
  # 使用 `uv` 安装
46
46
  uv install ErisPulse
47
47
  ```
48
+
49
+ ![安装演示](.github/assets/docs/install_pip.gif)
50
+
48
51
  > 如果您的 Python 版本低于 3.10,可以使用一键安装脚本自动配置环境。详见 [安装脚本说明](scripts/install/)。
49
52
 
50
53
  ### 初始化项目
@@ -4,14 +4,14 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ErisPulse"
7
- version = "2.3.8-dev.0"
7
+ version = "2.3.9-dev.1"
8
8
  description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  license = { file = "LICENSE" }
12
12
 
13
13
  authors = [
14
- { name = "艾莉丝·格雷拉特(WSu2059)", email = "wsu2059@qq.com" }
14
+ { name = "ErisDev", email = "erisdev@88.com" }
15
15
  ]
16
16
 
17
17
  maintainers = [
@@ -42,6 +42,41 @@ class SendDSL:
42
42
  self._target_to = target_id
43
43
  self._account_id = account_id
44
44
 
45
+ def __getattr__(self, name: str):
46
+ """
47
+ 动态属性访问处理,实现大小写不敏感调用
48
+
49
+ 1. 如果找到匹配的方法(忽略大小写),返回该方法
50
+ 2. 如果没找到,打印警告并抛出 AttributeError
51
+
52
+ :param name: 属性名
53
+ :return: 匹配的方法或属性
54
+ :raises AttributeError: 当属性不存在时抛出
55
+ """
56
+ # 检查所有实际存在的方法
57
+ for attr_name in dir(self.__class__):
58
+ # 跳过特殊方法
59
+ if attr_name.startswith('_'):
60
+ continue
61
+
62
+ # 大小写不敏感匹配
63
+ if attr_name.lower() == name.lower():
64
+ # 返回实际的方法绑定到当前实例
65
+ attr = getattr(self.__class__, attr_name)
66
+ if callable(attr):
67
+ return attr.__get__(self, self.__class__)
68
+ return attr
69
+
70
+ # 没有找到匹配的方法,打印警告
71
+ from .. import logger
72
+ logger.warning(
73
+ f"平台 {self._adapter.__class__.__name__} "
74
+ f"未实现 {name} 发送方法"
75
+ )
76
+
77
+ # 抛出 AttributeError,这样 hasattr() 能正常工作
78
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
79
+
45
80
  def At(self, **kwargs):
46
81
  from .. import logger
47
82
  logger.warning(
@@ -82,18 +117,41 @@ class SendDSL:
82
117
  """
83
118
  设置消息目标
84
119
 
120
+ 支持自动类型转换:
121
+ - 当 target_type 为 "private" 时,自动转换为 "user"
122
+ - 当只提供 target_id(字符串或数字)时,默认推断为 "user"
123
+
85
124
  :param target_type: 目标类型(可选)
86
125
  :param target_id: 目标ID(可选)
87
126
  :return: SendDSL实例
88
127
 
89
128
  :example:
129
+ >>> # 标准用法
90
130
  >>> adapter.Send.To("user", "123").Text("Hello")
91
- >>> adapter.Send.To("123").Text("Hello") # 简化形式
131
+ >>> # 自动转换 private → user
132
+ >>> adapter.Send.To("private", "123").Text("Hello")
133
+ >>> # 简化形式(默认推断为 user)
134
+ >>> adapter.Send.To("123").Text("Hello")
92
135
  """
136
+ from ..Event.session_type import is_standard_type
137
+
138
+ # 处理简化形式:只提供一个参数作为 target_id
93
139
  if target_id is None and target_type is not None:
94
140
  target_id = target_type
95
141
  target_type = None
96
-
142
+
143
+ # 如果没有明确指定 target_type,尝试推断
144
+ if target_type is None:
145
+ # 将 target_id 作为字符串处理
146
+ if target_id is not None:
147
+ # 默认推断为 user(对应 private)
148
+ # 这里我们假设如果只提供 ID,通常是发送给用户
149
+ target_type = "user"
150
+
151
+ # 自动转换 private → user
152
+ if target_type == "private":
153
+ target_type = "user"
154
+
97
155
  return self.__class__(self._adapter, target_type, target_id, self._account_id)
98
156
 
99
157
  def Using(self, account_id: Union[str, int]) -> 'SendDSL':
@@ -39,6 +39,18 @@ class SendDSL:
39
39
  :param _account_id: 发送账号(可选)
40
40
  """
41
41
  ...
42
+ def __getattr__(self: object, name: str) -> ...:
43
+ """
44
+ 动态属性访问处理,实现大小写不敏感调用
45
+
46
+ 1. 如果找到匹配的方法(忽略大小写),返回该方法
47
+ 2. 如果没找到,打印警告并抛出 AttributeError
48
+
49
+ :param name: 属性名
50
+ :return: 匹配的方法或属性
51
+ :raises AttributeError: 当属性不存在时抛出
52
+ """
53
+ ...
42
54
  def At(self: object, **kwargs: ...) -> ...:
43
55
  ...
44
56
  def Reply(self: object, **kwargs: ...) -> ...:
@@ -53,13 +65,21 @@ class SendDSL:
53
65
  """
54
66
  设置消息目标
55
67
 
68
+ 支持自动类型转换:
69
+ - 当 target_type 为 "private" 时,自动转换为 "user"
70
+ - 当只提供 target_id(字符串或数字)时,默认推断为 "user"
71
+
56
72
  :param target_type: 目标类型(可选)
57
73
  :param target_id: 目标ID(可选)
58
74
  :return: SendDSL实例
59
75
 
60
76
  :example:
77
+ >>> # 标准用法
61
78
  >>> adapter.Send.To("user", "123").Text("Hello")
62
- >>> adapter.Send.To("123").Text("Hello") # 简化形式
79
+ >>> # 自动转换 private → user
80
+ >>> adapter.Send.To("private", "123").Text("Hello")
81
+ >>> # 简化形式(默认推断为 user)
82
+ >>> adapter.Send.To("123").Text("Hello")
63
83
  """
64
84
  ...
65
85
  def Using(self: object, account_id: Union[(str, int)]) -> SendDSL:
@@ -26,6 +26,7 @@ class ManagerBase(ABC):
26
26
  - exists(): 检查是否存在
27
27
  - enable()/disable(): 启用/禁用
28
28
  - is_enabled(): 检查是否启用
29
+ - is_running(): 检查是否运行
29
30
  - list_*(): 列出相关项
30
31
  {!--< /tips >!--}
31
32
  """
@@ -129,6 +130,33 @@ class ManagerBase(ABC):
129
130
  :return: {名称: 是否启用} 字典
130
131
  """
131
132
  ...
133
+
134
+ # ==================== 运行状态检查 ====================
135
+
136
+ @abstractmethod
137
+ def is_running(self, name: str) -> bool:
138
+ """
139
+ 检查项是否正在运行
140
+
141
+ 对于适配器:检查是否已启动
142
+ 对于模块:检查是否已加载
143
+
144
+ :param name: 名称
145
+ :return: 是否正在运行
146
+ """
147
+ ...
148
+
149
+ @abstractmethod
150
+ def list_running(self) -> List[str]:
151
+ """
152
+ 列出所有正在运行的项
153
+
154
+ 对于适配器:列出所有已启动的适配器
155
+ 对于模块:列出所有已加载的模块
156
+
157
+ :return: 名称列表
158
+ """
159
+ ...
132
160
 
133
161
 
134
162
  __all__ = [
@@ -31,6 +31,7 @@ class ManagerBase(ABC):
31
31
  - exists(): 检查是否存在
32
32
  - enable()/disable(): 启用/禁用
33
33
  - is_enabled(): 检查是否启用
34
+ - is_running(): 检查是否运行
34
35
  - list_*(): 列出相关项
35
36
  {!--< /tips >!--}
36
37
  """
@@ -106,3 +107,24 @@ class ManagerBase(ABC):
106
107
  :return: {名称: 是否启用} 字典
107
108
  """
108
109
  ...
110
+ def is_running(self: object, name: str) -> bool:
111
+ """
112
+ 检查项是否正在运行
113
+
114
+ 对于适配器:检查是否已启动
115
+ 对于模块:检查是否已加载
116
+
117
+ :param name: 名称
118
+ :return: 是否正在运行
119
+ """
120
+ ...
121
+ def list_running(self: object) -> List[str]:
122
+ """
123
+ 列出所有正在运行的项
124
+
125
+ 对于适配器:列出所有已启动的适配器
126
+ 对于模块:列出所有已加载的模块
127
+
128
+ :return: 名称列表
129
+ """
130
+ ...
@@ -0,0 +1,85 @@
1
+ """
2
+ ErisPulse 事件处理模块
3
+
4
+ 提供统一的事件处理接口,支持命令、消息、通知、请求和元事件处理
5
+
6
+ {!--< tips >!--}
7
+ 1. 所有事件处理都基于OneBot12标准事件格式
8
+ 2. 通过装饰器方式注册事件处理器
9
+ 3. 支持优先级和条件过滤
10
+ {!--< /tips >!--}
11
+ """
12
+
13
+ from .command import command
14
+ from .message import message
15
+ from .notice import notice
16
+ from .request import request
17
+ from .meta import meta
18
+ from .wrapper import Event
19
+ from .session_type import (
20
+ # 标准类型常量
21
+ RECEIVE_TYPES,
22
+ SEND_TYPES,
23
+
24
+ # 自定义类型注册
25
+ register_custom_type,
26
+ unregister_custom_type,
27
+
28
+ # 类型获取方法
29
+ get_id_field,
30
+ get_receive_type,
31
+ convert_to_send_type,
32
+ convert_to_receive_type,
33
+
34
+ # 自动推断方法
35
+ infer_receive_type,
36
+ get_target_id,
37
+ get_send_type_and_target_id,
38
+
39
+ # 工具方法
40
+ is_standard_type,
41
+ is_valid_send_type,
42
+ get_standard_types,
43
+ get_send_types,
44
+ clear_custom_types,
45
+ )
46
+
47
+ def _clear_all_handlers():
48
+ """
49
+ {!--< internal-use >!--}
50
+ 清除所有已注册的事件处理器和命令
51
+ """
52
+ # 清除命令处理器
53
+ command._clear_commands()
54
+
55
+ # 清除各类事件处理器
56
+ message._clear_message_handlers()
57
+ notice._clear_notice_handlers()
58
+ request._clear_request_handlers()
59
+ meta._clear_meta_handlers()
60
+
61
+ __all__ = [
62
+ "command",
63
+ "message",
64
+ "notice",
65
+ "request",
66
+ "meta",
67
+ "Event",
68
+ # 会话类型管理
69
+ "RECEIVE_TYPES",
70
+ "SEND_TYPES",
71
+ "register_custom_type",
72
+ "unregister_custom_type",
73
+ "get_id_field",
74
+ "get_receive_type",
75
+ "convert_to_send_type",
76
+ "convert_to_receive_type",
77
+ "infer_receive_type",
78
+ "get_target_id",
79
+ "get_send_type_and_target_id",
80
+ "is_standard_type",
81
+ "is_valid_send_type",
82
+ "get_standard_types",
83
+ "get_send_types",
84
+ "clear_custom_types",
85
+ ]
@@ -22,3 +22,4 @@ from .notice import notice
22
22
  from .request import request
23
23
  from .meta import meta
24
24
  from .wrapper import Event
25
+ from .session_type import RECEIVE_TYPES, SEND_TYPES, register_custom_type, unregister_custom_type, get_id_field, get_receive_type, convert_to_send_type, convert_to_receive_type, infer_receive_type, get_target_id, get_send_type_and_target_id, is_standard_type, is_valid_send_type, get_standard_types, get_send_types, clear_custom_types
@@ -14,6 +14,7 @@ ErisPulse 命令处理模块
14
14
  from .base import BaseEventHandler
15
15
  from .. import adapter, logger
16
16
  from ...runtime import get_event_config
17
+ from .session_type import get_send_type_and_target_id, infer_receive_type
17
18
  from typing import Callable, Union, List, Dict, Any, Optional, Awaitable
18
19
  import asyncio
19
20
  import inspect
@@ -180,15 +181,15 @@ class CommandHandler:
180
181
  """
181
182
  platform = event.get("platform")
182
183
  user_id = event.get("user_id")
183
- group_id = event.get("group_id")
184
- detail_type = "group" if group_id else "private"
185
- target_id = group_id or user_id
184
+
185
+ # 使用会话类型管理模块获取发送类型和目标ID
186
+ send_type, target_id = get_send_type_and_target_id(event, platform)
186
187
 
187
188
  # 发送提示消息(如果提供)
188
189
  if prompt and platform:
189
190
  try:
190
191
  adapter_instance = getattr(adapter, platform)
191
- await adapter_instance.Send.To(detail_type, target_id).Text(prompt)
192
+ await adapter_instance.Send.To(send_type, target_id).Text(prompt)
192
193
  except Exception as e:
193
194
  logger.warning(f"发送提示消息失败: {e}")
194
195
 
@@ -273,9 +274,9 @@ class CommandHandler:
273
274
 
274
275
  # 检查是否必须@机器人
275
276
  if self.must_at_bot:
276
- detail_type = event.get("detail_type")
277
+ detail_type = infer_receive_type(event)
277
278
  # 一对一场景(private或user)不需要检查@
278
- if detail_type not in ("private", "user", "bot"):
279
+ if detail_type not in ("private", "user"):
279
280
  message_segments = event.get("message", [])
280
281
  self_id = event.get("self", {}).get("user_id")
281
282
 
@@ -404,8 +405,9 @@ class CommandHandler:
404
405
  """
405
406
  platform = event.get("platform")
406
407
  user_id = event.get("user_id")
407
- group_id = event.get("group_id")
408
- target_id = group_id or user_id
408
+
409
+ # 使用会话类型管理模块获取发送类型和目标ID
410
+ send_type, target_id = get_send_type_and_target_id(event, platform)
409
411
 
410
412
  wait_key = f"{platform}:{user_id}:{target_id}"
411
413
 
@@ -441,14 +443,13 @@ class CommandHandler:
441
443
  """
442
444
  try:
443
445
  platform = event.get("platform")
444
- user_id = event.get("user_id")
445
- group_id = event.get("group_id")
446
- detail_type = "group" if group_id else "private"
447
- target_id = group_id or user_id
446
+
447
+ # 使用会话类型管理模块获取发送类型和目标ID
448
+ send_type, target_id = get_send_type_and_target_id(event, platform)
448
449
 
449
450
  if platform and hasattr(adapter, platform):
450
451
  adapter_instance = getattr(adapter, platform)
451
- await adapter_instance.Send.To(detail_type, target_id).Text("权限不足,无法执行该命令")
452
+ await adapter_instance.Send.To(send_type, target_id).Text("权限不足,无法执行该命令")
452
453
  except Exception as e:
453
454
  logger.error(f"发送权限拒绝消息失败: {e}")
454
455
 
@@ -464,14 +465,13 @@ class CommandHandler:
464
465
  """
465
466
  try:
466
467
  platform = event.get("platform")
467
- user_id = event.get("user_id")
468
- group_id = event.get("group_id")
469
- detail_type = "group" if group_id else "private"
470
- target_id = group_id or user_id
468
+
469
+ # 使用会话类型管理模块获取发送类型和目标ID
470
+ send_type, target_id = get_send_type_and_target_id(event, platform)
471
471
 
472
472
  if platform and hasattr(adapter, platform):
473
473
  adapter_instance = getattr(adapter, platform)
474
- await adapter_instance.Send.To(detail_type, target_id).Text(f"命令执行出错: {error}")
474
+ await adapter_instance.Send.To(send_type, target_id).Text(f"命令执行出错: {error}")
475
475
  except Exception as e:
476
476
  logger.error(f"发送命令错误消息失败: {e}")
477
477
 
@@ -20,6 +20,7 @@ ErisPulse 命令处理模块
20
20
  from .base import BaseEventHandler
21
21
  from .. import adapter, logger
22
22
  from ...runtime import get_event_config
23
+ from .session_type import get_send_type_and_target_id, infer_receive_type
23
24
  from typing import Callable, Union, List, Dict, Any, Optional, Awaitable
24
25
  import asyncio
25
26
  import inspect