import db from './database.js'; import Config from './util/config.js'; import {update_the_one_discord_role} from './discord_updates.js'; const the_ones = []; const floors = { 'Cardboard': 0, 'Wood': 1250, 'Wood+': 1350, 'Bronze': 1400, 'Bronze+': 1450, 'Silver': 1475, 'Silver+': 1500, 'Gold': 1550, 'Gold+': 1600, 'Platinum': 1700, 'Platinum+': 1800, 'Diamond': 1900, 'Diamond+': 2100, 'Legendary': 2300, 'The One': 9999999999999, }; async function update_the_one(user_id, elo, mode) { // Check that "The One" is not deranking after a loss if (user_id == the_ones[mode].user_id) { const the_one = db.prepare('SELECT user_id, elo FROM rating WHERE s3_scores >= ? AND mode = ? ORDER BY elo DESC LIMIT 1').get(Config.games_needed_for_rank, mode); if (!the_one) return; the_ones[mode] = { user_id: the_one.user_id, elo: the_one.elo, }; if (the_one.user_id != user_id) { await update_the_one_discord_role(user_id, false); await update_the_one_discord_role(the_one.user_id, true); } return; } if (elo > the_ones[mode].elo) { const the_previous_one = the_ones[mode].user_id; the_ones[mode] = { user_id: user_id, elo: elo, }; await update_the_one_discord_role(the_previous_one, false); await update_the_one_discord_role(user_id, true); } } function init_the_ones() { for (let i = 0; i < 4; i++) { const the_one = db.prepare('SELECT user_id, elo FROM rating WHERE s3_scores >= ? AND mode = ? ORDER BY elo DESC LIMIT 1').get(Config.games_needed_for_rank, i); if (the_one) { the_ones[i] = { user_id: the_one.user_id, elo: the_one.elo, }; } else { // New season, no scores yet! the_ones[i] = { user_id: null, elo: 100, }; } } } function get_division_from_elo(elo, mode) { const progress = get_rankup_progress(elo, mode); return progress.floor_name; } function get_rankup_progress(elo, mode) { if (the_ones[mode].elo <= elo) { return { floor_name: 'The One', floor_elo: elo, curr_elo: elo, ceil_name: 'The One', ceil_elo: elo, }; } let floor_division = 'Cardboard'; for (const division in floors) { if (!floors.hasOwnProperty(division)) continue; if (floors[division] > elo) { return { floor_name: floor_division, floor_elo: floors[floor_division], curr_elo: elo, ceil_name: division, ceil_elo: division == 'The One' ? the_ones[mode].elo : floors[division], }; } floor_division = division; } // unreachable return { floor_name: 'Cardboard', floor_elo: 0, curr_elo: elo, ceil_name: 'Wood', ceil_elo: floors[1], }; } export {get_division_from_elo, get_rankup_progress, init_the_ones, update_the_one};