UNPKG

@chinchillaenterprises/mcp-discord

Version:

Modular Discord MCP server with 45+ tools for comprehensive server management, featuring clean architecture and discord_ prefixed tools

77 lines 5.97 kB
import { DiscordClientService } from "../services/discord-client.js"; /** * Utility functions for Discord client management */ /** * Get an active Discord client, creating one if necessary */ export async function getActiveClient(accountState) { if (!accountState.getActiveAccount()) { throw new Error("No active Discord account. Use 'add_account' to add one or 'switch_account' to select an existing account."); } const activeAccount = accountState.getActiveAccount(); let client = accountState.getActiveClient(); if (!client) { console.error(`[ClientHelpers] Creating new client for account ${activeAccount.id}`); client = DiscordClientService.createClient(); accountState.setClient(activeAccount.id, client); await DiscordClientService.loginClient(client, activeAccount); await DiscordClientService.waitForReady(client); } else if (!DiscordClientService.isClientReady(client)) { console.error(`[ClientHelpers] Client for account ${activeAccount.id} not ready, attempting to reconnect`); try { await DiscordClientService.waitForReady(client, 5000); } catch (error) { console.error(`[ClientHelpers] Client reconnection failed, creating new client`); // Destroy old client and create new one await DiscordClientService.destroyClient(client); client = DiscordClientService.createClient(); accountState.setClient(activeAccount.id, client); await DiscordClientService.loginClient(client, activeAccount); await DiscordClientService.waitForReady(client); } } return client; } /** * Ensure a client is ready for use */ export async function ensureClientReady(client) { if (!DiscordClientService.isClientReady(client)) { await DiscordClientService.waitForReady(client); } } /** * Get client status information */ export function getClientStatusInfo(client) { return DiscordClientService.getClientStatus(client); } /** * Safely cleanup a client connection */ export async function cleanupClient(client) { await DiscordClientService.destroyClient(client); } /** * Get the active guild for the client */ export async function getGuild(client, accountState) { const activeAccount = accountState.getActiveAccount(); if (activeAccount?.guildId) { const guild = await client.guilds.fetch(activeAccount.guildId); if (!guild) { throw new Error(`Guild ${activeAccount.guildId} not found or bot not a member`); } return guild; } // If no specific guild, use the first available guild const guilds = client.guilds.cache; if (guilds.size === 0) { throw new Error("Bot is not a member of any guilds"); } return guilds.first(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvY2xpZW50LWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFckU7O0dBRUc7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFlBQWlDO0lBQ3JFLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEdBQTRHLENBQUMsQ0FBQztJQUNoSSxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFHLENBQUM7SUFDdkQsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRTVDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakQsTUFBTSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzlELE1BQU0sb0JBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7U0FBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsYUFBYSxDQUFDLEVBQUUscUNBQXFDLENBQUMsQ0FBQztRQUUzRyxJQUFJLENBQUM7WUFDSCxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7WUFDakYsd0NBQXdDO1lBQ3hDLE1BQU0sb0JBQW9CLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWpELE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFakQsTUFBTSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzlELE1BQU0sb0JBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxNQUFjO0lBQ3BELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQWM7SUFNaEQsT0FBTyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsTUFBYztJQUNoRCxNQUFNLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxNQUFjLEVBQUUsWUFBaUM7SUFDOUUsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFFdEQsSUFBSSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLGFBQWEsQ0FBQyxPQUFPLGdDQUFnQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUcsQ0FBQztBQUN6QixDQUFDIn0=