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 = {