From 17f9605e8f2d78bf492108a662a9461553f2a29d Mon Sep 17 00:00:00 2001 From: holly Date: Fri, 3 Sep 2021 23:47:46 +0100 Subject: [PATCH] add ranking mode switching --- server/BotCommandHandler.js | 43 +++++++- server/Packets/StatusUpdate.js | 2 +- server/User.js | 188 +++++++++++++++++++++------------ 3 files changed, 157 insertions(+), 76 deletions(-) diff --git a/server/BotCommandHandler.js b/server/BotCommandHandler.js index a08fe70..919c069 100644 --- a/server/BotCommandHandler.js +++ b/server/BotCommandHandler.js @@ -15,19 +15,26 @@ module.exports = function(User, Message, Stream, IsCalledFromMultiplayer = false case "!help": // This is terrible if (args.length == 1) { - responseMessage = "Commands:" + + responseMessage = "Commands with an * next to them have a sub help section" + "\n!help - Shows this message" + "\n!roll - Rolls a random number or a number between 0 and a given number" + - "\n - Submenus:" + - "\n mp - Shows information about all multiplayer commands" + - "\n admin - Shows information about all admin commands"; + "\n!ranking* - Sets your perfered ranking type" + + "\n!mp* - Shows information about all multiplayer commands" + + "\n!admin* - Shows information about all admin commands"; } else { switch (args[1]) { + case "ranking": + responseMessage = "Ranking Commands:" + + "\n!ranking pp - Sets your ranking type to pp" + + "\n!ranking score - Sets your ranking type to score" + + "\n!ranking acc - Sets your ranking type to accuracy"; + break; + case "mp": responseMessage = "Multiplayer Commands:" + "\n!mp start - Starts a multiplayer match with a delay" + "\n!mp abort - Aborts the currently running multiplayer match" + - "\n!mp obr - Enables Battle Royale mode"; + "\n!mp obr - Enables Battle Royale mode"; break; case "admin": @@ -41,6 +48,32 @@ module.exports = function(User, Message, Stream, IsCalledFromMultiplayer = false } break; + case "!ranking": + if (args.length == 1) { + + } else { + switch (args[1]) { + case "pp": + responseMessage = "Set ranking mode to pp"; + User.rankingMode = 0; + User.getNewUserInformationFromDatabase(); + break; + + case "score": + responseMessage = "Set ranking mode to score"; + User.rankingMode = 1; + User.getNewUserInformationFromDatabase(); + break; + + case "acc": + responseMessage = "Set ranking mode to accuracy"; + User.rankingMode = 2; + User.getNewUserInformationFromDatabase(); + break; + } + } + break; + case "!roll": if (args.length == 1) { responseMessage = User.username + " rolled " + maths.randInt(0, 65535); diff --git a/server/Packets/StatusUpdate.js b/server/Packets/StatusUpdate.js index a45393f..32be534 100644 --- a/server/Packets/StatusUpdate.js +++ b/server/Packets/StatusUpdate.js @@ -25,7 +25,7 @@ module.exports = function(currentUser, id = 0, sendImmidiate = true) { playCount: User.playCount, totalScore: User.totalScore, rank: User.rank, - performance: User.pp + performance: (currentUser.rankingMode == 0 ? User.pp : 0) }; osuPacketWriter.HandleOsuUpdate(UserStatusObject); diff --git a/server/User.js b/server/User.js index 41c4a7f..f9cacb5 100644 --- a/server/User.js +++ b/server/User.js @@ -1,87 +1,135 @@ const StatusUpdate = require("./Packets/StatusUpdate.js"); module.exports = class { - constructor(id, username, uuid, connectTime, isTourneyUser = false) { - this.id = id; - this.username = username; - this.uuid = uuid; - this.connectTime = connectTime; - this.queue = new Buffer.alloc(0); + constructor(id, username, uuid, connectTime, isTourneyUser = false) { + this.id = id; + this.username = username; + this.uuid = uuid; + this.connectTime = connectTime; + this.queue = new Buffer.alloc(0); - this.playMode = 0; - this.countryID = 0; - this.spectators = []; - this.spectating = 0; - this.location = [0,0]; - this.joinedChannels = []; + // Binato specific + this.rankingMode = 0; - // Presence data - this.actionID = 0; - this.actionText = ""; - this.actionMods = 0; - this.beatmapChecksum = ""; - this.beatmapID = 0; - this.currentMods = 0; + this.playMode = 0; + this.countryID = 0; + this.spectators = []; + this.spectating = 0; + this.location = [0,0]; + this.joinedChannels = []; - // Cached db data - this.rankedScore = 0; - this.accuracy = 0; - this.playCount = 0; - this.totalScore = 0; - this.rank = 0; - this.pp = 0; + // Presence data + this.actionID = 0; + this.actionText = ""; + this.actionMods = 0; + this.beatmapChecksum = ""; + this.beatmapID = 0; + this.currentMods = 0; - // Multiplayer data - this.currentMatch = null; - this.matchSlotId = -1; + // Cached db data + this.rankedScore = 0; + this.accuracy = 0; + this.playCount = 0; + this.totalScore = 0; + this.rank = 0; + this.pp = 0; - this.isTourneyUser = isTourneyUser; - } + // Multiplayer data + this.currentMatch = null; + this.matchSlotId = -1; - // Adds new actions to the user's queue - addActionToQueue(newData) { - this.queue = Buffer.concat([this.queue, newData], this.queue.length + newData.length); - } + this.isTourneyUser = isTourneyUser; + } - // Updates the user's current action - updatePresence(action) { - this.actionID = action.status; - this.actionText = action.statusText; - this.beatmapChecksum = action.beatmapChecksum; - this.currentMods = action.currentMods; - this.actionMods = action.currentMods; - this.playMode = action.playMode; - this.beatmapID = action.beatmapId; - } + // Adds new actions to the user's queue + addActionToQueue(newData) { + this.queue = Buffer.concat([this.queue, newData], this.queue.length + newData.length); + } - // Gets the user's score information from the database and caches it - async getNewUserInformationFromDatabase() { - const userScoreDB = await global.DatabaseHelper.query(`SELECT * FROM users_modes_info WHERE user_id = ${this.id} AND mode_id = ${this.playMode} LIMIT 1`); - const userRankDB = await global.DatabaseHelper.query(`SELECT user_id, pp_raw FROM users_modes_info WHERE mode_id = ${this.playMode} ORDER BY pp_raw DESC`); + // Updates the user's current action + updatePresence(action) { + this.actionID = action.status; + this.actionText = action.statusText; + this.beatmapChecksum = action.beatmapChecksum; + this.currentMods = action.currentMods; + this.actionMods = action.currentMods; + this.playMode = action.playMode; + this.beatmapID = action.beatmapId; + } - if (userScoreDB == null || userRankDB == null) throw "fuck"; + // Gets the user's score information from the database and caches it + async getNewUserInformationFromDatabase(forceUpdate = false) { + const userScoreDB = await global.DatabaseHelper.query(`SELECT * FROM users_modes_info WHERE user_id = ${this.id} AND mode_id = ${this.playMode} LIMIT 1`); + let userRankDB = null; + switch (this.rankingMode) { + case 0: + userRankDB = await global.DatabaseHelper.query(`SELECT user_id, pp_raw FROM users_modes_info WHERE mode_id = ${this.playMode} ORDER BY pp_raw DESC`); + break; - let userScoreUpdate = false; - if (this.pp != userScoreDB.pp_raw) { - userScoreUpdate = true; - } + case 1: + userRankDB = await global.DatabaseHelper.query(`SELECT user_id, ranked_score FROM users_modes_info WHERE mode_id = ${this.playMode} ORDER BY ranked_score DESC`); + break; - this.rankedScore = userScoreDB.ranked_score; - this.totalScore = userScoreDB.total_score; - this.accuracy = userScoreDB.avg_accuracy; - this.playCount = userScoreDB.playcount; - for (let i = 0; i < userRankDB.length; i++) { - if (userRankDB[i]["user_id"] == this.id) this.rank = i + 1; - } - this.pp = userScoreDB.pp_raw; + case 2: + userRankDB = await global.DatabaseHelper.query(`SELECT user_id, avg_accuracy FROM users_modes_info WHERE mode_id = ${this.playMode} ORDER BY avg_accuracy DESC`); + break; + } - if (userScoreUpdate) { - StatusUpdate(this, this.id); - } - } + if (userScoreDB == null || userRankDB == null) throw "fuck"; - // Clears out the user's queue - clearQueue() { - this.queue = new Buffer.alloc(0); - } + let userScoreUpdate = false; + if (forceUpdate) { + userScoreUpdate = true; + } else { + switch (this.rankingMode) { + case 0: + if (this.pp != userScoreDB.pp_raw) { + userScoreUpdate = true; + } + break; + + case 1: + if (this.rankedScore != userScoreDB.ranked_score) { + userScoreUpdate = true; + } + break; + + case 2: + if (this.accuracy != userScoreDB.avg_accuracy) { + userScoreUpdate = true; + } + break; + } + } + + this.rankedScore = userScoreDB.ranked_score; + this.totalScore = userScoreDB.total_score; + this.accuracy = userScoreDB.avg_accuracy; + this.playCount = userScoreDB.playcount; + for (let i = 0; i < userRankDB.length; i++) { + if (userRankDB[i]["user_id"] == this.id) this.rank = i + 1; + } + switch (this.rankingMode) { + case 0: + this.pp = userScoreDB.pp_raw; + break; + + case 1: + this.pp = 0; + break; + + case 2: + this.pp = 0; + break; + } + + if (userScoreUpdate) { + StatusUpdate(this, this.id); + } + } + + // Clears out the user's queue + clearQueue() { + this.queue = new Buffer.alloc(0); + } } \ No newline at end of file