openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
98 lines (97 loc) • 3.29 kB
JavaScript
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { t as normalizeDiscordToken } from "./token-ByxvVRHv.js";
import { s as resolveDiscordAccount } from "./accounts-BI_6uJlY.js";
import { t as rememberDiscordDirectoryUser } from "./directory-cache-DfoYG_5F.js";
import { n as fetchDiscord } from "./api-IrbNzRWx.js";
import { a as normalizeDiscordSlug } from "./allow-list-CBhA2l4a.js";
//#region extensions/discord/src/directory-live.ts
function normalizeQuery(value) {
return normalizeOptionalLowercaseString(value) ?? "";
}
function buildUserRank(user) {
return user.bot ? 0 : 1;
}
function resolveDiscordDirectoryAccess(params) {
const account = resolveDiscordAccount({
cfg: params.cfg,
accountId: params.accountId
});
const token = normalizeDiscordToken(account.token, "channels.discord.token");
if (!token) return null;
return {
token,
query: normalizeQuery(params.query),
accountId: account.accountId
};
}
async function listDiscordGuilds(token) {
return (await fetchDiscord("/users/@me/guilds", token)).filter((guild) => guild.id && guild.name);
}
async function listDiscordDirectoryGroupsLive(params) {
const access = resolveDiscordDirectoryAccess(params);
if (!access) return [];
const { token, query } = access;
const guilds = await listDiscordGuilds(token);
const rows = [];
for (const guild of guilds) {
const channels = await fetchDiscord(`/guilds/${guild.id}/channels`, token);
for (const channel of channels) {
const name = channel.name?.trim();
if (!name) continue;
if (query && !normalizeDiscordSlug(name).includes(normalizeDiscordSlug(query))) continue;
rows.push({
kind: "group",
id: `channel:${channel.id}`,
name,
handle: `#${name}`,
raw: channel
});
if (typeof params.limit === "number" && params.limit > 0 && rows.length >= params.limit) return rows;
}
}
return rows;
}
async function listDiscordDirectoryPeersLive(params) {
const access = resolveDiscordDirectoryAccess(params);
if (!access) return [];
const { token, query, accountId } = access;
if (!query) return [];
const guilds = await listDiscordGuilds(token);
const rows = [];
const limit = typeof params.limit === "number" && params.limit > 0 ? params.limit : 25;
for (const guild of guilds) {
const paramsObj = new URLSearchParams({
query,
limit: String(Math.min(limit, 100))
});
const members = await fetchDiscord(`/guilds/${guild.id}/members/search?${paramsObj.toString()}`, token);
for (const member of members) {
const user = member.user;
if (!user?.id) continue;
rememberDiscordDirectoryUser({
accountId,
userId: user.id,
handles: [
user.username,
user.global_name,
member.nick,
user.username ? `@${user.username}` : null
]
});
const name = member.nick?.trim() || user.global_name?.trim() || user.username?.trim();
rows.push({
kind: "user",
id: `user:${user.id}`,
name: name || void 0,
handle: user.username ? `@${user.username}` : void 0,
rank: buildUserRank(user),
raw: member
});
if (rows.length >= limit) return rows;
}
}
return rows;
}
//#endregion
export { listDiscordDirectoryPeersLive as n, listDiscordDirectoryGroupsLive as t };