Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: 为 User 权限添加便捷创建方法 #1825

Merged
merged 1 commit into from Mar 20, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 30 additions & 12 deletions nonebot/internal/permission.py
Expand Up @@ -58,7 +58,7 @@ async def __call__(
stack: Optional[AsyncExitStack] = None,
dependency_cache: Optional[T_DependencyCache] = None,
) -> bool:
"""检查是否满足某个权限
"""检查是否满足某个权限

参数:
bot: Bot 对象
Expand Down Expand Up @@ -110,7 +110,7 @@ def __ror__(


class User:
"""检查当前事件是否属于指定会话
"""检查当前事件是否属于指定会话

参数:
users: 会话 ID 元组
Expand Down Expand Up @@ -141,29 +141,47 @@ async def __call__(self, bot: Bot, event: Event) -> bool:
session in self.users and (self.perm is None or await self.perm(bot, event))
)

@classmethod
def _clean_permission(cls, perm: Permission) -> Optional[Permission]:
if len(perm.checkers) == 1 and isinstance(
user_perm := tuple(perm.checkers)[0].call, cls
):
return user_perm.perm
return perm

@classmethod
def from_event(cls, event: Event, perm: Optional[Permission] = None) -> Self:
"""从事件中获取会话 ID
"""从事件中获取会话 ID。

如果 `perm` 中仅有 `User` 类型的权限检查函数,则会去除原有的会话 ID 限制。

参数:
event: Event 对象
perm: 需同时满足的权限
"""
if (
perm
and len(perm.checkers) == 1
and isinstance(user_perm := tuple(perm.checkers)[0].call, cls)
):
perm = user_perm.perm
return cls((event.get_session_id(),), perm)
return cls((event.get_session_id(),), perm=perm and cls._clean_permission(perm))

@classmethod
def from_permission(cls, *users: str, perm: Optional[Permission] = None) -> Self:
"""指定会话与权限。

如果 `perm` 中仅有 `User` 类型的权限检查函数,则会去除原有的会话 ID 限制。

参数:
users: 会话白名单
perm: 需同时满足的权限
"""
return cls(users, perm=perm and cls._clean_permission(perm))


def USER(*users: str, perm: Optional[Permission] = None):
"""匹配当前事件属于指定会话
"""匹配当前事件属于指定会话。

如果 `perm` 中仅有 `User` 类型的权限检查函数,则会去除原有检查函数的会话 ID 限制。

参数:
user: 会话白名单
perm: 需要同时满足的权限
"""

return Permission(User(users, perm))
return Permission(User.from_permission(*users, perm=perm))