Skip to content

Commit

Permalink
支持提取出的Subject带上offer_by与tag信息 (#11)
Browse files Browse the repository at this point in the history
* feat: 支持提取出的Subject带上offer_by与tag信息

* feat: 去除无用依赖

* feat: 更新文档
  • Loading branch information
ssttkkl authored Sep 25, 2023
1 parent f80b448 commit 8e962c7
Show file tree
Hide file tree
Showing 14 changed files with 312 additions and 183 deletions.
46 changes: 35 additions & 11 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -371,41 +371,65 @@ async def _(bot: Bot, event: Event, matcher: Matcher):

```python
@add_subject_extractor
def your_custom_subject_extractor(bot: Bot, event: Event, current: Sequence[str]) -> Sequence[str]:
def your_custom_subject_extractor(bot: Bot, event: Event, current: Sequence[SubjectModel]) -> Sequence[SubjectModel]:
...
```

传入参数`bot``event`其义自明,而`current`参数表明当前阶段已经被提取出的主体,返回值表示经过该轮处理后提取出的主体。

主体的模型定义如下:

```python
class SubjectModel(NamedTuple):
content: str
offer_by: str
tag: Optional[str]
```

其中content为主体字符串,offer_by用于标识提取出该主体的主体提取器(通常为插件名),tag用于标识主体的种类。通常我们约定,拥有同一个tag的主体包含的信息量完全一致。

在主体提取流程,插件会**按顺序依次**调用已注册的主体提取器,每一轮调用时,将上一轮的返回值作为这一轮传入的`current`
参数,并取最后一轮的返回值作为事件的主体。请注意维护主体提取器注册的顺序。(tips:如果你的主体提取器依赖其他插件中实现的主体提取器,可以依赖`nonebot`
提供的`require`机制控制主体提取器注册的顺序)

例如,下面这个主体提取器用于为OneBot V11协议中群管理/群主提取相应的主体:

```python
def extract_onebot_v11_group_role(bot: Bot, event: Event, current: Sequence[str]) -> Sequence[str]:
OFFER_BY = "nonebot_plugin_access_control"


def extract_onebot_v11_group_role(bot: Bot, event: Event, current: Sequence[SubjectModel]) -> Sequence[SubjectModel]:
if bot.type != "OneBot V11":
return current

li = [*current]

group_id = getattr(event, "group_id", None)
sender: Optional['Sender'] = getattr(event, "sender", None)

if group_id is not None and sender is not None:
# 添加群管理/群主的subject(在"qq:g{group_id}"之前)
idx = li.index(f"qq:g{group_id}")
li = []

if sender.role == 'owner':
li.insert(idx, f"qq:group_owner")
li.insert(idx, f"qq:g{group_id}.group_owner")
li.append(SubjectModel(f"qq:g{group_id}.group_owner", OFFER_BY,
f"qq:group.group_owner"))
li.append(SubjectModel(f"qq:group_owner", OFFER_BY,
f"qq:group_owner"))

if sender.role == 'owner' or sender.role == 'admin':
li.insert(idx, f"qq:group_admin")
li.insert(idx, f"qq:g{group_id}.group_admin")
li.append(SubjectModel(f"qq:g{group_id}.group_admin", OFFER_BY,
f"qq:group.group_admin"))
li.append(SubjectModel(f"qq:group_admin", OFFER_BY,
f"qq:group_admin"))

# 添加在platform:group之前
idx = 0
for i in range(len(current)):
if current[i].tag == "platform:group":
idx = i
break

return li
current = [*current[:idx], *li, *current[idx:]]

return current
```

## CLI支持
Expand Down
32 changes: 17 additions & 15 deletions docs/kaiheila.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ nonebot-plugin-access-control for Kaiheila

从上往下优先级从高到低

| 主体 | 含义 | 示例 | 存在条件 |
|----------------------------------------------|---------|----------------------------------------|----------------------|
| kaiheila:g<guild_id>:c<channel_id>:<user_id> | 服务器频道用户 | kaiheila:g87654321:c123454321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:c<channel_id>:<user_id> | 频道用户 | kaiheila:c123454321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:g<guild_id>:<user_id> | 服务器用户 | kaiheila:g87654321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:<user_id> | 用户 | kaiheila:12345678 | |
| superuser | 超级用户 | | 仅当该用户为超级用户时存在 |
| kaiheila:g<guild_id>.role_\<role_id\> | 服务器角色 | kaiheila:g87654321.role_233 | 仅当消息来自频道、该用户拥有该身份时存在 |
| kaiheila:g<guild_id>:c<channel_id> | 服务器频道 | kaiheila:g87654321:c123454321 | 仅当消息来自频道时存在 |
| kaiheila:c<channel_id> | 频道 | kaiheila:c123454321 | 仅当消息来自频道时存在 |
| kaiheila:g<guild_id> | 服务器 | kaiheila:g87654321 | 仅当消息来自频道时存在 |
| kaiheila:private | 私聊消息 | | 仅当消息来自私聊时存在 |
| kaiheila:channel | 频道消息 | | 仅当消息来自频道时存在 |
| kaiheila | 某个平台用户 | | |
| all | 所有用户 | | |
| 主体 | TAG | 含义 | 示例 | 存在条件 |
|----------------------------------------------|-----------------------------|-----------------|----------------------------------------|----------------------|
| kaiheila:g<guild_id>:c<channel_id>:<user_id> | platform:guild:channel:user | 服务器频道用户 | kaiheila:g87654321:c123454321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:c<channel_id>:<user_id> | platform:channel:user | 频道用户 | kaiheila:c123454321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:g<guild_id>:<user_id> | platform:guild:user | 服务器用户 | kaiheila:g87654321:12345678 | 仅当消息来自频道时存在 |
| kaiheila:<user_id> | platform:user | 用户 | kaiheila:12345678 | |
| superuser | superuser | 超级用户 | | 仅当该用户为超级用户时存在 |
| kaiheila:g<guild_id>.role_\<role_id\> | kaiheila:guild.role | 服务器角色 | kaiheila:g87654321.role_233 | 仅当消息来自频道、该用户拥有该身份时存在 |
| kaiheila:g<guild_id>:c<channel_id> | platform:guild:channel | 服务器频道 | kaiheila:g87654321:c123454321 | 仅当消息来自频道时存在 |
| kaiheila:c<channel_id> | platform:channel | 频道 | kaiheila:c123454321 | 仅当消息来自频道时存在 |
| kaiheila:g<guild_id> | platform:guild | 服务器 | kaiheila:g87654321 | 仅当消息来自频道时存在 |
| kaiheila:private | platform:private | 来自Kaiheila的私聊消息 | | 仅当消息来自私聊时存在 |
| private | private | 私聊消息 | | 仅当消息来自私聊时存在 | | |
| kaiheila:channel | platform:channel | 来自Kaiheila的频道消息 | | 仅当消息来自频道时存在 |
| channel | channel | 频道消息 | | 仅当消息来自频道是存在 |
| kaiheila | platform | 来自Kaiheila的用户 | | |
| all | all | 所有用户 | | |
42 changes: 22 additions & 20 deletions docs/onebot_v11.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,25 @@ nonebot-plugin-access-control for OneBot V11

从上往下优先级从高到低

| 主体 | 含义 | 示例 | 存在条件 |
|------------------------------|----------------|---------------------------|---------------|
| qq:g<group_id>:<user_id> | 群用户 | qq:g87654321:12345678 | 仅当消息来自群组时存在 |
| onebot:g<group_id>:<user_id> | 群用户(与上一条含义相同) | onebot:g87654321:12345678 | 仅当消息来自群组时存在 |
| qq:<user_id> | 用户 | qq:12345678 | |
| onebot:<user_id> | 用户(与上一条含义相同) | onebot:12345678 | |
| superuser | 超级用户 | | 仅当该用户为超级用户时存在 |
| qq:g<group_id> | 群组 | qq:g87654321 | 仅当消息来自群组时存在 |
| onebot:g<group_id> | 群组(与上一条含义相同) | onebot:g87654321 | 仅当消息来自群组时存在 |
| qq:g<group_id>.group_owner | 群主 | qq.g87654321.group_owner | 仅当消息来自群组时存在 |
| qq:group_owner | 群主 | | 仅当消息来自群组时存在 |
| qq:g<group_id>.group_admin | 群管理 | qq.g87654321.group_admin | 仅当消息来自群组时存在 |
| qq:group_admin | 群管理 | | 仅当消息来自群组时存在 |
| qq:private | 私聊消息 | | 仅当消息来自私聊时存在 |
| onebot:private | 私聊消息(与上一条含义相同) | | 仅当消息来自私聊时存在 |
| qq:group | 群聊消息 | | 仅当消息来自群聊时存在 |
| onebot:group | 群聊消息(与上一条含义相同) | | 仅当消息来自群聊时存在 |
| qq | QQ用户 | | |
| onebot | OneBot用户 | | |
| all | 所有用户 | | |
| 主体 | TAG | 含义 | 示例 | 存在条件 |
|------------------------------|----------------------|---------------|---------------------------|---------------|
| qq:g<group_id>:<user_id> | platform:group:user | 来自QQ的群用户 | qq:g87654321:12345678 | 仅当消息来自群组时存在 |
| onebot:g<group_id>:<user_id> | onebot:group:user | 来自OneBot的群用户 | onebot:g87654321:12345678 | 仅当消息来自群组时存在 |
| qq:<user_id> | platform:user | 来自QQ的用户 | qq:12345678 | |
| onebot:<user_id> | onebot:user | 来自OneBot的用户 | onebot:12345678 | |
| superuser | superuser | 超级用户 | | 仅当该用户为超级用户时存在 |
| qq:g<group_id>.group_owner | qq:group.group_owner | 群主 | qq.g87654321.group_owner | 仅当消息来自群组时存在 |
| qq:group_owner | qq:group_owner | 群主 | | 仅当消息来自群组时存在 |
| qq:g<group_id>.group_admin | qq:group.group_admin | 群管理 | qq.g87654321.group_admin | 仅当消息来自群组时存在 |
| qq:group_admin | qq:group_admin | 群管理 | | 仅当消息来自群组时存在 |
| qq:g<group_id> | platform:group | 来自QQ的群组 | qq:g87654321 | 仅当消息来自群组时存在 |
| onebot:g<group_id> | onebot:group | 来自OneBot的群组 | onebot:g87654321 | 仅当消息来自群组时存在 |
| qq:private | platform:chat_type | 来自QQ的私聊消息 | | 仅当消息来自私聊时存在 |
| onebot:private | onebot:chat_type | 来自OneBot的私聊消息 | | 仅当消息来自私聊时存在 |
| private | chat_type | 私聊消息 | | 仅当消息来自私聊时存在 |
| qq:group | platform:chat_type | 来自QQ的群聊消息 | | 仅当消息来自群聊时存在 |
| onebot:group | onebot:chat_type | 来自OneBot的群聊消息 | | 仅当消息来自群聊时存在 |
| group | group | 群聊消息 | | 仅当消息来自群聊时存在 |
| qq | platform | 来自QQ的用户 | | |
| onebot | onebot | 来自OneBot的用户 | | |
| all | all | 所有用户 | | |
Loading

0 comments on commit 8e962c7

Please sign in to comment.