
























@@ -1,70 +1,63 @@
1+import {
2+ACCESS_GROUP_ALLOW_FROM_PREFIX,
3+parseAccessGroupAllowFromEntry,
4+resolveAccessGroupAllowFromMatches,
5+type AccessGroupMembershipResolver,
6+} from "openclaw/plugin-sdk/command-auth";
17import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types";
28import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
39import type { RequestClient } from "../internal/discord.js";
410import { canViewDiscordGuildChannel } from "../send.permissions.js";
5116-export const DISCORD_ACCESS_GROUP_PREFIX = "accessGroup:";
12+export const DISCORD_ACCESS_GROUP_PREFIX = ACCESS_GROUP_ALLOW_FROM_PREFIX;
713814export function parseDiscordAccessGroupEntry(entry: string): string | null {
9-const trimmed = entry.trim();
10-if (!trimmed.startsWith(DISCORD_ACCESS_GROUP_PREFIX)) {
11-return null;
12-}
13-const name = trimmed.slice(DISCORD_ACCESS_GROUP_PREFIX.length).trim();
14-return name.length > 0 ? name : null;
15+return parseAccessGroupAllowFromEntry(entry);
1516}
161717-export async function resolveDiscordDmAccessGroupEntries(params: {
18-cfg?: OpenClawConfig;
19-allowFrom: string[];
20-sender: { id: string };
21-accountId: string;
18+export function createDiscordAccessGroupMembershipResolver(params: {
2219token?: string;
2320rest?: RequestClient;
24-}): Promise<string[]> {
25-const names = Array.from(
26-new Set(
27-params.allowFrom
28-.map((entry) => parseDiscordAccessGroupEntry(entry))
29-.filter((entry): entry is string => entry != null),
30-),
31-);
32-if (names.length === 0 || !params.cfg?.accessGroups) {
33-return [];
34-}
35-36-const matched: string[] = [];
37-for (const name of names) {
38-const group = params.cfg.accessGroups[name];
39-if (!group) {
40-continue;
41-}
21+}): AccessGroupMembershipResolver {
22+return async ({ cfg, name, group, accountId, senderId }) => {
4223if (group.type !== "discord.channelAudience") {
43-continue;
24+return false;
4425}
4526const membership = group.membership ?? "canViewChannel";
4627if (membership !== "canViewChannel") {
47-continue;
28+return false;
4829}
49-const allowed = await canViewDiscordGuildChannel(
50-group.guildId,
51-group.channelId,
52-params.sender.id,
53-{
54-cfg: params.cfg,
55-accountId: params.accountId,
56-token: params.token,
57-rest: params.rest,
58-},
59-).catch((err) => {
60-logVerbose(
61-`discord: accessGroup:${name} lookup failed for user ${params.sender.id}: ${String(err)}`,
62-);
30+return await canViewDiscordGuildChannel(group.guildId, group.channelId, senderId, {
31+ cfg,
32+ accountId,
33+token: params.token,
34+rest: params.rest,
35+}).catch((err) => {
36+logVerbose(`discord: accessGroup:${name} lookup failed for user ${senderId}: ${String(err)}`);
6337return false;
6438});
65-if (allowed) {
66-matched.push(`${DISCORD_ACCESS_GROUP_PREFIX}${name}`);
67-}
68-}
69-return matched;
39+};
40+}
41+42+export async function resolveDiscordDmAccessGroupEntries(params: {
43+cfg?: OpenClawConfig;
44+allowFrom: string[];
45+sender: { id: string };
46+accountId: string;
47+token?: string;
48+rest?: RequestClient;
49+isSenderAllowed?: (senderId: string, allowFrom: string[]) => boolean;
50+}): Promise<string[]> {
51+return await resolveAccessGroupAllowFromMatches({
52+cfg: params.cfg,
53+allowFrom: params.allowFrom,
54+channel: "discord",
55+accountId: params.accountId,
56+senderId: params.sender.id,
57+isSenderAllowed: params.isSenderAllowed,
58+resolveMembership: createDiscordAccessGroupMembershipResolver({
59+token: params.token,
60+rest: params.rest,
61+}),
62+});
7063}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。