[WIP] Add proposals for wiki changes
This commit is contained in:
parent
2780c87aaa
commit
9d8b2c08dc
@ -4,6 +4,10 @@ const groupArray = require('group-array');
|
|||||||
|
|
||||||
module.exports = async function(robot, kredits) {
|
module.exports = async function(robot, kredits) {
|
||||||
|
|
||||||
|
function messageRoom(message) {
|
||||||
|
robot.messageRoom(process.env.KREDITS_ROOM, message);
|
||||||
|
}
|
||||||
|
|
||||||
robot.logger.debug('[hubot-kredits] Loading MediaWiki integration...')
|
robot.logger.debug('[hubot-kredits] Loading MediaWiki integration...')
|
||||||
|
|
||||||
const Contributor = kredits.Contributor;
|
const Contributor = kredits.Contributor;
|
||||||
@ -11,6 +15,45 @@ module.exports = async function(robot, kredits) {
|
|||||||
|
|
||||||
const apiURL = process.env.KREDITS_MEDIAWIKI_URL + 'api.php';
|
const apiURL = process.env.KREDITS_MEDIAWIKI_URL + 'api.php';
|
||||||
|
|
||||||
|
function getContributorByWikiUser(username) {
|
||||||
|
return Contributor.all().then(contributors => {
|
||||||
|
let contrib = contributors.find(c => {
|
||||||
|
if (typeof c.accounts !== 'object') { return false; }
|
||||||
|
return c.accounts.find(a => {
|
||||||
|
a.url === `${process.env.KREDITS_MEDIAWIKI_URL}User:${username}`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (!contrib) {
|
||||||
|
throw new Error();
|
||||||
|
} else {
|
||||||
|
return contrib;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createProposal(username, amount, description, url, details={}) {
|
||||||
|
return getContributorByWikiUser(username).then(contributor => {
|
||||||
|
robot.logger.debug(`[hubot-kredits] Creating proposal to issue ${amount}₭S to ${contributor.name} for ${url}...`);
|
||||||
|
|
||||||
|
let contribution = {
|
||||||
|
contributorId: contributor.id,
|
||||||
|
amount: amount,
|
||||||
|
contributorIpfsHash: contributor.ipfsHash,
|
||||||
|
url,
|
||||||
|
description,
|
||||||
|
details,
|
||||||
|
kind: 'docs'
|
||||||
|
};
|
||||||
|
|
||||||
|
return Operator.addProposal(contribution).catch(error => {
|
||||||
|
robot.logger.error(`[hubot-kredits] Adding proposal failed:`, error);
|
||||||
|
});
|
||||||
|
}).catch(() => {
|
||||||
|
robot.logger.info(`[hubot-kredits] No contributor found for ${username}`);
|
||||||
|
messageRoom(`I wanted to propose giving kredits to wiki user ${username}, but I cannot find their info. Please add them as a contributor: https://kredits.kosmos.org`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function fetchChanges () {
|
function fetchChanges () {
|
||||||
const params = [
|
const params = [
|
||||||
'action=query',
|
'action=query',
|
||||||
@ -28,12 +71,14 @@ module.exports = async function(robot, kredits) {
|
|||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
return res.json();
|
return res.json();
|
||||||
} else {
|
} else {
|
||||||
robot.logger.warn(`Fetching ${url} returned HTTP status ${res.status}:`);
|
robot.logger.info(`Fetching ${url} returned HTTP status ${res.status}:`);
|
||||||
robot.logger.warn(res.body);
|
robot.logger.info(res.body);
|
||||||
throw Error('Unexpected response from '+url);
|
throw Error('Unexpected response from '+url);
|
||||||
}
|
}
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
return res.query.recentchanges;
|
return res.query.recentchanges;
|
||||||
|
}).catch(res => {
|
||||||
|
robot.logger.error(`[hubot-kredits] Failed to fetch ${url} (likely due to a network issue)`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +87,7 @@ module.exports = async function(robot, kredits) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function analyzeUserChanges (user, changes) {
|
function analyzeUserChanges (user, changes) {
|
||||||
robot.logger.debug(`Analyzing ${changes.length} edits from ${user} ...`);
|
// robot.logger.debug(`Analyzing ${changes.length} edits from ${user} ...`);
|
||||||
const results = {};
|
const results = {};
|
||||||
|
|
||||||
results.pagesCreated = changes.filter(c => c.type === 'new');
|
results.pagesCreated = changes.filter(c => c.type === 'new');
|
||||||
@ -51,23 +96,59 @@ module.exports = async function(robot, kredits) {
|
|||||||
.map(c => { return (c.oldlen < c.newlen) ? (c.newlen - c.oldlen) : 0; })
|
.map(c => { return (c.oldlen < c.newlen) ? (c.newlen - c.oldlen) : 0; })
|
||||||
.reduce((a, b) => a + b);
|
.reduce((a, b) => a + b);
|
||||||
|
|
||||||
robot.logger.debug(`Created ${results.pagesCreated.length} pages`);
|
// robot.logger.debug(`Created ${results.pagesCreated.length} pages`);
|
||||||
robot.logger.debug(`Edited ${results.pagesChanged.length} pages`);
|
// robot.logger.debug(`Edited ${results.pagesChanged.length} pages`);
|
||||||
robot.logger.debug(`Added ${results.linesAdded} lines of text\n`);
|
// robot.logger.debug(`Added ${results.linesAdded} lines of text\n`);
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createProposals (changes) {
|
||||||
|
let promises = [];
|
||||||
|
|
||||||
|
Object.keys(changes).forEach(user => {
|
||||||
|
promises.push(createProposalForUserChanges(user, changes[user]));
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
|
function pageTitlesFromChanges(changes) {
|
||||||
|
return changes.map(c => `"${c.title}"`).join(', ');
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateAmountForChanges(details) {
|
||||||
|
let amount;
|
||||||
|
|
||||||
|
amount = '50';
|
||||||
|
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
function createProposalForUserChanges (user, changes) {
|
function createProposalForUserChanges (user, changes) {
|
||||||
const details = analyzeUserChanges(user, changes);
|
const details = analyzeUserChanges(user, changes);
|
||||||
|
const amount = calculateAmountForChanges(changes);
|
||||||
|
|
||||||
// robot.logger.info(util.inspect(details));
|
let desc = `Added ${details.linesAdded} lines of text.`;
|
||||||
|
if (details.pagesChanged.length > 0) {
|
||||||
|
desc = `Edited ${pageTitlesFromChanges(details.pagesChanged)}. ${desc}`;
|
||||||
|
}
|
||||||
|
if (details.pagesCreated.length > 0) {
|
||||||
|
desc = `Created ${pageTitlesFromChanges(details.pagesCreated)}. ${desc}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let url;
|
||||||
|
if (changes.length > 1) {
|
||||||
|
url = `https://wiki.kosmos.org/Special:Contributions/${user}?hideMinor=1`;
|
||||||
|
} else {
|
||||||
|
rc = changes[0];
|
||||||
|
url = `https://wiki.kosmos.org/index.php?title=${rc.title}&diff=${rc.revid}&oldid=${rc.old_revid}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createProposal(user, amount, desc, url, details);
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchChanges()
|
fetchChanges()
|
||||||
.then(res => groupChangesByUser(res))
|
.then(res => groupChangesByUser(res))
|
||||||
.then(res => {
|
.then(res => createProposals(res));
|
||||||
Object.keys(res).forEach(user => createProposalForUserChanges(user, res[user]));
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user