{ "version": 3, "sources": ["../../../../server/chat-plugins/tcgtabletop.ts"], "sourcesContent": ["/**\r\n* TCG & Tabletop: Yugioh wiki plugin\r\n* This is a command that allows users to search the yugioh wiki for cards.\r\n* It will display the closest match with a given query, or a separate message if there isn't anything found.\r\n* By bumbadadabum with help from ascriptmaster, codelegend and the PS development team.\r\n*/\r\n\r\n\r\nimport {Net, Utils} from '../../lib';\r\nconst SEARCH_PATH = '/api/v1/Search/List/';\r\nconst DETAILS_PATH = '/api/v1/Articles/Details/';\r\n\r\nasync function getFandom(site: string, pathName: string, search: AnyObject) {\r\n\tconst body = await Net(`https://${site}.fandom.com/${pathName}`).get({query: search});\r\n\tconst json = JSON.parse(body);\r\n\tif (!json) throw new Error(`Malformed data`);\r\n\tif (json.exception) throw new Error(Utils.getString(json.exception.message) || `Not found`);\r\n\treturn json;\r\n}\r\n\r\nasync function searchFandom(site: string, query: string) {\r\n\tconst result = await getFandom(site, SEARCH_PATH, {query, limit: 1});\r\n\tif (!Array.isArray(result.items) || !result.items.length) throw new Error(`Malformed data`);\r\n\tif (!result.items[0] || typeof result.items[0] !== 'object') throw new Error(`Malformed data`);\r\n\treturn result.items[0];\r\n}\r\n\r\nasync function getCardDetails(site: string, id: string) {\r\n\tconst specifications = {\r\n\t\tids: id,\r\n\t\tabstract: 0,\r\n\t\twidth: 80,\r\n\t\theight: 115,\r\n\t};\r\n\r\n\tconst result = await getFandom(site, DETAILS_PATH, specifications);\r\n\tif (typeof result.items !== 'object' || !result.items[id] || typeof result.items[id] !== 'object') {\r\n\t\tthrow new Error(`Malformed data`);\r\n\t}\r\n\treturn result.items[id];\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tygo: 'yugioh',\r\n\tyugioh(target, room, user) {\r\n\t\tthis.checkBroadcast();\r\n\t\troom = this.requireRoom('tcgtabletop' as RoomID);\r\n\t\tconst subdomain = 'yugioh';\r\n\t\tconst query = target.trim();\r\n\t\tif (!query) return this.parse('/help yugioh');\r\n\r\n\t\treturn searchFandom(subdomain, query).then((data: {url: unknown, title: unknown, id: unknown}) => {\r\n\t\t\tif (!this.runBroadcast()) return;\r\n\t\t\tconst entryUrl = Utils.getString(data.url);\r\n\t\t\tconst entryTitle = Utils.getString(data.title);\r\n\t\t\tconst id = Utils.getString(data.id);\r\n\t\t\tlet htmlReply = Utils.html`Best result for ${query}:
${entryTitle}`;\r\n\t\t\tif (id) {\r\n\t\t\t\tgetCardDetails(subdomain, id).then((card: {thumbnail: unknown}) => {\r\n\t\t\t\t\tif (!room) return; // do nothing if the room doesn't exist anymore\r\n\t\t\t\t\tconst thumb = Utils.getString(card.thumbnail);\r\n\t\t\t\t\tif (thumb) {\r\n\t\t\t\t\t\thtmlReply = `
${htmlReply}
`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!this.broadcasting) return this.sendReply(`|raw|
${htmlReply}
`);\r\n\t\t\t\t\troom.addRaw(`
${htmlReply}
`).update();\r\n\t\t\t\t}, () => {\r\n\t\t\t\t\tif (!room) return; // do nothing if the room doesn't exist anymore\r\n\t\t\t\t\tif (!this.broadcasting) return this.sendReply(`|raw|
${htmlReply}
`);\r\n\t\t\t\t\troom.addRaw(`
${htmlReply}
`).update();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tif (!room) return; // do nothing if the room doesn't exist anymore\r\n\t\t\t\tif (!this.broadcasting) return this.sendReply(`|raw|
${htmlReply}
`);\r\n\t\t\t\troom.addRaw(`
${htmlReply}
`).update();\r\n\t\t\t}\r\n\t\t}, (err: Error & {code: string}) => {\r\n\t\t\tif (!this.runBroadcast()) return;\r\n\t\t\tif (!room) return; // do nothing if the room doesn't exist anymore\r\n\r\n\t\t\tif (err instanceof SyntaxError || err.message === 'Malformed data') {\r\n\t\t\t\tif (!this.broadcasting) return this.sendReply(`Error: Something went wrong in the request: ${err.message}`);\r\n\t\t\t\treturn room.add(`Error: Something went wrong in the request: ${err.message}`).update();\r\n\t\t\t} else if (err.message === 'Not found') {\r\n\t\t\t\tif (!this.broadcasting) return this.sendReply('|raw|
No results found.
');\r\n\t\t\t\treturn room.addRaw('
No results found.
').update();\r\n\t\t\t} else if (err.code === \"ENOTFOUND\") {\r\n\t\t\t\tif (!this.broadcasting) return this.sendReply(\"Error connecting to the yugioh wiki.\");\r\n\t\t\t\treturn room.add(\"Error connecting to the yugioh wiki.\").update();\r\n\t\t\t}\r\n\t\t\tif (!this.broadcasting) return this.sendReply(`Error: ${err.message}`);\r\n\t\t\treturn room.add(`Error: ${err.message}`).update();\r\n\t\t});\r\n\t},\r\n\tyugiohhelp: [`/yugioh [query] - Search the Yugioh wiki.`],\r\n};\r\n"], "mappings": "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", "names": [] }