From 0a6f03ea1d0380af86b6de45f1ea03d7cf2cd50f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abigail=20Magalh=C3=A3es?= Date: Tue, 17 Aug 2021 03:40:18 -0300 Subject: [PATCH] parse day changes and keep parse errors --- src/main.tsx | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index acf2c71..078af19 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -10,6 +10,9 @@ type MessageFrag = { } | { type: 'text', content: string +} | { + type: 'error', + content: string }; type IrcUser = { @@ -31,6 +34,8 @@ type IrcMessage = { type: 'message', user: IrcUser, content: MessageFrag[] +} | { + type: 'day_change' }; const URL = /(((?:https?|gopher):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/|spotify:track:)((?:\(?[^\s()<>]+\)?)*[^ \s`!\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))/i; @@ -52,6 +57,12 @@ function parseMessage(m: string): MessageFrag[] { function parse(s: string): IrcMessage { s = s.trimEnd(); + if (s.startsWith("--- Day changed")) { + return { + type: "day_change" + }; + } + const time = s.slice(0, 5); switch (s[6]) { case '-': @@ -81,14 +92,21 @@ function parse(s: string): IrcMessage { } } } - throw `couldn't parse message ${s}`; + return { + time: "no:ts", + type: 'status', + content: [{ + type: 'error', + content: `could not parse message: ${s}` + }] + }; }; const messages = lines.map(l => l.trim()).filter(l => l !== '.' && l !== "").map((v, i) => { try { return parse(v) } catch (e) { throw `${e} ${i}` } }); type MsgGroup = { user?: IrcUser, - type: "status" | "message" | "action", + type: "status" | "message" | "action" | "day_change", messages: IrcMessage[] } @@ -100,7 +118,7 @@ function group(messages: IrcMessage[]): MsgGroup[] { let type: "status" | "action" | "message" | undefined = undefined; for (const m of messages) { - if (m.type === "status") { + if (m.type === "status" || m.type === "day_change") { groups.push({ user: discrim, type: type ?? "message", @@ -156,12 +174,20 @@ const render = (c: MessageFrag): JSX.Element => { return JSX.createTextNode(escapeHtmlShitty(c.content)); } else if (c.type === "url") { return {escapeHtmlShitty(c.link)}; + } else if (c.type === "error") { + return {escapeHtmlShitty(c.content)}; } else { throw "impossible!" // thanks TypeScript } } const Message = ({ message, inclTs }: { message: IrcMessage, inclTs?: boolean }) => { + if (message.type === "day_change") { + return
+ Today +
+ }; + const prefix = message.type === "action" ? "* " : ""; return
{ @@ -173,6 +199,8 @@ const Message = ({ message, inclTs }: { message: IrcMessage, inclTs?: boolean }) function renderMessageGroup(m: MsgGroup): HtmlEnt { const u = m.user; + const m0 = m.messages[0]; + if (u !== undefined) { return
@@ -181,7 +209,7 @@ function renderMessageGroup(m: MsgGroup): HtmlEnt {
{m.user?.name} - {m.messages[0].time} + {m0.type === "day_change" ? "what" : m0.time}