




















@@ -41,6 +41,14 @@ type SlackListChannelsResponse = {
4141response_metadata?: { next_cursor?: string };
4242};
434344+type SlackAuthTestResponse = {
45+ok?: boolean;
46+user_id?: string;
47+user?: string;
48+team_id?: string;
49+team?: string;
50+};
51+4452function resolveReadToken(params: DirectoryConfigParams): string | undefined {
4553const account = resolveSlackAccount({ cfg: params.cfg, accountId: params.accountId });
4654return account.userToken ?? account.botToken?.trim();
@@ -65,6 +73,54 @@ function buildChannelRank(channel: SlackChannel): number {
6573return channel.is_archived ? 0 : 1;
6674}
677576+function slackUserToDirectoryEntry(
77+user: SlackUser,
78+fallback?: { id?: string; name?: string },
79+): ChannelDirectoryEntry | null {
80+const id = normalizeOptionalString(user.id) ?? normalizeOptionalString(fallback?.id);
81+if (!id) {
82+return null;
83+}
84+const handle = normalizeOptionalString(user.name) ?? normalizeOptionalString(fallback?.name);
85+const display =
86+normalizeOptionalString(user.profile?.display_name) ||
87+normalizeOptionalString(user.profile?.real_name) ||
88+normalizeOptionalString(user.real_name) ||
89+handle;
90+return {
91+kind: "user",
92+id: `user:${id}`,
93+name: display || undefined,
94+handle: handle ? `@${handle}` : undefined,
95+rank: buildUserRank(user),
96+raw: user,
97+};
98+}
99+100+export async function getSlackDirectorySelfLive(
101+params: DirectoryConfigParams,
102+): Promise<ChannelDirectoryEntry | null> {
103+const token = resolveReadToken(params);
104+if (!token) {
105+return null;
106+}
107+const client = createSlackWebClient(token);
108+const auth = (await client.auth.test()) as SlackAuthTestResponse;
109+const userId = normalizeOptionalString(auth.user_id);
110+if (!userId) {
111+return null;
112+}
113+try {
114+const info = (await client.users.info({ user: userId })) as { user?: SlackUser };
115+return slackUserToDirectoryEntry(info.user ?? {}, { id: userId, name: auth.user });
116+} catch {
117+return slackUserToDirectoryEntry(
118+{ id: userId, name: auth.user },
119+{ id: userId, name: auth.user },
120+);
121+}
122+}
123+68124export async function listSlackDirectoryPeersLive(
69125params: DirectoryConfigParams,
70126): Promise<ChannelDirectoryEntry[]> {
@@ -103,26 +159,7 @@ export async function listSlackDirectoryPeersLive(
103159});
104160105161const rows = filtered
106-.map((member) => {
107-const id = member.id?.trim();
108-if (!id) {
109-return null;
110-}
111-const handle = normalizeOptionalString(member.name);
112-const display =
113-normalizeOptionalString(member.profile?.display_name) ||
114-normalizeOptionalString(member.profile?.real_name) ||
115-normalizeOptionalString(member.real_name) ||
116-handle;
117-return {
118-kind: "user",
119-id: `user:${id}`,
120-name: display || undefined,
121-handle: handle ? `@${handle}` : undefined,
122-rank: buildUserRank(member),
123-raw: member,
124-} satisfies ChannelDirectoryEntry;
125-})
162+.map((member) => slackUserToDirectoryEntry(member))
126163.filter(Boolean) as ChannelDirectoryEntry[];
127164128165if (typeof params.limit === "number" && params.limit > 0) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。