discord-mcp
Version: 
Discord integration for Model Context Protocol
65 lines • 2.25 kB
JavaScript
import { DiscordService } from './discord/service.js';
import { UserError } from './utils/errors.js';
import { logger } from './utils/logger.js';
export const attachSession = async (req, ctx, next) => {
    try {
        // Get token from session or authorization header
        const token = ctx.session?.userToken || req.headers?.authorization || '';
        // Validate token format (simple check for Discord token structure)
        if (!token || !/^(Bot\s+)?[\w-]+\.[\w-]+\.[\w-]+$/.test(token)) {
            throw new UserError('Missing or malformed Discord token. Please provide a valid Discord user or bot token.');
        }
        // Create Discord service instance
        const discord = new DiscordService(token);
        // Verify token by fetching current user
        let user;
        try {
            user = await discord.getCurrentUser();
        }
        catch (error) {
            logger.error({
                msg: 'Failed to authenticate with Discord',
                error
            });
            throw new UserError('Invalid Discord token. Please check your token and try again.');
        }
        // Attach service and user info to context
        ctx.discord = discord;
        ctx.user = {
            id: user.id,
            username: user.username
        };
        logger.info({
            msg: 'Discord session attached',
            userId: user.id,
            username: user.username
        });
        // Continue to next middleware/handler
        return next(req);
    }
    catch (error) {
        // Re-throw UserError as is
        if (error instanceof UserError) {
            throw error;
        }
        // Log unexpected errors and throw generic message
        logger.error({
            msg: 'Session middleware error',
            error
        });
        throw new UserError('Failed to establish Discord session. Please try again.');
    }
};
export class SessionManager {
    sessions = new Map();
    getSession(sessionId) {
        return this.sessions.get(sessionId);
    }
    setSession(sessionId, context) {
        this.sessions.set(sessionId, context);
    }
    deleteSession(sessionId) {
        this.sessions.delete(sessionId);
    }
}
//# sourceMappingURL=session.js.map