From b0671fe33645a90f885d72f34b6ffa048e4e9b61 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 28 May 2021 18:47:40 +0200 Subject: [PATCH] Group folded events by type --- components/buffer.js | 130 ++++++++++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 34 deletions(-) diff --git a/components/buffer.js b/components/buffer.js index 6e96b7e..f983309 100644 --- a/components/buffer.js +++ b/components/buffer.js @@ -56,29 +56,6 @@ function canFoldMessage(msg) { return false; } -function getFoldableMessageContent(msg, createNick) { - switch (msg.command) { - case "JOIN": - return html` - ${createNick(msg.prefix.name)} has joined - `; - case "PART": - return html` - ${createNick(msg.prefix.name)} has left - `; - case "QUIT": - return html` - ${createNick(msg.prefix.name)} has quit - `; - case "NICK": - var newNick = msg.params[0]; - return html` - ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} - `; - } - throw new Error(`Message "${msg.command}" cannot be folded`); -} - class LogLine extends Component { shouldComponentUpdate(nextProps) { return this.props.message !== nextProps.message; @@ -124,6 +101,27 @@ class LogLine extends Component { lineClass += " highlight"; } break; + case "JOIN": + content = html` + ${createNick(msg.prefix.name)} has joined + `; + break; + case "PART": + content = html` + ${createNick(msg.prefix.name)} has left + `; + break; + case "QUIT": + content = html` + ${createNick(msg.prefix.name)} has quit + `; + break; + case "NICK": + var newNick = msg.params[0]; + content = html` + ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} + `; + break; case "KICK": content = html` ${createNick(msg.params[1])} was kicked by ${createNick(msg.prefix.name)} (${msg.params.slice(2)}) @@ -148,11 +146,7 @@ class LogLine extends Component { if (irc.isError(msg.command) && msg.command != irc.ERR_NOMOTD) { lineClass = "error"; } - if (canFoldMessage(msg)) { - content = getFoldableMessageContent(msg, createNick); - } else { - content = html`${msg.command} ${msg.params.join(" ")}`; - } + content = html`${msg.command} ${msg.params.join(" ")}`; } return html` @@ -165,6 +159,27 @@ class LogLine extends Component { } } +function createNickList(nicks, createNick) { + if (nicks.length === 0) { + return null; + } else if (nicks.length === 1) { + return createNick(nicks[0]); + } + + var l = nicks.slice(0, nicks.length - 1).map((nick, i) => { + if (i === 0) { + return createNick(nick); + } else { + return [", ", createNick(nick)]; + } + }); + + l.push(" and "); + l.push(createNick(nicks[nicks.length - 1])); + + return l; +} + class FoldGroup extends Component { shouldComponentUpdate(nextProps) { return this.props.messages[0] !== nextProps.messages[0] || @@ -182,13 +197,60 @@ class FoldGroup extends Component { `; } - var content = msgs.map((msg, i) => { - var item = getFoldableMessageContent(msg, createNick); - if (i === 0) { - return item; - } else { - return [", ", item]; + var byCommand = { + "JOIN": [], + "PART": [], + "QUIT": [], + "NICK": [], + }; + msgs.forEach((msg) => { + byCommand[msg.command].push(msg); + }); + + var first = true; + var content = []; + ["JOIN", "PART", "QUIT"].forEach((cmd) => { + if (byCommand[cmd].length === 0) { + return; } + + var plural = byCommand[cmd].length > 1; + var action; + switch (cmd) { + case "JOIN": + action = plural ? "have joined" : "has joined"; + break; + case "PART": + action = plural ? "have left" : "has left"; + break; + case "QUIT": + action = plural ? "have quit" : "has quit"; + break; + } + + if (first) { + first = false; + } else { + content.push(", "); + } + + var nicks = byCommand[cmd].map((msg) => msg.prefix.name); + + content.push(createNickList(nicks, createNick)); + content.push(" " + action); + }); + + byCommand["NICK"].forEach((msg) => { + if (first) { + first = true; + } else { + content.push(", "); + } + + var newNick = msg.params[0]; + content.push(html` + ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} + `); }); var lastMsg = msgs[msgs.length - 1];