From 245564fe11974b70faf841023066f60af19ba30a Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 29 Oct 2018 13:56:04 +1100 Subject: [PATCH] Implemented levelling and logging --- ADAM/adam.js | 8 +++-- SERVER_City/city.js | 86 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/ADAM/adam.js b/ADAM/adam.js index 3301e6d..efd0071 100644 --- a/ADAM/adam.js +++ b/ADAM/adam.js @@ -141,12 +141,11 @@ function processBasicCommands(client, message) { case "wallet": //DEBUGGING shared.OnServerData("wallet", (amount) => { - shared.SendPublicMessage(client, message.channel, "Wallet: " + amount); + shared.SendPublicMessage(client, message.author, message.channel, "Wallet: " + amount); }, message.author.id); return true; //ADAM and the faction leaders print the intros in the gate - //TODO: prune the unneeded intros from each bot case "intro": if (shared.IsAdmin(client, message.author) && message.channel.id == process.env.GATE_CHANNEL_ID) { shared.SendPublicMessage(client, client.channels.get(process.env.GATE_CHANNEL_ID), dialog("intro")); @@ -160,6 +159,11 @@ function processBasicCommands(client, message) { message.delete(1000); } return true; + + case "debugxp": + shared.SendServerData("addXP", message.author.id, args[0]); + shared.SendPublicMessage(client, message.author, message.channel, "debug XP added"); + return true; } return false; diff --git a/SERVER_City/city.js b/SERVER_City/city.js index ac7e962..20ee3d8 100644 --- a/SERVER_City/city.js +++ b/SERVER_City/city.js @@ -45,7 +45,7 @@ io.on("connection", async (socket) => { socket.on("updateStamina", handleUpdateStamina); socket.on("conversion", handleConversion); socket.on("checkin", handleCheckin); - socket.on("wallet", handleWallet); + socket.on("wallet", handleWallet); //TODO: server ping from ADAM socket.on("transfer", handleTransfer); socket.on("userStats", handleUserStats); socket.on("addXP", handleAddXP); @@ -83,14 +83,13 @@ async function handleConversion({ data }, fn) { let query = `INSERT INTO users (userID, faction, factionChanged) VALUES (${data[0]}, ${data[1]}, NOW());`; return dbConnection.query(query, (err, result) => { if (err) throw err; - console.log("new user"); + dbLog(data[0], "new user", `joined faction ${data[1]}`); return fn("newUser"); }); } //check if already joined this faction if (result[0].faction == data[1]) { //faction == factionRole - console.log("alreadyJoined"); return fn("alreadyJoined"); } @@ -99,16 +98,14 @@ async function handleConversion({ data }, fn) { return dbConnection.query(query, (err, result) => { if (err) throw err; - console.log(result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), factionChanged))']); if(result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), factionChanged))'] < 60 * 60 * 24 * 7) { //7 days - console.log("conversionLocked"); return fn("conversionLocked"); //too soon } else { //update the database with the join query = `UPDATE users SET faction = ${data[1]}, factionChanged = NOW() WHERE userID='${data[0]}';`; return dbConnection.query(query, (err, result) => { if (err) throw err; - console.log("joined"); //TODO: convert these to database logs + dbLog(data[0], "joined", `joined faction ${data[1]}`); return fn("joined"); }); } @@ -119,7 +116,6 @@ async function handleConversion({ data }, fn) { //handle checkin, and add 1 XP async function handleCheckin({ data }, fn) { //handle checkins (grant crystal bonus) - //TODO: handle XP (grant 1 XP) //arguments to fn: ["available", time since last checkin], randomAmount @@ -129,16 +125,17 @@ async function handleCheckin({ data }, fn) { return dbConnection.query(query, (err, result) => { if (err) throw err; - console.log(result); if (result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), lastCheckin))'] == null || result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), lastCheckin))'] > 60 * 60 * 22) { //22 hours let query = `UPDATE users SET lastCheckin = NOW(), wallet = wallet + ${randomAmount} WHERE userID='${data[0]}' LIMIT 1;`; return dbConnection.query(query, (err, result) => { if (err) throw err; + dbLog(data[0], "checkin", `gained ${randomAmount} to wallet`); + addExperience(data[0], 1); //Add 1 XP on every checkin return fn("available", randomAmount); }); } else { - return fn(result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), lastCheckin))']); //TODO: Time ago function + return fn(calculateTimeAgo(result[0]['TIME_TO_SEC(TIMEDIFF(NOW(), lastCheckin))'])); } }); } @@ -150,6 +147,7 @@ async function handleWallet({ data }, fn) { let query = `SELECT wallet FROM users WHERE userID='${data[0]}' LIMIT 1;`; dbConnection.query(query, (err, result) => { if (err) throw err; + dbLog(data[0], "wallet query", `result: ${result[0].wallet}`); fn(result[0].wallet); }); } @@ -192,8 +190,8 @@ async function handleTransfer({ data }, fn) { return dbConnection.query(query, (err, result) => { if (err) throw err; - //TODO: log here //finally + dbLog(data[0], "wallet transfer", `${data[2]} to ${data[1]}`); return fn("success"); }); }); @@ -226,7 +224,6 @@ async function handleUserStats({ data }, fn) { wallet: result[0].wallet }; - //TODO: log this return fn(stats); }); } @@ -236,17 +233,44 @@ async function handleAddXP({ userID, data }) { console.log("received an addXP request..."); //data[0] = amount - //TODO: add an amount of XP to a user account + addExperience(userID, data[0]); } //handle levelling up async function handleLevelUp({ data }, fn) { + //NOTE: levelling up is handled manually because of reasons console.log("received a levelUp request..."); //data[0] = user ID - if (fn) { - fn("none", 0, 0); //["none", "levelUp"], level, statPoints - } + //parameters to fn: ["none", "levelUp"], level, upgradePoints + + //get the current level and total amount of experience + let query = `SELECT level, experience, upgradePoints FROM users WHERE userID='${data[0]}' LIMIT 1;`; + return dbConnection.query(query, (err, result) => { + if (err) throw err; + + //calculate the correct level, and compare it with the result + let newLevel = Math.floor(calculateLevel(result[0].experience)); + + //if no levelling, return + if (newLevel == result[0].level) { + return fn("none", result[0].level, result[0].upgradePoints); + } + + //update the level and the upgrade points + let query = `UPDATE users SET level = ${newLevel}, upgradePoints = upgradePoints + ${newLevel - result[0].level} WHERE userID='${data[0]}' LIMIT 1;`; + return dbConnection.query(query, (err, result) => { + if (err) throw err; + + //finally, pass the level and upgrade points to the client + let query = `SELECT level, upgradePoints FROM users WHERE userID='${data[0]}' LIMIT 1;`; + return dbConnection.query(query, (err, result) => { + if (err) throw err; + dbLog(data[0], "level up", `level: ${result[0]}, upgrade points: ${result[0].upgradePoints}`); + return fn("levelUp", result[0].level, result[0].upgradePoints); + }); + }); + }); } //utility functions @@ -262,4 +286,36 @@ function calculateLevelProgress(experience) { let decimal = level - base; return Math.floor(decimal * 100); //percentage +} + +function addExperience(userID, amount) { + //Add an amount of XP to a user account + let query = `UPDATE users SET experience = experience + ${amount} WHERE userID='${userID}' LIMIT 1;`; + return dbConnection.query(query, (err, result) => { + if (err) throw err; + dbLog(userID, "xp up", `amount added: ${amount}`); + }); +} + +function dbLog(id, type, data) { + let query = `INSERT INTO log (discordID, type, data) VALUES ('${id}', '${type}', '${data}')`; + return dbConnection.query(query, (err, result) => { + if (err) throw err; + }); +} + +function calculateTimeAgo(seconds) { + if (seconds < 60) { + return "just now"; + } + + if (seconds < 60 * 60) { + return "just this hour"; + } + + if (seconds < 60 * 60 * 24) { + return "just today"; + } + + return "just recently"; } \ No newline at end of file