From e7b69cec9a839bb1c71ea67f21bb82e1ff3f7f2c Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 28 Aug 2022 19:16:41 +0200 Subject: [PATCH] Limit composer length Often times IRC servers will truncate messages which are too big. --- components/app.js | 5 +++++ components/composer.js | 1 + lib/irc.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/components/app.js b/components/app.js index 4aa4194..3ecf1b5 100644 --- a/components/app.js +++ b/components/app.js @@ -1928,8 +1928,12 @@ export default class App extends Component { } let commandOnly = false; + let privmsgMaxLen; if (activeBuffer && activeBuffer.type === BufferType.SERVER) { commandOnly = true; + } else if (activeBuffer) { + let client = this.clients.get(activeBuffer.server); + privmsgMaxLen = irc.getMaxPrivmsgLen(client.isupport, client.nick, activeBuffer.name); } let app = html` @@ -1981,6 +1985,7 @@ export default class App extends Component { onSubmit=${this.handleComposerSubmit} autocomplete=${this.autocomplete} commandOnly=${commandOnly} + maxLen=${privmsgMaxLen} /> ${dialog} ${error} diff --git a/components/composer.js b/components/composer.js index 6938f13..28fe664 100644 --- a/components/composer.js +++ b/components/composer.js @@ -222,6 +222,7 @@ export default class Composer extends Component { placeholder=${placeholder} enterkeyhint="send" onKeyDown=${this.handleInputKeyDown} + maxlength=${this.props.maxLen} /> `; diff --git a/lib/irc.js b/lib/irc.js index fe8de45..03ceb8d 100644 --- a/lib/irc.js +++ b/lib/irc.js @@ -479,6 +479,36 @@ export class Isupport { bot() { return this.raw.get("BOT"); } + + userLen() { + if (!this.raw.has("USERLEN")) { + return 20; + } + return parseInt(this.raw.get("USERLEN"), 10); + } + + hostLen() { + if (!this.raw.has("HOSTLEN")) { + return 63; + } + return parseInt(this.raw.get("HOSTLEN"), 10); + } + + lineLen() { + if (!this.raw.has("LINELEN")) { + return 512; + } + return parseInt(this.raw.get("LINELEN"), 10); + } +} + +export function getMaxPrivmsgLen(isupport, nick, target) { + let user = "_".repeat(isupport.userLen()); + let host = "_".repeat(isupport.hostLen()); + let prefix = { name: nick, user, host }; + let msg = { prefix, command: "PRIVMSG", params: [target, ""] }; + let raw = formatMessage(msg) + "\r\n"; + return isupport.lineLen() - raw.length; } export const CaseMapping = {