hubot-kredits/mediawiki.js

80 lines
2.0 KiB
JavaScript

#!/usr/bin/env node
const util = require('util');
const fetch = require('node-fetch');
const groupArray = require('group-array');
if (typeof process.env.KREDITS_MEDIAWIKI_URL === 'undefined') { return false; }
const apiURL = process.env.KREDITS_MEDIAWIKI_URL + 'api.php';
const robot = {
data: {},
brain: {
set(key, value) {
this.data[key] = value;
},
get(key) {
return this.data[key];
}
}
};
function fetchChanges () {
const params = [
'action=query',
'format=json',
'list=recentchanges',
'rctype=edit|new',
'rcshow=!minor|!bot|!anon|!redirect',
'rclimit=max',
'rcprop=ids|title|timestamp|user|sizes|comment|flags'
];
const url = `${apiURL}?${params.join('&')}`;
return fetch(url).then(res => {
if (res.status === 200) {
return res.json();
} else {
console.log(`Fetching ${url} returned HTTP status ${res.status}:`);
console.log(res.body);
throw Error('Unexpected response from '+url);
}
}).then(res => {
return res.query.recentchanges;
});
}
function groupChangesByUser (changes) {
return groupArray(changes, 'user');
}
function analyzeUserChanges (user, changes) {
console.log(`Analyzing ${changes.length} edits from ${user} ...`);
const results = {};
results.pagesCreated = changes.filter(c => c.type === 'new');
results.pagesChanged = changes.filter(c => c.type === 'edit');
results.linesAdded = changes
.map(c => { return (c.oldlen < c.newlen) ? (c.newlen - c.oldlen) : 0; })
.reduce((a, b) => a + b);
console.log(`Created ${results.pagesCreated.length} pages`);
console.log(`Edited ${results.pagesChanged.length} pages`);
console.log(`Added ${results.linesAdded} lines of text\n`);
return results;
}
function createProposalForUserChanges (user, changes) {
const details = analyzeUserChanges(user, changes);
// console.log(util.inspect(details));
}
fetchChanges()
.then(res => groupChangesByUser(res))
.then(res => {
Object.keys(res).forEach(user => createProposalForUserChanges(user, res[user]));
});