update src/events/messageCreate.ts to slience or mask errors going to the discord chat
Some checks failed
Builds / Discord-Node-Build (push) Has been cancelled
Builds / Discord-Ollama-Container-Build (push) Has been cancelled
Coverage / Discord-Node-Coverage (push) Has been cancelled

This commit is contained in:
quarterturn
2025-05-23 21:03:09 -04:00
parent 92add4a60c
commit fd626cb73f

View File

@@ -30,6 +30,18 @@ interface UserConfig {
} }
} }
// List of in-character error responses for unavoidable Discord replies
const friendlyErrorResponses = [
'Huh?',
'Sorry, I wasnt listening. Can you say that again?',
'Um... what was that?',
'Oops, my mind wandered! Could you repeat that?',
'Hehe, I got distracted. Say it one more time?'
]
// Function to get a random friendly error response
const getFriendlyError = () => friendlyErrorResponses[Math.floor(Math.random() * friendlyErrorResponses.length)]
/** /**
* Max Message length for free users is 2000 characters (bot or not). * Max Message length for free users is 2000 characters (bot or not).
* Bot supports infinite lengths for normal messages. * Bot supports infinite lengths for normal messages.
@@ -142,9 +154,9 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
if (config === undefined) { if (config === undefined) {
redis.set(`server:${message.guildId}:config`, JSON.stringify({ options: { 'toggle-chat': true } })) redis.set(`server:${message.guildId}:config`, JSON.stringify({ options: { 'toggle-chat': true } }))
.catch(err => log(`Failed to set default server config in Redis: ${err}`)); .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...')) reject(new Error('Failed to locate or create Server Preferences'))
} else if (!config.options['toggle-chat']) { } else if (!config.options['toggle-chat']) {
reject(new Error('Admin(s) have disabled chat features.\n\nPlease contact your server\'s admin(s).')) reject(new Error('Admin(s) have disabled chat features'))
} else { } else {
resolve(config) resolve(config)
} }
@@ -154,10 +166,12 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} catch (error) { } catch (error) {
++attempt ++attempt
if (attempt < maxRetries) { if (attempt < maxRetries) {
log(`Attempt ${attempt} failed for Server Preferences. Retrying in ${delay}ms...`) log(`Attempt ${attempt} failed for Server Preferences: ${error.message}. Retrying in ${delay}ms...`)
await new Promise(ret => setTimeout(ret, delay)) await new Promise(ret => setTimeout(ret, delay))
} else { } else {
throw new Error(`Could not retrieve Server Preferences, please try chatting again...`) log(`Could not retrieve Server Preferences after ${maxRetries} attempts: ${error.message}`)
message.reply(getFriendlyError())
return
} }
} }
} }
@@ -192,7 +206,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
redis.set(userConfigKey, JSON.stringify(defaultConfig)) redis.set(userConfigKey, JSON.stringify(defaultConfig))
.catch(err => log(`Failed to set default user config in Redis: ${err}`)); .catch(err => log(`Failed to set default user config in Redis: ${err}`));
log(`Created default config for ${message.author.username}`) 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.')) reject(new Error('No User Preferences set up. Created defaults.'))
return return
} }
@@ -207,7 +221,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
shouldStream = config.options['message-stream'] || false shouldStream = config.options['message-stream'] || false
if (typeof config.options['switch-model'] !== 'string') { if (typeof config.options['switch-model'] !== 'string') {
reject(new Error(`No Model was set. Please set a model by running \`/switch-model <model of choice>\`.\n\nIf you do not have any models. Run \`/pull-model <model name>\`.`)) reject(new Error('No Model set. User must run `/switch-model` or `/pull-model`.'))
} }
resolve(config) resolve(config)
@@ -220,10 +234,12 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} catch (error) { } catch (error) {
++attempt ++attempt
if (attempt < maxRetries) { if (attempt < maxRetries) {
log(`Attempt ${attempt} failed for User Preferences. Retrying in ${delay}ms...`) log(`Attempt ${attempt} failed for User Preferences: ${error.message}. Retrying in ${delay}ms...`)
await new Promise(ret => setTimeout(ret, delay)) await new Promise(ret => setTimeout(ret, delay))
} else { } else {
throw new Error(`Could not retrieve User Preferences, please try chatting again...`) log(`Could not retrieve User Preferences after ${maxRetries} attempts: ${error.message}`)
message.reply(getFriendlyError())
return
} }
} }
} }
@@ -251,7 +267,9 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} }
if (!userConfig) { if (!userConfig) {
throw new Error(`Failed to initialize User Preference for **${message.author.username}**.\n\nIt's likely you do not have a model set. Please use the \`switch-model\` command to do that.`) log(`Failed to initialize User Preference for ${message.author.username}: No config available`)
message.reply(getFriendlyError())
return
} }
// Get message attachment if exists // Get message attachment if exists
@@ -377,7 +395,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
}) })
} catch (error) { } catch (error) {
log(`Ollama chat error: ${error}`) log(`Ollama chat error: ${error}`)
message.reply('Sorry, Im having trouble contacting the AI model. Try again later?') message.reply(getFriendlyError())
msgHist.pop() msgHist.pop()
return return
} }
@@ -396,13 +414,14 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} }
} catch (error) { } catch (error) {
log(`Failed to parse model response: ${error}`) log(`Failed to parse model response: ${error}`)
message.reply('Sorry, Im having trouble thinking right now. Try again?') message.reply(getFriendlyError())
msgHist.pop() msgHist.pop()
return return
} }
if (jsonResponse.status === 'error') { if (jsonResponse.status === 'error') {
message.reply(jsonResponse.reply) log(`Model returned error status: ${jsonResponse.reply}`)
message.reply(getFriendlyError())
msgHist.pop() msgHist.pop()
return return
} }
@@ -439,7 +458,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} }
// Send reply to Discord and mark as bot response // Send reply to Discord and mark as bot response
const reply = jsonResponse.reply || 'Sorry, I didnt get that. Can you try again?' const reply = jsonResponse.reply || 'Huh?'
let replyMessage; let replyMessage;
try { try {
replyMessage = await message.reply(reply) replyMessage = await message.reply(reply)
@@ -487,7 +506,7 @@ export default event(Events.MessageCreate, async ({ log, msgHist, ollama, client
} }
} catch (error: any) { } catch (error: any) {
log(`Error in message processing: ${error.message}`) log(`Error in message processing: ${error.message}`)
message.reply(`**Error Occurred:**\n\n**Reason:** *${error.message}*`) message.reply(getFriendlyError())
msgHist.pop() msgHist.pop()
} }
}) })