Skip to content

Instantly share code, notes, and snippets.

@SpencerSharkey
Last active October 24, 2016 05:16
Show Gist options
  • Save SpencerSharkey/c8d7f699065ee368479384c9d54f0fa3 to your computer and use it in GitHub Desktop.
Save SpencerSharkey/c8d7f699065ee368479384c9d54f0fa3 to your computer and use it in GitHub Desktop.
'use strict';
const chalk = require('chalk');
const async = require('async');
const moment = require('moment');
const mysql = require('../lib/db-mysql').getPool('revive');
const db = require('../lib/db');
const Rcon = require('../lib/rcon');
const models = require('./models');
const Server = models.Server;
const Player = models.Player;
const utils = require('./utils');
const Servers = require('./servers');
const crypto = require('crypto');
console.log(chalk.white('Starting'))
function md5(s) {
return crypto.createHash('md5').update(s).digest('hex');
}
async.forever((done) => {
Player.find({}, (err, players) => {
var total = players.length;
var invalid = 0;
var toKick = [];
async.eachOfSeries(players, (player, playerId, playerDone) => {
mysql.query("SELECT id, bf2_key AS cdhash FROM web_users LEFT JOIN revive_soldiers ON web_users.id = revive_soldiers.web_id WHERE revive_soldiers.pid = ?;", [player.profileId], (err, rows) => {
if (err || !rows || !rows[0]) {
console.log(chalk.yellow('Invalid player!'), player.profileId, player.cdhash, player.name);
return playerDone();
}
var res = rows[0];
var hashes = [];
hashes.push(md5(res.cdhash.replace(/-/g, '').toUpperCase()));
hashes.push(md5(res.cdhash.replace(/-/g, '').toLowerCase()));
hashes.push(md5(res.cdhash.toLowerCase()));
hashes.push(md5(res.cdhash.toUpperCase()));
if (hashes.indexOf(player.cdhash) < 0) {
console.log(player.profileId, player.cdhash, player.name);
toKick.push(player);
invalid++;
}
playerDone();
})
}, () => {
console.log('');
console.log(chalk.red('Invalid CD Keys: '), invalid + ' / ' + total);
async.eachOfSeries(toKick, (player, playerId, playerDone) => {
let server = Servers[player.server];
if (!server) return playerDone();
let rcon = server.fetch();
if (!rcon) return playerDone();
let onError = function(e) {
if (rcon) rcon.release();
console.error('\t' + chalk.magenta(e));
playerDone(); // process next server after error
}
rcon.send('exec admin.kickPlayer ' + player.index).then((res) => {
rcon.release();
console.log('kicked player ', player.name)
playerDone();
}).catch((e) => {
onError(e);
});;
}, () => {
console.log(chalk.cyan('All done. waiting 10sec.'));
setTimeout(() => done(), 10000);
})
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment