{ "version": 3, "sources": ["../../../../server/chat-plugins/smogtours.ts"], "sourcesContent": ["/**\r\n * Integration for Smogon tournaments.\r\n * @author mia-pi-git\r\n */\r\nimport {FS, Utils} from '../../lib';\r\n\r\ntype Image = [string, number, number];\r\ninterface TourEvent {\r\n\ttitle: string;\r\n\turl: string;\r\n\tdesc: string;\r\n\timage?: Image;\r\n\tid: string;\r\n\tshortDesc: string;\r\n\tdate: number;\r\n}\r\n\r\ninterface TourTable {\r\n\ttitle: string;\r\n\ttours: TourEvent[];\r\n\twhitelist?: string[];\r\n\ticon?: Image;\r\n\tdesc: string;\r\n}\r\n\r\nexport const tours: Record = {\r\n\tofficial: {\r\n\t\ttitle: \"Smogon Officials\",\r\n\t\t// cap this one's dimensions\r\n\t\ticon: ['https://www.smogon.com/media/zracknel-beta.svg', 178, 200],\r\n\t\ttours: [],\r\n\t\tdesc: \"Tournaments run by Smogon staff.\",\r\n\t},\r\n\tsmogon: {\r\n\t\ttitle: \"Open Sign-Ups\",\r\n\t\ttours: [],\r\n\t\tdesc: \"Tournaments run by Smogon staff and regular users alike.\",\r\n\t},\r\n\tps: {\r\n\t\ttitle: \"Pok\u00E9mon Showdown!\",\r\n\t\ticon: ['https://play.pokemonshowdown.com/pokemonshowdownbeta.png', 146, 44],\r\n\t\ttours: [],\r\n\t\tdesc: \"Tournaments run by the rooms of Pokemon Showdown.\",\r\n\t},\r\n};\r\ntry {\r\n\tconst data = JSON.parse(FS('config/chat-plugins/smogtours.json').readSync());\r\n\t// settings should prioritize hardcoded values for these keys\r\n\tconst PRIO = ['title', 'icon'];\r\n\tfor (const key in data) {\r\n\t\tconst section = (tours[key] ||= data[key]) as any;\r\n\t\tfor (const k in data[key]) {\r\n\t\t\tif (PRIO.includes(k)) {\r\n\t\t\t\tif (!section[k]) section[k] = data[key][k];\r\n\t\t\t} else {\r\n\t\t\t\tsection[k] = data[key][k];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n} catch {}\r\n\r\nfunction saveTours() {\r\n\tFS('config/chat-plugins/smogtours.json').writeUpdate(() => JSON.stringify(tours));\r\n}\r\n\r\nfunction getTour(categoryID: ID, id: string) {\r\n\tid = toID(id);\r\n\treturn tours?.[categoryID].tours.find(f => f.id === id) || null;\r\n}\r\n\r\nfunction checkWhitelisted(category: ID, user: User) {\r\n\treturn category ?\r\n\t\ttours[category].whitelist?.includes(user.id) :\r\n\t\tObject.values(tours).some(f => f.whitelist?.includes(user.id));\r\n}\r\n\r\nfunction checkCanEdit(user: User, context: Chat.PageContext | Chat.CommandContext, category?: ID) {\r\n\tcategory = toID(category);\r\n\tif (!checkWhitelisted(category, user)) {\r\n\t\tcontext.checkCan('rangeban');\r\n\t}\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tsmogtours: {\r\n\t\t''() {\r\n\t\t\treturn this.parse('/j view-tournaments-all');\r\n\t\t},\r\n\t\tedit: 'add',\r\n\t\tasync add(target, room, user, connection, cmd) {\r\n\t\t\tif (!toID(target).length) {\r\n\t\t\t\treturn this.parse(`/help smogtours`);\r\n\t\t\t}\r\n\t\t\tconst targets = target.split('|');\r\n\t\t\tconst isEdit = cmd === 'edit';\r\n\t\t\tconst tourID = isEdit ? toID(targets.shift()) : null;\r\n\t\t\t// {title}|{category}|{url}|{img}|{shortDesc}|{desc}\r\n\t\t\tconst [\r\n\t\t\t\ttitle, rawSection, url, rawImg, rawShort, rawDesc,\r\n\t\t\t] = Utils.splitFirst(targets.join('|'), '|', 5).map(f => f.trim());\r\n\t\t\tconst sectionID = toID(rawSection);\r\n\t\t\tif (!toID(title)) {\r\n\t\t\t\treturn this.popupReply(`Invalid title. Must have at least one alphanumeric character.`);\r\n\t\t\t}\r\n\t\t\tconst section = tours[sectionID];\r\n\t\t\tif (!section) {\r\n\t\t\t\treturn this.errorReply(`Invalid section ID: \"${sectionID}\"`);\r\n\t\t\t}\r\n\t\t\tif (!isEdit && section.tours.find(f => toID(title) === f.id)) {\r\n\t\t\t\treturn this.popupReply(`A tour with that ID already exists. Please choose another.`);\r\n\t\t\t}\r\n\t\t\tcheckCanEdit(user, this, sectionID);\r\n\t\t\tif (!Chat.isLink(url)) {\r\n\t\t\t\treturn this.popupReply(`Invalid info URL: \"${url}\"`);\r\n\t\t\t}\r\n\t\t\tlet image;\r\n\t\t\tif (rawImg) {\r\n\t\t\t\tif (!Chat.isLink(rawImg)) {\r\n\t\t\t\t\treturn this.popupReply(`Invalid image URL: ${rawImg}`);\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst dimensions = await Chat.fitImage(rawImg, 300, 300);\r\n\t\t\t\t\timage = [rawImg, ...dimensions.slice(0, -1)] as Image;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treturn this.popupReply(`Invalid image URL: ${rawImg}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!rawShort?.length || !rawDesc?.length) {\r\n\t\t\t\treturn this.popupReply(`Must provide both a short description and a full description.`);\r\n\t\t\t}\r\n\t\t\tconst tour: TourEvent = {\r\n\t\t\t\ttitle: Utils.escapeHTML(title),\r\n\t\t\t\turl,\r\n\t\t\t\timage,\r\n\t\t\t\tshortDesc: rawShort.replace(/ /g, '\\n'),\r\n\t\t\t\tdesc: rawDesc.replace(/ /g, '\\n'),\r\n\t\t\t\tid: tourID || toID(title),\r\n\t\t\t\tdate: Date.now(),\r\n\t\t\t};\r\n\t\t\tif (isEdit) {\r\n\t\t\t\tconst index = section.tours.findIndex(t => t.id === tour.id);\r\n\t\t\t\tif (index < 0) {\r\n\t\t\t\t\treturn this.popupReply(`Tour not found. Create one first.`);\r\n\t\t\t\t}\r\n\t\t\t\tsection.tours.splice(index, 1);\r\n\t\t\t}\r\n\t\t\tsection.tours.push(tour);\r\n\t\t\tsaveTours();\r\n\t\t\tthis.refreshPage(`tournaments-add`);\r\n\t\t},\r\n\t\tend(target, room, user, connection) {\r\n\t\t\tconst [sectionID, tourID] = target.split(',').map(toID).filter(Boolean);\r\n\t\t\tif (!sectionID || !tourID) {\r\n\t\t\t\treturn this.parse(`/help smogtours`);\r\n\t\t\t}\r\n\t\t\tconst section = tours[sectionID];\r\n\t\t\tif (!section) return this.popupReply(`Invalid section: \"${sectionID}\"`);\r\n\t\t\tconst idx = section.tours.findIndex(t => t.id === tourID);\r\n\t\t\tconst title = section.tours[idx].title;\r\n\t\t\tif (idx < 0) {\r\n\t\t\t\treturn this.popupReply(`Tour with ID \"${tourID}\" not found.`);\r\n\t\t\t}\r\n\t\t\tsection.tours.splice(idx, 1);\r\n\t\t\tthis.refreshPage(`tournaments-view-${sectionID}-${tourID}`);\r\n\t\t\tthis.popupReply(`Tour \"${title}\" ended.`);\r\n\t\t},\r\n\t\twhitelist(target, room, user) {\r\n\t\t\tthis.checkCan('rangeban');\r\n\t\t\tconst [sectionID, targetID] = target.split(',').map(toID).filter(Boolean);\r\n\t\t\tif (!sectionID || !targetID) {\r\n\t\t\t\treturn this.parse(`/help smogtours`);\r\n\t\t\t}\r\n\t\t\tconst section = tours[sectionID];\r\n\t\t\tif (!section) {\r\n\t\t\t\treturn this.errorReply(`Invalid section ID: \"${sectionID}\". Valid IDs: ${Object.keys(tours).join(', ')}`);\r\n\t\t\t}\r\n\t\t\tif (section.whitelist?.includes(targetID)) {\r\n\t\t\t\treturn this.errorReply(`That user is already whitelisted on that section.`);\r\n\t\t\t}\r\n\t\t\tif (!section.whitelist) section.whitelist = [];\r\n\t\t\tsection.whitelist.push(targetID);\r\n\t\t\tthis.privateGlobalModAction(\r\n\t\t\t\t`${user.name} whitelisted ${targetID} to manage tours for the ${section.title} section`\r\n\t\t\t);\r\n\t\t\tthis.globalModlog('TOUR WHITELIST', targetID);\r\n\t\t\tsaveTours();\r\n\t\t},\r\n\t\tunwhitelist(target, room, user) {\r\n\t\t\tthis.checkCan('rangeban');\r\n\t\t\tconst [sectionID, targetID] = target.split(',').map(toID).filter(Boolean);\r\n\t\t\tif (!sectionID || !targetID) {\r\n\t\t\t\treturn this.parse(`/help smogtours`);\r\n\t\t\t}\r\n\t\t\tconst section = tours[sectionID];\r\n\t\t\tif (!section) {\r\n\t\t\t\treturn this.errorReply(`Invalid section ID: \"${sectionID}\". Valid IDs: ${Object.keys(tours).join(', ')}`);\r\n\t\t\t}\r\n\t\t\tconst idx = section.whitelist?.indexOf(targetID) ?? -1;\r\n\t\t\tif (!section.whitelist || idx < 0) {\r\n\t\t\t\treturn this.errorReply(`${targetID} is not whitelisted in that section.`);\r\n\t\t\t}\r\n\t\t\tsection.whitelist.splice(idx, 1);\r\n\t\t\tif (!section.whitelist.length) {\r\n\t\t\t\tdelete section.whitelist;\r\n\t\t\t}\r\n\t\t\tthis.privateGlobalModAction(\r\n\t\t\t\t`${user.name} removed ${targetID} from the tour management whitelist for the ${section.title} section`\r\n\t\t\t);\r\n\t\t\tthis.globalModlog('TOUR UNWHITELIST', targetID);\r\n\t\t\tsaveTours();\r\n\t\t},\r\n\t\tview() {\r\n\t\t\treturn this.parse(`/join view-tournaments-all`);\r\n\t\t},\r\n\t},\r\n\tsmogtourshelp: [\r\n\t\t`/smogtours view - View a list of ongoing forum tournaments.`,\r\n\t\t`/smogtours whitelist [section], [user] - Whitelists the given [user] to manage tournaments for the given [section].`,\r\n\t\t`Requires: &`,\r\n\t\t`/smogtours unwhitelist [section], [user] - Removes the given [user] from the [section]'s management whitelist.`,\r\n\t\t`Requires: &`,\r\n\t],\r\n};\r\n\r\n/** Modifies `inner` in-place to wrap it in the necessary HTML to show a tab on the sidebar. */\r\nfunction renderTab(inner: string, isTitle?: boolean, isCur?: boolean) {\r\n\tisTitle = false;\r\n\tlet buf = '';\r\n\tif (isCur) {\r\n\t\t// the CSS breaks entirely without the folderhacks.\r\n\t\tbuf += `
`;\r\n\t\tbuf += `
`;\r\n\t\tbuf += `
${inner}
`;\r\n\t} else {\r\n\t\tif (!isTitle) {\r\n\t\t\tinner = `
${inner}
`;\r\n\t\t}\r\n\t\tbuf += `
${inner}
`;\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nconst refresh = (pageid: string) => (\r\n\t``\r\n);\r\n\r\nconst back = (section?: string) => (\r\n\t`` +\r\n\t` Back`\r\n);\r\n\r\nexport function renderPageChooser(curPage: string, buffer: string, user?: User) {\r\n\tlet buf = `
`;\r\n\tbuf += `
`;\r\n\tbuf += `
`;\r\n\r\n\tconst keys = Object.keys(tours);\r\n\tbuf += keys.map(cat => {\r\n\t\tlet innerBuf = '';\r\n\t\tconst tourData = tours[cat];\r\n\t\tinnerBuf += renderTab(\r\n\t\t\t`${tourData.title}`,\r\n\t\t\ttrue,\r\n\t\t\tcurPage === cat\r\n\t\t);\r\n\t\tif (tourData.tours.length) {\r\n\t\t\tUtils.sortBy(tourData.tours, t => -t.date);\r\n\t\t\tinnerBuf += tourData.tours.map(t => (\r\n\t\t\t\trenderTab(\r\n\t\t\t\t\t`${t.title}`,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\tcurPage === `${cat}-${t.id}`\r\n\t\t\t\t)\r\n\t\t\t)).join('');\r\n\t\t} else {\r\n\t\t\tinnerBuf += renderTab(`None`, false);\r\n\t\t}\r\n\t\treturn innerBuf;\r\n\t}).join('
');\r\n\tif (user && (checkWhitelisted('', user) || user?.can('rangeban'))) {\r\n\t\tbuf += `
`;\r\n\t\tbuf += renderTab(\r\n\t\t\t`Manage`, true, curPage === 'manage'\r\n\t\t);\r\n\t\tbuf += renderTab(\r\n\t\t\t`Start new`,\r\n\t\t\tfalse,\r\n\t\t\tcurPage === 'start',\r\n\t\t);\r\n\t\tbuf += renderTab(\r\n\t\t\t`Edit existing`,\r\n\t\t\tfalse,\r\n\t\t\tcurPage === 'edit',\r\n\t\t);\r\n\t\tif (user.can('rangeban')) {\r\n\t\t\tbuf += renderTab(\r\n\t\t\t\t`Whitelist`,\r\n\t\t\t\tfalse,\r\n\t\t\t\tcurPage === 'whitelist',\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tbuf += `
`;\r\n\tbuf += `${buffer}
`;\r\n\treturn buf;\r\n}\r\n\r\nfunction error(page: string, message: string, user: User) {\r\n\treturn renderPageChooser(page, `
${message}
`, user);\r\n}\r\n\r\nexport const pages: Chat.PageTable = {\r\n\ttournaments: {\r\n\t\tall(query, user) {\r\n\t\t\tlet buf = `${refresh(this.pageid)}
`;\r\n\t\t\tbuf += `

Welcome!

`;\r\n\t\t\tconst icon = tours.official.icon;\r\n\t\t\tif (icon) buf += `
`;\r\n\t\t\tbuf += `
`;\r\n\t\t\tthis.title = '[Tournaments] All';\r\n\t\t\tbuf += `

Smogon runs official tournaments across their metagames where the strongest and most `;\r\n\t\t\tbuf += `experienced competitors duke it out for prizes and recognition!

`;\r\n\t\t\tbuf += `You can see a listing of current official tournaments here; `;\r\n\t\t\tbuf += `by clicking any hyperlink, you will be directed to the forum for any given tournament!

`;\r\n\t\t\tbuf += `Be sure to sign up if you are eager to participate or `;\r\n\t\t\tbuf += `check it out if you want to spectate the most hyped games out there.

`;\r\n\t\t\tbuf += `For information on tournament rules and etiquette, check out this information thread.`;\r\n\t\t\tbuf += `

`;\r\n\t\t\tbuf += Object.keys(tours).map(catID => (\r\n\t\t\t\t`` +\r\n\t\t\t\t` ${tours[catID].title}`\r\n\t\t\t)).join(' ');\r\n\t\t\tbuf += `
`;\r\n\t\t\treturn renderPageChooser('', buf, user);\r\n\t\t},\r\n\t\tview(query, user) {\r\n\t\t\tconst [categoryID, tourID] = query.map(toID);\r\n\t\t\tif (!categoryID || !tourID) {\r\n\t\t\t\treturn error('', 'You must specify a tour category and a tour ID.', user);\r\n\t\t\t}\r\n\t\t\tthis.title = `[Tournaments] [${categoryID}] `;\r\n\t\t\tif (!tours[categoryID]) {\r\n\t\t\t\treturn error('', `Invalid tour section: '${categoryID}'.`, user);\r\n\t\t\t}\r\n\t\t\tconst tour = getTour(categoryID, tourID);\r\n\t\t\tif (!tour) {\r\n\t\t\t\treturn error(categoryID, `Tour '${tourID}' not found.`, user);\r\n\t\t\t}\r\n\t\t\t// unescaping since it's escaped on client\r\n\t\t\tthis.title += `${tour.title}`\r\n\t\t\t\t.replace(/"/g, '\"')\r\n\t\t\t\t.replace(/>/g, '>')\r\n\t\t\t\t.replace(/</g, '<')\r\n\t\t\t\t.replace(/&/g, '&');\r\n\t\t\t// stuff!\r\n\t\t\tlet buf = `${back(categoryID)}${refresh(this.pageid)}
`;\r\n\t\t\tbuf += `

${tour.title}

`;\r\n\t\t\tif (tour.image) {\r\n\t\t\t\tbuf += ``;\r\n\t\t\t}\r\n\t\t\tbuf += `

`;\r\n\t\t\tbuf += Utils.escapeHTML(tour.desc).replace(/\\n/ig, '
');\r\n\t\t\tbuf += `

View information and signups`;\r\n\t\t\ttry {\r\n\t\t\t\tcheckCanEdit(user, this, categoryID);\r\n\t\t\t\tbuf += `

Manage`;\r\n\t\t\t\tbuf += ``;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t} catch {}\r\n\t\t\treturn renderPageChooser(query.join('-'), buf, user);\r\n\t\t},\r\n\t\tsection(query, user) {\r\n\t\t\tconst categoryID = toID(query.shift());\r\n\t\t\tif (!categoryID) {\r\n\t\t\t\treturn error('', `No section specified.`, user);\r\n\t\t\t}\r\n\t\t\tthis.title = '[Tournaments] ' + categoryID;\r\n\t\t\tconst category = tours[categoryID];\r\n\t\t\tif (!category) {\r\n\t\t\t\treturn error('', Utils.html`Invalid section specified: '${categoryID}'`, user);\r\n\t\t\t}\r\n\t\t\tlet buf = `${back()}${refresh(this.pageid)}

${category.title}

`;\r\n\t\t\tif (category.icon) {\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t}\r\n\t\t\tbuf += `
${category.desc}
`;\r\n\t\t\tif (!category.tours.length) {\r\n\t\t\t\tbuf += `

There are currently no tournaments in this section with open signups.

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

Check back later for new tours.

`;\r\n\t\t\t} else {\r\n\t\t\t\tbuf += category.tours.map(tour => {\r\n\t\t\t\t\tlet innerBuf = `
`;\r\n\t\t\t\t\tinnerBuf += `${tour.title}
`;\r\n\t\t\t\t\tinnerBuf += Utils.escapeHTML(tour.shortDesc);\r\n\t\t\t\t\tinnerBuf += `
`;\r\n\t\t\t\t\treturn innerBuf;\r\n\t\t\t\t}).join('
');\r\n\t\t\t}\r\n\t\t\treturn renderPageChooser(categoryID, buf, user);\r\n\t\t},\r\n\t\tstart(query, user) {\r\n\t\t\tcheckCanEdit(user, this); // broad check first\r\n\t\t\tlet buf = `${refresh(this.pageid)}
`;\r\n\t\t\tthis.title = '[Tournaments] Add';\r\n\t\t\tbuf += `

Add new tournament


`;\r\n\t\t\tbuf += `
`;\r\n\t\t\tlet possibleCategory = Object.keys(tours)[0];\r\n\t\t\tfor (const k in tours) {\r\n\t\t\t\tif (tours[k].whitelist?.includes(user.id)) {\r\n\t\t\t\t\t// favor first one where user is whitelisted where applicable\r\n\t\t\t\t\tpossibleCategory = k;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbuf += `Title:
`;\r\n\t\t\tbuf += `Category:
`;\r\n\t\t\tbuf += `Info link:
`;\r\n\t\t\tbuf += `Image link (optional):
`;\r\n\t\t\tbuf += `Short description:

`;\r\n\t\t\tbuf += `Full description:

`;\r\n\t\t\tbuf += `
`;\r\n\t\t\treturn renderPageChooser('start', buf, user);\r\n\t\t},\r\n\t\t// edit single\r\n\t\tedit(query, user) {\r\n\t\t\tthis.title = '[Tournaments] Edit ';\r\n\t\t\tconst [sectionID, tourID] = query.map(toID);\r\n\t\t\tif (!sectionID || !tourID) {\r\n\t\t\t\treturn Chat.resolvePage(`view-tournaments-manage`, user, this.connection);\r\n\t\t\t}\r\n\t\t\tconst section = tours[sectionID];\r\n\t\t\tif (!section) return error('edit', `Invalid section: \"${sectionID}\"`, user);\r\n\t\t\tconst tour = section.tours.find(t => t.id === tourID);\r\n\t\t\tif (!tour) return error('edit', `Tour with ID \"${tourID}\" not found.`, user);\r\n\t\t\tlet buf = `${refresh(this.pageid)}

Edit tournament \"${tour.title}\"


`;\r\n\t\t\tbuf += `
`;\r\n\t\t\tbuf += `Title:
`;\r\n\t\t\tbuf += `Info link:
`;\r\n\t\t\tbuf += `Image link (optional):
`;\r\n\t\t\tbuf += `Short description:
`;\r\n\t\t\tbuf += `
`;\r\n\t\t\tconst desc = Utils.escapeHTML(tour.desc).replace(/
/g, ' ');\r\n\t\t\tbuf += `Full description:

`;\r\n\t\t\tbuf += ``;\r\n\t\t\treturn renderPageChooser('edit', buf, user);\r\n\t\t},\r\n\t\t// panel for all you have perms to edit\r\n\t\tmanage(query, user) {\r\n\t\t\tcheckCanEdit(user, this);\r\n\t\t\tthis.title = '[Tournaments] Manage';\r\n\t\t\tlet buf = `${refresh(this.pageid)}

Manage ongoing tournaments


`;\r\n\t\t\tbuf += Object.keys(tours).map(cat => {\r\n\t\t\t\tlet innerBuf = '';\r\n\t\t\t\ttry {\r\n\t\t\t\t\tcheckCanEdit(user, this, toID(cat));\r\n\t\t\t\t} catch {\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t}\r\n\t\t\t\tconst section = tours[cat];\r\n\t\t\t\tinnerBuf += `${section.title}:
`;\r\n\t\t\t\tinnerBuf += section.tours.map(\r\n\t\t\t\t\tt => `• ${t.title}`\r\n\t\t\t\t).join('
') || \"None active.\";\r\n\t\t\t\treturn innerBuf;\r\n\t\t\t}).filter(Boolean).join('
');\r\n\t\t\treturn renderPageChooser('manage', buf, user);\r\n\t\t},\r\n\t\twhitelists(query, user) {\r\n\t\t\tthis.checkCan('rangeban');\r\n\t\t\tlet buf = `${refresh(this.pageid)}

Section whitelists
`;\r\n\t\t\tfor (const k in tours) {\r\n\t\t\t\tbuf += `${tours[k].title}
`;\r\n\t\t\t\tconst whitelist = tours[k].whitelist || [];\r\n\t\t\t\tif (!whitelist.length) {\r\n\t\t\t\t\tbuf += `None.
`;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tbuf += Utils.sortBy(whitelist).map(f => `
  • ${f}
  • `).join('');\r\n\t\t\t\tbuf += `
    `;\r\n\t\t\t}\r\n\t\t\treturn renderPageChooser('whitelist', buf, user);\r\n\t\t},\r\n\t},\r\n};\r\n\r\nprocess.nextTick(() => {\r\n\tChat.multiLinePattern.register('/smogtours (add|edit)');\r\n});\r\n"], "mappings": "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", "names": [] }