{ "version": 3, "sources": ["../../../../server/chat-plugins/thing-of-the-day.ts"], "sourcesContent": ["import {FS, Utils} from '../../lib';\r\nimport {YouTube} from './youtube';\r\n\r\nconst MINUTE = 60 * 1000;\r\nconst PRENOM_BUMP_TIME = 2 * 60 * MINUTE;\r\n\r\nconst PRENOMS_FILE = 'config/chat-plugins/otd-prenoms.json';\r\nconst DATA_FILE = 'config/chat-plugins/otds.json';\r\n\r\nexport const prenoms: {[k: string]: [string, AnyObject][]} = JSON.parse(FS(PRENOMS_FILE).readIfExistsSync() || \"{}\");\r\nexport const otdData: OtdData = JSON.parse(FS(DATA_FILE).readIfExistsSync() || \"{}\");\r\nexport const otds = new Map();\r\n\r\nconst FINISH_HANDLERS: {[k: string]: (winner: AnyObject) => Promise} = {\r\n\tcotw: async winner => {\r\n\t\tconst {channel, nominator} = winner;\r\n\t\tconst searchResults = await YouTube.searchChannel(channel, 1);\r\n\t\tconst result = searchResults?.[0];\r\n\t\tif (result) {\r\n\t\t\tif (YouTube.data.channels[result]) return;\r\n\t\t\tvoid YouTube.getChannelData(`https://www.youtube.com/channel/${result}`);\r\n\t\t\tconst yt = Rooms.get('youtube');\r\n\t\t\tif (!yt) return;\r\n\t\t\tyt.sendMods(\r\n\t\t\t\t`|c|&|/log The channel with ID ${result} was added to the YouTube channel database.`\r\n\t\t\t);\r\n\t\t\tyt.modlog({\r\n\t\t\t\taction: `ADDCHANNEL`,\r\n\t\t\t\tnote: `${result} (${toID(nominator)})`,\r\n\t\t\t\tloggedBy: toID(`COTW`),\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n};\r\n\r\ninterface OtdSettings {\r\n\tid?: string;\r\n\tupdateOnNom?: boolean;\r\n\tkeys: string[];\r\n\ttitle: string;\r\n\tkeyLabels: string[];\r\n\ttimeLabel: string;\r\n\troomid: RoomID;\r\n}\r\n\r\ninterface OtdData {\r\n\t[k: string]: {settings: OtdSettings, winners: AnyObject[]};\r\n}\r\n\r\nfunction savePrenoms() {\r\n\treturn FS(PRENOMS_FILE).writeUpdate(() => JSON.stringify(prenoms));\r\n}\r\n\r\nfunction toNominationId(nomination: string) {\r\n\treturn nomination.toLowerCase().replace(/\\s/g, '').replace(/\\b&\\b/g, '');\r\n}\r\n\r\nclass OtdHandler {\r\n\tid: string;\r\n\tname: string;\r\n\troom: Room;\r\n\tnominations: Map;\r\n\tremovedNominations: Map;\r\n\tvoting: boolean;\r\n\ttimer: NodeJS.Timeout | null;\r\n\tkeys: string[];\r\n\tkeyLabels: string[];\r\n\ttimeLabel: string;\r\n\tsettings: OtdSettings;\r\n\tlastPrenom: number;\r\n\twinners: AnyObject[];\r\n\tconstructor(\r\n\t\tid: string, room: Room, settings: OtdSettings\r\n\t) {\r\n\t\tthis.id = id;\r\n\t\tthis.name = settings.title;\r\n\t\tthis.room = room;\r\n\r\n\t\tthis.nominations = new Map(prenoms[id]);\r\n\t\tthis.removedNominations = new Map();\r\n\r\n\t\tthis.voting = false;\r\n\t\tthis.timer = null;\r\n\r\n\t\tthis.keys = settings.keys;\r\n\t\tthis.keyLabels = settings.keyLabels;\r\n\t\tthis.timeLabel = settings.timeLabel;\r\n\t\tthis.settings = settings;\r\n\r\n\t\tthis.lastPrenom = 0;\r\n\r\n\t\tthis.winners = otdData[this.id]?.winners || [];\r\n\t}\r\n\r\n\tstatic create(room: Room, settings: OtdSettings) {\r\n\t\tconst {title, timeLabel} = settings;\r\n\t\tconst id = settings.id || toID(title).charAt(0) + 'ot' + timeLabel.charAt(0);\r\n\t\tconst handler = new OtdHandler(id, room, settings);\r\n\t\totds.set(id, handler);\r\n\t\tlet needsSave = false;\r\n\t\tfor (const winner of handler.winners) {\r\n\t\t\tif (winner.timestamp) {\r\n\t\t\t\twinner.time = winner.timestamp;\r\n\t\t\t\tdelete winner.timestamp;\r\n\t\t\t\tneedsSave = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (needsSave) handler.save();\r\n\t\treturn handler;\r\n\t}\r\n\r\n\tstatic parseOldWinners(content: string, keyLabels: string[], keys: string[]) {\r\n\t\tconst data = ('' + content).split(\"\\n\");\r\n\t\tconst winners = [];\r\n\t\tfor (const arg of data) {\r\n\t\t\tif (!arg || arg === '\\r') continue;\r\n\t\t\tif (arg.startsWith(`${keyLabels[0]}\\t`)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst entry: AnyObject = {};\r\n\t\t\tconst vals = arg.trim().split(\"\\t\");\r\n\t\t\tfor (let i = 0; i < vals.length; i++) {\r\n\t\t\t\tentry[keys[i]] = vals[i];\r\n\t\t\t}\r\n\t\t\tentry.time = Number(entry.time) || 0;\r\n\t\t\twinners.push(entry);\r\n\t\t}\r\n\t\treturn winners;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles old-format data from the IP and userid refactor\r\n\t */\r\n\tconvertNominations() {\r\n\t\tfor (const value of this.nominations.values()) {\r\n\t\t\tif (!Array.isArray(value.userids)) value.userids = Object.keys(value.userids);\r\n\t\t\tif (!Array.isArray(value.ips)) value.ips = Object.keys(value.ips);\r\n\t\t}\r\n\t\tfor (const value of this.removedNominations.values()) {\r\n\t\t\tif (!Array.isArray(value.userids)) value.userids = Object.keys(value.userids);\r\n\t\t\tif (!Array.isArray(value.ips)) value.ips = Object.keys(value.ips);\r\n\t\t}\r\n\t}\r\n\r\n\tstartVote() {\r\n\t\tthis.voting = true;\r\n\t\tthis.timer = setTimeout(() => this.rollWinner(), 20 * MINUTE);\r\n\t\tthis.display();\r\n\t}\r\n\r\n\tfinish() {\r\n\t\tthis.voting = false;\r\n\t\tthis.nominations = new Map();\r\n\t\tthis.removedNominations = new Map();\r\n\t\tdelete prenoms[this.id];\r\n\t\tvoid savePrenoms();\r\n\t\tif (this.timer) clearTimeout(this.timer);\r\n\t}\r\n\r\n\taddNomination(user: User, nomination: string) {\r\n\t\tconst id = toNominationId(nomination);\r\n\r\n\t\tif (this.winners.slice(-30)\r\n\t\t\t.some(entry => toNominationId(entry[this.keys[0]]) === id)\r\n\t\t) {\r\n\t\t\treturn user.sendTo(this.room, `This ${this.name.toLowerCase()} has already been ${this.id} in the past month.`);\r\n\t\t}\r\n\t\tfor (const value of this.removedNominations.values()) {\r\n\t\t\tif (value.userids.includes(toID(user)) || (!Config.noipchecks && value.ips.includes(user.latestIp))) {\r\n\t\t\t\treturn user.sendTo(\r\n\t\t\t\t\tthis.room,\r\n\t\t\t\t\t`Since your nomination has been removed by staff, you cannot submit another ${this.name.toLowerCase()} until the next round.`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst prevNom = this.nominations.get(id);\r\n\t\tif (prevNom) {\r\n\t\t\tif (!(prevNom.userids.includes(toID(user)) || (!Config.noipchecks && prevNom.ips.includes(user.latestIp)))) {\r\n\t\t\t\treturn user.sendTo(this.room, `This ${this.name.toLowerCase()} has already been nominated.`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (const [key, value] of this.nominations) {\r\n\t\t\tif (value.userids.includes(toID(user)) || (!Config.noipchecks && value.ips.includes(user.latestIp))) {\r\n\t\t\t\tuser.sendTo(this.room, `Your previous vote for ${value.nomination} will be removed.`);\r\n\t\t\t\tthis.nominations.delete(key);\r\n\t\t\t\tif (prenoms[this.id]) {\r\n\t\t\t\t\tconst idx = prenoms[this.id].findIndex(val => val[0] === key);\r\n\t\t\t\t\tif (idx > -1) {\r\n\t\t\t\t\t\tprenoms[this.id].splice(idx, 1);\r\n\t\t\t\t\t\tvoid savePrenoms();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst obj: {[k: string]: string} = {};\r\n\t\tobj[user.id] = user.name;\r\n\r\n\t\tconst nomObj = {\r\n\t\t\tnomination: nomination,\r\n\t\t\tname: user.name,\r\n\t\t\tuserids: user.previousIDs.concat(user.id),\r\n\t\t\tips: user.ips.slice(),\r\n\t\t};\r\n\r\n\t\tthis.nominations.set(id, nomObj);\r\n\r\n\t\tif (!prenoms[this.id]) prenoms[this.id] = [];\r\n\t\tprenoms[this.id].push([id, nomObj]);\r\n\t\tvoid savePrenoms();\r\n\r\n\t\tuser.sendTo(this.room, `Your nomination for ${nomination} was successfully submitted.`);\r\n\r\n\t\tlet updateOnly = !this.voting;\r\n\t\tif (updateOnly) {\r\n\t\t\tconst now = Date.now();\r\n\t\t\tif (now - this.lastPrenom > PRENOM_BUMP_TIME) {\r\n\t\t\t\tupdateOnly = false;\r\n\t\t\t\tthis.lastPrenom = now;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.settings.updateOnNom) {\r\n\t\t\tthis.display(updateOnly);\r\n\t\t}\r\n\t}\r\n\r\n\tgenerateNomWindow() {\r\n\t\tlet buffer = '';\r\n\r\n\t\tif (this.voting) {\r\n\t\t\tbuffer += `

Nominations for ${this.name} of the ${this.timeLabel} are in progress! Use /${this.id} nom to nominate a${['A', 'E', 'I', 'O', 'U'].includes(this.name[0]) ? 'n' : ''} ${this.name.toLowerCase()}!

`;\r\n\t\t\tif (this.nominations.size) buffer += `Nominations:`;\r\n\t\t} else {\r\n\t\t\tbuffer += `

Pre-noms for ${this.name} of the ${this.timeLabel}. Use /${this.id} nom to nominate a${['A', 'E', 'I', 'O', 'U'].includes(this.name[0]) ? 'n' : ''} ${this.name.toLowerCase()}:

`;\r\n\t\t}\r\n\r\n\t\tif (this.winners.length) {\r\n\t\t\tconst winner = this.winners[this.winners.length - 1];\r\n\r\n\t\t\tbuffer += `

Current winner: ${winner[this.keys[0]]} (nominated by ${winner.nominator})

`;\r\n\t\t}\r\n\r\n\t\tconst entries = [];\r\n\r\n\t\tfor (const value of this.nominations.values()) {\r\n\t\t\tentries.push(Utils.html`
  • ${value.nomination} (Submitted by ${value.name})
  • `);\r\n\t\t}\r\n\r\n\t\tif (entries.length > 20) {\r\n\t\t\tbuffer += `
      ${entries.slice(0, Math.ceil(entries.length / 2)).join('')}
      ${entries.slice(Math.ceil(entries.length / 2)).join('')}
    `;\r\n\t\t} else {\r\n\t\t\tbuffer += `
      ${entries.join('')}
    `;\r\n\t\t}\r\n\r\n\t\tbuffer += `
    `;\r\n\r\n\t\treturn buffer;\r\n\t}\r\n\r\n\tdisplay(update = false) {\r\n\t\tif (update) {\r\n\t\t\tthis.room.uhtmlchange('otd', this.generateNomWindow());\r\n\t\t} else {\r\n\t\t\tthis.room.add(`|uhtml|otd|${this.generateNomWindow()}`);\r\n\t\t}\r\n\t}\r\n\r\n\tdisplayTo(connection: Connection) {\r\n\t\tconnection.sendTo(this.room, `|uhtml|otd|${this.generateNomWindow()}`);\r\n\t}\r\n\r\n\trollWinner() {\r\n\t\tconst keys = [...this.nominations.keys()];\r\n\t\tif (!keys.length) return false;\r\n\r\n\t\tconst winner = this.nominations.get(keys[Math.floor(Math.random() * keys.length)]);\r\n\t\tif (!winner) return false; // Should never happen but shuts typescript up.\r\n\t\tconst winnerEntry = this.appendWinner(winner.nomination, winner.name);\r\n\r\n\t\tconst names = [...this.nominations.values()].map(obj => obj.name);\r\n\r\n\t\tconst columns = names.length > 27 ? 4 : names.length > 18 ? 3 : names.length > 9 ? 2 : 1;\r\n\t\tlet content = '';\r\n\t\tfor (let i = 0; i < columns; i++) {\r\n\t\t\tcontent += `${names.slice(Math.ceil((i / columns) * names.length), Math.ceil(((i + 1) / columns) * names.length)).join('
    ')}`;\r\n\t\t}\r\n\t\tconst namesHTML = `${content}

    `;\r\n\r\n\t\tconst finishHandler = FINISH_HANDLERS[this.id];\r\n\t\tif (finishHandler) {\r\n\t\t\tvoid finishHandler(winnerEntry);\r\n\t\t}\r\n\t\tthis.room.add(\r\n\t\t\tUtils.html `|uhtml|otd|

    ` +\r\n\t\t\t`Nominations for ${this.name} of the ${this.timeLabel} are over!

    ` +\r\n\t\t\t`Out of ${keys.length} nominations, we randomly selected ${winner.nomination} as the winner!` +\r\n\t\t\t`(Nomination by ${winner.name})

    Thanks to today's participants:` + namesHTML\r\n\t\t);\r\n\t\tthis.room.update();\r\n\r\n\t\tthis.finish();\r\n\t\treturn true;\r\n\t}\r\n\r\n\tremoveNomination(name: string) {\r\n\t\tname = toID(name);\r\n\r\n\t\tlet success = false;\r\n\t\tfor (const [key, value] of this.nominations) {\r\n\t\t\tif (value.userids.includes(name)) {\r\n\t\t\t\tthis.removedNominations.set(key, value);\r\n\t\t\t\tthis.nominations.delete(key);\r\n\t\t\t\tif (prenoms[this.id]) {\r\n\t\t\t\t\tconst idx = prenoms[this.id].findIndex(val => val[0] === key);\r\n\t\t\t\t\tif (idx > -1) {\r\n\t\t\t\t\t\tprenoms[this.id].splice(idx, 1);\r\n\t\t\t\t\t\tvoid savePrenoms();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsuccess = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.voting) this.display();\r\n\t\treturn success;\r\n\t}\r\n\r\n\tforceWinner(winner: string, user: string) {\r\n\t\tthis.appendWinner(winner, user);\r\n\t\tthis.finish();\r\n\t}\r\n\r\n\tappendWinner(nomination: string, user: string): AnyObject {\r\n\t\tconst entry: AnyObject = {time: Date.now(), nominator: user};\r\n\t\tentry[this.keys[0]] = nomination;\r\n\t\tthis.winners.push(entry);\r\n\t\tthis.save();\r\n\t\treturn entry;\r\n\t}\r\n\r\n\tremoveWinner(nominationName: string) {\r\n\t\tfor (const [i, entry] of this.winners.entries()) {\r\n\t\t\tif (toID(entry[this.keys[0]]) === toID(nominationName)) {\r\n\t\t\t\tconst removed = this.winners.splice(i, 1);\r\n\t\t\t\tthis.save();\r\n\t\t\t\treturn removed[0];\r\n\t\t\t}\r\n\t\t}\r\n\t\tthrow new Chat.ErrorMessage(`The winner with nomination ${nominationName} could not be found.`);\r\n\t}\r\n\r\n\tsetWinnerProperty(properties: {[k: string]: string}) {\r\n\t\tif (!this.winners.length) return;\r\n\t\tfor (const i in properties) {\r\n\t\t\tthis.winners[this.winners.length - 1][i] = properties[i];\r\n\t\t}\r\n\t\treturn this.save();\r\n\t}\r\n\r\n\tsave(destroy = false) {\r\n\t\tif (!destroy) {\r\n\t\t\totdData[this.id] = {\r\n\t\t\t\tsettings: this.settings,\r\n\t\t\t\twinners: this.winners,\r\n\t\t\t};\r\n\t\t}\r\n\t\tFS(DATA_FILE).writeUpdate(() => JSON.stringify(otdData));\r\n\t}\r\n\r\n\tdestroy() {\r\n\t\tthis.room = null!;\r\n\t\tdelete otdData[this.id];\r\n\t\totds.delete(this.id);\r\n\t\tdelete Chat.commands[this.id];\r\n\t\tdelete Chat.pages[this.id];\r\n\t\tthis.save(true);\r\n\t}\r\n\r\n\tasync generateWinnerDisplay() {\r\n\t\tif (!this.winners.length) return false;\r\n\t\tconst winner = this.winners[this.winners.length - 1];\r\n\r\n\t\tlet output = Utils.html `

    ` +\r\n\t\t`

    The ${this.name} of the ${this.timeLabel} is ` +\r\n\t\t`${winner[this.keys[0]]}${winner.author ? ` by ${winner.author}` : ''}.`;\r\n\r\n\t\tif (winner.quote) output += Utils.html `
    \"${winner.quote}\"`;\r\n\t\tif (winner.tagline) output += Utils.html `
    ${winner.tagline}`;\r\n\t\toutput += `

    `;\r\n\t\tif (winner.image) {\r\n\t\t\ttry {\r\n\t\t\t\tconst [width, height] = await Chat.fitImage(winner.image, 100, 100);\r\n\t\t\t\toutput += Utils.html ``;\r\n\t\t\t} catch {}\r\n\t\t}\r\n\t\toutput += `
    `;\r\n\t\tif (winner.event) output += Utils.html `Event: ${winner.event}
    `;\r\n\t\tif (winner.song) {\r\n\t\t\toutput += `Song: `;\r\n\t\t\tif (winner.link) {\r\n\t\t\t\toutput += Utils.html `${winner.song}`;\r\n\t\t\t} else {\r\n\t\t\t\toutput += Utils.escapeHTML(winner.song);\r\n\t\t\t}\r\n\t\t\toutput += `
    `;\r\n\t\t} else if (winner.link) {\r\n\t\t\toutput += Utils.html `Link: ${winner.link}
    `;\r\n\t\t}\r\n\r\n\t\t// Batch these together on 2 lines. Order intentional.\r\n\t\tconst athleteDetails = [];\r\n\t\tif (winner.sport) athleteDetails.push(Utils.html `Sport: ${winner.sport}`);\r\n\t\tif (winner.team) athleteDetails.push(Utils.html `Team: ${winner.team}`);\r\n\t\tif (winner.age) athleteDetails.push(Utils.html `Age: ${winner.age}`);\r\n\t\tif (winner.country) athleteDetails.push(Utils.html `Nationality: ${winner.country}`);\r\n\r\n\t\tif (athleteDetails.length) {\r\n\t\t\toutput += athleteDetails.slice(0, 2).join(' | ') + '
    ';\r\n\t\t\tif (athleteDetails.length > 2) output += athleteDetails.slice(2).join(' | ') + '
    ';\r\n\t\t}\r\n\r\n\t\toutput += Utils.html `Nominated by ${winner.nominator}.`;\r\n\t\toutput += `
    `;\r\n\r\n\t\treturn output;\r\n\t}\r\n\r\n\tgenerateWinnerList(context: Chat.PageContext) {\r\n\t\tcontext.title = `${this.id.toUpperCase()} Winners`;\r\n\t\tlet buf = `

    ${this.name} of the ${this.timeLabel} Winners

    `;\r\n\r\n\t\t// Only use specific fields for displaying in winners list.\r\n\t\tconst columns: string[] = [];\r\n\t\tconst labels = [];\r\n\r\n\t\tfor (let i = 0; i < this.keys.length; i++) {\r\n\t\t\tif (i === 0 || ['song', 'event', 'link', 'tagline', 'sport', 'country']\r\n\t\t\t\t.includes(this.keys[i]) && !(this.keys[i] === 'link' && this.keys.includes('song'))\r\n\t\t\t) {\r\n\t\t\t\tcolumns.push(this.keys[i]);\r\n\t\t\t\tlabels.push(this.keyLabels[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!columns.includes('time')) {\r\n\t\t\tcolumns.push('time');\r\n\t\t\tlabels.push('Timestamp');\r\n\t\t}\r\n\r\n\t\tlet content = ``;\r\n\r\n\t\tcontent += `${labels.map(label => `

    ${label}

    `).join('')}`;\r\n\t\tfor (let i = this.winners.length - 1; i >= 0; i--) {\r\n\t\t\tconst entry = columns.map(col => {\r\n\t\t\t\tlet val = this.winners[i][col];\r\n\t\t\t\tif (!val) return '';\r\n\t\t\t\tswitch (col) {\r\n\t\t\t\tcase 'time':\r\n\t\t\t\t\tconst date = new Date(parseInt(this.winners[i].time));\r\n\r\n\t\t\t\t\tconst pad = (num: number) => num < 10 ? '0' + num : num;\r\n\r\n\t\t\t\t\treturn Utils.html`${pad(date.getMonth() + 1)}-${pad(date.getDate())}-${date.getFullYear()}`;\r\n\t\t\t\tcase 'song':\r\n\t\t\t\t\tif (!this.winners[i].link) return val;\r\n\t\t\t\t\t// falls through\r\n\t\t\t\tcase 'link':\r\n\t\t\t\t\treturn `${val}`;\r\n\t\t\t\tcase 'book':\r\n\t\t\t\t\tval = `${val}${this.winners[i].author ? ` by ${this.winners[i].author}` : ''}`;\r\n\t\t\t\t\t// falls through\r\n\t\t\t\tcase columns[0]:\r\n\t\t\t\t\treturn `${Utils.escapeHTML(val)}${this.winners[i].nominator ? Utils.html `
    nominated by ${this.winners[i].nominator}` : ''}`;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn Utils.escapeHTML(val);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tcontent += `${entry.map(val => `${val}`).join('')}`;\r\n\t\t}\r\n\t\tif (!content) {\r\n\t\t\tbuf += `

    There have been no ${this.id} winners.

    `;\r\n\t\t} else {\r\n\t\t\tbuf += `${content}
    `;\r\n\t\t}\r\n\t\tbuf += `
    `;\r\n\t\treturn buf;\r\n\t}\r\n}\r\n\r\nfunction selectHandler(message: string) {\r\n\tconst id = toID(message.substring(1).split(' ')[0]);\r\n\tconst handler = otds.get(id);\r\n\tif (!handler) throw new Error(\"Invalid type for otd handler.\");\r\n\treturn handler;\r\n}\r\n\r\nexport const otdCommands: Chat.ChatCommands = {\r\n\tstart(target, room, user, connection, cmd) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tif (handler.voting) {\r\n\t\t\treturn this.errorReply(\r\n\t\t\t\t`The nomination for the ${handler.name} of the ${handler.timeLabel} nomination is already in progress.`\r\n\t\t\t);\r\n\t\t}\r\n\t\thandler.startVote();\r\n\r\n\t\tthis.privateModAction(`${user.name} has started nominations for the ${handler.name} of the ${handler.timeLabel}.`);\r\n\t\tthis.modlog(`${handler.id.toUpperCase()} START`, null);\r\n\t},\r\n\tstarthelp: [`/-otd start - Starts nominations for the Thing of the Day. Requires: % @ # &`],\r\n\r\n\tend(target, room, user) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tif (!handler.voting) {\r\n\t\t\treturn this.errorReply(`There is no ${handler.name} of the ${handler.timeLabel} nomination in progress.`);\r\n\t\t}\r\n\t\tif (!handler.nominations.size) {\r\n\t\t\treturn this.errorReply(`Can't select the ${handler.name} of the ${handler.timeLabel} without nominations.`);\r\n\t\t}\r\n\t\thandler.rollWinner();\r\n\r\n\t\tthis.privateModAction(`${user.name} has ended nominations for the ${handler.name} of the ${handler.timeLabel}.`);\r\n\t\tthis.modlog(`${handler.id.toUpperCase()} END`, null);\r\n\t},\r\n\tendhelp: [\r\n\t\t`/-otd end - End nominations for the Thing of the Day and set it to a randomly selected nomination. Requires: % @ # &`,\r\n\t],\r\n\r\n\tnom(target, room, user) {\r\n\t\tthis.checkChat(target);\r\n\t\tif (!target) return this.parse('/help otd');\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\r\n\t\tif (!toNominationId(target).length || target.length > 75) {\r\n\t\t\treturn this.sendReply(`'${target}' is not a valid ${handler.name.toLowerCase()} name.`);\r\n\t\t}\r\n\t\thandler.addNomination(user, target);\r\n\t},\r\n\tnomhelp: [`/-otd nom [nomination] - Nominate something for Thing of the Day.`],\r\n\r\n\tview(target, room, user, connection) {\r\n\t\tthis.checkChat();\r\n\t\tif (!this.runBroadcast()) return false;\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\r\n\t\tif (this.broadcasting) {\r\n\t\t\tselectHandler(this.message).display();\r\n\t\t} else {\r\n\t\t\tselectHandler(this.message).displayTo(connection);\r\n\t\t}\r\n\t},\r\n\tviewhelp: [`/-otd view - View the current nominations for the Thing of the Day.`],\r\n\r\n\tremove(target, room, user) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tconst userid = toID(target);\r\n\t\tif (!userid) return this.errorReply(`'${target}' is not a valid username.`);\r\n\r\n\t\tif (handler.removeNomination(userid)) {\r\n\t\t\tthis.privateModAction(`${user.name} removed ${target}'s nomination for the ${handler.name} of the ${handler.timeLabel}.`);\r\n\t\t\tthis.modlog(`${handler.id.toUpperCase()} REMOVENOM`, userid);\r\n\t\t} else {\r\n\t\t\tthis.sendReply(`User '${target}' has no nomination for the ${handler.name} of the ${handler.timeLabel}.`);\r\n\t\t}\r\n\t},\r\n\tremovehelp: [\r\n\t\t`/-otd remove [username] - Remove a user's nomination for the Thing of the Day.`,\r\n\t\t `Prevents them from voting again until the next round. Requires: % @ # &`,\r\n\t],\r\n\r\n\tremovewinner(target, room, user) {\r\n\t\tconst handler = selectHandler(this.message);\r\n\t\troom = this.requireRoom(handler.room.roomid);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tif (!toID(target)) {\r\n\t\t\treturn this.parse(`/help aotd removewinner`);\r\n\t\t}\r\n\t\tconst removed = handler.removeWinner(target);\r\n\t\tthis.privateModAction(`${user.name} removed the nomination for ${removed[handler.keys[0]]} from ${removed.nominator}`);\r\n\t\tthis.modlog(`${handler.id.toUpperCase()} REMOVEWINNER`, removed.nominator, removed[handler.keys[0]]);\r\n\t},\r\n\tremovewinnerhelp: [\r\n\t\t`/-otd removewinner [nomination] - Remove winners matching the given [nomination] from Thing of the Day.`,\r\n\t\t`Requires: % @ # &`,\r\n\t],\r\n\r\n\tforce(target, room, user) {\r\n\t\tthis.checkChat();\r\n\t\tif (!target) return this.parse('/help aotd force');\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('declare', null, room);\r\n\r\n\t\tif (!toNominationId(target).length || target.length > 50) {\r\n\t\t\treturn this.sendReply(`'${target}' is not a valid ${handler.name.toLowerCase()} name.`);\r\n\t\t}\r\n\t\thandler.forceWinner(target, user.name);\r\n\t\tthis.privateModAction(`${user.name} forcibly set the ${handler.name} of the ${handler.timeLabel} to ${target}.`);\r\n\t\tthis.modlog(`${handler.id.toUpperCase()} FORCE`, user.name, target);\r\n\t\troom.add(`The ${handler.name} of the ${handler.timeLabel} was forcibly set to '${target}'`);\r\n\t},\r\n\tforcehelp: [\r\n\t\t`/-otd force [nomination] - Forcibly sets the Thing of the Day without a nomination round. Requires: # &`,\r\n\t],\r\n\r\n\tdelay(target, room, user) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tif (!(handler.voting && handler.timer)) {\r\n\t\t\treturn this.errorReply(`There is no ${handler.name} of the ${handler.timeLabel} nomination to disable the timer for.`);\r\n\t\t}\r\n\t\tclearTimeout(handler.timer);\r\n\r\n\t\tthis.privateModAction(`${user.name} disabled the ${handler.name} of the ${handler.timeLabel} timer.`);\r\n\t},\r\n\tdelayhelp: [\r\n\t\t`/-otd delay - Turns off the automatic 20 minute timer for Thing of the Day voting rounds. Requires: % @ # &`,\r\n\t],\r\n\r\n\tset(target, room, user) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\t\tthis.checkCan('mute', null, room);\r\n\r\n\t\tconst params = target.split(target.includes('|') ? '|' : ',').map(param => param.trim());\r\n\r\n\t\tconst changelist: {[k: string]: string} = {};\r\n\r\n\t\tfor (const param of params) {\r\n\t\t\tlet [key, ...values] = param.split(':');\r\n\t\t\tif (!key || !values.length) return this.errorReply(`Syntax error in '${param}'`);\r\n\r\n\t\t\tkey = key.trim();\r\n\t\t\tconst value = values.join(':').trim();\r\n\r\n\t\t\tif (!handler.keys.includes(key)) {\r\n\t\t\t\treturn this.errorReply(`Invalid key: '${key}'. Valid keys: ${handler.keys.join(', ')}`);\r\n\t\t\t}\r\n\r\n\t\t\tswitch (key) {\r\n\t\t\tcase 'artist':\r\n\t\t\tcase 'film':\r\n\t\t\tcase 'show':\r\n\t\t\tcase 'channel':\r\n\t\t\tcase 'book':\r\n\t\t\tcase 'author':\r\n\t\t\tcase 'athlete':\r\n\t\t\t\tif (!toNominationId(value) || value.length > 50) return this.errorReply(`Please enter a valid ${key} name.`);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'quote':\r\n\t\t\tcase 'tagline':\r\n\t\t\tcase 'match':\r\n\t\t\tcase 'event':\r\n\t\t\tcase 'videogame':\r\n\t\t\t\tif (!value.length || value.length > 150) return this.errorReply(`Please enter a valid ${key}.`);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'sport':\r\n\t\t\tcase 'team':\r\n\t\t\tcase 'song':\r\n\t\t\tcase 'country':\r\n\t\t\t\tif (!value.length || value.length > 50) return this.errorReply(`Please enter a valid ${key} name.`);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'link':\r\n\t\t\tcase 'image':\r\n\t\t\t\tif (!/https?:\\/\\//.test(value)) {\r\n\t\t\t\t\treturn this.errorReply(`Please enter a valid URL for the ${key} (starting with http:// or https://)`);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.length > 200) return this.errorReply(\"URL too long.\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'age':\r\n\t\t\t\tconst num = parseInt(value);\r\n\t\t\t\t// let's assume someone isn't over 100 years old? Maybe we should for the memes\r\n\t\t\t\t// but i doubt there's any legit athlete over 100.\r\n\t\t\t\tif (isNaN(num) || num < 1 || num > 100) return this.errorReply('Please enter a valid number as an age');\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\t// another custom key w/o validation\r\n\t\t\t\tif (!toNominationId(value)) {\r\n\t\t\t\t\treturn this.errorReply(`No value provided for key ${key}.`);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tchangelist[key] = value;\r\n\t\t}\r\n\r\n\t\tconst keys = Object.keys(changelist);\r\n\r\n\t\tif (keys.length) {\r\n\t\t\tvoid handler.setWinnerProperty(changelist);\r\n\t\t\tthis.modlog(handler.id.toUpperCase(), null, `changed ${keys.join(', ')}`);\r\n\t\t\treturn this.privateModAction(`${user.name} changed the following propert${Chat.plural(keys, 'ies', 'y')} of the ${handler.name} of the ${handler.timeLabel}: ${keys.join(', ')}`);\r\n\t\t}\r\n\t},\r\n\tsethelp: [\r\n\t\t`/-otd set property: value[, property: value] - Set the winner, quote, song, link or image for the current Thing of the Day.`,\r\n\t\t`Requires: % @ # &`,\r\n\t],\r\n\r\n\ttoggleupdate(target, room, user) {\r\n\t\tconst otd = selectHandler(this.message);\r\n\t\troom = this.requireRoom(otd.room.roomid);\r\n\r\n\t\tthis.checkCan('declare', null, room);\r\n\t\tlet logMessage = '';\r\n\r\n\t\tif (this.meansYes(target)) {\r\n\t\t\tif (otd.settings.updateOnNom) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`This -OTD is already set to update automatically on nomination.`);\r\n\t\t\t}\r\n\t\t\totd.settings.updateOnNom = true;\r\n\t\t\tlogMessage = 'update automatically on nomination';\r\n\t\t} else {\r\n\t\t\tif (!otd.settings.updateOnNom) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`This -OTD is not set to update automatically on nomination.`);\r\n\t\t\t}\r\n\t\t\tdelete otd.settings.updateOnNom;\r\n\t\t\tlogMessage = 'not update on nomination';\r\n\t\t}\r\n\t\tthis.privateModAction(`${user.name} set the ${otd.name} of the ${otd.timeLabel} to ${logMessage}`);\r\n\t\tthis.modlog(`OTD TOGGLEUPDATE`, null, logMessage);\r\n\t\totd.save();\r\n\t},\r\n\r\n\twinners(target, room, user, connection) {\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\r\n\t\treturn this.parse(`/join view-${handler.id}`);\r\n\t},\r\n\twinnershelp: [`/-otd winners - Displays a list of previous things of the day.`],\r\n\r\n\tasync ''(target, room) {\r\n\t\tthis.checkChat();\r\n\t\tif (!this.runBroadcast()) return false;\r\n\r\n\t\tconst handler = selectHandler(this.message);\r\n\t\tif (!handler.room) return this.errorReply(`The room for this -otd doesn't exist.`);\r\n\r\n\t\tif (room !== handler.room) return this.errorReply(`This command can only be used in ${handler.room.title}.`);\r\n\r\n\t\tconst text = await handler.generateWinnerDisplay();\r\n\t\tif (!text) return this.errorReply(\"There is no winner yet.\");\r\n\t\tthis.sendReplyBox(text);\r\n\t},\r\n};\r\n\r\nexport const pages: Chat.PageTable = {};\r\nexport const commands: Chat.ChatCommands = {\r\n\totd: {\r\n\t\tcreate(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tif (room.settings.isPrivate) {\r\n\t\t\t\treturn this.errorReply(`This command is only available in public rooms`);\r\n\t\t\t}\r\n\t\t\tconst count = [...otds.values()].filter(otd => otd.room.roomid === room!.roomid).length;\r\n\t\t\tif (count > 3) {\r\n\t\t\t\treturn this.errorReply(`This room already has 3+ -otd's.`);\r\n\t\t\t}\r\n\t\t\tthis.checkCan('rangeban');\r\n\r\n\t\t\tif (!toID(target)) {\r\n\t\t\t\treturn this.parse(`/help otd`);\r\n\t\t\t}\r\n\t\t\tconst [title, time, ...keyLabels] = target.split(',').map(i => i.trim());\r\n\t\t\tif (!toID(title)) {\r\n\t\t\t\treturn this.errorReply(`Invalid title.`);\r\n\t\t\t}\r\n\t\t\tconst timeLabel = toID(time);\r\n\t\t\tif (!['week', 'day'].includes(timeLabel)) {\r\n\t\t\t\treturn this.errorReply(\"Invalid time label - use 'week' or 'month'\");\r\n\t\t\t}\r\n\t\t\tconst id = `${title.charAt(0)}ot${timeLabel.charAt(0)}`;\r\n\t\t\tconst existing = otds.get(id);\r\n\t\t\tif (existing) {\r\n\t\t\t\tthis.errorReply(`That -OTD already exists (${existing.name} of the ${existing.timeLabel}, in ${existing.room.title})`);\r\n\t\t\t\treturn this.errorReply(`Try picking a new title.`);\r\n\t\t\t}\r\n\t\t\tconst titleIdx = keyLabels.map(toID).indexOf(toID(title));\r\n\t\t\tif (titleIdx > -1) {\r\n\t\t\t\tkeyLabels.splice(titleIdx, 1);\r\n\t\t\t}\r\n\t\t\tkeyLabels.unshift(title);\r\n\r\n\t\t\tconst filteredKeys = keyLabels.map(toNominationId).filter(Boolean);\r\n\t\t\tif (!filteredKeys.length) {\r\n\t\t\t\treturn this.errorReply(`No valid key labels given.`);\r\n\t\t\t}\r\n\t\t\tif (new Set(filteredKeys).size !== keyLabels.length) {\r\n\t\t\t\treturn this.errorReply(`Invalid keys in set - do not use duplicate key labels.`);\r\n\t\t\t}\r\n\t\t\tif (filteredKeys.length < 3) {\r\n\t\t\t\treturn this.errorReply(`Specify at least 3 key labels.`);\r\n\t\t\t}\r\n\t\t\tif (filteredKeys.some(k => k.length < 3 || k.length > 50)) {\r\n\t\t\t\treturn this.errorReply(`All labels must be more than 3 characters and less than 50 characters long.`);\r\n\t\t\t}\r\n\t\t\tconst otd = OtdHandler.create(room, {\r\n\t\t\t\tkeyLabels, keys: filteredKeys, title, timeLabel, roomid: room.roomid,\r\n\t\t\t});\r\n\t\t\tconst name = `${otd.name} of the ${otd.timeLabel}`;\r\n\t\t\tthis.globalModlog(`OTD CREATE`, null, `${name} - ${filteredKeys.join(', ')}`);\r\n\t\t\tthis.privateGlobalModAction(`${user.name} created the ${name} for ${room.title}`);\r\n\t\t\totd.save();\r\n\t\t},\r\n\t\tupdateroom(target, room, user) {\r\n\t\t\tthis.checkCan('rangeban');\r\n\t\t\tconst [otdId, roomid] = target.split(',').map(i => toID(i));\r\n\t\t\tif (!otdId || !roomid) {\r\n\t\t\t\treturn this.parse('/help otd');\r\n\t\t\t}\r\n\t\t\tconst otd = otds.get(otdId);\r\n\t\t\tif (!otd) {\r\n\t\t\t\treturn this.errorReply(`OTD ${otd} not found.`);\r\n\t\t\t}\r\n\t\t\tconst targetRoom = Rooms.get(roomid);\r\n\t\t\tif (!targetRoom) {\r\n\t\t\t\treturn this.errorReply(`Room ${roomid} not found.`);\r\n\t\t\t}\r\n\t\t\tconst oldRoom = otd.settings.roomid.slice();\r\n\t\t\totd.settings.roomid = targetRoom.roomid;\r\n\t\t\totd.room = targetRoom;\r\n\t\t\totd.save();\r\n\t\t\tthis.privateGlobalModAction(\r\n\t\t\t\t`${user.name} updated the room for the ${otd.name} of the ${otd.timeLabel} from ${oldRoom} to ${targetRoom}`\r\n\t\t\t);\r\n\t\t\tthis.globalModlog(`OTD UPDATEROOM`, null, `${otd.id} to ${targetRoom} from ${oldRoom}`);\r\n\t\t},\r\n\t\tdelete(target, room, user) {\r\n\t\t\tthis.checkCan('rangeban');\r\n\t\t\ttarget = toID(target);\r\n\t\t\tif (!target) {\r\n\t\t\t\treturn this.parse(`/help otd`);\r\n\t\t\t}\r\n\t\t\tconst otd = otds.get(target);\r\n\t\t\tif (!otd) return this.errorReply(`OTD ${target} not found.`);\r\n\t\t\totd.destroy();\r\n\t\t\tthis.globalModlog(`OTD DELETE`, null, target);\r\n\t\t\tthis.privateGlobalModAction(`${user.name} deleted the OTD ${otd.name} of the ${otd.timeLabel}`);\r\n\t\t},\r\n\t},\r\n\totdhelp: [\r\n\t\t`/otd create [title], [time], [...labels] - Creates a Thing of the Day with the given [name], [time], and [labels]. Requires: &`,\r\n\t\t`/otd updateroom [otd], [room] - Updates the room for the given [otd] to the new [room]. Requires: &`,\r\n\t\t`/otd delete [otd] - Removes the given Thing of the Day. Requires: &`,\r\n\t],\r\n};\r\n\r\nconst otdHelp = [\r\n\t`Thing of the Day plugin commands (aotd, fotd, sotd, cotd, botw, motw, anotd):`,\r\n\t`- /-otd - View the current Thing of the Day.`,\r\n\t`- /-otd start - Starts nominations for the Thing of the Day. Requires: % @ # &`,\r\n\t`- /-otd nom [nomination] - Nominate something for Thing of the Day.`,\r\n\t`- /-otd remove [username] - Remove a user's nomination for the Thing of the Day and prevent them from voting again until the next round. Requires: % @ # &`,\r\n\t`- /-otd end - End nominations for the Thing of the Day and set it to a randomly selected nomination. Requires: % @ # &`,\r\n\t`- /-otd removewinner [nomination] - Remove a winner with the given [nomination] from the winners list. Requires: % @ # &`,\r\n\t`- /-otd force [nomination] - Forcibly sets the Thing of the Day without a nomination round. Requires: # &`,\r\n\t`- /-otd delay - Turns off the automatic 20 minute timer for Thing of the Day voting rounds. Requires: % @ # &`,\r\n\t`- /-otd set property: value[, property: value] - Set the winner, quote, song, link or image for the current Thing of the Day. Requires: % @ # &`,\r\n\t`- /-otd winners - Displays a list of previous things of the day.`,\r\n\t`- /-otd toggleupdate [on|off] - Changes the Thing of the Day to display on nomination ([on] to update, [off] to turn off updates). Requires: % @ # &`,\r\n];\r\n\r\nfor (const otd in otdData) {\r\n\tconst data = otdData[otd];\r\n\tconst settings = data.settings;\r\n\tconst room = Rooms.get(settings.roomid);\r\n\tif (!room) {\r\n\t\tMonitor.warn(`Room for -otd ${settings.title} of the ${settings.timeLabel} (${settings.roomid}) not found.`);\r\n\t\tcontinue;\r\n\t}\r\n\tOtdHandler.create(room, settings);\r\n}\r\n\r\nfor (const [k, v] of otds) {\r\n\tpages[k] = function () {\r\n\t\treturn v.generateWinnerList(this);\r\n\t};\r\n\tcommands[k] = otdCommands;\r\n\tcommands[`${k}help`] = otdHelp;\r\n}\r\n\r\nexport const handlers: Chat.Handlers = {\r\n\tonRenameRoom(oldID, newID, room) {\r\n\t\tfor (const otd in otdData) {\r\n\t\t\tconst data = otdData[otd];\r\n\t\t\tif (data.settings.roomid === oldID) {\r\n\t\t\t\tdata.settings.roomid = newID;\r\n\t\t\t\tconst handler = otds.get(otd);\r\n\t\t\t\thandler!.room = room as Room;\r\n\t\t\t\thandler!.save();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n\r\nexport const punishmentfilter: Chat.PunishmentFilter = (user, punishment) => {\r\n\tuser = toID(user);\r\n\tif (!['NAMELOCK', 'BAN'].includes(punishment.type)) return;\r\n\tfor (const handler of otds.values()) {\r\n\t\thandler.removeNomination(user);\r\n\t}\r\n};\r\n"], "mappings": "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", "names": ["otd"] }