Initial commit

This commit is contained in:
2026-08-24 22:20:36 +02:00
commit 62f7b1278a
251 changed files with 16670 additions and 0 deletions
+49
View File
@@ -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;
+49
View File
@@ -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
*/
+29
View File
@@ -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;