import { Context, Session } from 'koishi'; import { DataManager } from '../data'; import { Role, PermissionNode, RegisteredCommand } from '../../types'; /** 内置角色 ID 列表 */ export declare const BUILTIN_ROLE_IDS: readonly ["authority1", "authority2", "authority3", "authority4+", "guild-admin"]; export type BuiltinRoleId = typeof BUILTIN_ROLE_IDS[number]; export declare class AuthService { private ctx; private data; /** 动态注册的权限节点 */ private _permissions; /** 已注册的模块通配符 */ private _moduleWildcards; /** 已注册的命令(用于动态生成帮助) */ private _commands; constructor(ctx: Context, data: DataManager); /** * 初始化内置角色(如果不存在则创建) */ private initBuiltinRoles; /** * 检查角色是否为内置角色 */ isBuiltinRole(roleId: string): boolean; /** * 注册权限节点 * @param id 权限节点ID(如 warn.add) * @param name 权限名称 * @param description 权限描述 * @param group 分组名称(用于前端显示) */ registerPermission(id: string, name: string, description: string, group?: string): void; /** * 获取所有已注册的权限节点 */ getPermissions(): PermissionNode[]; /** * 注册命令信息(用于动态生成帮助) */ registerCommand(cmd: RegisteredCommand): void; /** * 获取所有已注册的命令 */ getCommands(): RegisteredCommand[]; /** * 按模块分组获取命令 */ getCommandsByModule(): Map; /** * 创建或更新角色 */ saveRole(role: Role): Promise; /** * 删除角色(内置角色不可删除) */ deleteRole(roleId: string): Promise; /** * 获取所有角色 */ getRoles(): Role[]; /** * 获取用户的角色列表 * 支持两种用户 ID 格式匹配: * - 完整格式: "onebot:123456" * - 简短格式: "123456" (纯 QQ 号) */ getUserRoleIds(userId: string): string[]; /** * 获取拥有某角色的所有用户ID */ getRoleMembers(roleId: string): string[]; /** * 给用户分配角色(内置角色不可手动分配) */ assignRole(userId: string, roleId: string): Promise; /** * 移除用户的角色(内置角色不可手动移除) */ revokeRole(userId: string, roleId: string): Promise; /** * 获取用户的所有权限节点 * @param session 会话对象 * * 权限来源: * 1. 内置角色(authority1-4+)根据 Koishi 原生权限等级自动分配 * 2. 内置角色(guild-admin)根据群管理员身份自动分配(仅当前群生效) * 3. 用户被手动分配的自定义角色 */ getUserPermissions(session: Session): Set; /** * 检查用户是否为群管理员或群主 */ private checkGuildAdmin; /** * 检查用户是否有指定权限 * * 权限来源(按优先级): * 1. 用户被分配的角色权限 * 2. Koishi 原生 authority 等级对应的默认权限(需在 WebUI 中配置) * * 注意:不再对高 authority 用户自动放行,必须在 WebUI 配置相应权限 */ check(session: Session, node: string): boolean; }