diff --git a/src/events/messageCreate.ts b/src/events/messageCreate.ts index 381cadb..dacc10b 100644 --- a/src/events/messageCreate.ts +++ b/src/events/messageCreate.ts @@ -64,10 +64,14 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client // Check if message is a bot response to avoid loops const isBotResponseKey = `message:${message.id}:is_bot_response` if (isBotMessage) { - const isBotResponse = await redis.get(isBotResponseKey) - if (isBotResponse === 'true') { - log(`Skipping bot message ${message.id} as it is a bot response.`) - return + try { + const isBotResponse = await redis.get(isBotResponseKey) + if (isBotResponse === 'true') { + log(`Skipping bot message ${message.id} as it is a bot response.`) + return + } + } catch (error) { + log(`Failed to check isBotResponse in Redis: ${error}`) } } @@ -130,12 +134,14 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client try { // Retrieve Server/Guild Preferences let attempt = 0 + let serverConfig; while (attempt < maxRetries) { try { - await new Promise((resolve, reject) => { + serverConfig = await new Promise((resolve, reject) => { getServerConfig(`${message.guildId}-config.json`, (config) => { if (config === undefined) { redis.set(`server:${message.guildId}:config`, JSON.stringify({ options: { 'toggle-chat': true } })) + .catch(err => log(`Failed to set default server config in Redis: ${err}`)); reject(new Error('Failed to locate or create Server Preferences\n\nPlease try chatting again...')) } else if (!config.options['toggle-chat']) { reject(new Error('Admin(s) have disabled chat features.\n\nPlease contact your server\'s admin(s).')) @@ -166,7 +172,13 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client redis.get(userConfigKey).then(configRaw => { let config: UserConfig | undefined if (configRaw) { - config = JSON.parse(configRaw) + try { + config = JSON.parse(configRaw) + } catch (parseError) { + log(`Failed to parse user config JSON: ${parseError}`) + reject(parseError) + return + } } if (!config) { const defaultConfig: UserConfig = { @@ -178,6 +190,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client } } redis.set(userConfigKey, JSON.stringify(defaultConfig)) + .catch(err => log(`Failed to set default user config in Redis: ${err}`)); log(`Created default config for ${message.author.username}`) reject(new Error('No User Preferences is set up.\n\nCreating preferences with defaults.\nPlease try chatting again.')) return @@ -198,7 +211,10 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client } resolve(config) - }).catch(err => reject(err)) + }).catch(err => { + log(`Redis error fetching user config: ${err}`) + reject(err) + }) }) break } catch (error) { @@ -218,8 +234,13 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client try { const historyRaw = await redis.get(channelHistoryKey) if (historyRaw) { - chatMessages = JSON.parse(historyRaw) - log(`Retrieved ${chatMessages.length} messages from Redis for ${channelHistoryKey}`) + try { + chatMessages = JSON.parse(historyRaw) + log(`Retrieved ${chatMessages.length} messages from Redis for ${channelHistoryKey}`) + } catch (parseError) { + log(`Failed to parse channel history JSON: ${parseError}`) + chatMessages = [] + } } else { log(`No history found for ${channelHistoryKey}. Initializing empty history.`) chatMessages = [] @@ -237,9 +258,17 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client const attachment = message.attachments.first() let messageAttachment: string[] = [] if (attachment && attachment.name?.endsWith(".txt")) { - cleanedMessage += await getTextFileAttachmentData(attachment) + try { + cleanedMessage += await getTextFileAttachmentData(attachment) + } catch (error) { + log(`Failed to process text attachment: ${error}`) + } } else if (attachment) { - messageAttachment = await getAttachmentData(attachment) + try { + messageAttachment = await getAttachmentData(attachment) + } catch (error) { + log(`Failed to process attachment: ${error}`) + } } const model: string = userConfig.options['switch-model'] @@ -339,11 +368,19 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client }) // Call Ollama - const response = await ollama.chat({ - model, - messages: [{ role: 'user', content: prompt }], - stream: shouldStream - }) + let response; + try { + response = await ollama.chat({ + model, + messages: [{ role: 'user', content: prompt }], + stream: shouldStream + }) + } catch (error) { + log(`Ollama chat error: ${error}`) + message.reply('Sorry, I’m having trouble contacting the AI model. Try again later?') + msgHist.pop() + return + } // Parse JSON response let jsonResponse: ModelResponse @@ -359,7 +396,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client } } catch (error) { log(`Failed to parse model response: ${error}`) - //message.reply('Sorry, I’m having trouble thinking right now. Try again?') + message.reply('Sorry, I’m having trouble thinking right now. Try again?') msgHist.pop() return } @@ -402,8 +439,16 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client } // Send reply to Discord and mark as bot response - const reply = jsonResponse.reply || 'Huh?' - const replyMessage = await message.reply(reply) + const reply = jsonResponse.reply || 'Sorry, I didn’t get that. Can you try again?' + let replyMessage; + try { + replyMessage = await message.reply(reply) + } catch (error) { + log(`Failed to send reply to Discord: ${error}`) + msgHist.pop() + return + } + if (isBotMessage) { try { await redis.set(`message:${replyMessage.id}:is_bot_response`, 'true', { EX: 3600 }) // 1 hour TTL @@ -441,7 +486,8 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client } } } catch (error: any) { - msgHist.pop() + log(`Error in message processing: ${error.message}`) message.reply(`**Error Occurred:**\n\n**Reason:** *${error.message}*`) + msgHist.pop() } })