Implemented new ladder ordering algorithm
This commit is contained in:
@@ -38,6 +38,8 @@ let excluded = [ //messages that should not be logged
|
|||||||
'Purchase made',
|
'Purchase made',
|
||||||
'Sale made',
|
'Sale made',
|
||||||
|
|
||||||
|
'runLadderTick completed',
|
||||||
|
|
||||||
'Cleaned database',
|
'Cleaned database',
|
||||||
'outerTick'
|
'outerTick'
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ Major
|
|||||||
Minor
|
Minor
|
||||||
---
|
---
|
||||||
|
|
||||||
|
* Show the total equipment strength to the player on their own profile.
|
||||||
* Proper changelog feed.
|
* Proper changelog feed.
|
||||||
* Implement new game ladder sorting.
|
|
||||||
* Implement banning mechanism.
|
* Implement banning mechanism.
|
||||||
* Implement post scrolling for news page.
|
* Implement post scrolling for news page.
|
||||||
* Everyone who signed up within the first month will get an exclusive badge (based on diagnostics data).
|
* Everyone who signed up within the first month will get an exclusive badge (based on diagnostics data).
|
||||||
@@ -55,6 +55,7 @@ Event Ideas
|
|||||||
---
|
---
|
||||||
|
|
||||||
* Capture the flag.
|
* Capture the flag.
|
||||||
|
* Bosses / raids (drop exclusive badges / items).
|
||||||
|
|
||||||
Badge Ideas
|
Badge Ideas
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ app.post('/trainrequest', profiles.trainRequest(connection));
|
|||||||
app.post('/untrainrequest', profiles.untrainRequest(connection));
|
app.post('/untrainrequest', profiles.untrainRequest(connection));
|
||||||
app.post('/ladderrequest', profiles.ladderRequest(connection));
|
app.post('/ladderrequest', profiles.ladderRequest(connection));
|
||||||
profiles.runGoldTick(connection);
|
profiles.runGoldTick(connection);
|
||||||
|
profiles.runLadderTick(connection);
|
||||||
|
|
||||||
let combat = require('./combat.js');
|
let combat = require('./combat.js');
|
||||||
app.post('/attackrequest', combat.attackRequest(connection));
|
app.post('/attackrequest', combat.attackRequest(connection));
|
||||||
|
|||||||
+39
-2
@@ -430,7 +430,7 @@ const untrainRequest = (connection) => (req, res) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const ladderRequest = (connection) => (req, res) => {
|
const ladderRequest = (connection) => (req, res) => {
|
||||||
getLadderData(connection, req.body.start, req.body.length, (err, results) => {
|
getLadderData(connection, 'ladderRank', req.body.start, req.body.length, (err, results) => {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
getBadgesStatistics((err, { statistics }) => {
|
getBadgesStatistics((err, { statistics }) => {
|
||||||
@@ -513,6 +513,42 @@ const runGoldTick = (connection) => {
|
|||||||
outerTick.start();
|
outerTick.start();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const runLadderTick = (connection) => {
|
||||||
|
let ladderTickJob = new CronJob('0 * * * * *', () => {
|
||||||
|
//set the ladder rank weight
|
||||||
|
let query = 'UPDATE profiles SET ladderRankWeight = ((recruits + soldiers + scientists + spies) + (SELECT COUNT(*) FROM pastCombat WHERE (attackerId = accountId AND victor = "attacker") OR (defenderId = accountId AND victor = "defender")) / 30 + gold / 10);';
|
||||||
|
connection.query(query, (err) => {
|
||||||
|
if (err) throw err;
|
||||||
|
|
||||||
|
//get the profiles ordered by weight descending
|
||||||
|
let query = 'SELECT id FROM profiles ORDER BY ladderRankWeight DESC;';
|
||||||
|
connection.query(query, (err, results) => {
|
||||||
|
if (err) throw err;
|
||||||
|
|
||||||
|
//collect the promises
|
||||||
|
let promises = [];
|
||||||
|
|
||||||
|
//this is really inefficient
|
||||||
|
let query = 'UPDATE profiles SET ladderRank = ? WHERE id = ?;';
|
||||||
|
for (let i = 0; i < results.length; i++) {
|
||||||
|
promises.push(
|
||||||
|
connection.query(query, [i, results[i].id], (err) => {
|
||||||
|
if (err) throw err;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.all(promises)
|
||||||
|
.then((e) => log('runLadderTick completed'))
|
||||||
|
.catch((e) => log('runLadderTick failed', e ))
|
||||||
|
;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
ladderTickJob.start();
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
// profileCreate: profileCreate, //NOTE: Not actually used
|
// profileCreate: profileCreate, //NOTE: Not actually used
|
||||||
profileRequest: profileRequest,
|
profileRequest: profileRequest,
|
||||||
@@ -520,5 +556,6 @@ module.exports = {
|
|||||||
trainRequest: trainRequest,
|
trainRequest: trainRequest,
|
||||||
untrainRequest: untrainRequest,
|
untrainRequest: untrainRequest,
|
||||||
ladderRequest: ladderRequest,
|
ladderRequest: ladderRequest,
|
||||||
runGoldTick: runGoldTick
|
runGoldTick: runGoldTick,
|
||||||
|
runLadderTick: runLadderTick
|
||||||
};
|
};
|
||||||
+3
-3
@@ -109,10 +109,10 @@ const isSpying = (connection, user, cb) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const getLadderData = (connection, start, length, cb) => {
|
const getLadderData = (connection, field, start, length, cb) => {
|
||||||
//moved here for reusability
|
//moved here for reusability
|
||||||
let query = 'SELECT accounts.id AS id, username, soldiers, recruits, gold FROM accounts JOIN profiles ON accounts.id = profiles.accountId ORDER BY soldiers DESC, recruits DESC, gold DESC LIMIT ?, ?;';
|
let query = 'SELECT accounts.id AS id, username, soldiers, recruits, gold FROM accounts JOIN profiles ON accounts.id = profiles.accountId ORDER BY ? DESC LIMIT ?, ?;';
|
||||||
connection.query(query, [start, length], (err, results) => {
|
connection.query(query, [field, start, length], (err, results) => {
|
||||||
cb(err, results);
|
cb(err, results);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -68,6 +68,9 @@ CREATE TABLE IF NOT EXISTS profiles (
|
|||||||
|
|
||||||
accountId INTEGER UNSIGNED UNIQUE,
|
accountId INTEGER UNSIGNED UNIQUE,
|
||||||
|
|
||||||
|
ladderRank INTEGER UNSIGNED,
|
||||||
|
ladderRankWeight FLOAT UNSIGNED,
|
||||||
|
|
||||||
gold INTEGER DEFAULT 100,
|
gold INTEGER DEFAULT 100,
|
||||||
recruits INTEGER DEFAULT 0,
|
recruits INTEGER DEFAULT 0,
|
||||||
soldiers INTEGER DEFAULT 0,
|
soldiers INTEGER DEFAULT 0,
|
||||||
@@ -194,15 +197,15 @@ CREATE TABLE IF NOT EXISTS badges (
|
|||||||
CONSTRAINT FOREIGN KEY fk_accountId(accountId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
|
CONSTRAINT FOREIGN KEY fk_accountId(accountId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS badgesTimespan ( #for recording timespan-related badges
|
#CREATE TABLE IF NOT EXISTS badgesTimespan ( #for recording timespan-related badges
|
||||||
id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE,
|
# id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE,
|
||||||
td TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
|
# td TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
|
||||||
|
#
|
||||||
accountId INTEGER UNSIGNED,
|
# accountId INTEGER UNSIGNED,
|
||||||
|
#
|
||||||
name VARCHAR(50) NOT NULL,
|
# name VARCHAR(50) NOT NULL,
|
||||||
|
#
|
||||||
qualifyTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
|
# qualifyTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
|
||||||
|
#
|
||||||
CONSTRAINT FOREIGN KEY fk_accountId(accountId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
|
# CONSTRAINT FOREIGN KEY fk_accountId(accountId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
|
||||||
);
|
#);
|
||||||
@@ -1,2 +1,18 @@
|
|||||||
#NOTE: ALWAYS, ALWAYS, ALWAYS write a script in revert.sql that undoes these changes
|
#NOTE: ALWAYS, ALWAYS, ALWAYS write a script in revert.sql that undoes these changes
|
||||||
|
|
||||||
|
ALTER TABLE
|
||||||
|
profiles
|
||||||
|
ADD COLUMN
|
||||||
|
ladderRank INTEGER UNSIGNED
|
||||||
|
AFTER
|
||||||
|
accountId
|
||||||
|
;
|
||||||
|
|
||||||
|
ALTER TABLE
|
||||||
|
profiles
|
||||||
|
ADD COLUMN
|
||||||
|
ladderRankWeight FLOAT UNSIGNED
|
||||||
|
AFTER
|
||||||
|
ladderRank
|
||||||
|
;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user