From 680d4962a0d24a2f744027046810c14706f3de07 Mon Sep 17 00:00:00 2001
From: awesomepandapig <34806109+awesomepandapig@users.noreply.github.com>
Date: Sat, 30 Jul 2022 03:03:29 -0700
Subject: Add files via upload
---
LICENSE | 21 +
README.md | 19 +
index.html | 700 +++
index.js | 205 +
leaderboard.json | 1 +
package-lock.json | 1614 +++++++
package.json | 22 +
public_html/MinecraftColorCodes.min.3.7.js | 1 +
public_html/android-chrome-192x192.png | Bin 0 -> 4289 bytes
public_html/android-chrome-512x512.png | Bin 0 -> 16598 bytes
public_html/apple-touch-icon.png | Bin 0 -> 3603 bytes
public_html/favicon-16x16.png | Bin 0 -> 556 bytes
public_html/favicon-32x32.png | Bin 0 -> 743 bytes
public_html/favicon.ico | Bin 0 -> 34494 bytes
public_html/guide.html | 370 ++
public_html/guide.json | 1 +
public_html/index.html | 462 ++
public_html/leaderboard.html | 111 +
public_html/robots.txt | 0
stderr.log | 6896 ++++++++++++++++++++++++++++
swagger.json | 73 +
21 files changed, 10496 insertions(+)
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 index.html
create mode 100644 index.js
create mode 100644 leaderboard.json
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 public_html/MinecraftColorCodes.min.3.7.js
create mode 100644 public_html/android-chrome-192x192.png
create mode 100644 public_html/android-chrome-512x512.png
create mode 100644 public_html/apple-touch-icon.png
create mode 100644 public_html/favicon-16x16.png
create mode 100644 public_html/favicon-32x32.png
create mode 100644 public_html/favicon.ico
create mode 100644 public_html/guide.html
create mode 100644 public_html/guide.json
create mode 100644 public_html/index.html
create mode 100644 public_html/leaderboard.html
create mode 100644 public_html/robots.txt
create mode 100644 stderr.log
create mode 100644 swagger.json
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..918b3e4
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 awesomepandapig
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..02eafb1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+# skyblock.bingo
+
+skyblock.bingo allows you to view your [Hypixel Skyblock](https://hypixel.net/categories/skyblock.194/) bingo card, share your bingo progress with others, and view guides for how to solve the current bingo challenge!
+
+Website: https://skyblock.bingo
+
+## Features
+
+- View your current bingo card
+- View the goals you have left to complete
+- View guides for how to complete the bingo goals
+- View the top one-hundred bingo players
+- An API for getting a player's bingo stats
+
+
+
+## Contributing
+
+Open a pull request and I will look into adding the feature!
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c99c328
--- /dev/null
+++ b/index.html
@@ -0,0 +1,700 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ skyblock.bingo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
*Bingo Rank: none
+
Points: 0
+
Completed: 0 /20
+
+
+
+
+
+
+
+
+
+
Tier 1
+
+
+
Tier 2
+
+
+
Tier 3
+
+
+
Tier 4
+
+
+
Tier 5
+
+
+
Community
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..27920e0
--- /dev/null
+++ b/index.js
@@ -0,0 +1,205 @@
+const dotenv = require('dotenv').config();
+const fetch = require('node-fetch');
+const express = require('express');
+const cors = require('cors');
+const bodyParser = require('body-parser');
+const fs = require('fs');
+
+const app = express();
+app.set('views', './views');
+app.set('view engine', 'ejs');
+app.use(bodyParser.urlencoded({ extended: false }));
+app.use(bodyParser.json());
+app.use(cors());
+const port = process.env.PORT;
+const origin = process.env.ORIGIN;
+const key = process.env.API_KEY;
+
+var corsOptions = {
+ origin: origin,
+ optionsSuccessStatus: 200
+}
+
+const { body, validationResult } = require('express-validator');
+
+let leaderboard = JSON.parse(fs.readFileSync('leaderboard.json'));
+let blacklist = JSON.parse(fs.readFileSync('blacklist.json'));
+let blacklist_temp = JSON.parse(JSON.stringify(blacklist));
+
+app.get('/api', (req, res) => {
+ res.sendFile(__dirname + '/swagger.html');
+})
+
+app.get('/api/swagger.json', (req, res) => {
+ res.sendFile(__dirname + '/swagger.json');
+})
+
+app.get('/stats/:user', (req, res) => {
+ res.sendFile(__dirname + '/index.html');
+})
+
+app.get('/api/stats/:user', async (req, res) => {
+ let responded = false;
+ if (req.params.user.length > 16) { // If uuid
+ id = req.params.user;
+ if(id.includes('-')) {
+ id = id.replace(/-/g, '');
+ }
+ } else { // If username
+ var id = '';
+ await Promise.all([
+ fetch(`https://api.mojang.com/users/profiles/minecraft/${req.params.user}`)
+ ])
+ .then(async([res1]) => {
+ // Gets the user's uuid from the Mojang API
+ mojang_data = await res1.json();
+ id = mojang_data.id;
+ })
+ .catch(error => {
+ res.send({success: false, cause: 'This user does not exist'});
+ responded = true;
+ });
+ }
+ if(id != '') {
+ Promise.all([
+ fetch(`https://api.hypixel.net/resources/skyblock/bingo`)
+ ])
+ .then(async([res1]) => {
+ // Gets the current active bingo goals
+ let goal_data = await res1.json();
+ Promise.all([
+ fetch(`https://api.hypixel.net/player?key=${key}&uuid=${id}`),
+ fetch(`https://api.hypixel.net/skyblock/profiles?key=${key}&uuid=${id}`),
+ fetch(`https://api.hypixel.net/skyblock/bingo?key=${key}&uuid=${id}`)
+ ])
+ .then(async([res1, res2, res3]) => {
+ let player_data = await res1.json();
+ // Get's the user's username
+ let name = player_data.player.displayname;
+ // Gets the user's Hypixel rank
+ var hypixel_rank = 'NORMAL';
+ if(player_data.player.rank != undefined) {
+ hypixel_rank = player_data.player.rank;
+ } else if(player_data.player.monthlyPackageRank != undefined && player_data.player.monthlyPackageRank != 'NONE') {
+ hypixel_rank = player_data.player.monthlyPackageRank;
+ } else if(player_data.player.newPackageRank != undefined) {
+ hypixel_rank = player_data.player.newPackageRank;
+ } else if(player_data.player.packageRank != undefined) {
+ hypixel_rank = player_data.player.packageRank;
+ }
+
+ let profile_data = await res2.json();
+ // If the user does not have skyblock data send an error message
+ if (profile_data.profiles == null && !responded) {res.send({success: false, cause: 'No skyblock data could be found'}); responded = true;}
+ let bingo_rank = 0;
+ let profile_number = 0;
+ for (i = 0; i < profile_data.profiles.length; i++) {
+ if (profile_data.profiles[i].game_mode == 'bingo') {
+ // Determines which profile is the user's bingo profile
+ profile_number = i;
+ // Determines the user's bingo rank (based on their active bingo pet)
+ if (profile_data.profiles[profile_number].members[id].pets[0] != undefined) {
+ if (profile_data.profiles[profile_number].members[id].pets[0].tier == 'UNCOMMON') {bingo_rank = 1;}
+ if (profile_data.profiles[profile_number].members[id].pets[0].tier == 'RARE') {bingo_rank = 2;}
+ if (profile_data.profiles[profile_number].members[id].pets[0].tier == 'EPIC') {bingo_rank = 3;}
+ }
+ break;
+ }
+ }
+
+ let bingo_data = await res3.json();
+ // If the user does not have bingo data send an empty response
+ if (bingo_data.success == false && !responded) {res.send({uuid: id, username: name, hypixel_rank: hypixel_rank, bingo_rank: 0, total_completions: 0, total_points: 0, points: 0, completed_goals: []}); responded = true;}
+ // Get's the total bingo points & total bingo completions of a user
+ var completions = 0;
+ var total_points = 0;
+ let add_to_blacklist = false;
+ for(j = 0; j < bingo_data.events.length; j++) {
+ // If a user has exceeded the maximum number of points (ie: they duped points) blacklist the user
+ if (bingo_data.events[j].points > 160) {add_to_blacklist = true;}
+ if(bingo_data.events[j].completed_goals.length == 20) {completions++;}
+ total_points+=bingo_data.events[j].points;
+ }
+
+ // Checks to see if a user is blacklisted
+ let already_blacklisted = false;
+ for(i = 0; i < blacklist_temp.length; i++) {
+ if(blacklist_temp[i].uuid == id) {already_blacklisted = true;}
+ }
+
+ // Updates the leaderboard array
+ // For each player on the leaderboard
+ for(k = 0; k < leaderboard.length; k++) {
+ // If the user is not blacklisted
+ if(!already_blacklisted) {
+ // If the user's points are greater than the person k on the leaderboard
+ if (total_points > leaderboard[k].points) {
+ // If the user is already on the leaderboard
+ if (leaderboard.find(element => element.uuid === id) != undefined) {
+ // If the amount of points shown is less than the current amount
+ if (total_points > (leaderboard.find(element => element.uuid === id).points)) {
+ let index = leaderboard.findIndex(element => element.uuid === id);
+ leaderboard.splice(index, 1);
+ leaderboard.splice(k, 0, {uuid: id, name: name, hypixel_rank: hypixel_rank, points: total_points});
+ break;
+ }
+ // If the user is not already on the leaderboard
+ } else {
+ leaderboard.splice(k, 0, {uuid: id, name: name, hypixel_rank: hypixel_rank, points: total_points});
+ leaderboard.pop();
+ break;
+ }
+ }
+ }
+ }
+
+ // Updates the blacklist.json file
+ if(add_to_blacklist && !already_blacklisted) {blacklist_temp.push({uuid: id});}
+ if(blacklist != blacklist_temp) {
+ fs.writeFileSync('blacklist.json', JSON.stringify(blacklist_temp));
+ }
+
+ // Updates the leaderboard.json file
+ fs.writeFileSync('leaderboard.json', JSON.stringify(leaderboard));
+
+ completed_goals = [];
+ points = 0;
+ // Gets the user's amount of points for the current bingo event
+ for(i = 0; i < bingo_data.events.length; i++) {
+ if (bingo_data.events[i].key == goal_data.id) {
+ points = bingo_data.events[i].points;
+ // Gets the # of completed goals for the current bingo event
+ completed_goals = bingo_data.events[i].completed_goals;
+ }
+ }
+ if(!responded) {res.send({uuid: id, username: name, hypixel_rank: hypixel_rank, bingo_rank: bingo_rank, total_completions: completions, total_points: total_points, points: points, completed_goals: completed_goals}); responded = true;}
+ })
+ .catch(error => {
+ if(!responded) {res.send({success: false, cause: 'This user does not exist'}); responded = true;};
+ });
+ })
+ .catch(error => {
+ if(!responded) {res.send({success: false, cause: 'The Hypixel API is currently unavailable.'}); responded = true;};
+ });
+ }
+})
+
+app.get('/stats/:user', (req, res) => {
+ res.sendFile(__dirname + '/index.html');
+})
+
+app.get('/api/leaderboard', (req, res) => {
+ res.send({leaderboard});
+})
+
+app.get('/api/*', function(req, res){
+ res.redirect(`https://${origin}/api`);
+});
+
+app.get('*', function(req, res){
+ res.redirect(`https://${origin}`);
+});
+
+app.listen(port, () => {
+ console.log(`Listening to requests on https://${origin}:${port}`);
+});
\ No newline at end of file
diff --git a/leaderboard.json b/leaderboard.json
new file mode 100644
index 0000000..82e971a
--- /dev/null
+++ b/leaderboard.json
@@ -0,0 +1 @@
+[{"uuid":"2382416a89c646ee8ddc39aafbf801ba","name":"MinimiOW","hypixel_rank":"MVP_PLUS","points":1222},{"uuid":"93679901c82e468199fc54b53bb11c84","name":"Dredlig","hypixel_rank":"SUPERSTAR","points":1217},{"uuid":"1fb3717815694d02bca354cd1efaf25f","name":"zLegitH4cker","hypixel_rank":"MVP_PLUS","points":1211},{"uuid":"e6ae8489ca504c72a48133b3bcb262d2","name":"indigo_polecat","hypixel_rank":"SUPERSTAR","points":1145},{"uuid":"2bd36a91223743a49895b0f7fcdf6ce1","name":"sheetoflight","hypixel_rank":"MVP_PLUS","points":1141},{"uuid":"3bd74c4d69e04d76965f256b814b9a44","name":"CowKou","hypixel_rank":"MVP_PLUS","points":1117},{"uuid":"403ed07460254eb59cc5a27a5b45c78d","name":"Prestige0","hypixel_rank":"MVP_PLUS","points":1116},{"uuid":"6a2b0a0a92734cc4b2bb684f17213651","name":"Iridescentwolfz","hypixel_rank":"VIP","points":1093},{"uuid":"f144204d72de440799d4a1fbed50437b","name":"ZwergiX","hypixel_rank":"MVP_PLUS","points":1085},{"uuid":"c1127c0f10cd489c9d0f27c2df3d76f1","name":"godwyyn","hypixel_rank":"VIP_PLUS","points":1067},{"uuid":"0a0cd465fcaa43a6984aedbaf59ec862","name":"Hinoshii","hypixel_rank":"MVP_PLUS","points":1064},{"uuid":"d41427d70a8c42b98c8ea5b824e07b3b","name":"GoofyGoober","hypixel_rank":"MVP_PLUS","points":1046},{"uuid":"3abe728373774dd293bf6d843ce2618d","name":"_Progress","hypixel_rank":"VIP_PLUS","points":1042},{"uuid":"9bcb911d12f84d1e81af9c1f25fe19c2","name":"Bgbros","hypixel_rank":"MVP_PLUS","points":1040},{"uuid":"29c9e69228a44de8a0aeb8efd3c2872a","name":"AngeryMeowFloof","hypixel_rank":"SUPERSTAR","points":1038},{"uuid":"01dddf98b1be4498aadc8c3d84cbc69d","name":"lucky_man_cz14","hypixel_rank":"VIP","points":1035},{"uuid":"a99a4853fbe148eb8b9f0cf9efeb6912","name":"R4PlD","hypixel_rank":"MVP_PLUS","points":1034},{"uuid":"6df58a0ed5e54ec785c95d9e38f35350","name":"masanosuk","hypixel_rank":"MVP_PLUS","points":1025},{"uuid":"a8c55e3a665741c4a5762c6c97cbb428","name":"leo7668","hypixel_rank":"MVP_PLUS","points":1022},{"uuid":"952230439e3344c8a27e6b5096f719dc","name":"ArohaTheDino","hypixel_rank":"SUPERSTAR","points":1021},{"uuid":"e4f317cef6ea4bbd95842d62a4756c3f","name":"Ratzou2","hypixel_rank":"MVP_PLUS","points":1019},{"uuid":"7ab8e30281ce4844a8d10e88640a9248","name":"bcfc_simon","hypixel_rank":"SUPERSTAR","points":1005},{"uuid":"784b78edfe7d497289c617b4ab445361","name":"Blowody","hypixel_rank":"SUPERSTAR","points":1004},{"uuid":"fd9717eaedcf40b99b253af7f5e47e7b","name":"zyzzvays","hypixel_rank":"MVP_PLUS","points":999},{"uuid":"446dcccfa0e24822aca95d7ffafa9ca9","name":"ThePowerCoffee","hypixel_rank":"MVP_PLUS","points":986},{"uuid":"aeb0f531d3404bc8aca4e82b3234bc9c","name":"nightlibra","hypixel_rank":"SUPERSTAR","points":984},{"uuid":"e1ed1823b443477d96b4281b194e17ab","name":"Sir_Cow","hypixel_rank":"NORMAL","points":981},{"uuid":"803d0a34147e40a282050d2392c69ee8","name":"Jakeering","hypixel_rank":"MVP_PLUS","points":979},{"uuid":"40529a844ff246ab8956c47d05053631","name":"987654321kaboom","hypixel_rank":"MVP_PLUS","points":978},{"uuid":"7efecc4706d1407786eb0eefea32198b","name":"Iancido","hypixel_rank":"VIP_PLUS","points":972},{"uuid":"3b2f489e37f14629a18b94541e369b35","name":"Malmedare","hypixel_rank":"VIP_PLUS","points":970},{"uuid":"eb68c0983784414fbb6aaff40224d746","name":"yuuyuurunnta","hypixel_rank":"VIP","points":965},{"uuid":"ded40d76ce514e968fc2b366ff6a4d1d","name":"TheXandergoose","hypixel_rank":"MVP_PLUS","points":963},{"uuid":"931e12d3f1ef4fd98997ba28aab0997a","name":"GotKiller_","hypixel_rank":"MVP_PLUS","points":961},{"uuid":"75c03d723128405db2cdfe2b580cc8c2","name":"Hogalolz","hypixel_rank":"MVP_PLUS","points":958},{"uuid":"7617029983bf44ad9b03c65ab0c1cd10","name":"Growing_Potato","hypixel_rank":"VIP","points":956},{"uuid":"b28316a0102949ea97f0ee23cf079c3d","name":"JH159753","hypixel_rank":"MVP_PLUS","points":956},{"uuid":"5c5e1c4024d541deba7981c4b17de37a","name":"JackGB","hypixel_rank":"MVP_PLUS","points":952},{"uuid":"c58fa47723bf4894b185b9b7a619326b","name":"oWoPanda","hypixel_rank":"MVP_PLUS","points":951},{"uuid":"3fded1427bb64f53938e59010ddb098c","name":"Guermas","hypixel_rank":"MVP_PLUS","points":941},{"uuid":"7c6196f5a3ba44c8b2b4f46e337d4759","name":"valkeea","hypixel_rank":"SUPERSTAR","points":939},{"uuid":"4798a17b228f406c900516c3c472bb72","name":"THE_TY","hypixel_rank":"MVP_PLUS","points":933},{"uuid":"e5b7b611cd094b6daaba8590f944e26c","name":"isacang","hypixel_rank":"VIP_PLUS","points":933},{"uuid":"fe3bf05f803741f0b6cced25f03ea0c7","name":"WildPandas","hypixel_rank":"MVP_PLUS","points":930},{"uuid":"1cab746bfd854709bd3d9d079dc415f7","name":"Touwlix","hypixel_rank":"MVP_PLUS","points":921},{"uuid":"6c6dcfa62e8547b08b0733fd436127ab","name":"2Apex","hypixel_rank":"MVP_PLUS","points":920},{"uuid":"7c5acafbda154f4ababe885552c5aad1","name":"Arune_","hypixel_rank":"VIP","points":919},{"uuid":"508f7b37d1994fd89917cefcdfe32050","name":"Shiroyama95","hypixel_rank":"MVP_PLUS","points":917},{"uuid":"201842aaf9f34c1d82e388f6abaeaea3","name":"figthgocz","hypixel_rank":"MVP_PLUS","points":911},{"uuid":"76ebe550621b4954867575757ee3c281","name":"Luffy5000","hypixel_rank":"MVP_PLUS","points":909},{"uuid":"dffe9e8f094c42d79a0b2b74d445337c","name":"IAlcheMistI","hypixel_rank":"SUPERSTAR","points":908},{"uuid":"0d9eabc9e68844049b24249687e9a6a7","name":"tipok95","hypixel_rank":"YOUTUBER","points":902},{"uuid":"bbcc421b687849ae9bc20b8110bc2695","name":"Shmylblock","hypixel_rank":"MVP_PLUS","points":897},{"uuid":"280b962b7936464286ac1896969e5a82","name":"Midgemidge1014","hypixel_rank":"VIP","points":896},{"uuid":"29135e50c229404ba0b2a147abc374fc","name":"Knattekalle","hypixel_rank":"MVP_PLUS","points":888},{"uuid":"d6ec5310e2a14ef4a4e17bebf9e7b4dd","name":"Crxmsxn","hypixel_rank":"SUPERSTAR","points":888},{"uuid":"909960049b944a4da602b4f982b1bf39","name":"F8_DarQ","hypixel_rank":"SUPERSTAR","points":887},{"uuid":"1edd0fe43a004bdfa3c84770bb383680","name":"mcfiletmc","hypixel_rank":"MVP_PLUS","points":886},{"uuid":"77e3ef9ca4f647a5a5b1d0b2b9169165","name":"waterman6","hypixel_rank":"MVP_PLUS","points":885},{"uuid":"8deb1157188649f8bedc50c3adab88ef","name":"OPtea","hypixel_rank":"MVP_PLUS","points":883},{"uuid":"6410fef765f44204946201c45b2d01f9","name":"KatAura","hypixel_rank":"MVP_PLUS","points":882},{"uuid":"3c41a7323c0e426eb7708c7b49056be9","name":"ChangJenChieh","hypixel_rank":"MVP_PLUS","points":881},{"uuid":"94077c25c81147c493c239b66f76e55e","name":"Cybacat","hypixel_rank":"MVP_PLUS","points":879},{"uuid":"fb2188cc1abf4ae2b550b3c0d0a6b484","name":"Master_dragon7","hypixel_rank":"MVP_PLUS","points":878},{"uuid":"7b788f9e8a144629b3857f953f0d7fba","name":"Bluwudy","hypixel_rank":"SUPERSTAR","points":876},{"uuid":"27985f4edbcd49078057b9a9e180df83","name":"Bananyawn","hypixel_rank":"MVP_PLUS","points":874},{"uuid":"7eccd63ba67442aebe73246fc6ee326e","name":"qwerio","hypixel_rank":"VIP","points":873},{"uuid":"2295c365d1a14e5d84954c315b6053f7","name":"godmlg","hypixel_rank":"SUPERSTAR","points":870},{"uuid":"2d400a4ac7cb469db6f538681bca5400","name":"lgutich","hypixel_rank":"SUPERSTAR","points":869},{"uuid":"3f433486950c4ac493c9e45fe9408e3a","name":"iHqck0d","hypixel_rank":"MVP_PLUS","points":868},{"uuid":"866f23271d704d4c9af7374b49bac318","name":"The_HoboMC","hypixel_rank":"MVP_PLUS","points":867},{"uuid":"d45a0bdf0f544d7eb7eb388b9a479b33","name":"CombiGamerHD","hypixel_rank":"SUPERSTAR","points":863},{"uuid":"5602860f0158482aa46a830918a697db","name":"uwuMina","hypixel_rank":"VIP","points":858},{"uuid":"97d810bcc26e452aab0e9f6b1fa980d9","name":"TomekoYT","hypixel_rank":"MVP_PLUS","points":858},{"uuid":"42ff7beb96ea40f98feb8552e9fe6b3f","name":"ELIE101","hypixel_rank":"SUPERSTAR","points":853},{"uuid":"b9b21ef97dd84f2b842c21e46ade959a","name":"Ermanex","hypixel_rank":"MVP_PLUS","points":848},{"uuid":"c932b869d4794471a36d4ec6c1ef1fa2","name":"IQONIQ_","hypixel_rank":"SUPERSTAR","points":847},{"uuid":"578ce7fac6c44ca2ba1badad8dbbe884","name":"Im_Krazy","hypixel_rank":"SUPERSTAR","points":842},{"uuid":"eee62e0c4f2a4be79a513d002b7c1703","name":"VoidGloomSeraphV","hypixel_rank":"SUPERSTAR","points":842},{"uuid":"f315e6f2314944a29383571b015d8c99","name":"DoomTurtles_","hypixel_rank":"MVP","points":841},{"uuid":"1cd32de3866a4f6096c58c4578580ad9","name":"aurora6get","hypixel_rank":"VIP_PLUS","points":841},{"uuid":"76030a9f604d47d2983b9a71fdb5c687","name":"Axlifax","hypixel_rank":"VIP","points":840},{"uuid":"b883b8b3551c4ea28e446b7a7385712f","name":"LvckyTimeJr","hypixel_rank":"MVP_PLUS","points":836},{"uuid":"51a4220763bf4c50bcdcab7a8d84857b","name":"TheChubbyWalrus","hypixel_rank":"VIP","points":828},{"uuid":"0756300c365a4b8e832b04c5a374d728","name":"LeqitAndre","hypixel_rank":"MVP_PLUS","points":824},{"uuid":"27612d9e9da74fd690128c4bcde0299f","name":"Overvest","hypixel_rank":"NORMAL","points":818},{"uuid":"9163a0b254dc4fd6ac7dadcc86ec3465","name":"Erkonyx","hypixel_rank":"MVP_PLUS","points":816},{"uuid":"75fd93dd8e48469881a297dae2ec5b5f","name":"Pugzy","hypixel_rank":"MVP_PLUS","points":811},{"uuid":"df5e1701809c48be9b0def50b83b009e","name":"GoldenDusk","hypixel_rank":"SUPERSTAR","points":810},{"uuid":"858ee9a1ba6f4ef9a512fd0eb63d0663","name":"arithemonkey","hypixel_rank":"SUPERSTAR","points":809},{"uuid":"c860277ce6b346369d322499b2a14904","name":"IchBinJoxi","hypixel_rank":"MVP_PLUS","points":808},{"uuid":"820473a067cc4acaa1d8c31b4ef0c0a2","name":"Zlarium_","hypixel_rank":"MVP_PLUS","points":808},{"uuid":"a5c1a16ed64e498c8ccd0c1ce9bd37d8","name":"GleoLP","hypixel_rank":"MVP_PLUS","points":807},{"uuid":"33eba728d67b479e8fa1f37307174ea4","name":"Kneshio","hypixel_rank":"MVP_PLUS","points":806},{"uuid":"25dfaa496f2348279fadc88d4279c059","name":"SkeppyBisector","hypixel_rank":"MVP_PLUS","points":804},{"uuid":"3bb7b89511bf4ff7880318018c60a5ac","name":"Fireday","hypixel_rank":"VIP_PLUS","points":802},{"uuid":"74fcc716bf45488d82bf94d986625756","name":"Nackoy","hypixel_rank":"MVP_PLUS","points":801},{"uuid":"4d16bc6b2ff340c7910ce7472d12e6cd","name":"derNiklaas","hypixel_rank":"SUPERSTAR","points":800},{"uuid":"73153a9474cf4503ace8300044967889","name":"Portal_Room","hypixel_rank":"MVP_PLUS","points":800},{"uuid":"13913fb5aa3d4cd0bb5291b282e9be86","name":"uwususc","hypixel_rank":"MVP_PLUS","points":792}]
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..31c69ae
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1614 @@
+{
+ "name": "bingo-api",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "body-parser": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
+ "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.10.3",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActl