diff --git a/bot.js b/bot.js index 35ab8ea..205b1b6 100644 --- a/bot.js +++ b/bot.js @@ -39,6 +39,11 @@ function logForward(...args) { if (LOG_FORWARD) console.log(...args); } +// Utility to check ASCII +function isASCII(str) { + return /^[\x00-\x7F]*$/.test(str); +} + // Create IRC client for a bridge function createIRCClient(bridge) { const ircConfig = bridge.irc; @@ -206,22 +211,18 @@ discordClient.on("messageCreate", async (message) => { logForward(`Forwarding Discord → IRC [${info.channel}]: ${privmsgMessage}`); - // --- RELAYMSG logic --- - if (info.useRelayMsg) { - if (ircClient.state.hasOp) { - const relayNick = `${nickname}/dc`; - ircClient.raw(`RELAYMSG ${info.channel} ${relayNick} :${baseMessage}`); - } else { - if (!ircClient.state.warnedRelayMsg) { - ircClient.say( - info.channel, - `[Bridge] Missing +o, falling back to PRIVMSG (RELAYMSG disabled)` - ); - ircClient.state.warnedRelayMsg = true; - } - ircClient.say(info.channel, privmsgMessage); - } + // RELAYMSG logic with proper fallback for non-ASCII + if (info.useRelayMsg && ircClient.state.hasOp && isASCII(nickname)) { + const relayNick = `${nickname}/dc`; + ircClient.raw(`RELAYMSG ${info.channel} ${relayNick} :${baseMessage}`); } else { + if (info.useRelayMsg && !ircClient.state.hasOp && !ircClient.state.warnedRelayMsg) { + ircClient.say( + info.channel, + `[Bridge] Missing +o, falling back to PRIVMSG (RELAYMSG disabled)` + ); + ircClient.state.warnedRelayMsg = true; + } ircClient.say(info.channel, privmsgMessage); } } @@ -256,7 +257,7 @@ discordClient.on("messageReactionAdd", async (reaction, user) => { logForward(`Reaction → IRC [${info.channel}]: ${reactionMessage}`); - if (info.useRelayMsg && ircClient.state.hasOp) { + if (info.useRelayMsg && ircClient.state.hasOp && isASCII(nickname)) { const relayNick = `${nickname}/dc`; ircClient.raw( `RELAYMSG ${info.channel} ${relayNick} :${reactionMessage}`