pixelplanet/src/core/ranking.js
2020-01-09 17:09:29 +01:00

59 lines
1.9 KiB
JavaScript

/*
* timers and cron for account related actions
* @flow
*/
import Sequelize from 'sequelize';
import Model from '../data/sequelize';
import RegUser from '../data/models/RegUser';
import logger from './logger';
import { MINUTE } from './constants';
import { DailyCron } from '../utils/cron';
class Ranks {
ranks: Array;
constructor() {
this.updateRanking = this.updateRanking.bind(this);
this.resetDailyRanking = this.resetDailyRanking.bind(this);
this.ranks = {};
setInterval(this.updateRanking, 5 * MINUTE);
DailyCron.hook(this.resetDailyRanking);
}
async updateRanking() {
// recalculate ranking column
await Model.query('SET @r=0; UPDATE Users SET ranking= @r:= (@r + 1) WHERE NOT id= 18 ORDER BY totalPixels DESC;');
await Model.query('SET @r=0; UPDATE Users SET dailyRanking= @r:= (@r + 1) WHERE NOT id= 18 ORDER BY dailyTotalPixels DESC;');
// populate dictionaries
const ranking = await RegUser.findAll({
attributes: ['name', 'totalPixels', 'ranking', 'dailyRanking', 'dailyTotalPixels', [Sequelize.fn('DATEDIFF', Sequelize.literal('CURRENT_TIMESTAMP'), Sequelize.col('createdAt')), 'age']],
limit: 100,
where: { id: { [Sequelize.Op.notIn]: [18, 51] } },
order: ['ranking'],
raw: true,
});
const dailyRanking = await RegUser.findAll({
attributes: ['name', 'totalPixels', 'ranking', 'dailyRanking', 'dailyTotalPixels', [Sequelize.fn('DATEDIFF', Sequelize.literal('CURRENT_TIMESTAMP'), Sequelize.col('createdAt')), 'age']],
limit: 100,
where: { id: { [Sequelize.Op.notIn]: [18, 51] } },
order: ['dailyRanking'],
raw: true,
});
this.ranks.ranking = ranking;
this.ranks.dailyRanking = dailyRanking;
}
async resetDailyRanking() {
logger.info('Resetting Daily Ranking');
await RegUser.update({ dailyTotalPixels: 0 }, { where: {} });
await this.updateRanking();
}
}
const rankings = new Ranks();
export default rankings;