tenko-api 0.2.0__tar.gz → 0.3.0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tenko-api
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Tenko 第三方插件的稳定宿主接口(运行时转发到 Tenko 宿主)
5
5
  Project-URL: Homepage, https://github.com/g1331/tenko
6
6
  Project-URL: Issues, https://github.com/g1331/tenko/issues
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  插件依赖它,而不是依赖 `tenko` 本体:`tenko-api` 没有任何运行时依赖,
23
23
  只是转发到正在运行的 Tenko 宿主,因此不会影响插件自己的依赖解析。插件声明
24
- `tenko-api>=0.2,<0.3` 这样的范围;宿主加载插件前按自己提供的 `tenko-api` 版本检查
24
+ `tenko-api>=0.3,<0.4` 这样的范围;宿主加载插件前按自己提供的 `tenko-api` 版本检查
25
25
  这个范围,不兼容的插件不加载并在日志中说明原因,插件不需要另写兼容检查。
26
26
 
27
27
  > 当前为预览版(0.x)。1.0 之前接口可能调整,请把上限写到次版本。
@@ -36,7 +36,7 @@ Description-Content-Type: text/markdown
36
36
  [project]
37
37
  name = "tenko-plugin-hello"
38
38
  version = "0.1.0"
39
- dependencies = ["tenko-api>=0.2,<0.3"]
39
+ dependencies = ["tenko-api>=0.3,<0.4"]
40
40
 
41
41
  [project.entry-points."tenko.plugins"]
42
42
  hello = "tenko_plugin_hello" # 入口名 = 插件 ID
@@ -65,9 +65,8 @@ async def hello(session: Session):
65
65
  ## 返回消息
66
66
 
67
67
  命令处理函数直接返回 `str`,Entari 原样发送;图片等混合内容返回 `MessageChain`。
68
- `tenko_api.messages.text_message` 自 0.2.0 起弃用(调用时发出 `DeprecationWarning`),
69
- 将在 1.0 前移除,请改为直接返回字符串。宿主强制关闭 Entari 的 `str_as_message`,
70
- 返回的 `str` 一律按纯文本发送;需要 @、图片等元素时返回 `MessageChain`。
68
+ 宿主强制关闭 Entari 的 `str_as_message`,返回的 `str` 一律按纯文本发送,需要 @、图片等元素时
69
+ 返回 `MessageChain`。
71
70
 
72
71
  ## 权限与功能开关
73
72
 
@@ -82,7 +81,7 @@ async def hello(session: Session):
82
81
  - 装饰器放在 `@command.on(...)` 之下,放在之上也同样生效;同一种装饰器在一个函数上只能用一次。
83
82
  它们在命令匹配之后执行,所以只有命中命令的消息才会收到拒绝回复。
84
83
  - 声明的要求登记在处理函数上,`/帮助 <编号>` 会显示每条命令的“权限”。
85
- - 只有权限取决于运行时数据时(例如按参数区分的权限)才在函数体里调用 `require_perm`。
84
+ - 只有权限取决于运行时数据时(例如按参数区分的权限)才在函数体里调用 `require_perm(session, level)`。
86
85
  - `declare(level=Permission.X)` 声明整个插件要求的群等级,默认 `ActiveGroup`:群等级更低的群里,
87
86
  该插件的所有命令都被宿主静默忽略。
88
87
  - 不走命令的监听器(例如响应 @bot 的消息监听)没有宿主的命令策略保护,用
@@ -104,13 +103,12 @@ async def on_message(event: MessageCreatedEvent): ...
104
103
 
105
104
  | 模块 | 内容 |
106
105
  |---|---|
107
- | `tenko_api.context` | `MessageContext`、`context_from_session` |
108
106
  | `tenko_api.perm` | `Permission`;装饰器 `require`、`require_group`、`group_only`、`private_only`;函数体内的 `require_perm`、`get_user_perm`、`get_group_perm` |
109
107
  | `tenko_api.actions` | 发消息、禁言、踢人、撤回、查询群成员等宿主动作,以及 `ActionServiceError` 系列异常 |
110
108
  | `tenko_api.accounts` | 只读账号信息:在线账号、某群可响应的账号 |
111
109
  | `tenko_api.features` | `feature_enabled` 只读查询;`declare` 声明范围、默认开关、限流权重和群等级;`feature_required` 装饰非命令监听器 |
112
110
  | `tenko_api.render` | `RenderService`、`try_render`(浏览器不可用时得到 `None`,回退文本;`render_or_none` 是按方法名分发的旧写法) |
113
- | `tenko_api.messages` | `report_error`;`text_message` 已弃用(见上文“返回消息”) |
111
+ | `tenko_api.messages` | `report_error` |
114
112
  | `tenko_api.storage` | 插件独立数据目录 `data_dir()`、带版本号并自动备份迁移的 JSON `Store`、插件自己的 SQLite 库 `Model` 与 `get_session()` |
115
113
 
116
114
  ## 插件的 SQLite 库
@@ -135,7 +133,8 @@ async def latest() -> str | None:
135
133
  return await db.scalar(select(Note.text).order_by(Note.id.desc()).limit(1))
136
134
  ```
137
135
 
138
- - 模型要在插件模块里定义(导入期间),并在 Tenko 启动时随插件加载;已经在运行的 Tenko 里不能新增模型,需要重启。
136
+ - 模型要在插件模块里定义(导入期间),并在 Tenko 启动时随插件加载;已经在运行的 Tenko 里不能新增模型,
137
+ 所以用了模型的插件首次启用后需要重启,没有模型的插件启用即可加载。
139
138
  - 启动时自动建表,并自动执行新增表、新增可空列和新增索引。删除表、删除列、修改列类型会被拒绝
140
139
  (日志报错、数据保持原样);确需这类变更时用官方的 `register_custom_migration` 写显式迁移脚本。
141
140
  - 插件版本变化后的第一次启动,宿主先备份插件库(`backups/`,保留最近 3 份)再迁移。
@@ -149,7 +148,8 @@ async def latest() -> str | None:
149
148
 
150
149
  ## 版本承诺
151
150
 
152
- 版本号独立于 Tenko 本体,遵循语义化版本(1.0 起生效):
151
+ 版本号独立于 Tenko 本体,遵循语义化版本(1.0 起生效)。1.0 之前删除或改变语义时次版本号 +1,
152
+ 例如 0.3.0 移除了 `tenko_api.context` 和 `text_message`,权限函数改为接收 `Session`。
153
153
 
154
154
  | 变更 | 版本号 |
155
155
  |---|---|
@@ -4,7 +4,7 @@
4
4
 
5
5
  插件依赖它,而不是依赖 `tenko` 本体:`tenko-api` 没有任何运行时依赖,
6
6
  只是转发到正在运行的 Tenko 宿主,因此不会影响插件自己的依赖解析。插件声明
7
- `tenko-api>=0.2,<0.3` 这样的范围;宿主加载插件前按自己提供的 `tenko-api` 版本检查
7
+ `tenko-api>=0.3,<0.4` 这样的范围;宿主加载插件前按自己提供的 `tenko-api` 版本检查
8
8
  这个范围,不兼容的插件不加载并在日志中说明原因,插件不需要另写兼容检查。
9
9
 
10
10
  > 当前为预览版(0.x)。1.0 之前接口可能调整,请把上限写到次版本。
@@ -19,7 +19,7 @@
19
19
  [project]
20
20
  name = "tenko-plugin-hello"
21
21
  version = "0.1.0"
22
- dependencies = ["tenko-api>=0.2,<0.3"]
22
+ dependencies = ["tenko-api>=0.3,<0.4"]
23
23
 
24
24
  [project.entry-points."tenko.plugins"]
25
25
  hello = "tenko_plugin_hello" # 入口名 = 插件 ID
@@ -48,9 +48,8 @@ async def hello(session: Session):
48
48
  ## 返回消息
49
49
 
50
50
  命令处理函数直接返回 `str`,Entari 原样发送;图片等混合内容返回 `MessageChain`。
51
- `tenko_api.messages.text_message` 自 0.2.0 起弃用(调用时发出 `DeprecationWarning`),
52
- 将在 1.0 前移除,请改为直接返回字符串。宿主强制关闭 Entari 的 `str_as_message`,
53
- 返回的 `str` 一律按纯文本发送;需要 @、图片等元素时返回 `MessageChain`。
51
+ 宿主强制关闭 Entari 的 `str_as_message`,返回的 `str` 一律按纯文本发送,需要 @、图片等元素时
52
+ 返回 `MessageChain`。
54
53
 
55
54
  ## 权限与功能开关
56
55
 
@@ -65,7 +64,7 @@ async def hello(session: Session):
65
64
  - 装饰器放在 `@command.on(...)` 之下,放在之上也同样生效;同一种装饰器在一个函数上只能用一次。
66
65
  它们在命令匹配之后执行,所以只有命中命令的消息才会收到拒绝回复。
67
66
  - 声明的要求登记在处理函数上,`/帮助 <编号>` 会显示每条命令的“权限”。
68
- - 只有权限取决于运行时数据时(例如按参数区分的权限)才在函数体里调用 `require_perm`。
67
+ - 只有权限取决于运行时数据时(例如按参数区分的权限)才在函数体里调用 `require_perm(session, level)`。
69
68
  - `declare(level=Permission.X)` 声明整个插件要求的群等级,默认 `ActiveGroup`:群等级更低的群里,
70
69
  该插件的所有命令都被宿主静默忽略。
71
70
  - 不走命令的监听器(例如响应 @bot 的消息监听)没有宿主的命令策略保护,用
@@ -87,13 +86,12 @@ async def on_message(event: MessageCreatedEvent): ...
87
86
 
88
87
  | 模块 | 内容 |
89
88
  |---|---|
90
- | `tenko_api.context` | `MessageContext`、`context_from_session` |
91
89
  | `tenko_api.perm` | `Permission`;装饰器 `require`、`require_group`、`group_only`、`private_only`;函数体内的 `require_perm`、`get_user_perm`、`get_group_perm` |
92
90
  | `tenko_api.actions` | 发消息、禁言、踢人、撤回、查询群成员等宿主动作,以及 `ActionServiceError` 系列异常 |
93
91
  | `tenko_api.accounts` | 只读账号信息:在线账号、某群可响应的账号 |
94
92
  | `tenko_api.features` | `feature_enabled` 只读查询;`declare` 声明范围、默认开关、限流权重和群等级;`feature_required` 装饰非命令监听器 |
95
93
  | `tenko_api.render` | `RenderService`、`try_render`(浏览器不可用时得到 `None`,回退文本;`render_or_none` 是按方法名分发的旧写法) |
96
- | `tenko_api.messages` | `report_error`;`text_message` 已弃用(见上文“返回消息”) |
94
+ | `tenko_api.messages` | `report_error` |
97
95
  | `tenko_api.storage` | 插件独立数据目录 `data_dir()`、带版本号并自动备份迁移的 JSON `Store`、插件自己的 SQLite 库 `Model` 与 `get_session()` |
98
96
 
99
97
  ## 插件的 SQLite 库
@@ -118,7 +116,8 @@ async def latest() -> str | None:
118
116
  return await db.scalar(select(Note.text).order_by(Note.id.desc()).limit(1))
119
117
  ```
120
118
 
121
- - 模型要在插件模块里定义(导入期间),并在 Tenko 启动时随插件加载;已经在运行的 Tenko 里不能新增模型,需要重启。
119
+ - 模型要在插件模块里定义(导入期间),并在 Tenko 启动时随插件加载;已经在运行的 Tenko 里不能新增模型,
120
+ 所以用了模型的插件首次启用后需要重启,没有模型的插件启用即可加载。
122
121
  - 启动时自动建表,并自动执行新增表、新增可空列和新增索引。删除表、删除列、修改列类型会被拒绝
123
122
  (日志报错、数据保持原样);确需这类变更时用官方的 `register_custom_migration` 写显式迁移脚本。
124
123
  - 插件版本变化后的第一次启动,宿主先备份插件库(`backups/`,保留最近 3 份)再迁移。
@@ -132,7 +131,8 @@ async def latest() -> str | None:
132
131
 
133
132
  ## 版本承诺
134
133
 
135
- 版本号独立于 Tenko 本体,遵循语义化版本(1.0 起生效):
134
+ 版本号独立于 Tenko 本体,遵循语义化版本(1.0 起生效)。1.0 之前删除或改变语义时次版本号 +1,
135
+ 例如 0.3.0 移除了 `tenko_api.context` 和 `text_message`,权限函数改为接收 `Session`。
136
136
 
137
137
  | 变更 | 版本号 |
138
138
  |---|---|
@@ -4,13 +4,13 @@
4
4
  Tenko 宿主(``tenko.*``),所以 ``import tenko_api`` 本身不要求宿主已安装。
5
5
  插件只应从 ``tenko_api.*`` 导入宿主能力,不要导入 ``tenko.*`` 内部模块。
6
6
 
7
- 版本遵循语义化版本,且 1.0 之前(预览期)接口可能调整:
7
+ 版本遵循语义化版本。1.0 之前(预览期)删除或改变语义时次版本号 +1;1.0 起:
8
8
 
9
9
  - 新增能力:次版本号 +1;
10
10
  - 删除或改变语义:主版本号 +1,废弃的接口至少保留一个次版本并给出
11
11
  ``DeprecationWarning``。
12
12
  """
13
13
 
14
- __version__ = "0.2.0"
14
+ __version__ = "0.3.0"
15
15
 
16
16
  __all__ = ["__version__"]
@@ -25,7 +25,7 @@ kick_member = action_service.kick_member
25
25
  delete_message = action_service.delete_message
26
26
  get_group_member = action_service.get_group_member
27
27
  list_group_members = action_service.list_group_members
28
- list_groups = action_service.list_groups
28
+ list_groups = action_service.get_group_list
29
29
 
30
30
  __all__ = [
31
31
  "ActionAccountUnavailable",
@@ -0,0 +1,13 @@
1
+ """稳定插件 API:错误上报。
2
+
3
+ 命令处理函数直接返回 ``str`` 即可,Entari 会原样发送;混合内容(图片等)返回
4
+ ``MessageChain``。
5
+ """
6
+
7
+ from tenko.host.action_errors import action_error_message, report_action_error
8
+
9
+ # 把异常连同消息来源报告给 Master;投递失败只记日志,不会再抛出。
10
+ report_error = report_action_error
11
+
12
+
13
+ __all__ = ["action_error_message", "report_error"]
@@ -6,7 +6,9 @@
6
6
  (例如按参数区分的权限)时才在函数体里用 :func:`require_perm`。
7
7
  """
8
8
 
9
- from tenko.context import MessageContext
9
+ from arclet.entari import Session
10
+
11
+ from tenko.context import context_from_session
10
12
  from tenko.host import perm as _perm
11
13
  from tenko.host.guards import group_only, private_only, require_group
12
14
  from tenko.host.guards import require as _require
@@ -24,22 +26,22 @@ __all__ = [
24
26
  ]
25
27
 
26
28
 
27
- async def get_user_perm(ctx: MessageContext) -> int:
29
+ async def get_user_perm(session: Session) -> int:
28
30
  """返回消息发送者在当前群(私聊为全局)的权限数值。"""
29
31
 
30
- return await _perm.get_user_perm(ctx)
32
+ return await _perm.get_user_perm(context_from_session(session))
31
33
 
32
34
 
33
- async def get_group_perm(ctx: MessageContext) -> int:
35
+ async def get_group_perm(session: Session) -> int:
34
36
  """返回当前群的群等级数值。"""
35
37
 
36
- return await _perm.get_group_perm(ctx)
38
+ return await _perm.get_group_perm(context_from_session(session))
37
39
 
38
40
 
39
- async def require_perm(ctx: MessageContext, level: int) -> bool:
41
+ async def require_perm(session: Session, level: int) -> bool:
40
42
  """发送者权限不低于 ``level``(可用 :class:`Permission`)时返回 ``True``。"""
41
43
 
42
- return await _perm.require_perm(ctx, level)
44
+ return await _perm.require_perm(context_from_session(session), level)
43
45
 
44
46
 
45
47
  def require(level: Permission):
@@ -5,6 +5,6 @@
5
5
  ``None``,请回退到文本。:func:`render_or_none` 是按方法名分发的旧写法,保留兼容。
6
6
  """
7
7
 
8
- from tenko.render import RenderService, render_or_none, try_render
8
+ from tenko.host.render import RenderService, render_or_none, try_render
9
9
 
10
10
  __all__ = ["RenderService", "render_or_none", "try_render"]
@@ -14,7 +14,7 @@
14
14
 
15
15
  from typing import TYPE_CHECKING, Any
16
16
 
17
- from tenko.host.plugin_storage import (
17
+ from tenko.host.plugins.storage import (
18
18
  PluginStorageError,
19
19
  Store,
20
20
  StoreVersionError,
@@ -22,7 +22,7 @@ from tenko.host.plugin_storage import (
22
22
  )
23
23
 
24
24
  if TYPE_CHECKING:
25
- from tenko.db.plugin_models import Model, get_session
25
+ from tenko.host.plugins.database import Model, get_session
26
26
 
27
27
  __all__ = [
28
28
  "Model",
@@ -36,7 +36,7 @@ __all__ = [
36
36
 
37
37
  def __getattr__(name: str) -> Any:
38
38
  if name in ("Model", "get_session"):
39
- from tenko.db import plugin_models
39
+ from tenko.host.plugins import database as plugin_models
40
40
 
41
41
  return getattr(plugin_models, name)
42
42
  raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -1,6 +0,0 @@
1
- """稳定插件 API:消息上下文。"""
2
-
3
- from tenko.context import MessageContext
4
- from tenko.plugins._common import context_from_session
5
-
6
- __all__ = ["MessageContext", "context_from_session"]
@@ -1,34 +0,0 @@
1
- """稳定插件 API:错误上报。
2
-
3
- 命令处理函数直接返回 ``str`` 即可,Entari 会原样发送;混合内容(图片等)返回
4
- ``MessageChain``。``text_message`` 自 0.2.0 起弃用,将在 1.0 前移除。
5
- """
6
-
7
- import warnings
8
-
9
- from tenko.plugins._common import action_error_message, report_action_error
10
-
11
- # 把异常连同消息来源报告给 Master;投递失败只记日志,不会再抛出。
12
- report_error = report_action_error
13
-
14
-
15
- def text_message(content: str):
16
- """返回只含一段文本的 ``MessageChain``。
17
-
18
- .. deprecated:: 0.2.0
19
- 直接返回 ``str``;将在 1.0 前移除。
20
- """
21
-
22
- from arclet.entari import MessageChain
23
- from satori import Text
24
-
25
- warnings.warn(
26
- "tenko_api.messages.text_message 自 0.2.0 起弃用,将在 1.0 前移除;"
27
- "命令处理函数请直接返回 str",
28
- DeprecationWarning,
29
- stacklevel=2,
30
- )
31
- return MessageChain(Text(content))
32
-
33
-
34
- __all__ = ["action_error_message", "report_error", "text_message"]
File without changes
File without changes