{ "version": 3, "sources": ["../../../../server/chat-plugins/sample-teams.ts"], "sourcesContent": ["/**\r\n * A sample teams plugin\r\n *\r\n * @author Kris\r\n */\r\n\r\nimport {FS, Utils} from \"../../lib\";\r\n\r\nconst SAMPLE_TEAMS = 'config/chat-plugins/sample-teams.json';\r\n\r\ninterface SampleTeamsData {\r\n\twhitelist: {[formatid: string]: RoomID[]};\r\n\t/** Teams are stored in the packed format */\r\n\tteams: {\r\n\t\t[formatid: string]: {\r\n\t\t\tuncategorized: {[k: string]: string},\r\n\t\t\t[category: string]: {[teamName: string]: string},\r\n\t\t},\r\n\t};\r\n}\r\n\r\nexport const teamData: SampleTeamsData = (() => {\r\n\ttry {\r\n\t\treturn JSON.parse(FS(SAMPLE_TEAMS).readIfExistsSync());\r\n\t} catch {\r\n\t\treturn {\r\n\t\t\twhitelist: {},\r\n\t\t\tteams: {},\r\n\t\t};\r\n\t}\r\n})();\r\n\r\nfunction save() {\r\n\tFS(SAMPLE_TEAMS).writeUpdate(() => JSON.stringify(teamData));\r\n}\r\n\r\nfor (const formatid in teamData.teams) {\r\n\tif (!teamData.teams[formatid].uncategorized) teamData.teams[formatid].uncategorized = {};\r\n}\r\nsave();\r\n\r\nexport const SampleTeams = new class SampleTeams {\r\n\tprivate isRoomStaff(user: User, roomids: RoomID[]) {\r\n\t\tlet matched = false;\r\n\t\tif (!roomids?.length) return false;\r\n\t\tfor (const roomid of roomids) {\r\n\t\t\tconst room = Rooms.search(roomid);\r\n\t\t\t// Malformed entry from botched room rename\r\n\t\t\tif (!room) continue;\r\n\t\t\tmatched = room.auth.isStaff(user.id);\r\n\t\t\tif (matched) break;\r\n\t\t}\r\n\t\treturn matched;\r\n\t}\r\n\r\n\tisDevMod(user: User) {\r\n\t\treturn !!Rooms.get('development')?.auth.atLeast(user, '@');\r\n\t}\r\n\r\n\tcheckPermissions(user: User, roomids: RoomID[]) {\r\n\t\t// Give Development room mods access to help fix crashes\r\n\t\treturn this.isRoomStaff(user, roomids) || user.can('bypassall') || this.isDevMod(user);\r\n\t}\r\n\r\n\twhitelistedRooms(formatid: string, names = false) {\r\n\t\tformatid = this.sanitizeFormat(formatid);\r\n\t\tif (!teamData.whitelist[formatid]?.length) return null;\r\n\t\treturn Utils.sortBy(teamData.whitelist[formatid], (x) => {\r\n\t\t\tif (!names) return x;\r\n\t\t\tconst room = Rooms.search(x);\r\n\t\t\tif (!room) return x;\r\n\t\t\treturn room.title;\r\n\t\t});\r\n\t}\r\n\r\n\twhitelistRooms(formatids: string[], roomids: string[]) {\r\n\t\tfor (const unsanitizedFormatid of formatids) {\r\n\t\t\tconst formatid = this.sanitizeFormat(unsanitizedFormatid);\r\n\t\t\tif (!teamData.whitelist[formatid]) teamData.whitelist[formatid] = [];\r\n\t\t\tfor (const roomid of roomids) {\r\n\t\t\t\tconst targetRoom = Rooms.search(roomid);\r\n\t\t\t\tif (!targetRoom?.persist) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Room ${roomid} not found. Check spelling?`);\r\n\t\t\t\t}\r\n\t\t\t\tif (teamData.whitelist[formatid].includes(targetRoom.roomid)) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`Room ${targetRoom.title} is already added.`);\r\n\t\t\t\t}\r\n\t\t\t\tteamData.whitelist[formatid].push(targetRoom.roomid);\r\n\t\t\t\tsave();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tunwhitelistRoom(formatid: string, roomid: string) {\r\n\t\tformatid = this.sanitizeFormat(formatid, false);\r\n\t\tconst targetRoom = Rooms.search(roomid);\r\n\t\tif (!targetRoom?.persist) throw new Chat.ErrorMessage(`Room ${roomid} not found. Check spelling?`);\r\n\t\tif (!teamData.whitelist[formatid]?.length) throw new Chat.ErrorMessage(`No rooms are whitelisted for ${formatid}.`);\r\n\t\tif (!teamData.whitelist[formatid].includes(targetRoom.roomid)) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Room ${targetRoom.title} isn't whitelisted.`);\r\n\t\t}\r\n\t\tconst index = teamData.whitelist[formatid].indexOf(targetRoom.roomid);\r\n\t\tteamData.whitelist[formatid].splice(index, 1);\r\n\t\tif (!teamData.whitelist[formatid].length) delete teamData.whitelist[formatid];\r\n\t\tsave();\r\n\t}\r\n\r\n\tsanitizeFormat(formatid: string, checkExists = false) {\r\n\t\tconst format = Dex.formats.get(formatid);\r\n\t\tif (checkExists && !format.exists) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Format \"${formatid.trim()}\" not found. Check spelling?`);\r\n\t\t}\r\n\t\tif (format.team) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Formats with computer-generated teams can't have team storage.`);\r\n\t\t}\r\n\t\treturn format.id;\r\n\t}\r\n\r\n\tinitializeFormat(formatid: string) {\r\n\t\tif (!teamData.teams[formatid]) {\r\n\t\t\tteamData.teams[formatid] = {uncategorized: {}};\r\n\t\t\tsave();\r\n\t\t}\r\n\t}\r\n\r\n\taddCategory(user: User, formatid: string, category: string) {\r\n\t\tformatid = this.sanitizeFormat(formatid);\r\n\t\tif (!this.checkPermissions(user, teamData.whitelist[formatid])) {\r\n\t\t\tlet rankNeeded = `a global administrator`;\r\n\t\t\tif (teamData.whitelist[formatid]) {\r\n\t\t\t\trankNeeded = `staff in ${Chat.toListString(teamData.whitelist[formatid], \"or\")}`;\r\n\t\t\t}\r\n\t\t\tthrow new Chat.ErrorMessage(`Access denied. You need to be ${rankNeeded} to add teams for ${formatid}`);\r\n\t\t}\r\n\t\tcategory = category.trim();\r\n\t\tthis.initializeFormat(formatid);\r\n\t\tif (this.findCategory(formatid, category)) {\r\n\t\t\tthrow new Chat.ErrorMessage(`The category named ${category} already exists.`);\r\n\t\t}\r\n\t\tteamData.teams[formatid][category] = {};\r\n\t\tsave();\r\n\t}\r\n\r\n\tremoveCategory(user: User, formatid: string, category: string) {\r\n\t\tformatid = this.sanitizeFormat(formatid, false);\r\n\t\tif (!this.checkPermissions(user, teamData.whitelist[formatid])) {\r\n\t\t\tlet rankNeeded = `a global administrator`;\r\n\t\t\tif (teamData.whitelist[formatid]) {\r\n\t\t\t\trankNeeded = `staff in ${Chat.toListString(teamData.whitelist[formatid], \"or\")}`;\r\n\t\t\t}\r\n\t\t\tthrow new Chat.ErrorMessage(`Access denied. You need to be ${rankNeeded} to add teams for ${formatid}`);\r\n\t\t}\r\n\t\tconst categoryName = this.findCategory(formatid, category);\r\n\t\tif (!categoryName) {\r\n\t\t\tthrow new Chat.ErrorMessage(`There's no category named \"${category.trim()}\" for the format ${formatid}.`);\r\n\t\t}\r\n\t\tdelete teamData.teams[formatid][categoryName];\r\n\t\tsave();\r\n\t}\r\n\r\n\t/**\r\n\t * @param user\r\n\t * @param formatid\r\n\t * @param teamName\r\n\t * @param team - Can be a team in the packed, JSON, or exported format\r\n\t * @param category - Category the team will go in, defaults to uncategorized\r\n\t */\r\n\taddTeam(user: User, formatid: string, teamName: string, team: string, category = \"uncategorized\") {\r\n\t\tformatid = this.sanitizeFormat(formatid);\r\n\t\tif (!this.checkPermissions(user, teamData.whitelist[formatid])) {\r\n\t\t\tlet rankNeeded = `a global administrator`;\r\n\t\t\tif (teamData.whitelist[formatid]?.length) {\r\n\t\t\t\trankNeeded = `staff in ${Chat.toListString(teamData.whitelist[formatid], \"or\")}`;\r\n\t\t\t}\r\n\t\t\tthrow new Chat.ErrorMessage(`Access denied. You need to be ${rankNeeded} to add teams for ${formatid}`);\r\n\t\t}\r\n\t\tteamName = teamName.trim();\r\n\t\tcategory = category.trim();\r\n\t\tthis.initializeFormat(formatid);\r\n\t\tif (this.findTeamName(formatid, category, teamName)) {\r\n\t\t\tthrow new Chat.ErrorMessage(`There is already a team for ${formatid} with the name ${teamName} in the ${category} category.`);\r\n\t\t}\r\n\t\tif (!teamData.teams[formatid][category]) this.addCategory(user, formatid, category);\r\n\t\tteamData.teams[formatid][category][teamName] = Teams.pack(Teams.import(team.trim()));\r\n\t\tsave();\r\n\t\treturn teamData.teams[formatid][category][teamName];\r\n\t}\r\n\r\n\tremoveTeam(user: User, formatid: string, teamid: string, category: string) {\r\n\t\tformatid = this.sanitizeFormat(formatid, false);\r\n\t\tcategory = category.trim();\r\n\t\tif (!this.checkPermissions(user, teamData.whitelist[formatid])) {\r\n\t\t\tlet required = `an administrator`;\r\n\t\t\tif (teamData.whitelist[formatid]) {\r\n\t\t\t\trequired = `staff in ${Chat.toListString(teamData.whitelist[formatid], \"or\")}`;\r\n\t\t\t}\r\n\t\t\tthrow new Chat.ErrorMessage(`Access denied. You need to be ${required} to add teams for ${formatid}`);\r\n\t\t}\r\n\t\tconst categoryName = this.findCategory(formatid, category);\r\n\t\tif (!categoryName) {\r\n\t\t\tthrow new Chat.ErrorMessage(`There are no teams for ${formatid} under the category ${category.trim()}. Check spelling?`);\r\n\t\t}\r\n\t\tconst teamName = this.findTeamName(formatid, category, teamid);\r\n\t\tif (!teamName) {\r\n\t\t\tthrow new Chat.ErrorMessage(`There is no team for ${formatid} with the name of \"${teamid}\". Check spelling?`);\r\n\t\t}\r\n\t\tconst oldTeam = teamData.teams[formatid][categoryName][teamName];\r\n\t\tdelete teamData.teams[formatid][categoryName][teamName];\r\n\t\tif (!Object.keys(teamData.teams[formatid][categoryName]).length) delete teamData.teams[formatid][categoryName];\r\n\t\tif (!Object.keys(teamData.teams[formatid]).filter(x => x !== 'uncategorized').length) delete teamData.teams[formatid];\r\n\t\tsave();\r\n\t\treturn oldTeam;\r\n\t}\r\n\r\n\tformatTeam(teamName: string, teamStr: string, broadcasting = false) {\r\n\t\tconst team = Teams.unpack(teamStr);\r\n\t\tif (!team) return `Team is not correctly formatted. PM room staff to fix the formatting.`;\r\n\t\tlet buf = ``;\r\n\t\tif (!broadcasting) {\r\n\t\t\tbuf += `
${team.map(x => ``).join('')}`;\r\n\t\t\tbuf += `
${Utils.escapeHTML(teamName.toUpperCase())}
`;\r\n\t\t\tbuf += Chat.getReadmoreCodeBlock(Teams.export(team).trim());\r\n\t\t} else {\r\n\t\t\tbuf += `
${team.map(x => ``).join('')} – ${Utils.escapeHTML(teamName)}`;\r\n\t\t\tbuf += `${Teams.export(team).trim().replace(/\\n/g, '
')}
`;\r\n\t\t}\r\n\t\treturn buf;\r\n\t}\r\n\r\n\tmodlog(context: Chat.CommandContext, formatid: string, action: string, note: string, log: string) {\r\n\t\tformatid = this.sanitizeFormat(formatid);\r\n\t\tconst whitelistedRooms = this.whitelistedRooms(formatid);\r\n\t\tif (whitelistedRooms?.length) {\r\n\t\t\tfor (const roomid of whitelistedRooms) {\r\n\t\t\t\tconst room = Rooms.get(roomid);\r\n\t\t\t\tif (!room) continue;\r\n\t\t\t\tcontext.room = room;\r\n\t\t\t\tcontext.modlog(action, null, `${formatid}: ${note}`);\r\n\t\t\t\tcontext.privateModAction(log);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tcontext.room = Rooms.get('staff') || null;\r\n\t\t\tcontext.globalModlog(action, null, `${formatid}: ${note}`);\r\n\t\t\tcontext.privateGlobalModAction(log);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the category name of the provided category ID if there is one.\r\n\t */\r\n\tfindCategory(formatid: string, categoryid: string) {\r\n\t\tformatid = toID(formatid);\r\n\t\tcategoryid = toID(categoryid);\r\n\t\tlet match: string | null = null;\r\n\t\tfor (const categoryName in teamData.teams[formatid] || {}) {\r\n\t\t\tif (toID(categoryName) === categoryid) {\r\n\t\t\t\tmatch = categoryName;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn match;\r\n\t}\r\n\r\n\tfindTeamName(formatid: string, categoryid: string, teamid: string) {\r\n\t\tconst categoryName = this.findCategory(formatid, categoryid);\r\n\t\tif (!categoryName) return null;\r\n\t\tlet match: string | null = null;\r\n\t\tfor (const teamName in teamData.teams[formatid][categoryName] || {}) {\r\n\t\t\tif (toID(teamName) === teamid) {\r\n\t\t\t\tmatch = teamName;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn match;\r\n\t}\r\n\r\n\tgetFormatName(formatid: string) {\r\n\t\treturn Dex.formats.get(formatid).exists ? Dex.formats.get(formatid).name : formatid;\r\n\t}\r\n\r\n\tdestroy() {\r\n\t\tfor (const formatid in teamData.whitelist) {\r\n\t\t\tfor (const [i, roomid] of teamData.whitelist[formatid].entries()) {\r\n\t\t\t\tconst room = Rooms.search(roomid);\r\n\t\t\t\tif (room) continue;\r\n\t\t\t\tteamData.whitelist[formatid].splice(i, 1);\r\n\t\t\t\tif (!teamData.whitelist[formatid].length) delete teamData.whitelist[formatid];\r\n\t\t\t\tsave();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const destroy = SampleTeams.destroy;\r\n\r\nexport const handlers: Chat.Handlers = {\r\n\tonRenameRoom(oldID, newID) {\r\n\t\tfor (const formatid in teamData.whitelist) {\r\n\t\t\tif (!SampleTeams.whitelistedRooms(formatid)?.includes(oldID)) continue;\r\n\t\t\tSampleTeams.unwhitelistRoom(formatid, oldID);\r\n\t\t\tSampleTeams.whitelistRooms([formatid], [newID]);\r\n\t\t}\r\n\t},\r\n};\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tsampleteams: {\r\n\t\t''(target, room, user) {\r\n\t\t\tthis.runBroadcast();\r\n\t\t\tlet [formatid, category] = target.split(',');\r\n\t\t\tif (!this.broadcasting) {\r\n\t\t\t\tif (!formatid) return this.parse(`/j view-sampleteams-view`);\r\n\t\t\t\tformatid = SampleTeams.sanitizeFormat(formatid);\r\n\t\t\t\tif (!category) return this.parse(`/j view-sampleteams-view-${formatid}`);\r\n\t\t\t\tconst categoryName = SampleTeams.findCategory(formatid, category);\r\n\t\t\t\treturn this.parse(`/j view-sampleteams-view-${formatid}${categoryName ? '-' + toID(categoryName) : ''}`);\r\n\t\t\t}\r\n\t\t\tif (!formatid) return this.parse(`/help sampleteams`);\r\n\t\t\tformatid = SampleTeams.sanitizeFormat(formatid);\r\n\t\t\tif (!teamData.teams[formatid]) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`No teams for ${SampleTeams.getFormatName(formatid)} found. Check spelling?`);\r\n\t\t\t}\r\n\t\t\tlet buf = ``;\r\n\t\t\tif (!category) {\r\n\t\t\t\tfor (const categoryName in teamData.teams[formatid]) {\r\n\t\t\t\t\tif (!Object.keys(teamData.teams[formatid][categoryName]).length) continue;\r\n\t\t\t\t\tif (buf) buf += `
`;\r\n\t\t\t\t\tbuf += `${categoryName.toUpperCase()}`;\r\n\t\t\t\t\tfor (const [i, teamName] of Object.keys(teamData.teams[formatid][categoryName]).entries()) {\r\n\t\t\t\t\t\tif (i) buf += `
`;\r\n\t\t\t\t\t\tbuf += SampleTeams.formatTeam(teamName, teamData.teams[formatid][categoryName][teamName], true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbuf += ``;\r\n\t\t\t\t}\r\n\t\t\t\tif (!buf) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`No teams for ${SampleTeams.getFormatName(formatid)} found. Check spelling?`);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbuf = `

Sample Teams for ${SampleTeams.getFormatName(formatid)}


${buf}`;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconst categoryName = SampleTeams.findCategory(formatid, category);\r\n\t\t\t\tif (!categoryName) {\r\n\t\t\t\t\tthrow new Chat.ErrorMessage(`No teams for ${SampleTeams.getFormatName(formatid)} in the ${category} category found. Check spelling?`);\r\n\t\t\t\t}\r\n\t\t\t\tfor (const teamName in teamData.teams[formatid][categoryName]) {\r\n\t\t\t\t\tbuf += SampleTeams.formatTeam(teamName, teamData.teams[formatid][categoryName][teamName], true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.sendReplyBox(buf);\r\n\t\t},\r\n\t\taddcategory(target, room, user) {\r\n\t\t\tlet [formatid, categoryName] = target.split(',');\r\n\t\t\tif (!(formatid && categoryName)) return this.parse(`/help sampleteams`);\r\n\t\t\tif (!categoryName.trim()) categoryName = \"uncategorized\";\r\n\t\t\tSampleTeams.addCategory(user, formatid, categoryName.trim());\r\n\t\t\tSampleTeams.modlog(\r\n\t\t\t\tthis, formatid, 'ADDTEAMCATEGORY', categoryName.trim(),\r\n\t\t\t\t`${user.name} added ${categoryName.trim()} as a category for ${formatid}.`\r\n\t\t\t);\r\n\t\t\tthis.sendReply(`Added ${categoryName.trim()} as a category for ${formatid}.`);\r\n\t\t},\r\n\t\tremovecategory(target, room, user) {\r\n\t\t\tconst [formatid, categoryName] = target.split(',');\r\n\t\t\tif (!(formatid && categoryName)) return this.parse(`/help sampleteams`);\r\n\t\t\tif (toID(categoryName) === 'uncategorized') {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`The uncategorized category cannot be removed.`);\r\n\t\t\t}\r\n\t\t\tSampleTeams.removeCategory(user, formatid, categoryName);\r\n\t\t\tSampleTeams.modlog(\r\n\t\t\t\tthis, formatid, 'REMOVETEAMCATEGORY', categoryName.trim(),\r\n\t\t\t\t`${user.name} removed ${categoryName.trim()} as a category for ${formatid}.`\r\n\t\t\t);\r\n\t\t\tthis.sendReply(`Removed ${categoryName.trim()} as a category for ${formatid}.`);\r\n\t\t},\r\n\t\tadd(target, room, user) {\r\n\t\t\tconst [formatid, category, teamName, team] = target.split(',');\r\n\t\t\tif (!(formatid && category?.trim() && teamName && team)) return this.parse('/j view-sampleteams-add');\r\n\t\t\tconst packedTeam = SampleTeams.addTeam(user, formatid, teamName, team, category);\r\n\t\t\tSampleTeams.modlog(\r\n\t\t\t\tthis, formatid, 'ADDTEAM', `${category}: ${teamName}: ${packedTeam}`,\r\n\t\t\t\t`${user.name} added a team for ${formatid} in the ${category} category.`\r\n\t\t\t);\r\n\t\t\tthis.sendReply(`Added a team for ${formatid} in the ${category} category.`);\r\n\t\t},\r\n\t\tremove(target, room, user) {\r\n\t\t\tconst [formatid, category, teamName] = target.split(',').map(x => x.trim());\r\n\t\t\tif (!(formatid && category && teamName)) return this.parse(`/help sampleteams`);\r\n\t\t\tconst team = SampleTeams.removeTeam(user, formatid, toID(teamName), category);\r\n\t\t\tSampleTeams.modlog(\r\n\t\t\t\tthis, formatid, 'REMOVETEAM', `${category}: ${teamName}: ${team}`,\r\n\t\t\t\t`${user.name} removed a team from ${formatid} in the ${category} category.`\r\n\t\t\t);\r\n\t\t\tthis.sendReply(`Removed a team from ${formatid} in the ${category} category.`);\r\n\t\t},\r\n\t\twhitelist: {\r\n\t\t\tadd(target, room, user) {\r\n\t\t\t\t// Allow development roommods to whitelist to help debug\r\n\t\t\t\tif (!SampleTeams.isDevMod(user)) {\r\n\t\t\t\t\tthis.checkCan('bypassall');\r\n\t\t\t\t}\r\n\t\t\t\tconst [formatids, roomids] = target.split('|').map(x => x.split(','));\r\n\t\t\t\tif (!(formatids?.length && roomids?.length)) return this.parse(`/help sampleteams`);\r\n\t\t\t\tSampleTeams.whitelistRooms(formatids, roomids);\r\n\t\t\t\tthis.privateGlobalModAction(`${user.name} whitelisted ${Chat.toListString(roomids.map(x => Rooms.search(x)!.title))} to handle sample teams for ${Chat.toListString(formatids)}.`);\r\n\t\t\t\tthis.globalModlog(`SAMPLETEAMS WHITELIST`, null, roomids.join(', '));\r\n\t\t\t\tthis.sendReply(`Whitelisted ${Chat.toListString(roomids)} to handle sample teams for ${Chat.toListString(formatids)}.`);\r\n\t\t\t},\r\n\t\t\tremove(target, room, user) {\r\n\t\t\t\t// Allow development roommods to whitelist to help debug\r\n\t\t\t\tif (!SampleTeams.isDevMod(user)) {\r\n\t\t\t\t\tthis.checkCan('bypassall');\r\n\t\t\t\t}\r\n\t\t\t\tconst [formatid, roomid] = target.split(',');\r\n\t\t\t\tif (!(formatid && roomid)) return this.parse(`/help sampleteams`);\r\n\t\t\t\tSampleTeams.unwhitelistRoom(formatid, roomid);\r\n\t\t\t\tthis.refreshPage('sampleteams-whitelist');\r\n\t\t\t},\r\n\t\t\t'': 'view',\r\n\t\t\tview(target, room, user) {\r\n\t\t\t\t// Allow development roommods to whitelist to help debug\r\n\t\t\t\tif (!SampleTeams.isDevMod(user)) {\r\n\t\t\t\t\tthis.checkCan('bypassall');\r\n\t\t\t\t}\r\n\t\t\t\tthis.parse(`/j view-sampleteams-whitelist`);\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\tsampleteamshelp: [\r\n\t\t`/sampleteams [format] - Lists the sample teams for [format], if there are any.`,\r\n\t\t`/sampleteams addcategory/removecategory [format], [category] - Adds/removes categories for [format].`,\r\n\t\t`/sampleteams add - Pulls up the interface to add sample teams. Requires: Room staff in dedicated tier room, &`,\r\n\t\t`/sampleteams remove [format], [category], [team name] - Removes a sample team for [format] in [category].`,\r\n\t\t`/sampleteams whitelist add [formatid], [formatid] | [roomid], [roomid], ... - Whitelists room staff for the provided roomids to add sample teams. Requires: &`,\r\n\t\t`/sampleteams whitelist remove [formatid], [roomid] - Unwhitelists room staff for the provided room to add sample teams. Requires: &`,\r\n\t],\r\n};\r\n\r\nfunction formatFakeButton(url: string, text: string) {\r\n\treturn `${text}`;\r\n}\r\n\r\nexport const pages: Chat.PageTable = {\r\n\tsampleteams: {\r\n\t\twhitelist(query, user, connection) {\r\n\t\t\tthis.title = `Sample Teams Whitelist`;\r\n\t\t\tif (!(SampleTeams.isDevMod(user) || user.can('bypassall'))) {\r\n\t\t\t\treturn `

Access denied.

`;\r\n\t\t\t}\r\n\t\t\tconst staffRoomAccess = Rooms.get('staff')?.checkModjoin(user);\r\n\t\t\tlet buf = `

Sample Teams Rooms Whitelist

`;\r\n\t\t\tif ((!teamData.whitelist || !Object.keys(teamData.whitelist).length) && !query.length) {\r\n\t\t\t\tbuf += `

No rooms are whitelisted for any formats.

`;\r\n\t\t\t}\r\n\t\t\tif (query[0] === 'add') {\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tbuf += `

`;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tbuf += `
${formatFakeButton(\"view-sampleteams-whitelist\", \"Return to list\")}`;\r\n\t\t\t} else {\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tfor (const formatid of Object.keys(teamData.whitelist).sort().reverse()) {\r\n\t\t\t\t\tif (!teamData.whitelist[formatid]?.length) continue;\r\n\t\t\t\t\tbuf += `
${SampleTeams.getFormatName(formatid)}
`;\r\n\t\t\t\t\tfor (const roomid of teamData.whitelist[formatid]) {\r\n\t\t\t\t\t\tbuf += `
${Rooms.get(roomid)?.title || roomid}`;\r\n\t\t\t\t\t\tbuf += `
`;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t}\r\n\t\t\tbuf += `${query.length ? '' : formatFakeButton(\"view-sampleteams-whitelist-add\", \"Whitelist room\")}
`;\r\n\t\t\treturn buf;\r\n\t\t},\r\n\t\tview(query, user, connection) {\r\n\t\t\tthis.title = `Sample Teams`;\r\n\t\t\tlet buf = `
`;\r\n\t\t\tif (query.slice(0, query.length - 1).join('-')) {\r\n\t\t\t\tbuf += `${formatFakeButton(`view-sampleteams-view-${query.slice(0, query.length - 1).join('-')}`, \"« Back\")}`;\r\n\t\t\t} else {\r\n\t\t\t\tbuf += ``;\r\n\t\t\t}\r\n\t\t\tbuf += ``;\r\n\t\t\tbuf += `

Sample Teams


`;\r\n\t\t\tconst q0Teams = teamData.teams[query[0]];\r\n\t\t\tconst q0TeamKeys = q0Teams ? Object.keys(q0Teams) : [];\r\n\t\t\tif (!query[0]) {\r\n\t\t\t\tconst formats = Object.keys(teamData.teams);\r\n\t\t\t\tif (!formats.length) return `${buf}

No teams found.

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

Pick a format

`;\r\n\t\t\t} else if (!q0Teams || !q0TeamKeys.length ||\r\n\t\t\t\t(!Object.keys(q0Teams.uncategorized).length && !q0TeamKeys.filter(x => x !== 'uncategorized').length)) {\r\n\t\t\t\tconst name = Dex.formats.get(query[0]).exists ? Dex.formats.get(query[0]).name : query[0];\r\n\t\t\t\treturn `${buf}

No teams for ${name} were found.

`;\r\n\t\t\t} else if (!query[1] || (!SampleTeams.findCategory(query[0], query[1]) && query[1] !== 'allteams')) {\r\n\t\t\t\tbuf += `

Pick a category

`;\r\n\t\t\t} else if (query[1] === 'allteams') {\r\n\t\t\t\tbuf += `

All teams for ${SampleTeams.getFormatName(query[0])}

`;\r\n\t\t\t\tfor (const categoryName in teamData.teams[query[0]]) {\r\n\t\t\t\t\tconst category = teamData.teams[query[0]][categoryName];\r\n\t\t\t\t\tif (!Object.keys(category).length) continue;\r\n\t\t\t\t\tbuf += `

${categoryName}

`;\r\n\t\t\t\t\tfor (const teamName in category) {\r\n\t\t\t\t\t\tconst team = category[teamName];\r\n\t\t\t\t\t\tif (SampleTeams.checkPermissions(user, teamData.whitelist[query[0]] || [])) {\r\n\t\t\t\t\t\t\tbuf += ``;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbuf += SampleTeams.formatTeam(teamName, team);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbuf += `
`;\r\n\t\t\t\t\tconst index = Object.keys(teamData.teams[query[0]]).indexOf(categoryName);\r\n\t\t\t\t\tif (index !== Object.keys(teamData.teams[query[0]]).length - 1) buf += `
`;\r\n\t\t\t\t}\r\n\t\t\t} else if (SampleTeams.findCategory(query[0], query[1])) {\r\n\t\t\t\tconst categoryName = SampleTeams.findCategory(query[0], query[1])!;\r\n\t\t\t\tbuf += `

Sample teams for ${SampleTeams.getFormatName(query[0])} in the ${categoryName} category

`;\r\n\t\t\t\tfor (const teamName in teamData.teams[query[0]][categoryName]) {\r\n\t\t\t\t\tconst team = teamData.teams[query[0]][categoryName][teamName];\r\n\t\t\t\t\tbuf += SampleTeams.formatTeam(teamName, team);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbuf += ``;\r\n\t\t\treturn buf;\r\n\t\t},\r\n\t\tadd(query, user, connection) {\r\n\t\t\tthis.title = `Sample Teams`;\r\n\t\t\tconst trimFormatName = (name: string) => (name.includes('(') ? name.slice(0, name.indexOf('(')) : name).trim();\r\n\t\t\tconst formatsSet = new Set(Dex.formats.all().map(format => trimFormatName(format.name)));\r\n\t\t\tconst formatsArr = Array.from(formatsSet);\r\n\t\t\tconst formats = formatsArr.map(formatName => Dex.formats.get(formatName))\r\n\t\t\t\t.filter(format => (\r\n\t\t\t\t\t!format.name.includes('Custom') && format.effectType === 'Format' &&\r\n\t\t\t\t\t!format.team && SampleTeams.checkPermissions(user, SampleTeams.whitelistedRooms(format.id) || [])\r\n\t\t\t\t));\r\n\t\t\tif (!formats.length) return `

Access denied.

`;\r\n\t\t\tlet buf = `
`;\r\n\t\t\tif (query.slice(0, query.length - 1).join('-')) {\r\n\t\t\t\tbuf += `${formatFakeButton(`view-sampleteams-add-${query.slice(0, query.length - 1).join('-')}`, \"« Back\")}`;\r\n\t\t\t} else {\r\n\t\t\t\tbuf += ``;\r\n\t\t\t}\r\n\t\t\tlet buttonTitle = 'Refresh';\r\n\t\t\tif (query[2] === 'submit') buttonTitle = 'Add another team';\r\n\t\t\tbuf += ``;\r\n\t\t\tbuf += `

Add a sample team

`;\r\n\t\t\tif (!query[0] || !Dex.formats.get(query[0]).exists) {\r\n\t\t\t\tbuf += `

Pick a format

    `;\r\n\t\t\t\tfor (const format of formats) {\r\n\t\t\t\t\tbuf += `
  • ${formatFakeButton(`view-sampleteams-add-${format.id}`, format.name)}
  • `;\r\n\t\t\t\t}\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t} else if (!query[1] || !SampleTeams.findCategory(query[0], query[1]) || query[1] === 'addnewcategory') {\r\n\t\t\t\tconst name = SampleTeams.getFormatName(query[0]);\r\n\t\t\t\tif (query[1] === 'addnewcategory') {\r\n\t\t\t\t\tbuf += `

Add a category for ${name}

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

Pick a category for ${name}

    `;\r\n\t\t\t\t\tfor (const category of Object.keys(teamData.teams[query[0]] || {}) || []) {\r\n\t\t\t\t\t\tbuf += `
  • ${formatFakeButton(`view-sampleteams-add-${query[0]}-${toID(category)}-submit`, category)}
  • `;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbuf += `
  • ${formatFakeButton(`view-sampleteams-add-${query[0]}-addnewcategory`, `Add new category`)}
`;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tconst categoryName = SampleTeams.findCategory(query[0], query[1]);\r\n\t\t\tif (categoryName) {\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tbuf += `

Enter a team name

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

Enter team importable


`;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t}\r\n\t\t\tbuf += `
`;\r\n\t\t\treturn buf;\r\n\t\t},\r\n\t},\r\n};\r\n\r\nChat.multiLinePattern.register(`/sampleteams add `);\r\n"], "mappings": "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", "names": ["SampleTeams"] }