@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
JavaScript
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=