{ "version": 3, "sources": ["../../../../server/chat-plugins/room-faqs.ts"], "sourcesContent": ["import {FS, Utils} from '../../lib';\r\n\r\nexport const ROOMFAQ_FILE = 'config/chat-plugins/faqs.json';\r\nconst MAX_ROOMFAQ_LENGTH = 8192;\r\n\r\nexport const roomFaqs: {[k: string]: {[k: string]: RoomFAQ}} = (() => {\r\n\tconst data = JSON.parse(FS(ROOMFAQ_FILE).readIfExistsSync() || \"{}\");\r\n\tlet save = false;\r\n\tfor (const k in data) {\r\n\t\tfor (const name in data[k]) {\r\n\t\t\tif (typeof data[k][name] === 'string') {\r\n\t\t\t\tdata[k][name] = convertFaq(data[k][name]);\r\n\t\t\t\tsave = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (save) saveRoomFaqs(data);\r\n\treturn data;\r\n})();\r\n\r\ninterface RoomFAQ {\r\n\tsource: string;\r\n\talias?: boolean;\r\n\thtml?: boolean;\r\n}\r\n\r\nfunction saveRoomFaqs(table?: {[k: string]: {[k: string]: RoomFAQ}}) {\r\n\tFS(ROOMFAQ_FILE).writeUpdate(() => JSON.stringify(table || roomFaqs));\r\n}\r\n\r\nfunction convertFaq(faq: string): RoomFAQ {\r\n\tif (faq.startsWith('>')) {\r\n\t\treturn {\r\n\t\t\talias: true,\r\n\t\t\tsource: faq.slice(1),\r\n\t\t};\r\n\t}\r\n\treturn {\r\n\t\tsource: faq,\r\n\t};\r\n}\r\n\r\nexport function visualizeFaq(faq: RoomFAQ) {\r\n\tif (faq.html) {\r\n\t\treturn faq.source;\r\n\t}\r\n\treturn Chat.formatText(faq.source, true);\r\n}\r\n\r\nexport function getAlias(roomid: RoomID, key: string) {\r\n\tif (!roomFaqs[roomid]) return false;\r\n\tconst value = roomFaqs[roomid][key];\r\n\tif (value?.alias) return value.source;\r\n\treturn false;\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\taddhtmlfaq: 'addfaq',\r\n\taddfaq(target, room, user, connection) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst useHTML = this.cmd.includes('html');\r\n\t\tthis.checkCan('ban', null, room);\r\n\t\tif (useHTML && !user.can('addhtml', null, room, this.fullCmd)) {\r\n\t\t\treturn this.errorReply(`You are not allowed to use raw HTML in roomfaqs.`);\r\n\t\t}\r\n\t\tif (!room.persist) return this.errorReply(\"This command is unavailable in temporary rooms.\");\r\n\t\tif (!target) return this.parse('/help roomfaq');\r\n\r\n\t\ttarget = target.trim();\r\n\t\tconst input = this.filter(target);\r\n\t\tif (target !== input) return this.errorReply(\"You are not allowed to use fitered words in roomfaq entries.\");\r\n\t\tlet [topic, ...rest] = input.split(',');\r\n\r\n\t\ttopic = toID(topic);\r\n\t\tif (!(topic && rest.length)) return this.parse('/help roomfaq');\r\n\t\tlet text = rest.join(',').trim();\r\n\t\tif (topic.length > 25) return this.errorReply(\"FAQ topics should not exceed 25 characters.\");\r\n\r\n\t\tconst lengthWithoutFormatting = Chat.stripFormatting(text).length;\r\n\t\tif (lengthWithoutFormatting > MAX_ROOMFAQ_LENGTH) {\r\n\t\t\treturn this.errorReply(`FAQ entries must not exceed ${MAX_ROOMFAQ_LENGTH} characters.`);\r\n\t\t} else if (lengthWithoutFormatting < 1) {\r\n\t\t\treturn this.errorReply(`FAQ entries must include at least one character.`);\r\n\t\t}\r\n\r\n\t\tif (!useHTML) {\r\n\t\t\ttext = text.replace(/^>/, '>');\r\n\t\t} else {\r\n\t\t\ttext = text.replace(/\\n/ig, '
');\r\n\t\t\ttext = this.checkHTML(text);\r\n\t\t}\r\n\r\n\t\tif (!roomFaqs[room.roomid]) roomFaqs[room.roomid] = {};\r\n\t\tconst exists = topic in roomFaqs[room.roomid];\r\n\t\troomFaqs[room.roomid][topic] = {\r\n\t\t\tsource: text,\r\n\t\t\thtml: useHTML,\r\n\t\t};\r\n\t\tsaveRoomFaqs();\r\n\t\tthis.sendReplyBox(visualizeFaq(roomFaqs[room.roomid][topic]));\r\n\t\tthis.privateModAction(`${user.name} ${exists ? 'edited' : 'added'} an FAQ for '${topic}'`);\r\n\t\tthis.modlog('RFAQ', null, `${exists ? 'edited' : 'added'} '${topic}'`);\r\n\t},\r\n\tremovefaq(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkChat();\r\n\t\tthis.checkCan('ban', null, room);\r\n\t\tconst topic = toID(target);\r\n\t\tif (!topic) return this.parse('/help roomfaq');\r\n\r\n\t\tif (!(roomFaqs[room.roomid] && roomFaqs[room.roomid][topic])) return this.errorReply(\"Invalid topic.\");\r\n\t\tif (\r\n\t\t\troom.settings.repeats?.length &&\r\n\t\t\troom.settings.repeats.filter(x => x.faq && x.id === (getAlias(room!.roomid, topic) || topic)).length\r\n\t\t) {\r\n\t\t\tthis.parse(`/msgroom ${room.roomid},/removerepeat ${getAlias(room.roomid, topic) || topic}`);\r\n\t\t}\r\n\t\tdelete roomFaqs[room.roomid][topic];\r\n\t\tObject.keys(roomFaqs[room.roomid]).filter(\r\n\t\t\tval => getAlias(room!.roomid, val) === topic\r\n\t\t).map(\r\n\t\t\tval => delete roomFaqs[room!.roomid][val]\r\n\t\t);\r\n\t\tif (!Object.keys(roomFaqs[room.roomid]).length) delete roomFaqs[room.roomid];\r\n\t\tsaveRoomFaqs();\r\n\t\tthis.privateModAction(`${user.name} removed the FAQ for '${topic}'`);\r\n\t\tthis.modlog('ROOMFAQ', null, `removed ${topic}`);\r\n\t\tthis.refreshPage(`roomfaqs-${room.roomid}`);\r\n\t},\r\n\taddalias(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkChat();\r\n\t\tthis.checkCan('ban', null, room);\r\n\t\tif (!room.persist) return this.errorReply(\"This command is unavailable in temporary rooms.\");\r\n\t\tconst [alias, topic] = target.split(',').map(val => toID(val));\r\n\r\n\t\tif (!(alias && topic)) return this.parse('/help roomfaq');\r\n\t\tif (alias.length > 25) return this.errorReply(\"FAQ topics should not exceed 25 characters.\");\r\n\r\n\t\tif (!(roomFaqs[room.roomid] && topic in roomFaqs[room.roomid])) {\r\n\t\t\treturn this.errorReply(`The topic ${topic} was not found in this room's faq list.`);\r\n\t\t}\r\n\t\tif (getAlias(room.roomid, topic)) {\r\n\t\t\treturn this.errorReply(`You cannot make an alias of an alias. Use /addalias ${alias}, ${getAlias(room.roomid, topic)} instead.`);\r\n\t\t}\r\n\t\troomFaqs[room.roomid][alias] = {\r\n\t\t\talias: true,\r\n\t\t\tsource: topic,\r\n\t\t};\r\n\t\tsaveRoomFaqs();\r\n\t\tthis.privateModAction(`${user.name} added an alias for '${topic}': ${alias}`);\r\n\t\tthis.modlog('ROOMFAQ', null, `alias for '${topic}' - ${alias}`);\r\n\t},\r\n\tviewfaq: 'roomfaq',\r\n\trfaq: 'roomfaq',\r\n\troomfaq(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!roomFaqs[room.roomid]) return this.errorReply(\"This room has no FAQ topics.\");\r\n\t\tlet topic: string = toID(target);\r\n\t\tif (topic === 'constructor') return false;\r\n\t\tif (!topic) {\r\n\t\t\treturn this.parse(`/join view-roomfaqs-${room.roomid}`);\r\n\t\t}\r\n\t\tif (!roomFaqs[room.roomid][topic]) return this.errorReply(\"Invalid topic.\");\r\n\t\ttopic = getAlias(room.roomid, topic) || topic;\r\n\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tconst rfaq = roomFaqs[room.roomid][topic];\r\n\t\tthis.sendReplyBox(visualizeFaq(rfaq));\r\n\t\tif (!this.broadcasting && user.can('ban', null, room, 'addfaq')) {\r\n\t\t\tconst code = Utils.escapeHTML(rfaq.source).replace(/\\n/g, '
');\r\n\t\t\tconst command = rfaq.html ? 'addhtmlfaq' : 'addfaq';\r\n\t\t\tthis.sendReplyBox(`
Source/${command} ${topic}, ${code}
`);\r\n\t\t}\r\n\t},\r\n\troomfaqhelp: [\r\n\t\t`/roomfaq - Shows the list of all available FAQ topics`,\r\n\t\t`/roomfaq - Shows the FAQ for .`,\r\n\t\t`/addfaq , - Adds an entry for in this room or updates it. Requires: @ # &`,\r\n\t\t`/addhtmlfaq , - Adds or updates an entry for with HTML support. Requires: # &`,\r\n\t\t`/addalias , - Adds as an alias for , displaying it when users use /roomfaq . Requires: @ # &`,\r\n\t\t`/removefaq - Removes the entry for in this room. If used on an alias, removes the alias. Requires: @ # &`,\r\n\t],\r\n};\r\n\r\nexport const pages: Chat.PageTable = {\r\n\troomfaqs(args, user) {\r\n\t\tconst room = this.requireRoom();\r\n\t\tthis.title = `[Room FAQs]`;\r\n\t\t// allow it for users if they can access the room\r\n\t\tif (!room.checkModjoin(user)) {\r\n\t\t\tthrow new Chat.ErrorMessage(`

Access denied.

`);\r\n\t\t}\r\n\t\tlet buf = `
`;\r\n\t\tif (!roomFaqs[room.roomid]) {\r\n\t\t\treturn `${buf}

This room has no FAQs.

`;\r\n\t\t}\r\n\r\n\t\tbuf += `

FAQs for ${room.title}:

`;\r\n\t\tconst keys = Object.keys(roomFaqs[room.roomid]);\r\n\t\tconst sortedKeys = Utils.sortBy(keys.filter(val => !getAlias(room.roomid, val)));\r\n\t\tfor (const key of sortedKeys) {\r\n\t\t\tconst topic = roomFaqs[room.roomid][key];\r\n\t\t\tbuf += `
`;\r\n\t\t\tbuf += `

${key}

`;\r\n\t\t\tbuf += `
`;\r\n\t\t\tbuf += visualizeFaq(topic);\r\n\t\t\tconst aliases = keys.filter(val => getAlias(room.roomid, val) === key);\r\n\t\t\tif (aliases.length) {\r\n\t\t\t\tbuf += `
Aliases: ${aliases.join(', ')}`;\r\n\t\t\t}\r\n\t\t\tif (user.can('ban', null, room, 'addfaq')) {\r\n\t\t\t\tconst src = Utils.escapeHTML(topic.source).replace(/\\n/g, `
`);\r\n\t\t\t\tconst command = topic.html ? 'addhtmlfaq' : 'addfaq';\r\n\t\t\t\tbuf += `
Raw text`;\r\n\t\t\t\tbuf += `/${command} ${key}, ${src}
`;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t}\r\n\t\t\tbuf += `
`;\r\n\t\t}\r\n\t\tbuf += ``;\r\n\t\treturn buf;\r\n\t},\r\n};\r\n\r\nexport const handlers: Chat.Handlers = {\r\n\tonRenameRoom(oldID, newID) {\r\n\t\tif (roomFaqs[oldID]) {\r\n\t\t\tif (!roomFaqs[newID]) roomFaqs[newID] = {};\r\n\t\t\tObject.assign(roomFaqs[newID], roomFaqs[oldID]);\r\n\t\t\tdelete roomFaqs[oldID];\r\n\t\t\tsaveRoomFaqs();\r\n\t\t}\r\n\t},\r\n};\r\n\r\nprocess.nextTick(() => {\r\n\tChat.multiLinePattern.register('/add(htmlfaq|faq) ');\r\n});\r\n"], "mappings": "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", "names": [] }