From 951d1b3c0314b9d60dc4c0d3b3d59603da428ccd Mon Sep 17 00:00:00 2001 From: KittenTM Date: Sat, 21 Mar 2026 23:25:05 +0100 Subject: [PATCH] Implement rankCalc --- judd/models/playerRank.js | 40 +++++++++++++++++++++++++++++++++++++++ judd/titles/splatoon.js | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 judd/models/playerRank.js diff --git a/judd/models/playerRank.js b/judd/models/playerRank.js new file mode 100644 index 0000000..019100b --- /dev/null +++ b/judd/models/playerRank.js @@ -0,0 +1,40 @@ +const { DataTypes } = require('sequelize'); +const { connection } = require('../database'); + +const PlayerRank = connection.define('PlayerRank', { + PId: { + type: DataTypes.BIGINT, + primaryKey: true, + allowNull: false + }, + GameMode: { + type: DataTypes.INTEGER, + primaryKey: true, + allowNull: false + }, + MiiName: { + type: DataTypes.STRING, + allowNull: true + }, + Rank: { + type: DataTypes.INTEGER, + defaultValue: 0 + }, + WinSum: { + type: DataTypes.INTEGER, + defaultValue: 0 + }, + LoseSum: { + type: DataTypes.INTEGER, + defaultValue: 0 + }, + RankingScore: { + type: DataTypes.FLOAT, + defaultValue: 0.0 + } +}, { + tableName: 'player_ranks', + timestamps: true +}); + +module.exports = { PlayerRank }; \ No newline at end of file diff --git a/judd/titles/splatoon.js b/judd/titles/splatoon.js index cb7c6ad..5d455b5 100644 --- a/judd/titles/splatoon.js +++ b/judd/titles/splatoon.js @@ -3,6 +3,7 @@ const { joi } = require('../util'); const { SplatfestResult } = require('../models/splatfest_result'); const { Equipment } = require('../models/equipment'); const { EquipmentLast } = require('../models/equipmentLast'); +const { PlayerRank } = require('../models/playerRank'); module.exports = { type: 'telemetry', @@ -34,6 +35,45 @@ module.exports = { Rank: data.Rank, Udemae: data.Udemae }); + const gameMode = parseInt(data.GameMode); + + if (gameMode !== 3 && gameMode !== 4) { + const isWin = Number(data.IsWinGame) === 1; + const [stats, created] = await PlayerRank.findOrCreate({ + where: { + PId: data.PId, + GameMode: data.GameMode + }, + defaults: { + MiiName: data.MiiName, + Rank: data.Rank, + WinSum: 0, + LoseSum: 0, + RankingScore: 0 + } + }); + let currentWins = stats.WinSum; + let currentLosses = stats.LoseSum; + + if (isWin) { + currentWins += 1; + } else { + currentLosses += 1; + } + + const totalGames = currentWins + currentLosses; + + const winRate = totalGames > 0 ? (currentWins / totalGames) : 0; + const newRankingScore = currentWins * winRate * 10; + + await stats.update({ + MiiName: data.MiiName, + Rank: data.Rank, + WinSum: currentWins, + LoseSum: currentLosses, + RankingScore: newRankingScore + }); + } return result; }