import { isPrivateNetworkOptInEnabled } from "openclaw/plugin-sdk/ssrf-runtime"; import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; import { listMattermostAccountIds, resolveMattermostAccount } from "./accounts.js"; import {
createMattermostClient,
fetchMattermostMe,
type MattermostChannel,
type MattermostClient,
type MattermostUser,
} from "./client.js"; import type { ChannelDirectoryEntry, OpenClawConfig, RuntimeEnv } from "./runtime-api.js";
for (const client of clients) { try { const me = await fetchMattermostMe(client); const channels = await client.request<MattermostChannel[]>(
`/users/${me.id}/channels?per_page=200`,
); for (const ch of channels) { if (ch.type !== "O" && ch.type !== "P") { continue;
} if (seenIds.has(ch.id)) { continue;
} if (q) { const name = normalizeLowercaseStringOrEmpty(ch.name); const display = normalizeLowercaseStringOrEmpty(ch.display_name); if (!name.includes(q) && !display.includes(q)) { continue;
}
}
seenIds.add(ch.id);
entries.push({
kind: "group" as const,
id: `channel:${ch.id}`,
name: ch.name ?? undefined,
handle: ch.display_name ?? undefined,
});
}
} catch (err) { // Token may be expired/revoked — skip this account and try others
console.debug?.( "[mattermost-directory] listGroups: skipping account:",
(err as Error)?.message,
); continue;
}
} return params.limit && params.limit > 0 ? entries.slice(0, params.limit) : entries;
}
/** *Listteammembersaspeerdirectoryentries. * *Usesonlythefirstavailableclientsinceallbotsinateamseethesame *userlist(unlikechannelswheremembershipvaries).Usesthefirstteam *returned—multi-teamsetupswillonlyseemembersfromthatteam. * *NOTE:per_page=200formemberlisting;samepaginationcaveatasgroups.
*/
export async function listMattermostDirectoryPeers(
params: MattermostDirectoryParams,
): Promise<ChannelDirectoryEntry[]> { const clients = buildClients(params); if (!clients.length) { return [];
} // All bots see the same user list, so one client suffices (unlike channels // where private channel membership varies per bot). const client = clients[0]; try { const me = await fetchMattermostMe(client); const teams = await client.request<{ id: string }[]>("/users/me/teams"); if (!teams.length) { return [];
} // Uses first team — multi-team setups may need iteration in the future const teamId = teams[0].id; const q = normalizeLowercaseStringOrEmpty(params.query);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.