feat: Add validation for DISCORD_CLIENT_ID in command registration and update deployment guide for dashboard publish directory
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@ Optional same-origin pattern:
|
|||||||
3. Add resource `omo-bot-dashboard` from this repository:
|
3. Add resource `omo-bot-dashboard` from this repository:
|
||||||
- Base directory: `admin-dashboard`
|
- Base directory: `admin-dashboard`
|
||||||
- Build command: `npm run build`
|
- Build command: `npm run build`
|
||||||
- Publish directory: `dist`
|
- Publish directory: `/`
|
||||||
- Internal port: `80` (typical static web port behind Coolify)
|
- Internal port: `80` (typical static web port behind Coolify)
|
||||||
4. Configure domains for each resource and enable TLS certificates.
|
4. Configure domains for each resource and enable TLS certificates.
|
||||||
|
|
||||||
|
|||||||
+14
-8
@@ -207,6 +207,7 @@ async function loadConfigOverridesFromDatabase(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function buildConfig(readConfig: ConfigReader): BotConfig {
|
function buildConfig(readConfig: ConfigReader): BotConfig {
|
||||||
|
const discordClientId = readConfig("DISCORD_CLIENT_ID")?.trim();
|
||||||
const discordGuildId = readConfig("DISCORD_GUILD_ID");
|
const discordGuildId = readConfig("DISCORD_GUILD_ID");
|
||||||
const callSheetMessageId = readConfig("CALL_SHEET_MESSAGE_ID");
|
const callSheetMessageId = readConfig("CALL_SHEET_MESSAGE_ID");
|
||||||
const callSheetOnboardedRoleId = readConfig("CALL_SHEET_ONBOARDED_ROLE_ID");
|
const callSheetOnboardedRoleId = readConfig("CALL_SHEET_ONBOARDED_ROLE_ID");
|
||||||
@@ -266,12 +267,19 @@ function buildConfig(readConfig: ConfigReader): BotConfig {
|
|||||||
const openmicSyncToken = readConfig("OPENMIC_SYNC_TOKEN")?.trim();
|
const openmicSyncToken = readConfig("OPENMIC_SYNC_TOKEN")?.trim();
|
||||||
const oauthBridgeEnabled =
|
const oauthBridgeEnabled =
|
||||||
Boolean(oauthBridgeClientSecret) && Boolean(oauthBridgeRedirectUri);
|
Boolean(oauthBridgeClientSecret) && Boolean(oauthBridgeRedirectUri);
|
||||||
|
|
||||||
|
if (oauthBridgeEnabled && !discordClientId) {
|
||||||
|
throw new Error(
|
||||||
|
"Missing required configuration value: DISCORD_CLIENT_ID (required when OAuth bridge is enabled)",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const configurationDatabaseEnabled =
|
const configurationDatabaseEnabled =
|
||||||
readConfig("CONFIG_DB_ENABLED") === "false" ? false : Boolean(databaseUrl);
|
readConfig("CONFIG_DB_ENABLED") === "false" ? false : Boolean(databaseUrl);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
discordToken: readRequiredValue(readConfig, "DISCORD_TOKEN"),
|
discordToken: readRequiredValue(readConfig, "DISCORD_TOKEN"),
|
||||||
discordClientId: readRequiredValue(readConfig, "DISCORD_CLIENT_ID"),
|
discordClientId: discordClientId ?? "",
|
||||||
...(discordGuildId ? { discordGuildId } : {}),
|
...(discordGuildId ? { discordGuildId } : {}),
|
||||||
callSheet: {
|
callSheet: {
|
||||||
...(callSheetMessageId ? { messageId: callSheetMessageId } : {}),
|
...(callSheetMessageId ? { messageId: callSheetMessageId } : {}),
|
||||||
@@ -475,17 +483,15 @@ export async function loadRuntimeConfig(): Promise<BotConfig> {
|
|||||||
return loadConfig();
|
return loadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let overrides: Map<string, string>;
|
||||||
try {
|
try {
|
||||||
const overrides = await loadConfigOverridesFromDatabase(
|
overrides = await loadConfigOverridesFromDatabase(databaseUrl, guildScope);
|
||||||
databaseUrl,
|
|
||||||
guildScope,
|
|
||||||
);
|
|
||||||
|
|
||||||
return buildConfig((name) => overrides.get(name) ?? process.env[name]);
|
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
console.warn(
|
console.warn(
|
||||||
`Falling back to environment config. Config DB overrides unavailable: ${String(error)}`,
|
`Config DB unavailable. Falling back to environment config: ${String(error)}`,
|
||||||
);
|
);
|
||||||
return loadConfig();
|
return loadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return buildConfig((name) => overrides.get(name) ?? process.env[name]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,12 @@ import { loadRuntimeConfig } from "./config";
|
|||||||
|
|
||||||
async function registerCommands(): Promise<void> {
|
async function registerCommands(): Promise<void> {
|
||||||
const config = await loadRuntimeConfig();
|
const config = await loadRuntimeConfig();
|
||||||
|
if (!config.discordClientId) {
|
||||||
|
throw new Error(
|
||||||
|
"DISCORD_CLIENT_ID required for command registration. Set it in bot_settings or environment.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const rest = new REST({ version: "10" }).setToken(config.discordToken);
|
const rest = new REST({ version: "10" }).setToken(config.discordToken);
|
||||||
const body = commands.map((command) => command.data.toJSON());
|
const body = commands.map((command) => command.data.toJSON());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user