diff --git a/index.js b/index.js index 2773f5c..e8ff887 100644 --- a/index.js +++ b/index.js @@ -147,4 +147,8 @@ module.exports = async function(robot) { require('./integrations/github')(robot, kredits); + if (typeof process.env.KREDITS_MEDIAWIKI_URL !== 'undefined') { + require('./integrations/mediawiki')(robot, kredits); + } + }; diff --git a/integrations/github.js b/integrations/github.js index 102437e..9f276fb 100644 --- a/integrations/github.js +++ b/integrations/github.js @@ -1,5 +1,7 @@ module.exports = async function(robot, kredits) { + robot.logger.debug('[hubot-kredits] Loading GitHub integration...') + const Contributor = kredits.Contributor; const Operator = kredits.Operator; diff --git a/integrations/mediawiki.js b/integrations/mediawiki.js new file mode 100644 index 0000000..aa1d56b --- /dev/null +++ b/integrations/mediawiki.js @@ -0,0 +1,85 @@ +const util = require('util'); +const fetch = require('node-fetch'); +const groupArray = require('group-array'); + +module.exports = async function(robot, kredits) { + + robot.logger.debug('[hubot-kredits] Loading MediaWiki integration...') + + const Contributor = kredits.Contributor; + const Operator = kredits.Operator; + + 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 { + robot.logger.warn(`Fetching ${url} returned HTTP status ${res.status}:`); + robot.logger.warn(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) { + robot.logger.info(`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); + + robot.logger.info(`Created ${results.pagesCreated.length} pages`); + robot.logger.info(`Edited ${results.pagesChanged.length} pages`); + robot.logger.info(`Added ${results.linesAdded} lines of text\n`); + + return results; + } + + function createProposalForUserChanges (user, changes) { + const details = analyzeUserChanges(user, changes); + + // robot.logger.info(util.inspect(details)); + } + + fetchChanges() + .then(res => groupChangesByUser(res)) + .then(res => { + Object.keys(res).forEach(user => createProposalForUserChanges(user, res[user])); + }); + +}; diff --git a/mediawiki.js b/mediawiki.js deleted file mode 100644 index 3ad181e..0000000 --- a/mediawiki.js +++ /dev/null @@ -1,79 +0,0 @@ -#!/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])); - });