123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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};
|