refactor(discord): dedupe guild listing
This commit is contained in:
29
src/discord/guilds.ts
Normal file
29
src/discord/guilds.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { fetchDiscord } from "./api.js";
|
||||
import { normalizeDiscordSlug } from "./monitor/allow-list.js";
|
||||
|
||||
export type DiscordGuildSummary = {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
};
|
||||
|
||||
export async function listGuilds(
|
||||
token: string,
|
||||
fetcher: typeof fetch,
|
||||
): Promise<DiscordGuildSummary[]> {
|
||||
const raw = await fetchDiscord<Array<{ id?: string; name?: string }>>(
|
||||
"/users/@me/guilds",
|
||||
token,
|
||||
fetcher,
|
||||
);
|
||||
return raw
|
||||
.filter(
|
||||
(guild): guild is { id: string; name: string } =>
|
||||
typeof guild.id === "string" && typeof guild.name === "string",
|
||||
)
|
||||
.map((guild) => ({
|
||||
id: guild.id,
|
||||
name: guild.name,
|
||||
slug: normalizeDiscordSlug(guild.name),
|
||||
}));
|
||||
}
|
||||
@@ -1,13 +1,8 @@
|
||||
import { fetchDiscord } from "./api.js";
|
||||
import { listGuilds, type DiscordGuildSummary } from "./guilds.js";
|
||||
import { normalizeDiscordSlug } from "./monitor/allow-list.js";
|
||||
import { normalizeDiscordToken } from "./token.js";
|
||||
|
||||
type DiscordGuildSummary = {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
};
|
||||
|
||||
type DiscordChannelSummary = {
|
||||
id: string;
|
||||
name: string;
|
||||
@@ -73,24 +68,6 @@ function parseDiscordChannelInput(raw: string): {
|
||||
return { guild: trimmed, guildOnly: true };
|
||||
}
|
||||
|
||||
async function listGuilds(token: string, fetcher: typeof fetch): Promise<DiscordGuildSummary[]> {
|
||||
const raw = await fetchDiscord<Array<{ id?: string; name?: string }>>(
|
||||
"/users/@me/guilds",
|
||||
token,
|
||||
fetcher,
|
||||
);
|
||||
return raw
|
||||
.filter(
|
||||
(guild): guild is { id: string; name: string } =>
|
||||
typeof guild.id === "string" && typeof guild.name === "string",
|
||||
)
|
||||
.map((guild) => ({
|
||||
id: guild.id,
|
||||
name: guild.name,
|
||||
slug: normalizeDiscordSlug(guild.name),
|
||||
}));
|
||||
}
|
||||
|
||||
async function listGuildChannels(
|
||||
token: string,
|
||||
fetcher: typeof fetch,
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
import { fetchDiscord } from "./api.js";
|
||||
import { listGuilds, type DiscordGuildSummary } from "./guilds.js";
|
||||
import { normalizeDiscordSlug } from "./monitor/allow-list.js";
|
||||
import { normalizeDiscordToken } from "./token.js";
|
||||
|
||||
type DiscordGuildSummary = {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
};
|
||||
|
||||
type DiscordUser = {
|
||||
id: string;
|
||||
username: string;
|
||||
@@ -61,24 +56,6 @@ function parseDiscordUserInput(raw: string): {
|
||||
return { userName: trimmed.replace(/^@/, "") };
|
||||
}
|
||||
|
||||
async function listGuilds(token: string, fetcher: typeof fetch): Promise<DiscordGuildSummary[]> {
|
||||
const raw = await fetchDiscord<Array<{ id?: string; name?: string }>>(
|
||||
"/users/@me/guilds",
|
||||
token,
|
||||
fetcher,
|
||||
);
|
||||
return raw
|
||||
.filter(
|
||||
(guild): guild is { id: string; name: string } =>
|
||||
typeof guild.id === "string" && typeof guild.name === "string",
|
||||
)
|
||||
.map((guild) => ({
|
||||
id: guild.id,
|
||||
name: guild.name,
|
||||
slug: normalizeDiscordSlug(guild.name),
|
||||
}));
|
||||
}
|
||||
|
||||
function scoreDiscordMember(member: DiscordMember, query: string): number {
|
||||
const q = query.toLowerCase();
|
||||
const user = member.user;
|
||||
|
||||
Reference in New Issue
Block a user