diff --git a/src/message.ts b/src/message.ts
index 42c981d..90c8846 100644
--- a/src/message.ts
+++ b/src/message.ts
@@ -8,21 +8,41 @@ export type RichMessage = {
notify?: boolean;
};
+// https://www.30secondsofcode.org/js/s/escape-unescape-html/
+const escapeHTML = (str: string) =>
+ str.replace(
+ /[&<>'"]/g,
+ (tag: string) =>
+ ({
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ "'": ''',
+ '"': '"'
+ }[tag] || tag)
+ );
+
+const html = (strings: TemplateStringsArray, ...values: string[]) => {
+ return strings.map((string, index) => {
+ return string + escapeHTML(values[index] ?? "");
+ }).join("");
+};
+
export function formatRichMessage(message: RichMessage): string {
const metadata = Object.entries(message.metadata ?? {})
- .map(([key, value]) => `#${key}: ${value}`)
+ .map(([key, value]) => html`#${key}: ${value}`)
.join("\n");
- return `${message.emoji ? `${message.emoji} • ` : ""}${
+ return html`${message.emoji ? `${message.emoji} • ` : ""}${
message.channel
- ? `#${message.channel}
+ ? html`#${message.channel}
`
: ""
}${message.event}${
(message.text ?? message.message)
- ? `
+ ? html`
-${message.text ?? message.message}`
+${message.text ?? message.message ?? ""}`
: ""
}