Skip to content
Snippets Groups Projects
action.js 4.79 KiB
Newer Older
Ciro Santilli's avatar
Ciro Santilli committed
#!/usr/bin/env node

const fs = require('fs');
const readline = require('readline');

Ciro Santilli's avatar
Ciro Santilli committed
const core = require('@actions/core');
const github = require('@actions/github');

Ciro Santilli's avatar
Ciro Santilli committed
// 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 () => {
Ciro Santilli's avatar
Ciro Santilli committed

// Get images.
Ciro Santilli's avatar
Ciro Santilli committed
let imageRe = /^image::{china-dictatorship-media-base}\/([^/[]+)/;
let images = new Set();
Ciro Santilli's avatar
Ciro Santilli committed
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]);
Ciro Santilli's avatar
Ciro Santilli committed
  }
}
Ciro Santilli's avatar
Ciro Santilli committed
images = getRandom(Array.from(images), 30);
Ciro Santilli's avatar
Ciro Santilli committed
full_images = []
Ciro Santilli's avatar
Ciro Santilli committed
for (const image of images) {
  const url = `https://raw.githubusercontent.com/cirosantilli/china-dictatorship-media/master/${image}`;
Ciro Santilli's avatar
Ciro Santilli committed
  full_images.push(image.replace(/[_.]/g, ' '));
  full_images.push(`<img src="${url}" width="600">`);
Ciro Santilli's avatar
Ciro Santilli committed
}
Ciro Santilli's avatar
Ciro Santilli committed

// 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;
}
Ciro Santilli's avatar
Ciro Santilli committed
const quoteArray = [];
Ciro Santilli's avatar
Ciro Santilli committed
for (const line of titleAndBody.split('\n')) {
Ciro Santilli's avatar
Ciro Santilli committed
  // Remove some speical chars to remove at mention spam possibilities.
  quoteArray.push('> ' + line.replace(/[@#]/g, ""));
}
Ciro Santilli's avatar
Ciro Santilli committed
const replyBody = `Hi @${author},
Ciro Santilli's avatar
Ciro Santilli committed

Ciro Santilli's avatar
Ciro Santilli committed
${quoteArray.join('\n').substring(0,40000)}
Ciro Santilli's avatar
Ciro Santilli committed

${full_images.join('\n\n')}
`;

Ciro Santilli's avatar
Ciro Santilli committed
// Label handling.
Ciro Santilli's avatar
Ciro Santilli committed
let labels;
Ciro Santilli's avatar
Ciro Santilli committed
let newLabels;
if (!isComment) {
Ciro Santilli's avatar
Ciro Santilli committed
  labels = new Set(payload.issue.labels.map(label => label.name));
Ciro Santilli's avatar
Ciro Santilli committed
  newLabels = new Set();
  const shabiWords = [
Ciro Santilli's avatar
Ciro Santilli committed
    '(sha|沙|啥|煞)(b|bi|diao|雕|比|笔)',
    '',
    '智障',
Ciro Santilli's avatar
Ciro Santilli committed
    '垃圾',
Ciro Santilli's avatar
Ciro Santilli committed
    '脑瘫',
    'stupid',
  ];
  for (const word of shabiWords) {
    if (new RegExp(word, 'i').test(titleAndBody)) {
      newLabels.add('you-are-stupid-argument');
      break;
    }
Ciro Santilli's avatar
Ciro Santilli committed
  }
Ciro Santilli's avatar
Ciro Santilli committed
  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;
    }
Ciro Santilli's avatar
Ciro Santilli committed
  }
Ciro Santilli's avatar
Ciro Santilli committed
  for (const word of [
    '中国共产党万岁',
  ]) {
    if (new RegExp(word, 'i').test()) {
      newLabels.add('i-like-my-dictatorship')
      break;
    }
  }
  const motherDiedWords = [
    'nmsl',
Ciro Santilli's avatar
Ciro Santilli committed
    '' + maWords + '',
    '司马',
  ]
  for (const word of motherDiedWords) {
    if (new RegExp(word, 'i').test(titleAndBody)) {
      newLabels.add('your-mother-died-argument');
      break;
    }
Ciro Santilli's avatar
Ciro Santilli committed
  }
  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;
    }
Ciro Santilli's avatar
Ciro Santilli committed
  }
  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');
    }
Ciro Santilli's avatar
Ciro Santilli committed
}

Ciro Santilli's avatar
Ciro Santilli committed
// Make the request.
Ciro Santilli's avatar
Ciro Santilli committed
try {
  console.log(github.context);
  console.log(github.context.payload.owner);
Ciro Santilli's avatar
Ciro Santilli committed
  const octokit = new github.getOctokit(process.env.GITHUB_TOKEN);
  const new_comment = octokit.issues.createComment({
    owner: payload.repository.owner.login,
Ciro Santilli's avatar
Ciro Santilli committed
    repo: payload.repository.name,
    issue_number: payload.issue.number,
    body: replyBody,
Ciro Santilli's avatar
Ciro Santilli committed
  });
  if (!isComment) {
    // Update labels.
    await octokit.issues.update({
      owner: payload.repository.owner.login,
Ciro Santilli's avatar
Ciro Santilli committed
      repo: payload.repository.name,
      issue_number: payload.issue.number,
      labels: Array.from([...labels, ...newLabels])
    });
  }
Ciro Santilli's avatar
Ciro Santilli committed
  const new_issue = octokit.issues.create({
    owner: payload.repository.owner.login,
    repo: payload.repository.name,
    title: `Hi @${author}`,
    body: replyBody,
  });
Ciro Santilli's avatar
Ciro Santilli committed
} catch (error) {
  core.setFailed(error.message);
Ciro Santilli's avatar
Ciro Santilli committed
}
})()