const EventEmitter = require("events"); let linkSignal = null; module.exports = class { onCreate(input) { this.state = { shortName: "", name: "", text: "", nameSuffix: "", modal: null, removed: false, multipart: false, anchored: false, prevWasText: false, } this.mounted = false; this.updatePost(input) } open(modal) { this.state.modal = modal } close() { this.state.modal = null } move(toPosition) { this.emit("move", toPosition) } remove() { this.state.removed = true this.emit("remove") } edited(data) { this.emit("edited", data) } onInput(input) { if (this.state == null) { return } const timediff = Date.parse(input.post.time) - Date.parse(input.prev.time) this.state.multipart = (input.post.nick == input.prev.nick && input.prev.multipart !== false) && (Math.abs(timediff) < 60000); this.state.prevWasText = (input.prev.kind === "text"); this.updatePost(input) } onMount() { this.linkSignalCallback = () => { this.state.anchored = false } if (linkSignal == null) { linkSignal = new EventEmitter() linkSignal.setMaxListeners(10000) } linkSignal.on("signal", this.linkSignalCallback) this.state.anchored = window.location.hash.slice(1) === this.input.post.id; } onUnmount() { linkSignal.removeListener("signal", this.linkSignalCallback) } link() { linkSignal.emit("signal") this.state.anchored = true } updatePost(input) { this.state.shortName = input.post.nick.split("_").shift() this.state.name = input.post.nick this.state.nameSuffix = "" this.state.text = input.post.text.replace(/\x02/g, "**").replace(/\x1D/g, "_").trim(); if (this.state.text.startsWith("|")) { this.state.name = "" this.state.text = this.state.text.slice(1).trim(); } if (input.post.kind === "text" && !this.state.text.includes("\"") && !this.state.text.includes("\''") && !this.state.text.includes("|")) { const colonIndex = this.state.text.indexOf(": "); if (colonIndex != -1 && colonIndex < this.state.text.indexOf(" ")) { this.state.text = this.state.text.replace(": ", ": \"") + "\""; } else { this.state.text = '"' + this.state.text + '"' } } if (this.state.text.charAt(0) == this.state.text.charAt(0).toUpperCase()) { this.state.name = "" } if (!input.post.nick.startsWith("=")) { const postNick = input.post.nick.replace("'s", "").replace("s'", "s") for (const character of input.characters) { for (const nick of character.nicks) { if (nick === postNick) { this.state.name = character.name this.state.shortName = character.shortName if (input.post.nick.endsWith("'s") || input.post.nick.endsWith("'")) { this.state.nameSuffix = (character.shortName.endsWith("s") || character.shortName.endsWith("z")) ? "'" : "'s" } return } } } } } kindClass(prefix) { if (this.input.post == null) { return } return `${prefix}${this.input.post.kind.replace(".", "-")}` } }