1
0
mirror of https://github.com/cirosantilli/china-dictatorship.git synced 2025-09-01 10:42:34 +02:00
Files
china-dictatorship/action.js
2022-08-04 06:01:38 +00:00

251 lines
6.8 KiB
JavaScript
Executable File

#!/usr/bin/env node
console.log('Starting action.js')
const fs = require('fs');
const readline = require('readline');
const core = require('@actions/core');
const github = require('@actions/github');
// https://stackoverflow.com/questions/19269545/how-to-get-a-number-of-random-elements-from-an-array/19270021#19270021
function getRandom(arr, n) {
var result = new Array(n),
len = arr.length,
taken = new Array(len);
if (n > len)
throw new RangeError("getRandom: more elements taken than available");
while (n--) {
var x = Math.floor(Math.random() * len);
result[n] = arr[x in taken ? taken[x] : x];
taken[x] = --len in taken ? taken[len] : len;
}
return result;
}
(async () => {
// Get images.
let imageRe = /^image::{china-dictatorship-media-base}\/([^/[]+)/;
let images = new Set();
const fileStream = fs.createReadStream('README.adoc');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
let match = imageRe.exec(line);
if (match !== null) {
images.add(match[1]);
}
}
images = getRandom(Array.from(images), 30);
full_images = []
for (const image of images) {
const url = `https://raw.githubusercontent.com/cirosantilli/china-dictatorship-media/master/${image}`;
full_images.push(image.replace(/[_.]/g, ' '));
full_images.push(`<img src="${url}" width="600">`);
}
// Prepare reply body.
const payload = github.context.payload
const isComment = payload.comment !== undefined;
let titleAndBody;
let author;
if (isComment) {
titleAndBody = payload.comment.body;
author = payload.comment.user.login;
} else {
titleAndBody = payload.issue.title + '\n\n' + payload.issue.body;
author = payload.issue.user.login;
}
const quoteArray = [];
const noQuoteArray = [];
for (const line of titleAndBody.split('\n')) {
// Remove some special chars to remove at mention spam possibilities.
const l = line.replace(/[@#]/g, "")
quoteArray.push('> ' + l);
noQuoteArray.push(l);
}
const replyBody = `Hi @${author},
${quoteArray.join('\n').substring(0,40000)}
${full_images.join('\n\n')}
`;
// Label handling.
let labels;
let newLabels;
if (!isComment) {
labels = new Set(payload.issue.labels.map(label => label.name));
newLabels = new Set();
const shabiWords = [
'(sha|沙|啥|煞)(b|bi|diao|雕|比|笔)',
'傻',
'智障',
'垃圾',
'脑瘫',
'stupid',
];
for (const word of shabiWords) {
if (new RegExp(word, 'i').test(titleAndBody)) {
newLabels.add('you-are-stupid-argument');
break;
}
}
const maWords = '(马|吗|妈|m)'
const fuckMotherWords = [
'cnm',
'fuck.*\\b(mom|mum|mother)\\b',
'尼玛',
'(叼|去|日|操|草)(你|泥|拟)' + maWords,
]
for (const word of fuckMotherWords) {
if (new RegExp(word, 'i').test(titleAndBody)) {
newLabels.add('fuck-your-mother-argument');
break;
}
}
for (const word of [
'中国共产党万岁',
'中华人民共和国万岁',
]) {
if (new RegExp(word, 'i').test()) {
newLabels.add('i-like-my-dictatorship')
break;
}
}
const motherDiedWords = [
'nmsl',
'你' + maWords + '死',
'司马',
]
for (const word of motherDiedWords) {
if (new RegExp(word, 'i').test(titleAndBody)) {
newLabels.add('your-mother-died-argument');
break;
}
}
const meantToBeUsedWords = [
'技术',
'github',
]
for (const word of meantToBeUsedWords) {
if (new RegExp(word, 'i').test(titleAndBody)) {
newLabels.add('meant-to-be-used');
break;
}
}
const shitpostWords = [
'fuck',
'shit',
'bitch',
'垃圾',
'婊子',
'恶心',
'操你',
'丑',
];
for (const word of shitpostWords) {
if (new RegExp(word, 'i').test(titleAndBody)) {
newLabels.add('shitpost');
break;
}
}
if (new RegExp('狗', 'i').test(titleAndBody)) {
newLabels.add('you-are-dog-argument');
}
if (newLabels.size > 0) {
newLabels.add('shitpost');
if (labels.has('not-shitpost')) {
labels.delete('not-shitpost');
newLabels.add('op-does-not-know-what-shit-is');
}
}
}
// Make the request.
try {
const octokit = new github.getOctokit(process.env.GITHUB_TOKEN);
// https://github.com/cirosantilli/china-dictatorship/issues/1330
//const new_comment = octokit.rest.issues.createComment({
// owner: payload.repository.owner.login,
// repo: payload.repository.name,
// issue_number: payload.issue.number,
// body: replyBody,
//});
let html_url
if (isComment) {
const title = (`@${author}: ` + noQuoteArray.join('\n').replaceAll('\n', ' ')).substring(0, 255)
html_url = payload.comment.html_url
// https://github.com/cirosantilli/china-dictatorship/issues/1330
//const new_issue = octokit.rest.issues.create({
// owner: payload.repository.owner.login,
// repo: payload.repository.name,
// title,
// body: html_url + '\n\n' + replyBody,
//})
} else {
// Update labels.
if (author !== 'cirosantilli') {
console.log('before octokit.rest.issues.update')
await octokit.rest.issues.update({
owner: payload.repository.owner.login,
repo: payload.repository.name,
issue_number: payload.issue.number,
labels: Array.from([...labels, ...newLabels])
})
console.log('after octokit.rest.issues.update')
}
}
// Get the latest news from duty-machine.
// Can't do fetches anymore they were DMCA'ed.
{
//const commits = await octokit.rest.repos.listCommits({
// owner: 'duty-machine',
// repo: 'news',
// per_page: 1,
//})
//const sha = commits.data[0].sha
//const commit = await octokit.rest.repos.getCommit({
// owner: 'duty-machine',
// repo: 'news',
// ref: sha,
//})
//let filename
//for (const file of commit.data.files) {
// filename = file.filename
// if (filename.startsWith('articles/')) {
// break
// }
//}
//const content = await octokit.rest.repos.getContent({
// owner: 'duty-machine',
// repo: 'news',
// ref: sha,
// path: filename,
//})
//contentS = Buffer.from(content.data.content, 'base64').toString('utf-8')
//const lines = contentS.split('\n')
//const titleAndLink = lines[1]
//const match = titleAndLink.match(/\[([^\]]+)\]\(([^)]+)\)/)
//const title = match[1]
//const link = match[2]
//const body = lines[4]
// https://github.com/cirosantilli/china-dictatorship/issues/1330
//const new_issue_duty = await octokit.rest.issues.create({
// owner: payload.repository.owner.login,
// repo: payload.repository.name,
// title: title + ' ' + link,
// body: content.data.html_url + '\n\n' + link + '\n\n' + html_url + '\n\n' + body,
// labels: ['duty-machine'],
//})
}
} catch (error) {
core.setFailed(error.message);
}
console.log('Finishing action.js')
})()