elo_cache.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import db from './database.js';
  2. import Config from './util/config.js';
  3. import {update_the_one_discord_role} from './discord_updates.js';
  4. const the_ones = [];
  5. const floors = {
  6. 'Cardboard': 0,
  7. 'Wood': 1250,
  8. 'Wood+': 1350,
  9. 'Bronze': 1400,
  10. 'Bronze+': 1450,
  11. 'Silver': 1475,
  12. 'Silver+': 1500,
  13. 'Gold': 1550,
  14. 'Gold+': 1600,
  15. 'Platinum': 1700,
  16. 'Platinum+': 1800,
  17. 'Diamond': 1900,
  18. 'Diamond+': 2100,
  19. 'Legendary': 2300,
  20. 'The One': 9999999999999,
  21. };
  22. async function update_the_one(user_id, elo, mode) {
  23. // Check that "The One" is not deranking after a loss
  24. if (user_id == the_ones[mode].user_id) {
  25. 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);
  26. if (!the_one) return;
  27. the_ones[mode] = {
  28. user_id: the_one.user_id,
  29. elo: the_one.elo,
  30. };
  31. if (the_one.user_id != user_id) {
  32. await update_the_one_discord_role(user_id, false);
  33. await update_the_one_discord_role(the_one.user_id, true);
  34. }
  35. return;
  36. }
  37. if (elo > the_ones[mode].elo) {
  38. const the_previous_one = the_ones[mode].user_id;
  39. the_ones[mode] = {
  40. user_id: user_id,
  41. elo: elo,
  42. };
  43. await update_the_one_discord_role(the_previous_one, false);
  44. await update_the_one_discord_role(user_id, true);
  45. }
  46. }
  47. function init_the_ones() {
  48. for (let i = 0; i < 4; i++) {
  49. 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);
  50. if(the_one) {
  51. the_ones[i] = {
  52. user_id: the_one.user_id,
  53. elo: the_one.elo,
  54. };
  55. } else {
  56. // New season, no scores yet!
  57. the_ones[i] = {
  58. user_id: null,
  59. elo: 100,
  60. };
  61. }
  62. }
  63. }
  64. function get_division_from_elo(elo, mode) {
  65. let progress = get_rankup_progress(elo, mode);
  66. return progress.floor_name;
  67. }
  68. function get_rankup_progress(elo, mode) {
  69. if(the_ones[mode].elo <= elo) {
  70. return {
  71. floor_name: "The One",
  72. floor_elo: elo,
  73. curr_elo: elo,
  74. ceil_name: "The One",
  75. ceil_elo: elo
  76. };
  77. }
  78. let floor_division = 'Cardboard';
  79. for(let division in floors) {
  80. if(floors[division] > elo) {
  81. return {
  82. floor_name: floor_division,
  83. floor_elo: floors[floor_division],
  84. curr_elo: elo,
  85. ceil_name: division,
  86. ceil_elo: division == 'The One' ? the_ones[mode].elo : floors[division],
  87. };
  88. }
  89. floor_division = division;
  90. }
  91. // unreachable
  92. return {
  93. floor_name: 'Cardboard',
  94. floor_elo: 0,
  95. curr_elo: elo,
  96. ceil_name: 'Wood',
  97. ceil_elo: floors[1],
  98. };
  99. }
  100. export {get_division_from_elo, get_rankup_progress, init_the_ones, update_the_one};