Syncing reddit and wekan actors.

This commit is contained in:
ThePendulum 2022-06-27 01:38:24 +02:00
commit 096637d46b
6 changed files with 1643 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
node_modules/
config/*
!config/default.js

2
README.md Normal file
View File

@ -0,0 +1,2 @@
# kanbanmod
Synchronize Wekan kanban actor names with reddit automoderator forbidden title word list.

20
config/default.js Normal file
View File

@ -0,0 +1,20 @@
module.exports = {
reddit: {
userAgent: 'kanbanmod',
clientId: '',
clientSecret: '',
refreshToken: '',
accessToken: '',
},
interval: 5,
subreddit: 'PornMilestones',
actorCommentKey: 'KANBANNED',
baseActorNames: [],
wekan: {
url: '',
username: '',
password: '',
boardId: '',
listId: '',
},
};

1534
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

16
package.json Normal file
View File

@ -0,0 +1,16 @@
{
"name": "kanbanmod",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"bhttp": "^1.2.8",
"config": "^3.3.7",
"snoowrap": "^1.23.0"
}
}

68
src/app.js Normal file
View File

@ -0,0 +1,68 @@
'use strict';
const config = require('config');
const snoowrap = require('snoowrap');
const bhttp = require('bhttp');
const reddit = new snoowrap(config.reddit);
async function getWekanActorNames() {
const wekanLoginRes = await bhttp.post(`${config.wekan.url}/users/login`, {
username: config.wekan.username,
password: config.wekan.password,
});
if (!wekanLoginRes.statusCode === 200) {
throw new Error(`Wekan login failed (${wekanLoginRes.statusCode}): ${wekanLoginRes.body}`);
}
const wekanBoardRes = await bhttp.get(`${config.wekan.url}/api/boards/${config.wekan.boardId}/lists/${config.wekan.listId}/cards`, {
headers: {
Authorization: `Bearer ${wekanLoginRes.body.token}`,
},
});
if (!wekanBoardRes.statusCode === 200) {
throw new Error(`Wekan card retrieval failed (${wekanBoardRes.statusCode}): ${wekanBoardRes.body}`);
}
const actorNames = wekanBoardRes.body.map((card) => {
const name = card.title.split(/\s+/).slice(0, 2).join(' ');
// allow single name to be delimited
return name.slice(0, name.indexOf('.'));
;});
return actorNames;
}
async function init() {
const automodConfig = await reddit.getSubreddit(config.subreddit).getWikiPage('config/automoderator').fetch();
const automodLines = automodConfig.content_md.split('\n');
const actorLineIndex = automodLines.findIndex((line) => line.includes(config.actorCommentKey)) + 1;
const wekanActorNames= await getWekanActorNames();
const actorNames = [...config.baseActorNames, ...wekanActorNames];
const newActorLine = `title: ${JSON.stringify(actorNames)}`;
automodLines[actorLineIndex] = newActorLine;
const newConfig = automodLines.join('\n');
if (config.interval) {
const result = await reddit.getSubreddit(config.subreddit).getWikiPage('config/automoderator').edit({
text: newConfig,
reason: 'Synced kanban actor names',
});
console.log(`${new Date().toISOString()} Sync complete, resyncing in ${config.interval} minutes, set ${newActorLine}`);
setTimeout(() => init(), config.interval * 60 * 1000);
return;
}
console.log(`${new Date().toISOString()} Sync complete, set ${newActorLine}`);
}
init();