diff --git a/assets/json/periodic-table.json b/assets/json/periodic-table.json deleted file mode 100644 index 68a62acc..00000000 --- a/assets/json/periodic-table.json +++ /dev/null @@ -1,1015 +0,0 @@ -{ - "elements": [ - { - "name": "Batman", - "mass": 5.736e+28, - "number": 0, - "period": "Gotham City", - "phase": "Solid", - "symbol": "🦇" - }, - { - "name": "Hydrogen", - "mass": 1.008, - "number": 1, - "period": 1, - "phase": "Gas", - "symbol": "H" - }, - { - "name": "Helium", - "mass": 4.0026022, - "number": 2, - "period": 1, - "phase": "Gas", - "symbol": "He" - }, - { - "name": "Lithium", - "mass": 6.94, - "number": 3, - "period": 2, - "phase": "Solid", - "symbol": "Li" - }, - { - "name": "Beryllium", - "mass": 9.01218315, - "number": 4, - "period": 2, - "phase": "Solid", - "symbol": "Be" - }, - { - "name": "Boron", - "mass": 10.81, - "number": 5, - "period": 2, - "phase": "Solid", - "symbol": "B" - }, - { - "name": "Carbon", - "mass": 12.011, - "number": 6, - "period": 2, - "phase": "Solid", - "symbol": "C" - }, - { - "name": "Nitrogen", - "mass": 14.007, - "number": 7, - "period": 2, - "phase": "Gas", - "symbol": "N" - }, - { - "name": "Oxygen", - "mass": 15.999, - "number": 8, - "period": 2, - "phase": "Gas", - "symbol": "O" - }, - { - "name": "Fluorine", - "mass": 18.9984031636, - "number": 9, - "period": 2, - "phase": "Gas", - "symbol": "F" - }, - { - "name": "Neon", - "mass": 20.17976, - "number": 10, - "period": 2, - "phase": "Gas", - "symbol": "Ne" - }, - { - "name": "Sodium", - "mass": 22.989769282, - "number": 11, - "period": 3, - "phase": "Solid", - "symbol": "Na" - }, - { - "name": "Magnesium", - "mass": 24.305, - "number": 12, - "period": 3, - "phase": "Solid", - "symbol": "Mg" - }, - { - "name": "Aluminium", - "mass": 26.98153857, - "number": 13, - "period": 3, - "phase": "Solid", - "symbol": "Al" - }, - { - "name": "Silicon", - "mass": 28.085, - "number": 14, - "period": 3, - "phase": "Solid", - "symbol": "Si" - }, - { - "name": "Phosphorus", - "mass": 30.9737619985, - "number": 15, - "period": 3, - "phase": "Solid", - "symbol": "P" - }, - { - "name": "Sulfur", - "mass": 32.06, - "number": 16, - "period": 3, - "phase": "Solid", - "symbol": "S" - }, - { - "name": "Chlorine", - "mass": 35.45, - "number": 17, - "period": 3, - "phase": "Gas", - "symbol": "Cl" - }, - { - "name": "Argon", - "mass": 39.9481, - "number": 18, - "period": 3, - "phase": "Gas", - "symbol": "Ar" - }, - { - "name": "Potassium", - "mass": 39.09831, - "number": 19, - "period": 4, - "phase": "Solid", - "symbol": "K" - }, - { - "name": "Calcium", - "mass": 40.0784, - "number": 20, - "period": 4, - "phase": "Solid", - "symbol": "Ca" - }, - { - "name": "Scandium", - "mass": 44.9559085, - "number": 21, - "period": 4, - "phase": "Solid", - "symbol": "Sc" - }, - { - "name": "Titanium", - "mass": 47.8671, - "number": 22, - "period": 4, - "phase": "Solid", - "symbol": "Ti" - }, - { - "name": "Vanadium", - "mass": 50.94151, - "number": 23, - "period": 4, - "phase": "Solid", - "symbol": "V" - }, - { - "name": "Chromium", - "mass": 51.99616, - "number": 24, - "period": 4, - "phase": "Solid", - "symbol": "Cr" - }, - { - "name": "Manganese", - "mass": 54.9380443, - "number": 25, - "period": 4, - "phase": "Solid", - "symbol": "Mn" - }, - { - "name": "Iron", - "mass": 55.8452, - "number": 26, - "period": 4, - "phase": "Solid", - "symbol": "Fe" - }, - { - "name": "Cobalt", - "mass": 58.9331944, - "number": 27, - "period": 4, - "phase": "Solid", - "symbol": "Co" - }, - { - "name": "Nickel", - "mass": 58.69344, - "number": 28, - "period": 4, - "phase": "Solid", - "symbol": "Ni" - }, - { - "name": "Copper", - "mass": 63.5463, - "number": 29, - "period": 4, - "phase": "Solid", - "symbol": "Cu" - }, - { - "name": "Zinc", - "mass": 65.382, - "number": 30, - "period": 4, - "phase": "Solid", - "symbol": "Zn" - }, - { - "name": "Gallium", - "mass": 69.7231, - "number": 31, - "period": 4, - "phase": "Solid", - "symbol": "Ga" - }, - { - "name": "Germanium", - "mass": 72.6308, - "number": 32, - "period": 4, - "phase": "Solid", - "symbol": "Ge" - }, - { - "name": "Arsenic", - "mass": 74.9215956, - "number": 33, - "period": 4, - "phase": "Solid", - "symbol": "As" - }, - { - "name": "Selenium", - "mass": 78.9718, - "number": 34, - "period": 4, - "phase": "Solid", - "symbol": "Se" - }, - { - "name": "Bromine", - "mass": 79.904, - "number": 35, - "period": 4, - "phase": "Liquid", - "symbol": "Br" - }, - { - "name": "Krypton", - "mass": 83.7982, - "number": 36, - "period": 4, - "phase": "Gas", - "symbol": "Kr" - }, - { - "name": "Rubidium", - "mass": 85.46783, - "number": 37, - "period": 5, - "phase": "Solid", - "symbol": "Rb" - }, - { - "name": "Strontium", - "mass": 87.621, - "number": 38, - "period": 5, - "phase": "Solid", - "symbol": "Sr" - }, - { - "name": "Yttrium", - "mass": 88.905842, - "number": 39, - "period": 5, - "phase": "Solid", - "symbol": "Y" - }, - { - "name": "Zirconium", - "mass": 91.2242, - "number": 40, - "period": 5, - "phase": "Solid", - "symbol": "Zr" - }, - { - "name": "Niobium", - "mass": 92.906372, - "number": 41, - "period": 5, - "phase": "Solid", - "symbol": "Nb" - }, - { - "name": "Molybdenum", - "mass": 95.951, - "number": 42, - "period": 5, - "phase": "Solid", - "symbol": "Mo" - }, - { - "name": "Technetium", - "mass": 98, - "number": 43, - "period": 5, - "phase": "Solid", - "symbol": "Tc" - }, - { - "name": "Ruthenium", - "mass": 101.072, - "number": 44, - "period": 5, - "phase": "Solid", - "symbol": "Ru" - }, - { - "name": "Rhodium", - "mass": 102.905502, - "number": 45, - "period": 5, - "phase": "Solid", - "symbol": "Rh" - }, - { - "name": "Palladium", - "mass": 106.421, - "number": 46, - "period": 5, - "phase": "Solid", - "symbol": "Pd" - }, - { - "name": "Silver", - "mass": 107.86822, - "number": 47, - "period": 5, - "phase": "Solid", - "symbol": "Ag" - }, - { - "name": "Cadmium", - "mass": 112.4144, - "number": 48, - "period": 5, - "phase": "Solid", - "symbol": "Cd" - }, - { - "name": "Indium", - "mass": 114.8181, - "number": 49, - "period": 5, - "phase": "Solid", - "symbol": "In" - }, - { - "name": "Tin", - "mass": 118.7107, - "number": 50, - "period": 5, - "phase": "Solid", - "symbol": "Sn" - }, - { - "name": "Antimony", - "mass": 121.7601, - "number": 51, - "period": 5, - "phase": "Solid", - "symbol": "Sb" - }, - { - "name": "Tellurium", - "mass": 127.603, - "number": 52, - "period": 5, - "phase": "Solid", - "symbol": "Te" - }, - { - "name": "Iodine", - "mass": 126.904473, - "number": 53, - "period": 5, - "phase": "Solid", - "symbol": "I" - }, - { - "name": "Xenon", - "mass": 131.2936, - "number": 54, - "period": 5, - "phase": "Gas", - "symbol": "Xe" - }, - { - "name": "Cesium", - "mass": 132.905451966, - "number": 55, - "period": 6, - "phase": "Solid", - "symbol": "Cs" - }, - { - "name": "Barium", - "mass": 137.3277, - "number": 56, - "period": 6, - "phase": "Solid", - "symbol": "Ba" - }, - { - "name": "Lanthanum", - "mass": 138.905477, - "number": 57, - "period": 6, - "phase": "Solid", - "symbol": "La" - }, - { - "name": "Cerium", - "mass": 140.1161, - "number": 58, - "period": 6, - "phase": "Solid", - "symbol": "Ce" - }, - { - "name": "Praseodymium", - "mass": 140.907662, - "number": 59, - "period": 6, - "phase": "Solid", - "symbol": "Pr" - }, - { - "name": "Neodymium", - "mass": 144.2423, - "number": 60, - "period": 6, - "phase": "Solid", - "symbol": "Nd" - }, - { - "name": "Promethium", - "mass": 145, - "number": 61, - "period": 6, - "phase": "Solid", - "symbol": "Pm" - }, - { - "name": "Samarium", - "mass": 150.362, - "number": 62, - "period": 6, - "phase": "Solid", - "symbol": "Sm" - }, - { - "name": "Europium", - "mass": 151.9641, - "number": 63, - "period": 6, - "phase": "Solid", - "symbol": "Eu" - }, - { - "name": "Gadolinium", - "mass": 157.253, - "number": 64, - "period": 6, - "phase": "Solid", - "symbol": "Gd" - }, - { - "name": "Terbium", - "mass": 158.925352, - "number": 65, - "period": 6, - "phase": "Solid", - "symbol": "Tb" - }, - { - "name": "Dysprosium", - "mass": 162.5001, - "number": 66, - "period": 6, - "phase": "Solid", - "symbol": "Dy" - }, - { - "name": "Holmium", - "mass": 164.930332, - "number": 67, - "period": 6, - "phase": "Solid", - "symbol": "Ho" - }, - { - "name": "Erbium", - "mass": 167.2593, - "number": 68, - "period": 6, - "phase": "Solid", - "symbol": "Er" - }, - { - "name": "Thulium", - "mass": 168.934222, - "number": 69, - "period": 6, - "phase": "Solid", - "symbol": "Tm" - }, - { - "name": "Ytterbium", - "mass": 173.0451, - "number": 70, - "period": 6, - "phase": "Solid", - "symbol": "Yb" - }, - { - "name": "Lutetium", - "mass": 174.96681, - "number": 71, - "period": 6, - "phase": "Solid", - "symbol": "Lu" - }, - { - "name": "Hafnium", - "mass": 178.492, - "number": 72, - "period": 6, - "phase": "Solid", - "symbol": "Hf" - }, - { - "name": "Tantalum", - "mass": 180.947882, - "number": 73, - "period": 6, - "phase": "Solid", - "symbol": "Ta" - }, - { - "name": "Tungsten", - "mass": 183.841, - "number": 74, - "period": 6, - "phase": "Solid", - "symbol": "W" - }, - { - "name": "Rhenium", - "mass": 186.2071, - "number": 75, - "period": 6, - "phase": "Solid", - "symbol": "Re" - }, - { - "name": "Osmium", - "mass": 190.233, - "number": 76, - "period": 6, - "phase": "Solid", - "symbol": "Os" - }, - { - "name": "Iridium", - "mass": 192.2173, - "number": 77, - "period": 6, - "phase": "Solid", - "symbol": "Ir" - }, - { - "name": "Platinum", - "mass": 195.0849, - "number": 78, - "period": 6, - "phase": "Solid", - "symbol": "Pt" - }, - { - "name": "Gold", - "mass": 196.9665695, - "number": 79, - "period": 6, - "phase": "Solid", - "symbol": "Au" - }, - { - "name": "Mercury", - "mass": 200.5923, - "number": 80, - "period": 6, - "phase": "Liquid", - "symbol": "Hg" - }, - { - "name": "Thallium", - "mass": 204.38, - "number": 81, - "period": 6, - "phase": "Solid", - "symbol": "Tl" - }, - { - "name": "Lead", - "mass": 207.21, - "number": 82, - "period": 6, - "phase": "Solid", - "symbol": "Pb" - }, - { - "name": "Bismuth", - "mass": 208.980401, - "number": 83, - "period": 6, - "phase": "Solid", - "symbol": "Bi" - }, - { - "name": "Polonium", - "mass": 209, - "number": 84, - "period": 6, - "phase": "Solid", - "symbol": "Po" - }, - { - "name": "Astatine", - "mass": 210, - "number": 85, - "period": 6, - "phase": "Solid", - "symbol": "At" - }, - { - "name": "Radon", - "mass": 222, - "number": 86, - "period": 6, - "phase": "Gas", - "symbol": "Rn" - }, - { - "name": "Francium", - "mass": 223, - "number": 87, - "period": 7, - "phase": "Solid", - "symbol": "Fr" - }, - { - "name": "Radium", - "mass": 226, - "number": 88, - "period": 7, - "phase": "Solid", - "symbol": "Ra" - }, - { - "name": "Actinium", - "mass": 227, - "number": 89, - "period": 7, - "phase": "Solid", - "symbol": "Ac" - }, - { - "name": "Thorium", - "mass": 232.03774, - "number": 90, - "period": 7, - "phase": "Solid", - "symbol": "Th" - }, - { - "name": "Protactinium", - "mass": 231.035882, - "number": 91, - "period": 7, - "phase": "Solid", - "symbol": "Pa" - }, - { - "name": "Uranium", - "mass": 238.028913, - "number": 92, - "period": 7, - "phase": "Solid", - "symbol": "U" - }, - { - "name": "Neptunium", - "mass": 237, - "number": 93, - "period": 7, - "phase": "Solid", - "symbol": "Np" - }, - { - "name": "Plutonium", - "mass": 244, - "number": 94, - "period": 7, - "phase": "Solid", - "symbol": "Pu" - }, - { - "name": "Americium", - "mass": 243, - "number": 95, - "period": 7, - "phase": "Solid", - "symbol": "Am" - }, - { - "name": "Curium", - "mass": 247, - "number": 96, - "period": 7, - "phase": "Solid", - "symbol": "Cm" - }, - { - "name": "Berkelium", - "mass": 247, - "number": 97, - "period": 7, - "phase": "Solid", - "symbol": "Bk" - }, - { - "name": "Californium", - "mass": 251, - "number": 98, - "period": 7, - "phase": "Solid", - "symbol": "Cf" - }, - { - "name": "Einsteinium", - "mass": 252, - "number": 99, - "period": 7, - "phase": "Solid", - "symbol": "Es" - }, - { - "name": "Fermium", - "mass": 257, - "number": 100, - "period": 7, - "phase": "Solid", - "symbol": "Fm" - }, - { - "name": "Mendelevium", - "mass": 258, - "number": 101, - "period": 7, - "phase": "Solid", - "symbol": "Md" - }, - { - "name": "Nobelium", - "mass": 259, - "number": 102, - "period": 7, - "phase": "Solid", - "symbol": "No" - }, - { - "name": "Lawrencium", - "mass": 266, - "number": 103, - "period": 7, - "phase": "Solid", - "symbol": "Lr" - }, - { - "name": "Rutherfordium", - "mass": 267, - "number": 104, - "period": 7, - "phase": "Solid", - "symbol": "Rf" - }, - { - "name": "Dubnium", - "mass": 268, - "number": 105, - "period": 7, - "phase": "Solid", - "symbol": "Db" - }, - { - "name": "Seaborgium", - "mass": 269, - "number": 106, - "period": 7, - "phase": "Solid", - "symbol": "Sg" - }, - { - "name": "Bohrium", - "mass": 270, - "number": 107, - "period": 7, - "phase": "Solid", - "symbol": "Bh" - }, - { - "name": "Hassium", - "mass": 269, - "number": 108, - "period": 7, - "phase": "Solid", - "symbol": "Hs" - }, - { - "name": "Meitnerium", - "mass": 278, - "number": 109, - "period": 7, - "phase": "Solid", - "symbol": "Mt" - }, - { - "name": "Darmstadtium", - "mass": 281, - "number": 110, - "period": 7, - "phase": "Solid", - "symbol": "Ds" - }, - { - "name": "Roentgenium", - "mass": 282, - "number": 111, - "period": 7, - "phase": "Solid", - "symbol": "Rg" - }, - { - "name": "Copernicium", - "mass": 285, - "number": 112, - "period": 7, - "phase": "Gas", - "symbol": "Cn" - }, - { - "name": "Nihonium", - "mass": 286, - "number": 113, - "period": 7, - "phase": "Solid", - "symbol": "Nh" - }, - { - "name": "Flerovium", - "mass": 289, - "number": 114, - "period": 7, - "phase": "Solid", - "symbol": "Fl" - }, - { - "name": "Moscovium", - "mass": 289, - "number": 115, - "period": 7, - "phase": "Solid", - "symbol": "Mc" - }, - { - "name": "Livermorium", - "mass": 293, - "number": 116, - "period": 7, - "phase": "Solid", - "symbol": "Lv" - }, - { - "name": "Tennessine", - "mass": 294, - "number": 117, - "period": 7, - "phase": "Solid", - "symbol": "Ts" - }, - { - "name": "Oganesson", - "mass": 294, - "number": 118, - "period": 7, - "phase": "Solid", - "symbol": "Og" - }, - { - "name": "Ununennium", - "mass": 315, - "number": 119, - "period": 8, - "phase": "Solid", - "symbol": "Uue", - "undiscovered": true - }, - { - "name": "Unbinilium", - "mass": 299, - "number": 120, - "period": 8, - "phase": "Solid", - "symbol": "Ubn", - "undiscovered": true - }, - { - "name": "Unbiunium", - "mass": 320, - "number": 121, - "period": 8, - "phase": null, - "symbol": "Ubu", - "undiscovered": true - }, - { - "name": "Unbibium", - "mass": null, - "number": 122, - "period": 8, - "phase": null, - "symbol": "Ubb", - "undiscovered": true - }, - { - "name": "Unbitrium", - "mass": null, - "number": 123, - "period": 8, - "phase": null, - "symbol": "Ubt", - "undiscovered": true - }, - { - "name": "Unbiquadium", - "mass": null, - "number": 124, - "period": 8, - "phase": null, - "symbol": "Ubq", - "undiscovered": true - } - ], - "colors": { - "Solid": "black", - "Liquid": "blue", - "Gas": "green" - } -} diff --git a/commands/search/periodic-table.js b/commands/search/periodic-table.js index a22e8fd6..04001e56 100644 --- a/commands/search/periodic-table.js +++ b/commands/search/periodic-table.js @@ -1,7 +1,20 @@ const Command = require('../../framework/Command'); +const request = require('node-superfetch'); const { createCanvas, loadImage } = require('canvas'); const path = require('path'); -const { elements, colors } = require('../../assets/json/periodic-table'); +const colors = { + Solid: 'black', + Liquid: 'blue', + Gas: 'green' +}; +const batman = { + name: 'Batman', + mass: 5.736e+28, + number: 0, + period: 'Gotham City', + phase: 'Solid', + symbol: '🦇' +}; module.exports = class PeriodicTableCommand extends Command { constructor(client) { @@ -36,23 +49,26 @@ module.exports = class PeriodicTableCommand extends Command { type: 'string', validate: element => { const num = Number.parseInt(element, 10); - if (!Number.isNaN(num) && num >= 0 && num <= elements.length - 1) return true; + if (!Number.isNaN(num) && num >= 0 && num <= this.table.length - 1) return true; const search = element.toString().toLowerCase(); - if (elements.find(e => e.name.toLowerCase() === search || e.symbol.toLowerCase() === search)) return true; + if (this.table.find(e => e.name.toLowerCase() === search || e.symbol.toLowerCase() === search)) return true; return 'Invalid element, please enter a valid element symbol, name, or atomic number.'; }, parse: element => { const num = Number.parseInt(element, 10); - if (!Number.isNaN(num)) return elements[num]; + if (!Number.isNaN(num)) return this.table[num]; const search = element.toLowerCase(); - return elements.find(e => e.name.toLowerCase() === search || e.symbol.toLowerCase() === search); + return this.table.find(e => e.name.toLowerCase() === search || e.symbol.toLowerCase() === search); } } ] }); + + this.table = null; } async run(msg, { element }) { + if (!this.table) await this.fetchTable(); const canvas = createCanvas(500, 500); const ctx = canvas.getContext('2d'); ctx.fillStyle = 'black'; @@ -61,8 +77,8 @@ module.exports = class PeriodicTableCommand extends Command { ctx.fillRect(10, 10, canvas.width - 20, canvas.height - 20); ctx.textAlign = 'center'; if (element.number === 0) { - const batman = await loadImage(path.join(__dirname, '..', '..', 'assets', 'images', 'batman.png')); - ctx.drawImage(batman, 100, 166); + const batmanImg = await loadImage(path.join(__dirname, '..', '..', 'assets', 'images', 'batman.png')); + ctx.drawImage(batmanImg, 100, 166); } else { ctx.font = this.client.fonts.get('Noto-Regular.ttf').toCanvasString(210); ctx.fillStyle = colors[element.phase] || 'gray'; @@ -81,4 +97,13 @@ module.exports = class PeriodicTableCommand extends Command { { files: [{ attachment: canvas.toBuffer(), name: `${element.name}.png` }] } ); } + + async fetchTable() { + if (this.table) return this.table; + const { text } = await request + .get('https://raw.githubusercontent.com/Bowserinator/Periodic-Table-JSON/master/PeriodicTableJSON.json'); + this.table = JSON.parse(text).elements; + this.table.elements.unshift(batman); + return this.table; + } };