@aarekaz/switchboard-discord 0.3.1 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -93,7 +93,7 @@ declare class DiscordAdapter implements PlatformAdapter {
|
|
|
93
93
|
/**
|
|
94
94
|
* Upload a file to a channel
|
|
95
95
|
*/
|
|
96
|
-
uploadFile(channelId: string,
|
|
96
|
+
uploadFile(channelId: string, _file: unknown, _options?: unknown): Promise<Result<UnifiedMessage>>;
|
|
97
97
|
/**
|
|
98
98
|
* Register an event handler
|
|
99
99
|
*/
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Client, Partials, GatewayIntentBits } from 'discord.js';
|
|
|
5
5
|
|
|
6
6
|
// src/normalizers.ts
|
|
7
7
|
function normalizeMessage(message) {
|
|
8
|
-
|
|
8
|
+
const text = message.content;
|
|
9
9
|
const attachments = Array.from(message.attachments.values()).map(
|
|
10
10
|
(attachment) => ({
|
|
11
11
|
id: attachment.id,
|
|
@@ -400,7 +400,7 @@ var DiscordAdapter = class {
|
|
|
400
400
|
/**
|
|
401
401
|
* Upload a file to a channel
|
|
402
402
|
*/
|
|
403
|
-
async uploadFile(channelId,
|
|
403
|
+
async uploadFile(channelId, _file, _options) {
|
|
404
404
|
if (!this.client) {
|
|
405
405
|
return err(new ConnectionError("discord", new Error("Not connected")));
|
|
406
406
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/normalizers.ts","../src/adapter.ts","../src/register.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Normalizers for converting Discord types to Switchboard unified types\n */\n\nimport type {\n UnifiedMessage,\n Attachment,\n Channel,\n User,\n UnifiedEvent,\n MessageEvent,\n ReactionEvent,\n} from '@aarekaz/switchboard-core';\nimport type {\n Message,\n TextChannel,\n DMChannel,\n User as DiscordUser,\n MessageReaction,\n PartialMessageReaction,\n PartialUser,\n} from 'discord.js';\n\n/**\n * Normalizes a Discord message to UnifiedMessage\n */\nexport function normalizeMessage(message: Message): UnifiedMessage {\n // Get plain text content\n let text = message.content;\n\n // Extract attachments\n const attachments: Attachment[] = Array.from(message.attachments.values()).map(\n (attachment) => ({\n id: attachment.id,\n filename: attachment.name || 'unknown',\n url: attachment.url,\n mimeType: attachment.contentType || 'application/octet-stream',\n size: attachment.size,\n })\n );\n\n // Determine thread ID (Discord uses channel ID for threads)\n const threadId = message.thread?.id || (message.channel.isThread() ? message.channelId : undefined);\n\n return {\n id: message.id,\n channelId: message.channelId,\n userId: message.author.id,\n text,\n timestamp: message.createdAt,\n threadId,\n attachments: attachments.length > 0 ? attachments : undefined,\n platform: 'discord',\n _raw: message,\n };\n}\n\n/**\n * Normalizes a Discord channel to Switchboard Channel\n */\nexport function normalizeChannel(\n channel: TextChannel | DMChannel\n): Channel {\n return {\n id: channel.id,\n name: channel.isDMBased() ? 'DM' : (channel as TextChannel).name,\n type: channel.isDMBased() ? 'dm' : 'public',\n platform: 'discord',\n };\n}\n\n/**\n * Normalizes a Discord user to Switchboard User\n */\nexport function normalizeUser(user: DiscordUser): User {\n return {\n id: user.id,\n username: user.username,\n displayName: user.displayName || user.username,\n isBot: user.bot || false,\n platform: 'discord',\n };\n}\n\n/**\n * Normalizes a Discord message event to UnifiedEvent\n */\nexport function normalizeMessageEvent(message: Message): MessageEvent {\n return {\n type: 'message',\n message: normalizeMessage(message),\n };\n}\n\n/**\n * Normalizes a Discord reaction event to UnifiedEvent\n */\nexport function normalizeReactionEvent(\n reaction: MessageReaction | PartialMessageReaction,\n user: DiscordUser | PartialUser,\n action: 'added' | 'removed'\n): ReactionEvent {\n // Handle partial reactions by using the emoji identifier\n const emoji = reaction.emoji.name || '❓';\n\n return {\n type: 'reaction',\n messageId: reaction.message.id,\n userId: user.id,\n emoji,\n action,\n };\n}\n\n/**\n * Extracts emoji string from Discord reaction\n * Handles both standard emoji and custom Discord emoji\n */\nexport function getEmojiString(emoji: string): string {\n // Discord custom emoji format: <:name:id> or <a:name:id> for animated\n // We'll just use the emoji string as-is for standard emoji\n // For custom emoji, Discord.js handles the formatting\n return emoji;\n}\n\n/**\n * Converts a Switchboard emoji to Discord format\n * Standard emoji pass through, custom emoji need special handling\n */\nexport function toDiscordEmoji(emoji: string): string {\n // If it's already in Discord custom emoji format, return as-is\n if (emoji.startsWith('<') && emoji.endsWith('>')) {\n return emoji;\n }\n\n // Otherwise, assume it's a standard emoji\n return emoji;\n}\n","/**\n * Discord Platform Adapter\n * Implements the Switchboard PlatformAdapter interface for Discord\n */\n\nimport {\n Client,\n GatewayIntentBits,\n Message,\n TextChannel,\n ThreadChannel,\n Partials,\n} from 'discord.js';\nimport type {\n PlatformAdapter,\n Result,\n UnifiedMessage,\n MessageRef,\n UnifiedEvent,\n Channel,\n User,\n} from '@aarekaz/switchboard-core';\nimport {\n ok,\n err,\n ConnectionError,\n MessageSendError,\n MessageEditError,\n MessageDeleteError,\n ReactionError,\n} from '@aarekaz/switchboard-core';\nimport {\n normalizeMessage,\n normalizeChannel,\n normalizeUser,\n normalizeMessageEvent,\n normalizeReactionEvent,\n toDiscordEmoji,\n} from './normalizers.js';\nimport type { DiscordCredentials, DiscordConfig, DiscordMessageOptions } from './types.js';\n\n/**\n * Discord adapter implementation\n */\nexport class DiscordAdapter implements PlatformAdapter {\n readonly name = 'discord-adapter';\n readonly platform = 'discord' as const;\n\n private client: Client | null = null;\n private eventHandlers: Set<(event: UnifiedEvent) => void> = new Set();\n private config: DiscordConfig;\n\n constructor(config: DiscordConfig = {}) {\n this.config = config;\n }\n\n /**\n * Connect to Discord\n */\n async connect(credentials: unknown): Promise<void> {\n const discordCreds = credentials as DiscordCredentials;\n\n if (!discordCreds.token) {\n throw new ConnectionError(\n 'discord',\n new Error('Discord token is required')\n );\n }\n\n try {\n // Create Discord client with necessary intents\n this.client = new Client({\n intents: this.config.intents || [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n GatewayIntentBits.DirectMessages,\n GatewayIntentBits.GuildMessageReactions,\n ],\n partials: [Partials.Message, Partials.Channel, Partials.Reaction],\n });\n\n // Set up event listeners\n this.setupEventListeners();\n\n // Login to Discord\n await this.client.login(discordCreds.token);\n\n // Wait for the client to be ready\n await new Promise<void>((resolve) => {\n this.client!.once('ready', () => resolve());\n });\n } catch (error) {\n throw new ConnectionError('discord', error);\n }\n }\n\n /**\n * Disconnect from Discord\n */\n async disconnect(): Promise<void> {\n if (this.client) {\n this.client.destroy();\n this.client = null;\n }\n }\n\n /**\n * Check if connected to Discord\n */\n isConnected(): boolean {\n return this.client !== null && this.client.isReady();\n }\n\n /**\n * Send a message to a Discord channel\n */\n async sendMessage(\n channelId: string,\n text: string,\n options?: unknown\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channel = await this.client.channels.fetch(channelId);\n\n if (!channel || !channel.isTextBased()) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('Channel not found or not text-based')\n )\n );\n }\n\n // Handle Discord-specific options\n const discordOptions = (options as { discord?: DiscordMessageOptions })\n ?.discord;\n\n const message = await (channel as TextChannel).send({\n content: text,\n embeds: discordOptions?.embeds,\n components: discordOptions?.components,\n allowedMentions: discordOptions?.allowedMentions,\n });\n\n return ok(normalizeMessage(message));\n } catch (error) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Edit a message\n */\n async editMessage(\n messageRef: MessageRef,\n newText: string\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n new Error(\n 'Cannot edit message: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.editMessage(message, \"text\") // ✅ Works\\n' +\n ' bot.editMessage(message.id, \"text\") // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch and edit the message\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const editedMessage = await message.edit(newText);\n\n return ok(normalizeMessage(editedMessage));\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Delete a message\n */\n async deleteMessage(messageRef: MessageRef): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n new Error(\n 'Cannot delete message: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.deleteMessage(message) // ✅ Works\\n' +\n ' bot.deleteMessage(message.id) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch and delete the message\n const message = await (channel as TextChannel).messages.fetch(messageId);\n await message.delete();\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Add a reaction to a message\n */\n async addReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(\n 'Cannot add reaction: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.addReaction(message, emoji) // ✅ Works\\n' +\n ' bot.addReaction(message.id, emoji) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and add reaction\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const discordEmoji = toDiscordEmoji(emoji);\n await message.react(discordEmoji);\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Remove a reaction from a message\n */\n async removeReaction(\n messageRef: MessageRef,\n emoji: string\n ): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(\n 'Cannot remove reaction: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.removeReaction(message, emoji) // ✅ Works\\n' +\n ' bot.removeReaction(message.id, emoji) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and remove reaction\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const discordEmoji = toDiscordEmoji(emoji);\n\n // Remove the bot's own reaction\n await message.reactions.cache.get(discordEmoji)?.users.remove(this.client.user!.id);\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Create a thread from a message\n */\n async createThread(\n messageRef: MessageRef,\n text: string\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageSendError(\n 'discord',\n 'unknown',\n new Error(\n 'Cannot create thread: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.createThread(message, text) // ✅ Works\\n' +\n ' bot.createThread(message.id, text) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and create thread\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const thread = await message.startThread({\n name: text.substring(0, 100), // Discord thread names max 100 chars\n });\n\n // Send the first message in the thread\n const threadMessage = await thread.send(text);\n\n return ok(normalizeMessage(threadMessage));\n } catch (error) {\n const channelId = typeof messageRef === 'string' ? 'unknown' : messageRef.channelId;\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Upload a file to a channel\n */\n async uploadFile(\n channelId: string,\n file: unknown,\n options?: unknown\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channel = await this.client.channels.fetch(channelId);\n\n if (!channel || !channel.isTextBased()) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('Channel not found or not text-based')\n )\n );\n }\n\n // Handle file upload\n // This is a simplified implementation - production would handle Buffer, Stream, File, etc.\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('File upload not yet implemented')\n )\n );\n } catch (error) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Register an event handler\n */\n onEvent(handler: (event: UnifiedEvent) => void): void {\n this.eventHandlers.add(handler);\n }\n\n /**\n * Get list of channels\n */\n async getChannels(): Promise<Result<Channel[]>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channels: Channel[] = [];\n\n for (const [, channel] of this.client.channels.cache) {\n if (channel.isTextBased() && !channel.isThread()) {\n channels.push(normalizeChannel(channel as TextChannel));\n }\n }\n\n return ok(channels);\n } catch (error) {\n return err(\n new ConnectionError(\n 'discord',\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Get list of users (in a specific channel or guild)\n */\n async getUsers(channelId?: string): Promise<Result<User[]>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const users: User[] = [];\n\n if (channelId) {\n const channel = await this.client.channels.fetch(channelId);\n if (channel && 'members' in channel) {\n for (const [, member] of (channel as any).members) {\n users.push(normalizeUser(member.user));\n }\n }\n } else {\n // Get all cached users\n for (const [, user] of this.client.users.cache) {\n users.push(normalizeUser(user));\n }\n }\n\n return ok(users);\n } catch (error) {\n return err(\n new ConnectionError(\n 'discord',\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Normalize a Discord message to UnifiedMessage\n */\n normalizeMessage(platformMessage: unknown): UnifiedMessage {\n return normalizeMessage(platformMessage as Message);\n }\n\n /**\n * Normalize a Discord event to UnifiedEvent\n */\n normalizeEvent(platformEvent: unknown): UnifiedEvent {\n // This would handle different Discord event types\n // For now, we assume it's a message event\n return normalizeMessageEvent(platformEvent as Message);\n }\n\n /**\n * Set up Discord event listeners\n */\n private setupEventListeners(): void {\n if (!this.client) return;\n\n // Message events\n this.client.on('messageCreate', (message: Message) => {\n // Ignore bot messages\n if (message.author.bot) return;\n\n const event = normalizeMessageEvent(message);\n this.emitEvent(event);\n });\n\n // Reaction events\n this.client.on('messageReactionAdd', async (reaction, user) => {\n // Handle partial reactions\n if (reaction.partial) {\n try {\n await reaction.fetch();\n } catch (error) {\n console.error('Failed to fetch reaction:', error);\n return;\n }\n }\n\n if (user.partial) {\n try {\n await user.fetch();\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return;\n }\n }\n\n if (user.bot) return;\n\n const event = normalizeReactionEvent(reaction, user, 'added');\n this.emitEvent(event);\n });\n\n this.client.on('messageReactionRemove', async (reaction, user) => {\n // Handle partial reactions\n if (reaction.partial) {\n try {\n await reaction.fetch();\n } catch (error) {\n console.error('Failed to fetch reaction:', error);\n return;\n }\n }\n\n if (user.partial) {\n try {\n await user.fetch();\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return;\n }\n }\n\n if (user.bot) return;\n\n const event = normalizeReactionEvent(reaction, user, 'removed');\n this.emitEvent(event);\n });\n\n // Ready event\n this.client.on('ready', () => {\n console.log(`[Switchboard] Discord bot connected as ${this.client!.user!.tag}`);\n });\n\n // Error handling\n this.client.on('error', (error) => {\n console.error('Discord client error:', error);\n });\n }\n\n /**\n * Emit an event to all registered handlers\n */\n private emitEvent(event: UnifiedEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('Error in event handler:', error);\n }\n }\n }\n}\n","/**\n * Auto-registration for Discord adapter\n * This file is imported as a side effect to register the Discord adapter\n */\n\nimport { registry } from '@aarekaz/switchboard-core';\nimport { DiscordAdapter } from './adapter.js';\n\n// Create and register the Discord adapter\nconst discordAdapter = new DiscordAdapter();\nregistry.register('discord', discordAdapter);\n\n// Log registration (only in development)\nif (process.env.NODE_ENV !== 'production') {\n console.log('[Switchboard] Discord adapter registered');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/normalizers.ts","../src/adapter.ts","../src/register.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Normalizers for converting Discord types to Switchboard unified types\n */\n\nimport type {\n UnifiedMessage,\n Attachment,\n Channel,\n User,\n MessageEvent,\n ReactionEvent,\n} from '@aarekaz/switchboard-core';\nimport type {\n Message,\n TextChannel,\n DMChannel,\n User as DiscordUser,\n MessageReaction,\n PartialMessageReaction,\n PartialUser,\n} from 'discord.js';\n\n/**\n * Normalizes a Discord message to UnifiedMessage\n */\nexport function normalizeMessage(message: Message): UnifiedMessage {\n // Get plain text content\n const text = message.content;\n\n // Extract attachments\n const attachments: Attachment[] = Array.from(message.attachments.values()).map(\n (attachment) => ({\n id: attachment.id,\n filename: attachment.name || 'unknown',\n url: attachment.url,\n mimeType: attachment.contentType || 'application/octet-stream',\n size: attachment.size,\n })\n );\n\n // Determine thread ID (Discord uses channel ID for threads)\n const threadId = message.thread?.id || (message.channel.isThread() ? message.channelId : undefined);\n\n return {\n id: message.id,\n channelId: message.channelId,\n userId: message.author.id,\n text,\n timestamp: message.createdAt,\n threadId,\n attachments: attachments.length > 0 ? attachments : undefined,\n platform: 'discord',\n _raw: message,\n };\n}\n\n/**\n * Normalizes a Discord channel to Switchboard Channel\n */\nexport function normalizeChannel(\n channel: TextChannel | DMChannel\n): Channel {\n return {\n id: channel.id,\n name: channel.isDMBased() ? 'DM' : (channel as TextChannel).name,\n type: channel.isDMBased() ? 'dm' : 'public',\n platform: 'discord',\n };\n}\n\n/**\n * Normalizes a Discord user to Switchboard User\n */\nexport function normalizeUser(user: DiscordUser): User {\n return {\n id: user.id,\n username: user.username,\n displayName: user.displayName || user.username,\n isBot: user.bot || false,\n platform: 'discord',\n };\n}\n\n/**\n * Normalizes a Discord message event to UnifiedEvent\n */\nexport function normalizeMessageEvent(message: Message): MessageEvent {\n return {\n type: 'message',\n message: normalizeMessage(message),\n };\n}\n\n/**\n * Normalizes a Discord reaction event to UnifiedEvent\n */\nexport function normalizeReactionEvent(\n reaction: MessageReaction | PartialMessageReaction,\n user: DiscordUser | PartialUser,\n action: 'added' | 'removed'\n): ReactionEvent {\n // Handle partial reactions by using the emoji identifier\n const emoji = reaction.emoji.name || '❓';\n\n return {\n type: 'reaction',\n messageId: reaction.message.id,\n userId: user.id,\n emoji,\n action,\n };\n}\n\n/**\n * Extracts emoji string from Discord reaction\n * Handles both standard emoji and custom Discord emoji\n */\nexport function getEmojiString(emoji: string): string {\n // Discord custom emoji format: <:name:id> or <a:name:id> for animated\n // We'll just use the emoji string as-is for standard emoji\n // For custom emoji, Discord.js handles the formatting\n return emoji;\n}\n\n/**\n * Converts a Switchboard emoji to Discord format\n * Standard emoji pass through, custom emoji need special handling\n */\nexport function toDiscordEmoji(emoji: string): string {\n // If it's already in Discord custom emoji format, return as-is\n if (emoji.startsWith('<') && emoji.endsWith('>')) {\n return emoji;\n }\n\n // Otherwise, assume it's a standard emoji\n return emoji;\n}\n","/**\n * Discord Platform Adapter\n * Implements the Switchboard PlatformAdapter interface for Discord\n */\n\nimport {\n Client,\n GatewayIntentBits,\n Message,\n TextChannel,\n Partials,\n} from 'discord.js';\nimport type {\n PlatformAdapter,\n Result,\n UnifiedMessage,\n MessageRef,\n UnifiedEvent,\n Channel,\n User,\n} from '@aarekaz/switchboard-core';\nimport {\n ok,\n err,\n ConnectionError,\n MessageSendError,\n MessageEditError,\n MessageDeleteError,\n ReactionError,\n} from '@aarekaz/switchboard-core';\nimport {\n normalizeMessage,\n normalizeChannel,\n normalizeUser,\n normalizeMessageEvent,\n normalizeReactionEvent,\n toDiscordEmoji,\n} from './normalizers.js';\nimport type { DiscordCredentials, DiscordConfig, DiscordMessageOptions } from './types.js';\n\n/**\n * Discord adapter implementation\n */\nexport class DiscordAdapter implements PlatformAdapter {\n readonly name = 'discord-adapter';\n readonly platform = 'discord' as const;\n\n private client: Client | null = null;\n private eventHandlers: Set<(event: UnifiedEvent) => void> = new Set();\n private config: DiscordConfig;\n\n constructor(config: DiscordConfig = {}) {\n this.config = config;\n }\n\n /**\n * Connect to Discord\n */\n async connect(credentials: unknown): Promise<void> {\n const discordCreds = credentials as DiscordCredentials;\n\n if (!discordCreds.token) {\n throw new ConnectionError(\n 'discord',\n new Error('Discord token is required')\n );\n }\n\n try {\n // Create Discord client with necessary intents\n this.client = new Client({\n intents: this.config.intents || [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n GatewayIntentBits.DirectMessages,\n GatewayIntentBits.GuildMessageReactions,\n ],\n partials: [Partials.Message, Partials.Channel, Partials.Reaction],\n });\n\n // Set up event listeners\n this.setupEventListeners();\n\n // Login to Discord\n await this.client.login(discordCreds.token);\n\n // Wait for the client to be ready\n await new Promise<void>((resolve) => {\n this.client!.once('ready', () => resolve());\n });\n } catch (error) {\n throw new ConnectionError('discord', error);\n }\n }\n\n /**\n * Disconnect from Discord\n */\n async disconnect(): Promise<void> {\n if (this.client) {\n this.client.destroy();\n this.client = null;\n }\n }\n\n /**\n * Check if connected to Discord\n */\n isConnected(): boolean {\n return this.client !== null && this.client.isReady();\n }\n\n /**\n * Send a message to a Discord channel\n */\n async sendMessage(\n channelId: string,\n text: string,\n options?: unknown\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channel = await this.client.channels.fetch(channelId);\n\n if (!channel || !channel.isTextBased()) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('Channel not found or not text-based')\n )\n );\n }\n\n // Handle Discord-specific options\n const discordOptions = (options as { discord?: DiscordMessageOptions })\n ?.discord;\n\n const message = await (channel as TextChannel).send({\n content: text,\n embeds: discordOptions?.embeds,\n components: discordOptions?.components,\n allowedMentions: discordOptions?.allowedMentions,\n });\n\n return ok(normalizeMessage(message));\n } catch (error) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Edit a message\n */\n async editMessage(\n messageRef: MessageRef,\n newText: string\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n new Error(\n 'Cannot edit message: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.editMessage(message, \"text\") // ✅ Works\\n' +\n ' bot.editMessage(message.id, \"text\") // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch and edit the message\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const editedMessage = await message.edit(newText);\n\n return ok(normalizeMessage(editedMessage));\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new MessageEditError(\n 'discord',\n messageId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Delete a message\n */\n async deleteMessage(messageRef: MessageRef): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n new Error(\n 'Cannot delete message: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.deleteMessage(message) // ✅ Works\\n' +\n ' bot.deleteMessage(message.id) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch and delete the message\n const message = await (channel as TextChannel).messages.fetch(messageId);\n await message.delete();\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new MessageDeleteError(\n 'discord',\n messageId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Add a reaction to a message\n */\n async addReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(\n 'Cannot add reaction: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.addReaction(message, emoji) // ✅ Works\\n' +\n ' bot.addReaction(message.id, emoji) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and add reaction\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const discordEmoji = toDiscordEmoji(emoji);\n await message.react(discordEmoji);\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Remove a reaction from a message\n */\n async removeReaction(\n messageRef: MessageRef,\n emoji: string\n ): Promise<Result<void>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(\n 'Cannot remove reaction: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.removeReaction(message, emoji) // ✅ Works\\n' +\n ' bot.removeReaction(message.id, emoji) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and remove reaction\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const discordEmoji = toDiscordEmoji(emoji);\n\n // Remove the bot's own reaction\n await message.reactions.cache.get(discordEmoji)?.users.remove(this.client.user!.id);\n\n return ok(undefined);\n } catch (error) {\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n return err(\n new ReactionError(\n 'discord',\n messageId,\n emoji,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Create a thread from a message\n */\n async createThread(\n messageRef: MessageRef,\n text: string\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n // Extract message ID and channel ID from MessageRef\n const messageId = typeof messageRef === 'string' ? messageRef : messageRef.id;\n const channelId = typeof messageRef === 'string'\n ? null\n : messageRef.channelId;\n\n if (!channelId) {\n return err(\n new MessageSendError(\n 'discord',\n 'unknown',\n new Error(\n 'Cannot create thread: channel context not found.\\n' +\n 'Pass the full message object instead:\\n' +\n ' bot.createThread(message, text) // ✅ Works\\n' +\n ' bot.createThread(message.id, text) // ❌ Missing channel context'\n )\n )\n );\n }\n\n // Fetch the channel\n const channel = await this.client.channels.fetch(channelId);\n if (!channel || !('messages' in channel)) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error(`Channel ${channelId} not found or is not a text channel`)\n )\n );\n }\n\n // Fetch the message and create thread\n const message = await (channel as TextChannel).messages.fetch(messageId);\n const thread = await message.startThread({\n name: text.substring(0, 100), // Discord thread names max 100 chars\n });\n\n // Send the first message in the thread\n const threadMessage = await thread.send(text);\n\n return ok(normalizeMessage(threadMessage));\n } catch (error) {\n const channelId = typeof messageRef === 'string' ? 'unknown' : messageRef.channelId;\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Upload a file to a channel\n */\n async uploadFile(\n channelId: string,\n _file: unknown,\n _options?: unknown\n ): Promise<Result<UnifiedMessage>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channel = await this.client.channels.fetch(channelId);\n\n if (!channel || !channel.isTextBased()) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('Channel not found or not text-based')\n )\n );\n }\n\n // Handle file upload\n // This is a simplified implementation - production would handle Buffer, Stream, File, etc.\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n new Error('File upload not yet implemented')\n )\n );\n } catch (error) {\n return err(\n new MessageSendError(\n 'discord',\n channelId,\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Register an event handler\n */\n onEvent(handler: (event: UnifiedEvent) => void): void {\n this.eventHandlers.add(handler);\n }\n\n /**\n * Get list of channels\n */\n async getChannels(): Promise<Result<Channel[]>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const channels: Channel[] = [];\n\n for (const [, channel] of this.client.channels.cache) {\n if (channel.isTextBased() && !channel.isThread()) {\n channels.push(normalizeChannel(channel as TextChannel));\n }\n }\n\n return ok(channels);\n } catch (error) {\n return err(\n new ConnectionError(\n 'discord',\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Get list of users (in a specific channel or guild)\n */\n async getUsers(channelId?: string): Promise<Result<User[]>> {\n if (!this.client) {\n return err(new ConnectionError('discord', new Error('Not connected')));\n }\n\n try {\n const users: User[] = [];\n\n if (channelId) {\n const channel = await this.client.channels.fetch(channelId);\n if (channel && 'members' in channel) {\n for (const [, member] of (channel as any).members) {\n users.push(normalizeUser(member.user));\n }\n }\n } else {\n // Get all cached users\n for (const [, user] of this.client.users.cache) {\n users.push(normalizeUser(user));\n }\n }\n\n return ok(users);\n } catch (error) {\n return err(\n new ConnectionError(\n 'discord',\n error instanceof Error ? error : new Error(String(error))\n )\n );\n }\n }\n\n /**\n * Normalize a Discord message to UnifiedMessage\n */\n normalizeMessage(platformMessage: unknown): UnifiedMessage {\n return normalizeMessage(platformMessage as Message);\n }\n\n /**\n * Normalize a Discord event to UnifiedEvent\n */\n normalizeEvent(platformEvent: unknown): UnifiedEvent {\n // This would handle different Discord event types\n // For now, we assume it's a message event\n return normalizeMessageEvent(platformEvent as Message);\n }\n\n /**\n * Set up Discord event listeners\n */\n private setupEventListeners(): void {\n if (!this.client) return;\n\n // Message events\n this.client.on('messageCreate', (message: Message) => {\n // Ignore bot messages\n if (message.author.bot) return;\n\n const event = normalizeMessageEvent(message);\n this.emitEvent(event);\n });\n\n // Reaction events\n this.client.on('messageReactionAdd', async (reaction, user) => {\n // Handle partial reactions\n if (reaction.partial) {\n try {\n await reaction.fetch();\n } catch (error) {\n console.error('Failed to fetch reaction:', error);\n return;\n }\n }\n\n if (user.partial) {\n try {\n await user.fetch();\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return;\n }\n }\n\n if (user.bot) return;\n\n const event = normalizeReactionEvent(reaction, user, 'added');\n this.emitEvent(event);\n });\n\n this.client.on('messageReactionRemove', async (reaction, user) => {\n // Handle partial reactions\n if (reaction.partial) {\n try {\n await reaction.fetch();\n } catch (error) {\n console.error('Failed to fetch reaction:', error);\n return;\n }\n }\n\n if (user.partial) {\n try {\n await user.fetch();\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return;\n }\n }\n\n if (user.bot) return;\n\n const event = normalizeReactionEvent(reaction, user, 'removed');\n this.emitEvent(event);\n });\n\n // Ready event\n this.client.on('ready', () => {\n console.log(`[Switchboard] Discord bot connected as ${this.client!.user!.tag}`);\n });\n\n // Error handling\n this.client.on('error', (error) => {\n console.error('Discord client error:', error);\n });\n }\n\n /**\n * Emit an event to all registered handlers\n */\n private emitEvent(event: UnifiedEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('Error in event handler:', error);\n }\n }\n }\n}\n","/**\n * Auto-registration for Discord adapter\n * This file is imported as a side effect to register the Discord adapter\n */\n\nimport { registry } from '@aarekaz/switchboard-core';\nimport { DiscordAdapter } from './adapter.js';\n\n// Create and register the Discord adapter\nconst discordAdapter = new DiscordAdapter();\nregistry.register('discord', discordAdapter);\n\n// Log registration (only in development)\nif (process.env.NODE_ENV !== 'production') {\n console.log('[Switchboard] Discord adapter registered');\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aarekaz/switchboard-discord",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Discord adapter for Switchboard SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"switchboard",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"README.md"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"discord.js": "^14.
|
|
35
|
-
"@aarekaz/switchboard-core": "0.3.
|
|
34
|
+
"discord.js": "^14.25.1",
|
|
35
|
+
"@aarekaz/switchboard-core": "0.3.5"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"tsup": "^8.
|
|
39
|
-
"typescript": "^5.
|
|
38
|
+
"tsup": "^8.5.1",
|
|
39
|
+
"typescript": "^5.9.3"
|
|
40
40
|
},
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public"
|