Initial commit
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
const leaderboards = require("../Data/leaderboard");
|
||||
|
||||
const BATCH_SIZE = 1000;
|
||||
const INTERVAL_TIME = 10000;
|
||||
|
||||
const playerBehaviourContext = global.playerBehaviourContext;
|
||||
let mongoBehaviourCollection = null;
|
||||
let mongoDB = null;
|
||||
|
||||
const { MongoClient } = require("mongodb");
|
||||
async function connect() {
|
||||
const client = new MongoClient("mongodb://localhost:27017");
|
||||
await client.connect({
|
||||
maxPoolSize: 100,
|
||||
minPoolSize: 20,
|
||||
maxConnecting: 20,
|
||||
waitQueueTimeoutMS: 0,
|
||||
socketTimeoutMS: 30000,
|
||||
connectTimeoutMS: 10000,
|
||||
retryWrites: false,
|
||||
directConnection: true
|
||||
});
|
||||
|
||||
return client.db("test");
|
||||
};
|
||||
|
||||
(async function() {
|
||||
mongoDB = await connect();
|
||||
mongoBehaviourCollection = mongoDB.collection("Behaviour");
|
||||
})();
|
||||
|
||||
async function behaviourLoop() {
|
||||
if (playerBehaviourContext.length === 0) return;
|
||||
//require("../Miscellaneous/winston").error(playerBehaviourContext);
|
||||
// console.info(playerBehaviourContext, "loop");
|
||||
const playerBehaviourContextCopy = playerBehaviourContext.slice();
|
||||
|
||||
mongoBehaviourCollection.insertMany(playerBehaviourContextCopy, {
|
||||
ordered: false,
|
||||
writeConcern: { w: 0 },
|
||||
bypassDocumentValidation: true
|
||||
});
|
||||
|
||||
playerBehaviourContext.length = 0;
|
||||
};
|
||||
|
||||
setInterval(behaviourLoop, INTERVAL_TIME);
|
||||
|
||||
module.exports = behaviourLoop;
|
||||
@@ -0,0 +1,49 @@
|
||||
const leaderboards = require("../Data/leaderboard");
|
||||
|
||||
const BATCH_SIZE = 1000;
|
||||
const INTERVAL_TIME = 60000;
|
||||
|
||||
async function leaderboardLoop() {
|
||||
for (let i = 0, length = leaderboards.length; i < length; i++) {
|
||||
const leaderboard = leaderboards[i];
|
||||
const databaseName = `leaderboard_${i + 1}`;
|
||||
const queries = [];
|
||||
const entries = [];
|
||||
|
||||
const dbConnection = await db.getConnection();
|
||||
await dbConnection.beginTransaction();
|
||||
|
||||
leaderboard.list.clearEach((key, value) => entries.push([key, value]));
|
||||
|
||||
for (let j = 0, length = Math.ceil(entries.length / BATCH_SIZE); j < length; j++) {
|
||||
const batch = entries.slice(j * BATCH_SIZE, (j + 1) * BATCH_SIZE);
|
||||
let leaderboardFromDB = null;
|
||||
|
||||
if (i === 0) leaderboardFromDB = dbConnection.query(`INSERT INTO ${databaseName} (id, amount) VALUES ? ON DUPLICATE KEY UPDATE amount = VALUES(amount)`, [batch]);
|
||||
else leaderboardFromDB = dbConnection.query(`INSERT INTO ${databaseName} (id, amount) VALUES ? ON DUPLICATE KEY UPDATE amount = amount + VALUES(amount)`, [batch]);
|
||||
|
||||
queries.push(leaderboardFromDB);
|
||||
};
|
||||
|
||||
try {
|
||||
await Promise.all(queries);
|
||||
await dbConnection.commit();
|
||||
} catch {
|
||||
await dbConnection.rollback();
|
||||
} finally {
|
||||
dbConnection.release();
|
||||
};
|
||||
|
||||
const leaderboardSizeFromDB = await execute(`SELECT COUNT(*) AS size FROM ${databaseName}`);
|
||||
leaderboard.size = leaderboardSizeFromDB.data ? leaderboardSizeFromDB.data[0].size : 0;
|
||||
leaderboard.cache = {};
|
||||
};
|
||||
};
|
||||
|
||||
setInterval(leaderboardLoop, INTERVAL_TIME);
|
||||
|
||||
module.exports = leaderboardLoop;
|
||||
|
||||
/*
|
||||
Periodically saves leaderboard changes to disk in batches
|
||||
*/
|
||||
@@ -0,0 +1,29 @@
|
||||
const [playerEconomy, guildEconomy] = require("../Data/batchSave");
|
||||
|
||||
const BATCH_SIZE = 1000;
|
||||
const INTERVAL_TIME = 60000;
|
||||
|
||||
function resourceLoop() {
|
||||
const guildValues = [];
|
||||
const playerValues = [];
|
||||
|
||||
guildEconomy.clearEach((key, value) => {
|
||||
const [guildID, categoryID, rewardID] = key.split("-");
|
||||
guildValues.push([guildID, categoryID, rewardID, value]);
|
||||
});
|
||||
|
||||
if (guildValues.length) query("INSERT INTO guildresources (guildID, categoryID, itemID, amount) VALUES ? ON DUPLICATE KEY UPDATE amount = amount + VALUES(amount)", [guildValues]);
|
||||
|
||||
playerEconomy.clearEach((key, value) => {
|
||||
const [playerID, categoryID, rewardID] = key.split("-");
|
||||
playerValues.push([playerID, categoryID, rewardID, value]);
|
||||
});
|
||||
|
||||
if (playerValues.length) query("INSERT INTO resources (playerID, categoryID, itemID, amount) VALUES ? ON DUPLICATE KEY UPDATE amount = amount + VALUES(amount)", [playerValues]);
|
||||
|
||||
console.info(guildValues.length, playerValues.length, "periodic save")
|
||||
};
|
||||
|
||||
setInterval(resourceLoop, INTERVAL_TIME);
|
||||
|
||||
module.exports = resourceLoop;
|
||||
Reference in New Issue
Block a user