Refactor channel and role selection in various forms to use Discord components
- Replaced standard input fields with DiscordChannelSelect and DiscordRoleSelect components in the BirthdaysForm, FeedsManager, GiveawaysManager, LevelingForm, LoggingForm, SchedulerManager, SelfRolesManager, StatsForm, SuggestionsConfigForm, TagsManager, TempVoiceForm, TicketConfigForm, and StarboardForm for improved user experience and consistency. - Updated state management to accommodate new component structures, enhancing data handling for channel and role selections across the application.
This commit is contained in:
@@ -5,17 +5,24 @@ import { redis } from './redis';
|
||||
const DISCORD_API_BASE = 'https://discord.com/api/v10';
|
||||
const CACHE_TTL_SECONDS = 60;
|
||||
|
||||
/** Discord channel types usable for slash commands. */
|
||||
const COMMAND_CHANNEL_TYPES = new Set([
|
||||
/** Channel types useful in the dashboard (text, voice, category, forum, …). */
|
||||
const DASHBOARD_CHANNEL_TYPES = new Set([
|
||||
0, // GUILD_TEXT
|
||||
2, // GUILD_VOICE
|
||||
4, // GUILD_CATEGORY
|
||||
5, // GUILD_ANNOUNCEMENT
|
||||
10, // ANNOUNCEMENT_THREAD
|
||||
11, // PUBLIC_THREAD
|
||||
12, // PRIVATE_THREAD
|
||||
13, // GUILD_STAGE_VOICE
|
||||
15, // GUILD_FORUM
|
||||
16 // GUILD_MEDIA
|
||||
]);
|
||||
|
||||
export const CHANNEL_TYPES = {
|
||||
text: [0, 5, 15, 16],
|
||||
voice: [2, 13],
|
||||
category: [4],
|
||||
messageable: [0, 5, 15, 16]
|
||||
} as const;
|
||||
|
||||
async function discordBotFetch<T>(path: string): Promise<T> {
|
||||
const response = await fetch(`${DISCORD_API_BASE}${path}`, {
|
||||
headers: { Authorization: `Bot ${env.BOT_TOKEN}` },
|
||||
@@ -44,7 +51,7 @@ interface DiscordRoleRest {
|
||||
}
|
||||
|
||||
export async function listGuildChannelsForDashboard(guildId: string): Promise<DiscordChannelOption[]> {
|
||||
const cacheKey = `dashboard:guild:${guildId}:channels`;
|
||||
const cacheKey = `dashboard:guild:${guildId}:channels:v2`;
|
||||
const cached = await redis.get(cacheKey);
|
||||
if (cached) {
|
||||
return JSON.parse(cached) as DiscordChannelOption[];
|
||||
@@ -52,7 +59,7 @@ export async function listGuildChannelsForDashboard(guildId: string): Promise<Di
|
||||
|
||||
const channels = await discordBotFetch<DiscordChannelRest[]>(`/guilds/${guildId}/channels`);
|
||||
const options = channels
|
||||
.filter((channel) => COMMAND_CHANNEL_TYPES.has(channel.type))
|
||||
.filter((channel) => DASHBOARD_CHANNEL_TYPES.has(channel.type))
|
||||
.map((channel) => ({
|
||||
id: channel.id,
|
||||
name: channel.name,
|
||||
@@ -86,3 +93,13 @@ export async function listGuildRolesForDashboard(guildId: string): Promise<Disco
|
||||
await redis.set(cacheKey, JSON.stringify(options), 'EX', CACHE_TTL_SECONDS);
|
||||
return options;
|
||||
}
|
||||
|
||||
export function channelPrefix(type: number): string {
|
||||
if (type === 2 || type === 13) {
|
||||
return '🔊 ';
|
||||
}
|
||||
if (type === 4) {
|
||||
return '📁 ';
|
||||
}
|
||||
return '#';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user