From 65f1ad5ece5b645d26ddd71c7f26a4e5c8239f8d Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 14 Oct 2021 12:00:51 +0200 Subject: [PATCH 01/62] Began working on submission script rewrite + added .d.ts for jokes & langs --- .eslintrc.json | 3 +- src/types/jokes.d.ts | 73 ++++++++++ src/types/languages.d.ts | 9 ++ tools/submissions.js | 278 ++++++++++++++++----------------------- tools/types.d.ts | 24 ++++ tsconfig.json | 5 + 6 files changed, 230 insertions(+), 162 deletions(-) create mode 100644 src/types/jokes.d.ts create mode 100644 src/types/languages.d.ts create mode 100644 tools/types.d.ts create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index e0285f40..cd2cd5c0 100755 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -14,6 +14,7 @@ "ecmaVersion": 2018 }, "rules": { - "no-console": "off" + "no-console": "off", + "no-async-promise-executor": "off" } } \ No newline at end of file diff --git a/src/types/jokes.d.ts b/src/types/jokes.d.ts new file mode 100644 index 00000000..ced92912 --- /dev/null +++ b/src/types/jokes.d.ts @@ -0,0 +1,73 @@ +//#SECTION dependency types + +/** All joke types */ +export type JokeType = "single" | "twopart"; + +/** All joke categories (excluding aliases) */ +export type JokeCategory = "Misc" | "Programming" | "Dark" | "Pun" | "Spooky" | "Christmas"; + +/** All blacklist flags */ +export interface JokeFlags { + nsfw: boolean; + racist: boolean; + religious: boolean; + political: boolean; + explicit: boolean; +} + + +/** Base interface for all kinds of jokes, internal or submission */ +declare interface JokeBase { + category: JokeCategory; + type: JokeType; + flags: JokeFlags; +} + +/** Base interface for internal jokes (ones that are saved to the local JSON files) */ +declare interface InternalJokeBase extends JokeBase { + safe: boolean; + id: number; +} + +/** Base interface for joke submissions */ +declare interface SubmissionBase extends JokeBase { + formatVersion: number; +} + + +//#SECTION base joke + +/** An internal joke of type `single` */ +export interface SingleJoke extends InternalJokeBase { + type: "single"; + joke: string; +} + +/** An internal joke of type `twopart` */ +export interface TwopartJoke extends InternalJokeBase { + type: "twopart"; + setup: string; + delivery: string; +} + +/** An internal joke of any type */ +export type Joke = SingleJoke | TwopartJoke; + + +//#SECTION submissions + +/** A joke submission of type `single` */ +export interface JokeSubmissionSingle extends SubmissionBase { + type: "single"; + joke: string; +} + +/** A joke submission of type `twopart` */ +export interface JokeSubmissionTwopart extends SubmissionBase { + type: "twopart"; + setup: string; + delivery: string; +} + +/** A joke submission of any type */ +export type JokeSubmission = JokeSubmissionSingle | JokeSubmissionTwopart; diff --git a/src/types/languages.d.ts b/src/types/languages.d.ts new file mode 100644 index 00000000..7f1ef7f4 --- /dev/null +++ b/src/types/languages.d.ts @@ -0,0 +1,9 @@ +import * as LangFile from "../../data/languages.json"; + +declare type LangFileType = typeof LangFile; + + +/** All language codes JokeAPI supports */ +export type LangCodes = keyof LangFileType; +/** The default / fallback language code */ +export type DefaultLangCode = "en"; diff --git a/tools/submissions.js b/tools/submissions.js index 3c5f42c2..93ed47bd 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,199 +1,155 @@ -const settings = require("../settings"); -const fs = require("fs-extra"); +const { readdir, readFile } = require("fs-extra"); const { resolve, join } = require("path"); -const jsl = require("svjsl"); -const parseJokes = require("../src/parseJokes"); -const jokeSubmission = require("../src/jokeSubmission"); -jsl.unused(parseJokes); +const { colors, Errors } = require("svcorelib"); -let addedCount = 0; -let jokesFiles = getAllJokes(); +// const parseJokes = require("../src/parseJokes"); +// const jokeSubmission = require("../src/jokeSubmission"); +const settings = require("../settings"); -const run = () => { - let submissions = getSubmissions(); +const col = colors.fg; - console.log(`${jsl.colors.fg.cyan}There ${submissions.length == 1 ? "is" : "are"} ${jsl.colors.fg.yellow}${submissions.length}${jsl.colors.fg.cyan} submission${submissions.length == 1 ? "" : "s"}.${jsl.colors.rst}`); - if(submissions.length === 0) - { - console.log("Exiting."); - return process.exit(0); - } - jsl.pause(`Do you want to go through them all now? (Y/n):${jsl.colors.rst}`).then(key => { - if(key.toLowerCase && key.toLowerCase() == "n") - process.exit(0); - else - { - console.clear(); - - let goThroughSubmission = (idx) => { - - if(!submissions[idx]) - return finishAdding(); - - let submission = submissions[idx]; - - console.log(`${jsl.colors.fg.yellow}Submission ${idx + 1} / ${submissions.length}${jsl.colors.rst}\n`); - - if(submission.formatVersion != settings.jokes.jokesFormatVersion) - console.error(`${jsl.colors.fg.red}Error: Format version is incorrect${jsl.colors.rst}`); - - console.log(`${jsl.colors.fg.yellow}Language:${jsl.colors.rst} ${submission.lang}`); - - if(submission.type == "single") - { - console.log(`${jsl.colors.fg.yellow}Joke:${jsl.colors.rst} ${submission.joke}`); - console.log(`${jsl.colors.fg.yellow}Category:${jsl.colors.rst} ${submission.category}`); - console.log(`${jsl.colors.fg.yellow}Flags:${jsl.colors.rst} ${getFlags(submission)}`); - } - else if(submission.type == "twopart") - { - console.log(`${jsl.colors.fg.yellow}Setup:${jsl.colors.rst} ${submission.setup}`); - console.log(`${jsl.colors.fg.yellow}Delivery:${jsl.colors.rst} ${submission.delivery}`); - console.log(`${jsl.colors.fg.yellow}Category:${jsl.colors.rst} ${submission.category}`); - console.log(`${jsl.colors.fg.yellow}Flags:${jsl.colors.rst} ${getFlags(submission)}`); - } - else console.error(`${jsl.colors.fg.red}Error: Unsuppoted joke type "${submission.type}"${jsl.colors.rst}`); - - jsl.pause("Do you want to add this joke? (Safe/Unsafe/No):").then(key => { - let lcKey = key.toLowerCase(); - if(lcKey === "s") - { - submissions[idx].safe = true; - addJoke(submissions[idx]); - process.stdout.write(`${jsl.colors.fg.green}Adding joke.${jsl.colors.rst}\n\n\n\n`); - } - else if(lcKey === "u") - { - submissions[idx].safe = false; - addJoke(submissions[idx]); - process.stdout.write(`${jsl.colors.fg.green}Adding joke.${jsl.colors.rst}\n\n\n\n`); - } - else - process.stdout.write(`${jsl.colors.fg.red}Not adding joke.${jsl.colors.rst}\n\n\n\n`); - - goThroughSubmission(++idx); - }); - }; +/** @typedef {import("./types").AllSubmissions} AllSubmissions */ +/** @typedef {import("./types").Submission} Submission */ +/** @typedef {import("../src/types/languages").LangCodes} LangCodes */ - goThroughSubmission(0); - } - }).catch(err => { - console.error(`Error: ${err}`); - process.exit(1); - }); -}; -/** - * @typedef {Object} AllJokesObj - * @prop {Object} [en] - * @prop {Object} en.info - * @prop {String} en.info.formatVersion - * @prop {Array|Array} en.jokes - */ - -/** - * Reads the jokes files and returns it as an object - * @returns {AllJokesObj} - */ -function getAllJokes() +async function run() { - let retObj = {}; - fs.readdirSync(settings.jokes.jokesFolderPath).forEach(jokesFile => { - if(jokesFile.startsWith("template")) - return; + /** @type {LangCodes} */ + const langCodes = await getLangCodes(); + const submissions = await readSubmissions(langCodes); - let langCode = jokesFile.split("-")[1].substr(0, 2); - let filePath = resolve(join(settings.jokes.jokesFolderPath, jokesFile)); + // TODO: + console.log(submissions); +} - retObj[langCode] = JSON.parse(fs.readFileSync(filePath).toString()); - }); +//#SECTION prompts - return retObj; -} -/** - * Adds a joke to the `jokesFile` object - * @param {Object} joke - */ -const addJoke = joke => { - let fJoke = JSON.parse(JSON.stringify(joke)); // reserialize because call by reference :( - delete fJoke.formatVersion; - delete fJoke.lang; +//#SECTION internal stuff - // jokesFile.jokes.push(fJoke); - if(!jokesFiles[joke.lang]) - jokesFiles[joke.lang] = JSON.parse(fs.readFileSync(resolve(join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile))).toString()); +/** + * Reads all possible language codes and resolves with them + * @returns {Promise} + */ +function getLangCodes() +{ + return new Promise(async (res, rej) => { + try + { + const file = await readFile(resolve(settings.languages.langFilePath)); + const parsed = JSON.parse(file.toString()); - Object.keys(jokesFiles).forEach(langCode => { - if(joke.lang == langCode) + return res(Object.keys(parsed)); + } + catch(err) { - jokesFiles[langCode].jokes.push(jokeSubmission.reformatJoke(fJoke)); - addedCount++; + return rej(new Error(`Error while reading language codes: ${err}`)); } }); -}; +} /** - * Writes the `jokesFiles` object to the jokes file + * Reads all submissions and resolves with them + * @param {LangCodes} langCodes + * @returns {Promise<(AllSubmissions|null), Error>} Resolves null if no submissions were found */ -const finishAdding = () => { - Object.keys(jokesFiles).forEach(langCode => { - fs.writeFileSync(resolve(join(settings.jokes.jokesFolderPath, `jokes-${langCode}.json`)), JSON.stringify(jokesFiles[langCode], null, 4)); - }); +function readSubmissions(langCodes) +{ + /** @type {AllSubmissions} */ + const allSubmissions = {}; - jsl.pause(`Delete all submissions? (Y/n):`).then(val => { - if(val.toLowerCase() != "n") + return new Promise(async (res, rej) => { + try { - fs.readdirSync(settings.jokes.jokeSubmissionPath).forEach(folder => { - fs.removeSync(join(settings.jokes.jokeSubmissionPath, folder)); + const folders = await readdir(resolve(settings.jokes.jokeSubmissionPath)); + + if(folders.length < 1) + return res(null); + + /** @type {Promise[]} */ + const readPromises = []; + + folders.forEach(langCode => { + langCode = langCode.toString(); + + if(!langCodes.includes(langCode)) // ignore folders that don't match + return; + + readPromises.push(new Promise(async res => { + const subm = await getSubmissions(langCode); + + if(subm.length > 0) + allSubmissions[langCode] = subm; + + return res(); + })); }); - } - console.log(`${jsl.colors.fg.green}Successfully added ${jsl.colors.fg.yellow}${addedCount}${jsl.colors.fg.green} joke${addedCount != 1 ? "s" : ""}${jsl.colors.rst}.\nExiting.\n\n`); - require("./reassign-ids"); // reassign joke IDs - return; + await Promise.all(readPromises); + + return res(allSubmissions); + } + catch(err) + { + return rej(new Error(`Error while reading submissions: ${err}`)); + } }); -}; +} /** - * Returns the flags of a joke as a string - * @param {Object} joke - * @returns {String} + * Reads all submissions of the specified language + * @param {LangCodes} langCode + * @returns {Promise} */ -const getFlags = joke => { - let flags = []; +function getSubmissions(langCode) +{ + return new Promise(async (res, rej) => { + /** @type {Submission[]} */ + const submissions = []; - Object.keys(joke.flags).forEach(key => { - if(joke.flags[key] === true) - flags.push(key); - }); + try + { + const submissionsFolder = join(settings.jokes.jokeSubmissionPath, langCode); + const files = await readdir(submissionsFolder); - if(flags.length == 0) - return "(none)"; + for await(const fileName of files) + { + const file = await readFile(join(submissionsFolder, fileName)); + const joke = JSON.parse(file); - return jsl.readableArray(flags); -}; + // TODO: ensure submission validity with parseJokes.validateSingle() + // TODO: populate props -/** - * Reads all joke submission files and returns them as an array of objects - * @returns {Array} - */ -const getSubmissions = () => { - let submissions = []; - fs.readdirSync(settings.jokes.jokeSubmissionPath).forEach(lang => { - fs.readdirSync(resolve(join(settings.jokes.jokeSubmissionPath, lang))).forEach(file => { - submissions.push(JSON.parse(fs.readFileSync(resolve(`${settings.jokes.jokeSubmissionPath}/${lang}/${file}`)).toString())); - }); + submissions.push({ + ipHash: "test", + joke, + timestamp: NaN, + }); + } + + return res(submissions); + } + catch(err) + { + return rej(new Error(`Error while reading submissions of language '${langCode}': ${err}`)); + } }); - return submissions; -}; +} + -if(!process.stdin.isTTY) +try { - console.log(`${jsl.colors.fg.red}Error: process doesn't have a stdin to read from${jsl.colors.rst}`); - process.exit(1); + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else run(); +} +catch(err) +{ + console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); + + process.exit(0); } -else run(); diff --git a/tools/types.d.ts b/tools/types.d.ts new file mode 100644 index 00000000..102fbc59 --- /dev/null +++ b/tools/types.d.ts @@ -0,0 +1,24 @@ +import { JokeSubmission } from "../src/types/jokes"; +import { LangCodes } from "../src/types/languages"; + + +//#SECTION submissions + +/** + * A single joke submission + */ +export interface Submission { + joke: JokeSubmission; + ipHash: string; + timestamp: number; +} + +/** + * This object contains all submissions + */ +export type AllSubmissions = { + [key in LangCodes]?: Submission; +}; +// & { +// [key in DefaultLangCode]: Submission; +// }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..5e1c0236 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "resolveJsonModule": true + } +} \ No newline at end of file From a752736cb440d5703c17dafd248f25590887fabf Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 14 Oct 2021 17:01:55 +0200 Subject: [PATCH 02/62] bit more submission stuff --- package-lock.json | 45 +++++++++ package.json | 1 + tools/submissions.js | 215 ++++++++++++++++++++++++++++++++++++++++--- tools/types.d.ts | 15 ++- 4 files changed, 262 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b6f87c2..eb359bae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "mysql": "^2.18.1", "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", + "prompts": "^2.4.2", "rate-limiter-flexible": "^2.2.4", "request-ip": "^2.1.3", "svcorelib": "^1.14.0", @@ -3228,6 +3229,14 @@ "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=" }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4075,6 +4084,18 @@ "resolved": "https://registry.npmjs.org/promise-all-sequential/-/promise-all-sequential-1.0.0.tgz", "integrity": "sha512-XQPGPgQZERb1mYEpqSR5tIsC2E5amQZgnqVUPK6gsDtcOv/Yjxmz99cOA1MxLWcuWXz1lZZiD3hERA+rFVdP2w==" }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4557,6 +4578,11 @@ "simple-concat": "^1.0.0" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7736,6 +7762,11 @@ "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=" }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8387,6 +8418,15 @@ "resolved": "https://registry.npmjs.org/promise-all-sequential/-/promise-all-sequential-1.0.0.tgz", "integrity": "sha512-XQPGPgQZERb1mYEpqSR5tIsC2E5amQZgnqVUPK6gsDtcOv/Yjxmz99cOA1MxLWcuWXz1lZZiD3hERA+rFVdP2w==" }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -8741,6 +8781,11 @@ "simple-concat": "^1.0.0" } }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", diff --git a/package.json b/package.json index 63a5a5ca..5904bb8a 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "mysql": "^2.18.1", "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", + "prompts": "^2.4.2", "rate-limiter-flexible": "^2.2.4", "request-ip": "^2.1.3", "svcorelib": "^1.14.0", diff --git a/tools/submissions.js b/tools/submissions.js index 93ed47bd..3fa5507c 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,32 +1,172 @@ const { readdir, readFile } = require("fs-extra"); const { resolve, join } = require("path"); -const { colors, Errors } = require("svcorelib"); +const { colors, Errors, unused } = require("svcorelib"); +const prompt = require("prompts"); -// const parseJokes = require("../src/parseJokes"); +const languages = require("../src/languages"); +const parseJokes = require("../src/parseJokes"); // const jokeSubmission = require("../src/jokeSubmission"); const settings = require("../settings"); const col = colors.fg; +const { exit } = process; +//#SECTION types & init + /** @typedef {import("./types").AllSubmissions} AllSubmissions */ /** @typedef {import("./types").Submission} Submission */ +/** @typedef {import("./types").ParsedFileName} ParsedFileName */ +/** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ +/** @typedef {import("../src/types/jokes").JokeFlags} JokeFlags */ /** @typedef {import("../src/types/languages").LangCodes} LangCodes */ async function run() { + try + { + await languages.init(); + await parseJokes.init(); + } + catch(err) + { + throw new Error(`Error while initializing dependency modules: ${err}`); + } + /** @type {LangCodes} */ const langCodes = await getLangCodes(); const submissions = await readSubmissions(langCodes); - // TODO: - console.log(submissions); + const subAmt = Object.keys(submissions).length; + + + const { proceed } = await prompt({ + message: `There are ${subAmt} submissions. Go through them now?`, + type: "confirm", + name: "proceed" + }); + + if(proceed) + return promptSubmissions(submissions); + else + { + console.log("Exiting."); + exit(0); + } } //#SECTION prompts +/** + * Goes through all submissions, prompting about what to do with them + * @param {AllSubmissions} allSubmissions + */ +async function promptSubmissions(allSubmissions) +{ + const langs = Object.keys(allSubmissions); + + let currentSub = 1; + + for await(const lang of langs) + { + /** @type {Submission[]} */ + const submissions = allSubmissions[lang]; + console.log(`\n------------\nLanguage: ${lang}\n------------\n`); + + for await(const sub of submissions) + { + printSubmission(sub, lang, currentSub); + currentSub++; + + /** @type {null|Submission} The submission to be added to the local jokes */ + let finalSub = null; + + const { correct } = await prompt({ + message: "Is this joke correct?", + type: "confirm", + name: "correct", + }); + + if(!correct) + finalSub = await editSubmission(sub); + else + finalSub = sub; + + await addSubmission(finalSub); + } + } + + return finishPrompts(); +} + +/** + * Gets called to edit a submission + * @param {Submission} sub + * @returns {Promise} Returns the edited submission + */ +function editSubmission(sub) +{ + return new Promise(async (res, rej) => { + try + { + // TODO: + return res(); + } + catch(err) + { + return rej(new Error(`Error while editing submission: ${err}`)); + } + }); +} + +/** + * Prints a submission to the console + * @param {Submission} submission + * @param {LangCodes} lang + * @param {number} index Current index of the submission + */ +function printSubmission(submission, lang, index) +{ + const lines = [ + `Submission #${index} [${lang}]:`, + ` Category: ${submission.joke.category}`, + ` Type: ${submission.joke.type}`, + ` Flags: ${extractFlags(submission.joke)}`, + + ]; + + process.stdout.write(`${lines.join("\n")}\n`); +} + +/** + * Extracts flags of a joke submission, returning a string + * @param {JokeSubmission} joke + * @returns {string} Returns "(none)" if no flags are set + */ +function extractFlags(joke) +{ + /** @type {JokeFlags[]} */ + const flags = []; + + Object.keys(joke.flags).forEach(key => { + if(joke.flags[key] === true) + flags.push(key); + }); + + return flags.length > 0 ? flags.join(", ") : "(none)"; +} + +/** + * Called when all submissions have been gone through + */ +function finishPrompts() +{ + console.log(""); + + exit(0); +} //#SECTION internal stuff @@ -76,7 +216,7 @@ function readSubmissions(langCodes) folders.forEach(langCode => { langCode = langCode.toString(); - if(!langCodes.includes(langCode)) // ignore folders that don't match + if(!langCodes.includes(langCode)) // ignore folders that aren't valid return; readPromises.push(new Promise(async res => { @@ -119,16 +259,20 @@ function getSubmissions(langCode) for await(const fileName of files) { const file = await readFile(join(submissionsFolder, fileName)); + /** @type {JokeSubmission} */ const joke = JSON.parse(file); - // TODO: ensure submission validity with parseJokes.validateSingle() - // TODO: populate props + const valRes = parseJokes.validateSingle(joke, langCode); + let errors = null; + + if(Array.isArray(valRes)) + errors = valRes; + + const { client, timestamp, index } = parseFileName(fileName); - submissions.push({ - ipHash: "test", - joke, - timestamp: NaN, - }); + unused(index); + + submissions.push({ client, joke, timestamp, errors }); } return res(submissions); @@ -140,6 +284,51 @@ function getSubmissions(langCode) }); } +/** + * Parses the file name of a submission, returning its information + * @param {string} fileName + * @returns {Readonly} + */ +function parseFileName(fileName) +{ + if(fileName.startsWith("submission_")) + fileName = fileName.substr(11); + if(fileName.endsWith(".json")) + fileName = fileName.substr(0, fileName.length - 5); + + // eff8e7ca_0_1634205492859 + + const [ client, index, timestamp ] = fileName.split("_"); + + return Object.freeze({ + client, + index: parseInt(index), + timestamp: parseInt(timestamp), + }); +} + +/** + * Adds a submission to the local jokes + * @param {Submission} sub + */ +function addSubmission(sub) +{ + return new Promise(async (res, rej) => { + try + { + // TODO: + + return res(); + } + catch(err) + { + return rej(new Error(`Error while adding submission: ${err}`)); + } + }); +} + + +//#SECTION on execute try { @@ -151,5 +340,5 @@ catch(err) { console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); - process.exit(0); + exit(0); } diff --git a/tools/types.d.ts b/tools/types.d.ts index 102fbc59..6777e7cc 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -8,9 +8,13 @@ import { LangCodes } from "../src/types/languages"; * A single joke submission */ export interface Submission { + /** The submission itself */ joke: JokeSubmission; - ipHash: string; + /** Unique identification of the client (usually IP hash) */ + client: string; + /** Submission timestamp (Unix-13) */ timestamp: number; + errors: null | string[]; } /** @@ -19,6 +23,15 @@ export interface Submission { export type AllSubmissions = { [key in LangCodes]?: Submission; }; +// to make "en" a required property: // & { // [key in DefaultLangCode]: Submission; // }; + +export interface ParsedFileName { + /** Unique identification of the client (usually IP hash) */ + client: string; + timestamp: number; + /** Index that gets incremented if a file name is duplicate (default = 0) */ + index: number; +} From ac1e481cfc5bb1e37c67a55fc89fee2ce142ad67 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 14 Oct 2021 17:27:56 +0200 Subject: [PATCH 03/62] fixed some stuff --- tools/submissions.js | 20 +++++++++++++------- tools/types.d.ts | 5 +++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/tools/submissions.js b/tools/submissions.js index 3fa5507c..f8f842b5 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -18,6 +18,7 @@ const { exit } = process; /** @typedef {import("./types").AllSubmissions} AllSubmissions */ /** @typedef {import("./types").Submission} Submission */ /** @typedef {import("./types").ParsedFileName} ParsedFileName */ +/** @typedef {import("./types").ReadSubmissionsResult} ReadSubmissionsResult */ /** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ /** @typedef {import("../src/types/jokes").JokeFlags} JokeFlags */ /** @typedef {import("../src/types/languages").LangCodes} LangCodes */ @@ -37,13 +38,10 @@ async function run() /** @type {LangCodes} */ const langCodes = await getLangCodes(); - const submissions = await readSubmissions(langCodes); - - const subAmt = Object.keys(submissions).length; - + const { submissions, amount } = await readSubmissions(langCodes); const { proceed } = await prompt({ - message: `There are ${subAmt} submissions. Go through them now?`, + message: `There are ${amount} submissions of ${Object.keys(submissions).length} languages. Go through them now?`, type: "confirm", name: "proceed" }); @@ -57,6 +55,7 @@ async function run() } } + //#SECTION prompts /** @@ -195,7 +194,7 @@ function getLangCodes() /** * Reads all submissions and resolves with them * @param {LangCodes} langCodes - * @returns {Promise<(AllSubmissions|null), Error>} Resolves null if no submissions were found + * @returns {Promise} */ function readSubmissions(langCodes) { @@ -213,6 +212,8 @@ function readSubmissions(langCodes) /** @type {Promise[]} */ const readPromises = []; + let amount = 0; + folders.forEach(langCode => { langCode = langCode.toString(); @@ -225,13 +226,18 @@ function readSubmissions(langCodes) if(subm.length > 0) allSubmissions[langCode] = subm; + amount += subm.length; + return res(); })); }); await Promise.all(readPromises); - return res(allSubmissions); + return res({ + submissions: allSubmissions, + amount + }); } catch(err) { diff --git a/tools/types.d.ts b/tools/types.d.ts index 6777e7cc..0ea34581 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -35,3 +35,8 @@ export interface ParsedFileName { /** Index that gets incremented if a file name is duplicate (default = 0) */ index: number; } + +export interface ReadSubmissionsResult { + submissions: AllSubmissions; + amount: number; +} From 9e4bbca5096f02cbfa16c37b2e11e31b3d9beecb Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 15 Oct 2021 11:36:06 +0200 Subject: [PATCH 04/62] a LOT of submission script stuff --- .vscode/launch.json | 2 +- package-lock.json | 1 + package.json | 1 + src/types/languages.d.ts | 2 +- tools/submissions.js | 367 +++++++++++++++++++++++++++++++++++---- tools/types.d.ts | 18 +- 6 files changed, 349 insertions(+), 42 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index def655ec..a9b92b95 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,7 +40,7 @@ "args": [ "--trace-deprecation" ], - "console": "externalTerminal" + "console": "integratedTerminal" } ], "debug.javascript.usePreview": true diff --git a/package-lock.json b/package-lock.json index eb359bae..899ffd26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "http-ratelimit": "^0.2.3", "js2xmlparser": "^4.0.1", "json-to-pretty-yaml": "^1.2.2", + "keypress": "^0.2.1", "mysql": "^2.18.1", "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", diff --git a/package.json b/package.json index 5904bb8a..c9904eb9 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "http-ratelimit": "^0.2.3", "js2xmlparser": "^4.0.1", "json-to-pretty-yaml": "^1.2.2", + "keypress": "^0.2.1", "mysql": "^2.18.1", "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", diff --git a/src/types/languages.d.ts b/src/types/languages.d.ts index 7f1ef7f4..ea6178f9 100644 --- a/src/types/languages.d.ts +++ b/src/types/languages.d.ts @@ -4,6 +4,6 @@ declare type LangFileType = typeof LangFile; /** All language codes JokeAPI supports */ -export type LangCodes = keyof LangFileType; +export type LangCode = keyof LangFileType; /** The default / fallback language code */ export type DefaultLangCode = "en"; diff --git a/tools/submissions.js b/tools/submissions.js index f8f842b5..3c0032bb 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,17 +1,26 @@ const { readdir, readFile } = require("fs-extra"); const { resolve, join } = require("path"); -const { colors, Errors, unused } = require("svcorelib"); +const { colors, Errors, unused, reserialize } = require("svcorelib"); const prompt = require("prompts"); +const promiseAllSeq = require("promise-all-sequential"); const languages = require("../src/languages"); const parseJokes = require("../src/parseJokes"); // const jokeSubmission = require("../src/jokeSubmission"); const settings = require("../settings"); +const { isEmpty } = require("lodash"); const col = colors.fg; const { exit } = process; +/** @type {LastEditedSubmission} */ +let lastSubmissionType; +/** @type {number} */ +let currentSub; +/** @type {boolean} */ +let lastKeyInvalid = false; + //#SECTION types & init @@ -19,9 +28,11 @@ const { exit } = process; /** @typedef {import("./types").Submission} Submission */ /** @typedef {import("./types").ParsedFileName} ParsedFileName */ /** @typedef {import("./types").ReadSubmissionsResult} ReadSubmissionsResult */ +/** @typedef {import("./types").LastEditedSubmission} LastEditedSubmission */ +/** @typedef {import("./types").KeypressResult} KeypressResult */ /** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ /** @typedef {import("../src/types/jokes").JokeFlags} JokeFlags */ -/** @typedef {import("../src/types/languages").LangCodes} LangCodes */ +/** @typedef {import("../src/types/languages").LangCode} LangCodes */ async function run() @@ -36,6 +47,9 @@ async function run() throw new Error(`Error while initializing dependency modules: ${err}`); } + lastSubmissionType = undefined; + currentSub = 1; + /** @type {LangCodes} */ const langCodes = await getLangCodes(); const { submissions, amount } = await readSubmissions(langCodes); @@ -66,38 +80,101 @@ async function promptSubmissions(allSubmissions) { const langs = Object.keys(allSubmissions); - let currentSub = 1; - for await(const lang of langs) { /** @type {Submission[]} */ const submissions = allSubmissions[lang]; - console.log(`\n------------\nLanguage: ${lang}\n------------\n`); - for await(const sub of submissions) + // /** @type {(() => Promise)[]} */ + const proms = submissions.map((sub) => (() => actSubmission(sub))); + + await promiseAllSeq(proms); + } + + return finishPrompts(); +} + +/** + * Prompts the user to act on a submission + * @param {Submission} sub + * @returns {Promise} + */ +function actSubmission(sub) +{ + return new Promise(async (res, rej) => { + try { - printSubmission(sub, lang, currentSub); - currentSub++; + console.clear(); + + let lastSubmText = ""; + switch(lastSubmissionType) + { + case "accepted_safe": + lastSubmText = `(Last submission was accepted ${col.green}safe${col.rst})`; + break; + case "accepted_unsafe": + lastSubmText = `(Last submission was accepted ${col.yellow}unsafe${col.rst})`; + break; + case "edited": + lastSubmText = `(Last submission was ${col.magenta}edited${col.rst})`; + break; + case "deleted": + lastSubmText = `(Last submission was ${col.red}deleted${col.rst})`; + break; + } + + const last = !lastKeyInvalid ? (lastSubmissionType ? lastSubmText : "") : `${col.red}Invalid key - try again${col.rst}`; + + console.log(`${last}\n\n------------\nLanguage: ${sub.lang}\n------------\n`); + + printSubmission(sub, currentSub); /** @type {null|Submission} The submission to be added to the local jokes */ let finalSub = null; - const { correct } = await prompt({ - message: "Is this joke correct?", - type: "confirm", - name: "correct", - }); + const key = await getKey(`\n${col.blue}Choose action:${col.rst} Accept ${col.green}[S]${col.rst}afe • Accept ${col.yellow}[U]${col.rst}nsafe • ${col.magenta}[E]${col.rst}dit • ${col.red}[D]${col.rst}elete`); - if(!correct) + let safe = false; + + switch(key.name) + { + case "s": // add safe + safe = true; + lastSubmissionType = "accepted_safe"; + finalSub = reserialize(sub); + break; + case "u": // add unsafe + lastSubmissionType = "accepted_unsafe"; + finalSub = reserialize(sub); + break; + case "e": // edit + lastSubmissionType = "edited"; finalSub = await editSubmission(sub); - else - finalSub = sub; + break; + case "d": // delete + lastSubmissionType = "deleted"; + return res(); + default: // invalid key + lastKeyInvalid = true; + return await actSubmission(sub); + } - await addSubmission(finalSub); - } - } + if(finalSub) + finalSub.joke.safe = safe; - return finishPrompts(); + currentSub++; + + // if not deleted in editSubmission() + if(finalSub !== null) + await addSubmission(finalSub); + + return res(); + } + catch(err) + { + return rej(new Error(`Error while choosing action for submission #${currentSub}: ${err}`)); + } + }); } /** @@ -108,10 +185,168 @@ async function promptSubmissions(allSubmissions) function editSubmission(sub) { return new Promise(async (res, rej) => { + /** @type {Submission} */ + const editedSub = reserialize(sub); + try { + // TODO: display joke + + const jokeChoices = sub.joke.type === "single" ? [ + { + title: `Joke (${editedSub.joke.joke})`, + value: "joke", + }, + ] : [ + { + title: `Setup (${editedSub.joke.setup})`, + value: "setup", + }, + { + title: `Delivery (${editedSub.joke.delivery})`, + value: "delivery", + }, + ]; + + const choices = [ + { + title: `Category (${editedSub.joke.category})`, + value: "category", + }, + { + title: `Type (${editedSub.joke.type})`, + value: "type", + }, + ...jokeChoices, + { + title: `Flags (${extractFlags(editedSub.joke)})`, + value: "flags", + }, + { + title: `Safe (${editedSub.joke.safe})`, + value: "safe", + }, + { + title: `${col.green}[Done]${col.rst}`, + value: "done", + }, + { + title: `${col.red}[Delete]${col.rst}`, + value: "delete", + }, + ]; + + process.stdout.write("\n"); + + const { action } = await prompt({ + message: "Edit property", + type: "select", + name: "action", + choices, + }); + // TODO: - return res(); + switch(action) + { + case "category": + { + const catChoices = settings.jokes.possible.categories.map(cat => ({ title: cat, value: cat })); + + const { category } = await prompt({ + type: "select", + message: `Select new category`, + name: "category", + choices: catChoices, + initial: settings.jokes.possible.categories.indexOf("Misc"), + }); + + editedSub.joke.category = category; + break; + } + case "joke": + case "setup": + case "delivery": + editedSub.joke[action] = (await prompt({ + type: "text", + message: `Enter new value for ${action}`, + name: "val", + validate: (val) => !isEmpty(val), + })).val; + break; + case "type": + editedSub.joke.type = (await prompt({ + type: "select", + message: "Select a new joke type", + choices: [ + { title: "Single", value: "single" }, + { title: "Two Part", value: "twopart" }, + ], + name: "val", + })).val; + break; + case "flags": + { + const flagKeys = Object.keys(editedSub.joke.flags); + const flagChoices = []; + + flagKeys.forEach(key => { + flagChoices.push({ + title: key, + selected: editedSub.joke.flags[key] === true, + }); + }); + + const { newFlags } = await prompt({ + type: "multiselect", + message: "Edit joke flags", + choices: flagChoices, + name: "newFlags", + instructions: false, + hint: "- arrow-keys to move, space to toggle, return to submit", + }); + + Object.keys(editedSub.joke.flags).forEach(key => { + editedSub.joke.flags[key] = false; + }); + + newFlags.forEach(setFlagIdx => { + const key = flagKeys[setFlagIdx]; + editedSub.joke.flags[key] = true; + }); + + break; + } + case "safe": + editedSub.joke.safe = (await prompt({ + type: "confirm", + message: "Is this joke safe?", + initial: false, + name: "del", + })).del; + break; + case "done": + return res(Object.freeze(editedSub)); + case "delete": + { + const { del } = await prompt({ + type: "confirm", + message: "Delete this submission?", + name: "del", + }); + + if(del) + { + lastSubmissionType = "deleted"; + return res(null); + } + + break; + } + default: + return res(Object.freeze(editedSub)); + } + + return res(await editSubmission(editedSub)); } catch(err) { @@ -122,21 +357,28 @@ function editSubmission(sub) /** * Prints a submission to the console - * @param {Submission} submission - * @param {LangCodes} lang + * @param {Submission} sub * @param {number} index Current index of the submission */ -function printSubmission(submission, lang, index) +function printSubmission(sub, index) { const lines = [ - `Submission #${index} [${lang}]:`, - ` Category: ${submission.joke.category}`, - ` Type: ${submission.joke.type}`, - ` Flags: ${extractFlags(submission.joke)}`, - + `Submission #${index} by ${sub.client}:`, + ` Category: ${sub.joke.category}`, + ` Type: ${sub.joke.type}`, + ` Flags: ${extractFlags(sub.joke)}`, + ``, ]; - process.stdout.write(`${lines.join("\n")}\n`); + if(sub.joke.type === "single") + lines.push(sub.joke.joke); + if(sub.joke.type === "twopart") + { + lines.push(sub.joke.setup); + lines.push(sub.joke.delivery); + } + + process.stdout.write(`${lines.join("\n")}\n\n`); } /** @@ -167,6 +409,56 @@ function finishPrompts() exit(0); } +/** + * Waits for the user to press a key, then returns it + * @param {string} [prompt] + * @returns {Promise} + */ +function getKey(prompt) +{ + return new Promise(async (res, rej) => { + if(typeof prompt === "string") + prompt = `${prompt.trimRight()} `; + + try + { + const onKey = (ch, key) => { + if(key && key.ctrl && ["c", "d"].includes(key.name)) + process.exit(0); + + process.stdin.setRawMode(false); + process.stdin.pause(); + + process.stdin.removeListener("keypress", onKey); + + if(typeof prompt === "string") + process.stdout.write("\n"); + + return res({ + name: key.name || ch || "", + ctrl: key.ctrl || false, + meta: key.meta || false, + shift: key.shift || false, + sequence: key.sequence || undefined, + code: key.code || undefined, + }); + }; + + process.stdin.setRawMode(true); + process.stdin.on("keypress", onKey); + + if(typeof prompt === "string") + process.stdout.write(prompt); + + process.stdin.resume(); + } + catch(err) + { + return rej(new Error(`Error while getting key: ${err}`)); + } + }); +} + //#SECTION internal stuff @@ -248,10 +540,10 @@ function readSubmissions(langCodes) /** * Reads all submissions of the specified language - * @param {LangCodes} langCode + * @param {LangCodes} lang * @returns {Promise} */ -function getSubmissions(langCode) +function getSubmissions(lang) { return new Promise(async (res, rej) => { /** @type {Submission[]} */ @@ -259,7 +551,7 @@ function getSubmissions(langCode) try { - const submissionsFolder = join(settings.jokes.jokeSubmissionPath, langCode); + const submissionsFolder = join(settings.jokes.jokeSubmissionPath, lang); const files = await readdir(submissionsFolder); for await(const fileName of files) @@ -268,7 +560,7 @@ function getSubmissions(langCode) /** @type {JokeSubmission} */ const joke = JSON.parse(file); - const valRes = parseJokes.validateSingle(joke, langCode); + const valRes = parseJokes.validateSingle(joke, lang); let errors = null; if(Array.isArray(valRes)) @@ -278,14 +570,14 @@ function getSubmissions(langCode) unused(index); - submissions.push({ client, joke, timestamp, errors }); + submissions.push({ client, joke, timestamp, errors, lang }); } return res(submissions); } catch(err) { - return rej(new Error(`Error while reading submissions of language '${langCode}': ${err}`)); + return rej(new Error(`Error while reading submissions of language '${lang}': ${err}`)); } }); } @@ -316,8 +608,9 @@ function parseFileName(fileName) /** * Adds a submission to the local jokes * @param {Submission} sub + * @param {boolean} [safe=false] */ -function addSubmission(sub) +function addSubmission(sub, safe = false) { return new Promise(async (res, rej) => { try diff --git a/tools/types.d.ts b/tools/types.d.ts index 0ea34581..2fb50124 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -1,5 +1,5 @@ import { JokeSubmission } from "../src/types/jokes"; -import { LangCodes } from "../src/types/languages"; +import { LangCode } from "../src/types/languages"; //#SECTION submissions @@ -9,19 +9,20 @@ import { LangCodes } from "../src/types/languages"; */ export interface Submission { /** The submission itself */ - joke: JokeSubmission; + joke: JokeSubmission & { safe: boolean }; /** Unique identification of the client (usually IP hash) */ client: string; /** Submission timestamp (Unix-13) */ timestamp: number; errors: null | string[]; + lang: LangCode; } /** * This object contains all submissions */ export type AllSubmissions = { - [key in LangCodes]?: Submission; + [key in LangCode]?: Submission; }; // to make "en" a required property: // & { @@ -40,3 +41,14 @@ export interface ReadSubmissionsResult { submissions: AllSubmissions; amount: number; } + +export type LastEditedSubmission = "accepted_safe" | "accepted_unsafe" | "edited" | "deleted"; + +export interface KeypressResult { + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; + sequence?: string; + code?: string; +} From e0529a1d2dda4254781612ae68e1a79750eddf4c Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 15 Oct 2021 11:36:29 +0200 Subject: [PATCH 05/62] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 216c5f9f..12c55601 100755 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,7 @@ data/submissions/*/*.json # Auth Tokens: data/tokens.json +data/auth/tokens.json # Other potentially sensitive information: data/lists/*.json From 4f343db0ce4666492fdebcb03990250e20c348cf Mon Sep 17 00:00:00 2001 From: Sven Date: Fri, 15 Oct 2021 11:39:59 +0200 Subject: [PATCH 06/62] comment --- tools/submissions.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/submissions.js b/tools/submissions.js index 3c0032bb..cd1a6227 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -190,8 +190,6 @@ function editSubmission(sub) try { - // TODO: display joke - const jokeChoices = sub.joke.type === "single" ? [ { title: `Joke (${editedSub.joke.joke})`, @@ -236,6 +234,8 @@ function editSubmission(sub) }, ]; + // TODO: display joke + process.stdout.write("\n"); const { action } = await prompt({ @@ -245,7 +245,6 @@ function editSubmission(sub) choices, }); - // TODO: switch(action) { case "category": From 281ee0b6bb8e9120f6ed671c43068096d95ee58d Mon Sep 17 00:00:00 2001 From: Sven Date: Fri, 15 Oct 2021 12:54:29 +0200 Subject: [PATCH 07/62] stuff --- tools/submissions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/submissions.js b/tools/submissions.js index cd1a6227..6d995bd1 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -132,7 +132,7 @@ function actSubmission(sub) /** @type {null|Submission} The submission to be added to the local jokes */ let finalSub = null; - const key = await getKey(`\n${col.blue}Choose action:${col.rst} Accept ${col.green}[S]${col.rst}afe • Accept ${col.yellow}[U]${col.rst}nsafe • ${col.magenta}[E]${col.rst}dit • ${col.red}[D]${col.rst}elete`); + const key = await getKey(`\n${col.blue}Choose action:${col.rst} Accept ${col.green}[S]${col.rst}afe • Accept ${col.magenta}[U]${col.rst}nsafe • ${col.yellow}[E]${col.rst}dit • ${col.red}[D]${col.rst}elete`); let safe = false; From 70eead605f04b20f95f847470817677273c59964 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 16 Oct 2021 18:29:53 +0200 Subject: [PATCH 08/62] add jokeapi bin --- package-lock.json | 394 +++++++++++++++++++++------------------------- package.json | 16 +- tools/cli.js | 56 +++++++ tools/test.js | 2 +- 4 files changed, 248 insertions(+), 220 deletions(-) create mode 100644 tools/cli.js diff --git a/package-lock.json b/package-lock.json index dc7ae8e1..97c6aba0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "fs-extra": "^10.0.0", "fuse.js": "^6.4.1", "http-ratelimit": "^0.2.3", + "import-fresh": "^3.3.0", "js2xmlparser": "^4.0.1", "json-to-pretty-yaml": "^1.2.2", "keypress": "^0.2.1", @@ -28,7 +29,11 @@ "svjsl": "^1.9.4", "url-parse": "^1.5.3", "xmlhttprequest": "^1.8.0", - "xss": "^1.0.10" + "xss": "^1.0.10", + "yargs": "^17.2.1" + }, + "bin": { + "jokeapi": "tools/cli.js" }, "devDependencies": { "dependency-cruiser": "^10.0.6", @@ -36,7 +41,6 @@ "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", - "require-uncached": "^2.0.0", "snyk": "^1.667.0", "table": "^6.0.1" } @@ -887,7 +891,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -896,7 +899,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1151,32 +1153,10 @@ "node": ">=8" } }, - "node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "dependencies": { - "callsites": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caller-path/node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -1270,28 +1250,13 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "wrap-ansi": "^7.0.0" } }, "node_modules/clone": { @@ -1315,7 +1280,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1326,8 +1290,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { "version": "8.2.0", @@ -1780,8 +1743,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -1826,7 +1788,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2545,7 +2506,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -2816,7 +2776,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2926,7 +2885,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3677,6 +3635,17 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3686,6 +3655,61 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3833,7 +3857,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -4239,7 +4262,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4269,29 +4291,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/require-uncached": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-2.0.0.tgz", - "integrity": "sha512-rPv1//BQwg4gzIbpJcKXWIfjDJEtgS8jzbsNoLcdVSE5FpBzKEKKuoG6MfCbLC28ZTv+qlQWC9/K7J5GBGPSMg==", - "deprecated": "Renamed to `import-fresh`.", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -4348,7 +4347,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -4683,7 +4681,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4711,7 +4708,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5237,7 +5233,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5301,10 +5296,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -5313,38 +5310,28 @@ "dev": true }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { - "node": ">=6" + "node": ">=10" } } }, @@ -5993,14 +5980,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -6185,28 +6170,10 @@ "write-file-atomic": "^3.0.0" } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - }, - "dependencies": { - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - } - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "5.3.1", @@ -6269,27 +6236,13 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "wrap-ansi": "^7.0.0" } }, "clone": { @@ -6307,7 +6260,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -6315,8 +6267,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { "version": "8.2.0", @@ -6672,8 +6623,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -6711,8 +6661,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "4.0.0", @@ -7256,8 +7205,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-own-enumerable-property-symbols": { "version": "3.0.2", @@ -7444,7 +7392,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7532,8 +7479,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", @@ -8119,11 +8065,68 @@ "yargs": "^15.0.2" }, "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -8235,7 +8238,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -8533,8 +8535,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -8558,24 +8559,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require-uncached": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-2.0.0.tgz", - "integrity": "sha512-rPv1//BQwg4gzIbpJcKXWIfjDJEtgS8jzbsNoLcdVSE5FpBzKEKKuoG6MfCbLC28ZTv+qlQWC9/K7J5GBGPSMg==", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, "requirejs": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", @@ -8615,8 +8598,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "restore-cursor": { "version": "3.1.0", @@ -8859,7 +8841,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8881,7 +8862,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -9295,7 +9275,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9346,10 +9325,9 @@ } }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -9358,33 +9336,23 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" } } } diff --git a/package.json b/package.json index 22b207a8..3b8fdf39 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "main": "JokeAPI.js", "homepage": "https://v2.jokeapi.dev", "scripts": { - "start": "node . && exit $?", - "test": "node tools/test && snyk test", - "test-colorblind": "node tools/test --colorblind && snyk test", + "start": "node JokeAPI", + "test": "node tools/test", + "test-colorblind": "node tools/test --colorblind", "submissions": "node tools/submissions", "reformat": "node tools/reformat", "reassign-ids": "node tools/reassign-ids", @@ -15,7 +15,7 @@ "add-token": "node tools/add-token", "validate-jokes": "node tools/validate-jokes", "validate-ids": "node tools/validate-ids", - "lint": "eslint ./ && exit $?", + "lint": "eslint .", "all": "npm run validate-jokes && npm run validate-ids && npm run lint && npm run dep-graph && npm run generate-changelog && npm test", "dep-graph-old": "node dev/madge", "dep-graph": "depcruise --include-only \"^src|^endpoints|^tests|^tools\" --output-type dot . | dot -T svg > dev/dependencygraph.svg && echo Created dependency graph at \"dev/dependencygraph.svg\"", @@ -23,6 +23,9 @@ "snyk-protect": "snyk protect", "prepare": "npm run snyk-protect" }, + "bin": { + "jokeapi": "tools/cli.js" + }, "repository": { "type": "git", "url": "git+https://github.com/Sv443/JokeAPI.git" @@ -85,6 +88,7 @@ "fs-extra": "^10.0.0", "fuse.js": "^6.4.1", "http-ratelimit": "^0.2.3", + "import-fresh": "^3.3.0", "js2xmlparser": "^4.0.1", "json-to-pretty-yaml": "^1.2.2", "keypress": "^0.2.1", @@ -98,7 +102,8 @@ "svjsl": "^1.9.4", "url-parse": "^1.5.3", "xmlhttprequest": "^1.8.0", - "xss": "^1.0.10" + "xss": "^1.0.10", + "yargs": "^17.2.1" }, "devDependencies": { "dependency-cruiser": "^10.0.6", @@ -106,7 +111,6 @@ "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", - "require-uncached": "^2.0.0", "snyk": "^1.667.0", "table": "^6.0.1" }, diff --git a/tools/cli.js b/tools/cli.js new file mode 100644 index 00000000..53679aef --- /dev/null +++ b/tools/cli.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node + +const yargs = require("yargs"); +const importFresh = require("import-fresh"); +const { colors, Errors } = require("svcorelib"); + +const settings = require("../settings"); + +const { exit } = process; +const col = colors.fg; + + +const argv = yargs + .scriptName("jokeapi") + .version(`JokeAPI v${settings.info.version} - ${settings.info.projGitHub}`) + .command([ "submissions", "sub", "s" ], "Goes through all submissions, prompting to edit, add or delete them") + .example("$0 submissions") + .help() + .alias("h", "help") + .completion() + .argv; + + +async function run() +{ + const command = argv._[0]; + console.log(command); + + switch(command) + { + case "submissions": + case "sub": + case "s": + return importFresh("./submissions.js"); + default: + return yargs.showHelp(); + } + +} + + +//#SECTION on execute + +try +{ + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else + run(); +} +catch(err) +{ + console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); + + exit(0); +} diff --git a/tools/test.js b/tools/test.js index f250fd50..d3b0ec56 100755 --- a/tools/test.js +++ b/tools/test.js @@ -3,7 +3,7 @@ const jsl = require("svjsl"); const fs = require("fs-extra"); const cp = require("child_process"); -const requireUncached = require('require-uncached'); +const requireUncached = require('import-fresh'); const { resolve, join } = require("path"); const { XMLHttpRequest } = require("xmlhttprequest"); From 81bd3748b31e54ac9d424030908edec79a34922f Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 16 Oct 2021 18:31:18 +0200 Subject: [PATCH 09/62] add parsing --- settings.js | 1 + tools/submissions.js | 68 ++++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/settings.js b/settings.js index 3b8f00a2..1c15adcd 100755 --- a/settings.js +++ b/settings.js @@ -64,6 +64,7 @@ const settings = { timeFrame: 60, // time frame of submission rate limiter (in seconds) rateLimiting: 5, // how many requests per timeframe should be allowed invalidCharRegex: /(?![\u0000-\u0fff])./gm, // eslint-disable-line no-control-regex + minLength: 8, // minimum amount of characters needed in joke submissions (per property) }, jokesTemplateFile: "template.json", // relative to "jokes.jokesFolderPath" possible: { diff --git a/tools/submissions.js b/tools/submissions.js index 6d995bd1..dbb9e29f 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -6,7 +6,7 @@ const promiseAllSeq = require("promise-all-sequential"); const languages = require("../src/languages"); const parseJokes = require("../src/parseJokes"); -// const jokeSubmission = require("../src/jokeSubmission"); +const { reformatJoke } = require("../src/jokeSubmission"); const settings = require("../settings"); const { isEmpty } = require("lodash"); @@ -54,8 +54,10 @@ async function run() const langCodes = await getLangCodes(); const { submissions, amount } = await readSubmissions(langCodes); + const langCount = Object.keys(submissions).length; + const { proceed } = await prompt({ - message: `There are ${amount} submissions of ${Object.keys(submissions).length} languages. Go through them now?`, + message: `There are ${amount} submissions of ${langCount} language${langCount > 1 ? "s" : ""}. Go through them now?`, type: "confirm", name: "proceed" }); @@ -162,7 +164,8 @@ function actSubmission(sub) if(finalSub) finalSub.joke.safe = safe; - currentSub++; + if(lastSubmissionType !== "invalid") + currentSub++; // if not deleted in editSubmission() if(finalSub !== null) @@ -188,6 +191,27 @@ function editSubmission(sub) /** @type {Submission} */ const editedSub = reserialize(sub); + /** @param {Submission} finalSub */ + const trySubmit = async (finalSub) => { + const validateRes = parseJokes.validateSingle(finalSub.joke, finalSub.lang); + const allErrors = Array.isArray(validateRes) ? validateRes : []; + + if(typeof finalSub.joke.safe !== "boolean") + allErrors.push("Property 'safe' is not of type boolean"); + + if(allErrors.length > 0) + { + console.log(`${col.red}Joke is invalid:${col.rst}`); + console.log(`- ${allErrors.join("\n- ")}\n`); + + await getKey("Press any key to try again."); + + return res(editSubmission(finalSub)); + } + else + return res(Object.freeze(finalSub)); + }; + try { const jokeChoices = sub.joke.type === "single" ? [ @@ -225,8 +249,8 @@ function editSubmission(sub) value: "safe", }, { - title: `${col.green}[Done]${col.rst}`, - value: "done", + title: `${col.green}[Submit]${col.rst}`, + value: "submit", }, { title: `${col.red}[Delete]${col.rst}`, @@ -238,14 +262,15 @@ function editSubmission(sub) process.stdout.write("\n"); - const { action } = await prompt({ + const { editProperty } = await prompt({ message: "Edit property", type: "select", - name: "action", + name: "editProperty", + hint: "- Use arrow-keys. Return to select. Esc or Ctrl+C to submit.", choices, }); - switch(action) + switch(editProperty) { case "category": { @@ -265,11 +290,11 @@ function editSubmission(sub) case "joke": case "setup": case "delivery": - editedSub.joke[action] = (await prompt({ + editedSub.joke[editProperty] = (await prompt({ type: "text", - message: `Enter new value for ${action}`, + message: `Enter new value for '${editProperty}' property`, name: "val", - validate: (val) => !isEmpty(val), + validate: (val) => (!isEmpty(val) && val.length >= settings.jokes.submissions.minLength), })).val; break; case "type": @@ -280,8 +305,8 @@ function editSubmission(sub) { title: "Single", value: "single" }, { title: "Two Part", value: "twopart" }, ], - name: "val", - })).val; + name: "type", + })).type; break; case "flags": { @@ -320,11 +345,11 @@ function editSubmission(sub) type: "confirm", message: "Is this joke safe?", initial: false, - name: "del", - })).del; + name: "safe", + })).safe; break; - case "done": - return res(Object.freeze(editedSub)); + case "submit": + return trySubmit(editedSub); case "delete": { const { del } = await prompt({ @@ -342,7 +367,7 @@ function editSubmission(sub) break; } default: - return res(Object.freeze(editedSub)); + return trySubmit(editedSub); } return res(await editSubmission(editedSub)); @@ -607,14 +632,14 @@ function parseFileName(fileName) /** * Adds a submission to the local jokes * @param {Submission} sub - * @param {boolean} [safe=false] */ -function addSubmission(sub, safe = false) +function addSubmission(sub) { return new Promise(async (res, rej) => { try { // TODO: + unused(sub); return res(); } @@ -632,7 +657,8 @@ try { if(!process.stdin.isTTY) throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); - else run(); + else + run(); } catch(err) { From f05938bb5339879b000d98db95d9f89c8225f668 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sun, 17 Oct 2021 17:00:28 +0200 Subject: [PATCH 10/62] stuff --- src/jokeSubmission.js | 3 ++- tools/submissions.js | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/jokeSubmission.js b/src/jokeSubmission.js index 9fd63956..86958bf2 100755 --- a/src/jokeSubmission.js +++ b/src/jokeSubmission.js @@ -159,7 +159,8 @@ function writeJokeToFile(res, filePath, submittedJoke, fileFormat, ip, analytics } /** - * Coarse filter that ensures that a joke is formatted as expected + * Coarse filter that ensures that a joke is formatted as expected. + * This doesn't do any validation and omits missing properties! * @param {JokeSubmission} joke * @returns {JokeSubmission} Returns the reformatted joke */ diff --git a/tools/submissions.js b/tools/submissions.js index dbb9e29f..1f7a3626 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -169,7 +169,7 @@ function actSubmission(sub) // if not deleted in editSubmission() if(finalSub !== null) - await addSubmission(finalSub); + await saveSubmission(finalSub); return res(); } @@ -434,7 +434,7 @@ function finishPrompts() } /** - * Waits for the user to press a key, then returns it + * Waits for the user to press a key, then resolves with it * @param {string} [prompt] * @returns {Promise} */ @@ -442,7 +442,7 @@ function getKey(prompt) { return new Promise(async (res, rej) => { if(typeof prompt === "string") - prompt = `${prompt.trimRight()} `; + prompt = isEmpty(prompt) ? null : `${prompt.trimRight()} `; try { @@ -455,8 +455,7 @@ function getKey(prompt) process.stdin.removeListener("keypress", onKey); - if(typeof prompt === "string") - process.stdout.write("\n"); + prompt && process.stdout.write("\n"); return res({ name: key.name || ch || "", @@ -471,8 +470,7 @@ function getKey(prompt) process.stdin.setRawMode(true); process.stdin.on("keypress", onKey); - if(typeof prompt === "string") - process.stdout.write(prompt); + prompt && process.stdout.write(prompt); process.stdin.resume(); } @@ -630,16 +628,18 @@ function parseFileName(fileName) } /** - * Adds a submission to the local jokes + * Saves a submission to the local jokes * @param {Submission} sub */ -function addSubmission(sub) +function saveSubmission(sub) { return new Promise(async (res, rej) => { try { + const joke = reformatJoke(sub.joke); + // TODO: - unused(sub); + unused(joke); return res(); } From 2b34eb83387f62800b480c6fb346f88d8fd58f9a Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 18 Oct 2021 10:25:19 +0200 Subject: [PATCH 11/62] added all tools to cli bin --- .vscode/launch.json | 13 ++++ package.json | 3 +- tools/add-token.js | 16 ++++- tools/cli.js | 142 +++++++++++++++++++++++++++++++++++++++----- tools/test.js | 2 +- 5 files changed, 155 insertions(+), 21 deletions(-) mode change 100644 => 100755 tools/cli.js diff --git a/.vscode/launch.json b/.vscode/launch.json index a9b92b95..29d9d4ce 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -41,6 +41,19 @@ "--trace-deprecation" ], "console": "integratedTerminal" + }, + { + "program": "${workspaceFolder}/tools/cli.js", + "name": "CLI", + "request": "launch", + "type": "node", + "skipFiles": [ + "/**" + ], + "args": [ + "--trace-deprecation" + ], + "console": "integratedTerminal" } ], "debug.javascript.usePreview": true diff --git a/package.json b/package.json index 3b8fdf39..839e2605 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "dep-graph": "depcruise --include-only \"^src|^endpoints|^tests|^tools\" --output-type dot . | dot -T svg > dev/dependencygraph.svg && echo Created dependency graph at \"dev/dependencygraph.svg\"", "generate-changelog": "node tools/generate-changelog", "snyk-protect": "snyk protect", - "prepare": "npm run snyk-protect" + "prepare": "npm run snyk-protect", + "link": "npm link" }, "bin": { "jokeapi": "tools/cli.js" diff --git a/tools/add-token.js b/tools/add-token.js index d049dc84..84ec312c 100755 --- a/tools/add-token.js +++ b/tools/add-token.js @@ -6,16 +6,26 @@ try { let amount; + console.log(process.argv); + try { - amount = parseInt(process.argv[2].replace(/[-]/g, "")); + amount = parseInt( + process.argv.find(arg => arg.match(/^-{0,2}\d+$/)) + .replace(/[-]/g, "") + ); } catch(err) { jsl.unused(err); - amount = 1; + amount = NaN; } + if(isNaN(amount) || amount < 1) + amount = 1; + + amount = Math.min(amount, 10); + console.log("\n"); for(let i = 0; i < amount; i++) @@ -42,7 +52,7 @@ try console.log(`Token ${jsl.colors.fg.green}${tok}${jsl.colors.rst} added to the list of tokens at "${settings.auth.tokenListFile}".`); } - console.log("\n\n"); + console.log("\n"); return process.exit(0); } catch(err) diff --git a/tools/cli.js b/tools/cli.js old mode 100644 new mode 100755 index 53679aef..24a9f266 --- a/tools/cli.js +++ b/tools/cli.js @@ -10,32 +10,142 @@ const { exit } = process; const col = colors.fg; -const argv = yargs - .scriptName("jokeapi") - .version(`JokeAPI v${settings.info.version} - ${settings.info.projGitHub}`) - .command([ "submissions", "sub", "s" ], "Goes through all submissions, prompting to edit, add or delete them") - .example("$0 submissions") - .help() - .alias("h", "help") - .completion() - .argv; - +//#SECTION run async function run() { + const argv = prepareCLI(); const command = argv._[0]; - console.log(command); + let file = ""; + let action = null; + + // TODO: (v2.4) remove comments below switch(command) { - case "submissions": - case "sub": - case "s": - return importFresh("./submissions.js"); - default: + case "start": case "run": + file = "../JokeAPI.js"; + break; + case "submissions": case "sub": case "s": + action = "Joke submissions"; + file = "./submissions.js"; + break; + case "add-joke": case "add": case "j": + action = "Add joke"; + file = "./add-joke.js"; + break; + case "reassign-ids": case "re-id": case "r": + action = "Reassign IDs"; + file = "./reassign-ids.js"; + break; + case "add-token": case "token": case "t": + action = "Add API token"; + file = "./add-token.js"; + break; + case "validate-ids": case "vi": + action = "Validate IDs"; + file = "./validate-ids.js"; + break; + case "validate-jokes": case "vj": + action = "Validate jokes"; + file = "./validate-jokes.js"; + break; + case "generate-changelog": case "gen-cl": case "c": + action = "Generate changelog"; + file = "./generate-changelog.js"; + break; + // case "stresstest": case "str": + // action = "Stress test"; + // file = "./stresstest.js"; + // break; + case "test": + action = "Unit tests"; + file = "./test.js"; + break; + // case "ip-info": case "ip": + // action = "IP info"; + // file = "./ip-info.js"; + case undefined: case null: case "": return yargs.showHelp(); + default: + console.log(`Unrecognized command '${command}'\nUse 'jokeapi -h' to see a list of commands`); + return; } + action && console.log(`${settings.info.name} CLI - ${action}`); + + return importFresh(file); +} + +/** + * Prepares the CLI so it can show help + * @returns {yargs.Argv} + */ +function prepareCLI() +{ + //#SECTION general + yargs.scriptName("jokeapi") + .version(`${settings.info.name} v${settings.info.version} - ${settings.info.projGitHub}`) + .help() + .alias("h", "help"); + + //#SECTION commands + // TODO: (v2.4) remove comments below + yargs.command([ "start", "run" ], `Starts ${settings.info.name} (equivalent to 'npm start')`); + + yargs.command([ "submissions", "sub", "s" ], "Goes through all joke submissions, prompting to edit, add or delete them"); + + yargs.command([ "add-joke", "add", "j" ], "Runs an interactive prompt that adds a joke"); + + yargs.command([ "reassign-ids", "re-id", "r" ], "Goes through each joke file and reassigns IDs to each one, consecutively"); + + yargs.command([ "add-token [amount]", "token", "t" ], "Generates one or multiple API tokens to be used to gain unlimited access to the API", cmd => { + cmd.positional("amount", { + describe: "Specifies the amount of tokens to generate - min is 1, max is 10", + type: "number", + default: 1 + }); + + // cmd.option("no-copy", { + // alias: "nc", + // describe: "Disables auto-copying the token to the clipboard (if amount = 1)", + // type: "boolean" + // }); + }); + + yargs.command([ "validate-ids", "vi" ], "Goes through each joke file and makes sure the IDs are correct (no duplicates or skipped IDs & correct order)"); + + yargs.command([ "validate-jokes", "vj" ], "Goes through each joke file and checks the validity of each joke and whether they can all be loaded to memory"); + + yargs.command([ "generate-changelog", "gen-cl", "c" ], "Turns the changelog.txt file into a markdown file (changelog.md)", cmd => { + cmd.option("generate-json", { + alias: "j", + describe: "Use this argument to generate a changelog-data.json file in addition to the markdown file", + type: "boolean" + }); + }); + + yargs.command([ "ip-info", "ip" ], "Starts a server at '127.0.0.1:8074' that just prints information about each request's IP", cmd => { + cmd.option("color-cycle", { + alias: "c", + describe: "Cycles the color of the output after each request (to make spotting a new request easier)", + type: "boolean" + }); + }); + + // yargs.command([ "stresstest", "str" ], `Sends lots of requests to ${settings.info.name} to stresstest it (requires the API to run in another process on the same machine)`); + + yargs.command("test", `Runs ${settings.info.name}'s unit tests`, cmd => { + cmd.option("colorblind", { + alias: "c", + describe: "Include this argument to replace the colors green with cyan and red with magenta", + type: "boolean" + }); + }); + + yargs.wrap(Math.min(100, process.stdout.columns)); + + return yargs.argv; } diff --git a/tools/test.js b/tools/test.js index d3b0ec56..309f5a62 100755 --- a/tools/test.js +++ b/tools/test.js @@ -49,7 +49,7 @@ function runAllTests() { runningTests = true; - if(process.argv.includes("--colorblind") || process.argv.includes("-cb")) + if(process.argv.includes("--colorblind") || process.argv.includes("-c")) { col.green = jsl.colors.fg.cyan; col.red = jsl.colors.fg.magenta; From fd5db61f6f96dc70112c4a91eaf83e45533671f2 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 18 Oct 2021 10:47:09 +0200 Subject: [PATCH 12/62] cli stuff --- tools/cli.js | 152 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 90 insertions(+), 62 deletions(-) diff --git a/tools/cli.js b/tools/cli.js index 24a9f266..2d0946b8 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -9,82 +9,93 @@ const settings = require("../settings"); const { exit } = process; const col = colors.fg; +const argv = prepareCLI(); + //#SECTION run async function run() { - const argv = prepareCLI(); - const command = argv._[0]; - - let file = ""; - let action = null; - - // TODO: (v2.4) remove comments below - switch(command) + try { - case "start": case "run": - file = "../JokeAPI.js"; - break; - case "submissions": case "sub": case "s": - action = "Joke submissions"; - file = "./submissions.js"; - break; - case "add-joke": case "add": case "j": - action = "Add joke"; - file = "./add-joke.js"; - break; - case "reassign-ids": case "re-id": case "r": - action = "Reassign IDs"; - file = "./reassign-ids.js"; - break; - case "add-token": case "token": case "t": - action = "Add API token"; - file = "./add-token.js"; - break; - case "validate-ids": case "vi": - action = "Validate IDs"; - file = "./validate-ids.js"; - break; - case "validate-jokes": case "vj": - action = "Validate jokes"; - file = "./validate-jokes.js"; - break; - case "generate-changelog": case "gen-cl": case "c": - action = "Generate changelog"; - file = "./generate-changelog.js"; - break; - // case "stresstest": case "str": - // action = "Stress test"; - // file = "./stresstest.js"; - // break; - case "test": - action = "Unit tests"; - file = "./test.js"; - break; - // case "ip-info": case "ip": - // action = "IP info"; - // file = "./ip-info.js"; - case undefined: case null: case "": - return yargs.showHelp(); - default: - console.log(`Unrecognized command '${command}'\nUse 'jokeapi -h' to see a list of commands`); - return; + const command = argv._[0]; + + let file, action; + + // TODO: (v2.4) remove comments below + switch(command) + { + case "start": case "run": + file = "../JokeAPI.js"; + break; + case "submissions": case "sub": case "s": + action = "Joke submissions"; + file = "./submissions.js"; + break; + case "add-joke": case "add": case "j": + action = "Add joke"; + file = "./add-joke.js"; + break; + case "reassign-ids": case "re-id": case "r": + action = "Reassign IDs"; + file = "./reassign-ids.js"; + break; + case "add-token": case "token": case "t": + action = "Add API token"; + file = "./add-token.js"; + break; + case "validate-ids": case "vi": + action = "Validate IDs"; + file = "./validate-ids.js"; + break; + case "validate-jokes": case "vj": + action = "Validate jokes"; + file = "./validate-jokes.js"; + break; + case "generate-changelog": case "gen-cl": case "c": + action = "Generate changelog"; + // file = "./generate-changelog.js"; + break; + // case "stresstest": case "str": + // action = "Stress test"; + // file = "./stresstest.js"; + // break; + case "test": + action = "Unit tests"; + file = "./test.js"; + break; + // case "ip-info": case "ip": + // action = "IP info"; + // file = "./ip-info.js"; + case undefined: case null: case "": + console.log(`${settings.info.name} CLI v${settings.info.version}\n`); + return yargs.showHelp(); + default: + return warn(`Unrecognized command '${command}'\nUse '${argv.$0} -h' to see a list of commands`); + } + + if(!file) + throw new Error(`Command '${command}' (${action.toLowerCase()}) didn't yield an executable file`); + + action && console.log(`${settings.info.name} CLI - ${action}`); + + return importFresh(file); + } + catch(err) + { + return error(err); } - - action && console.log(`${settings.info.name} CLI - ${action}`); - - return importFresh(file); } /** * Prepares the CLI so it can show help - * @returns {yargs.Argv} + * @returns {yargs.Argv<*>} */ function prepareCLI() { //#SECTION general yargs.scriptName("jokeapi") + .usage("Usage: $0 ") .version(`${settings.info.name} v${settings.info.version} - ${settings.info.projGitHub}`) .help() .alias("h", "help"); @@ -160,7 +171,24 @@ try } catch(err) { - console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); + return error(err); +} - exit(0); +/** + * @param {Error} err + */ +function error(err) +{ + console.error(`${col.red}${settings.info.name} CLI - ${err.name}:${col.rst}\n${err.stack}\n`); + exit(1); +} + +/** + * @param {string} warning + * @param {string} [type] + */ +function warn(warning, type = "Warning") +{ + console.log(`${col.yellow}${settings.info.name} CLI - ${type}:${col.rst}\n${warning}\n`); + exit(1); } From 3df4c98cdc29245a98b1e0f9dee02906e985d8fd Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 19 Oct 2021 16:21:01 +0200 Subject: [PATCH 13/62] types & submission stuff --- src/types/jokes.d.ts | 13 ++++++- tools/submissions.js | 87 ++++++++++++++++++++++++++++++++------------ tools/types.d.ts | 4 +- 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/src/types/jokes.d.ts b/src/types/jokes.d.ts index ced92912..61a3b755 100644 --- a/src/types/jokes.d.ts +++ b/src/types/jokes.d.ts @@ -12,10 +12,13 @@ export interface JokeFlags { racist: boolean; religious: boolean; political: boolean; + sexist: boolean; explicit: boolean; } +//#SECTION base interfaces + /** Base interface for all kinds of jokes, internal or submission */ declare interface JokeBase { category: JokeCategory; @@ -35,7 +38,7 @@ declare interface SubmissionBase extends JokeBase { } -//#SECTION base joke +//#SECTION internal jokes /** An internal joke of type `single` */ export interface SingleJoke extends InternalJokeBase { @@ -53,6 +56,14 @@ export interface TwopartJoke extends InternalJokeBase { /** An internal joke of any type */ export type Joke = SingleJoke | TwopartJoke; +/** Represents an internal joke file */ +export interface JokesFile { + info: { + formatVersion: number; + } + jokes: Joke[]; +} + //#SECTION submissions diff --git a/tools/submissions.js b/tools/submissions.js index 1f7a3626..c4221be2 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,8 +1,9 @@ -const { readdir, readFile } = require("fs-extra"); +const { readdir, readFile, writeFile, copyFile, rm } = require("fs-extra"); const { resolve, join } = require("path"); -const { colors, Errors, unused, reserialize } = require("svcorelib"); +const { colors, Errors, unused, reserialize, filesystem } = require("svcorelib"); const prompt = require("prompts"); const promiseAllSeq = require("promise-all-sequential"); +const keypress = require("keypress"); const languages = require("../src/languages"); const parseJokes = require("../src/parseJokes"); @@ -14,32 +15,37 @@ const { isEmpty } = require("lodash"); const col = colors.fg; const { exit } = process; -/** @type {LastEditedSubmission} */ -let lastSubmissionType; -/** @type {number} */ -let currentSub; -/** @type {boolean} */ -let lastKeyInvalid = false; - -//#SECTION types & init +//#MARKER types & init /** @typedef {import("./types").AllSubmissions} AllSubmissions */ /** @typedef {import("./types").Submission} Submission */ /** @typedef {import("./types").ParsedFileName} ParsedFileName */ /** @typedef {import("./types").ReadSubmissionsResult} ReadSubmissionsResult */ /** @typedef {import("./types").LastEditedSubmission} LastEditedSubmission */ -/** @typedef {import("./types").KeypressResult} KeypressResult */ +/** @typedef {import("./types").Keypress} Keypress */ /** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ /** @typedef {import("../src/types/jokes").JokeFlags} JokeFlags */ +/** @typedef {import("../src/types/jokes").JokesFile} JokesFile */ /** @typedef {import("../src/types/languages").LangCode} LangCodes */ +/** @type {LastEditedSubmission} */ +let lastSubmissionType; +/** @type {number} */ +let currentSub; +/** @type {boolean} */ +let lastKeyInvalid = false; + + async function run() { + keypress(process.stdin); + try { await languages.init(); + await parseJokes.init(); } catch(err) @@ -72,7 +78,7 @@ async function run() } -//#SECTION prompts +//#MARKER prompts /** * Goes through all submissions, prompting about what to do with them @@ -96,6 +102,8 @@ async function promptSubmissions(allSubmissions) return finishPrompts(); } +//#SECTION act on submission + /** * Prompts the user to act on a submission * @param {Submission} sub @@ -129,7 +137,7 @@ function actSubmission(sub) console.log(`${last}\n\n------------\nLanguage: ${sub.lang}\n------------\n`); - printSubmission(sub, currentSub); + printSubmission(sub); /** @type {null|Submission} The submission to be added to the local jokes */ let finalSub = null; @@ -180,6 +188,8 @@ function actSubmission(sub) }); } +//#SECTION edit submission + /** * Gets called to edit a submission * @param {Submission} sub @@ -258,9 +268,11 @@ function editSubmission(sub) }, ]; - // TODO: display joke + process.stdout.write("\n\n"); + + printSubmission(sub); - process.stdout.write("\n"); + process.stdout.write("\n\n"); const { editProperty } = await prompt({ message: "Edit property", @@ -379,15 +391,16 @@ function editSubmission(sub) }); } +//#SECTION print submission + /** * Prints a submission to the console * @param {Submission} sub - * @param {number} index Current index of the submission */ -function printSubmission(sub, index) +function printSubmission(sub) { const lines = [ - `Submission #${index} by ${sub.client}:`, + `Submission #${currentSub} by ${sub.client}:`, ` Category: ${sub.joke.category}`, ` Type: ${sub.joke.type}`, ` Flags: ${extractFlags(sub.joke)}`, @@ -436,7 +449,7 @@ function finishPrompts() /** * Waits for the user to press a key, then resolves with it * @param {string} [prompt] - * @returns {Promise} + * @returns {Promise} */ function getKey(prompt) { @@ -482,7 +495,7 @@ function getKey(prompt) } -//#SECTION internal stuff +//#MARKER internal stuff /** * Reads all possible language codes and resolves with them @@ -578,7 +591,9 @@ function getSubmissions(lang) for await(const fileName of files) { - const file = await readFile(join(submissionsFolder, fileName)); + const path = join(submissionsFolder, fileName); + + const file = await readFile(path); /** @type {JokeSubmission} */ const joke = JSON.parse(file); @@ -592,7 +607,7 @@ function getSubmissions(lang) unused(index); - submissions.push({ client, joke, timestamp, errors, lang }); + submissions.push({ client, joke, timestamp, errors, lang, path }); } return res(submissions); @@ -636,10 +651,34 @@ function saveSubmission(sub) return new Promise(async (res, rej) => { try { + // TODO: test this + const { lang } = sub; const joke = reformatJoke(sub.joke); - // TODO: - unused(joke); + const jokeFilePath = join(settings.jokes.jokeSubmissionPath, `jokes-${lang}.json`); + const templatePath = join(settings.jokes.jokeSubmissionPath, settings.jokes.jokesTemplateFile); + + if(!(await filesystem.exists(jokeFilePath))) + await copyFile(templatePath, jokeFilePath); + + + /** @type {JokesFile} */ + const currentJokesFile = JSON.parse((await readFile(jokeFilePath)).toString()); + const currentJokes = reserialize(currentJokesFile.jokes); + + const lastId = [currentJokes.length - 1].id; + + joke.id = lastId + 1; + + currentJokes.push(joke); + + currentJokesFile.jokes = currentJokes; + + + await writeFile(jokeFilePath, JSON.stringify(currentJokesFile, undefined, 4)); + + await rm(sub.path); + return res(); } diff --git a/tools/types.d.ts b/tools/types.d.ts index 2fb50124..c0020d82 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -16,6 +16,8 @@ export interface Submission { timestamp: number; errors: null | string[]; lang: LangCode; + /** Absolute path to the joke submission */ + path: string; } /** @@ -44,7 +46,7 @@ export interface ReadSubmissionsResult { export type LastEditedSubmission = "accepted_safe" | "accepted_unsafe" | "edited" | "deleted"; -export interface KeypressResult { +export interface Keypress { name: string; ctrl: boolean; meta: boolean; From 5b7dd051a8f97267bfccf885add617b282006699 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 19 Oct 2021 16:27:49 +0200 Subject: [PATCH 14/62] submission fixes --- settings.js | 2 +- tools/submissions.js | 19 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/settings.js b/settings.js index 1c15adcd..296e7d23 100755 --- a/settings.js +++ b/settings.js @@ -64,7 +64,7 @@ const settings = { timeFrame: 60, // time frame of submission rate limiter (in seconds) rateLimiting: 5, // how many requests per timeframe should be allowed invalidCharRegex: /(?![\u0000-\u0fff])./gm, // eslint-disable-line no-control-regex - minLength: 8, // minimum amount of characters needed in joke submissions (per property) + minLength: 2, // minimum amount of characters needed in joke submissions (per property) }, jokesTemplateFile: "template.json", // relative to "jokes.jokesFolderPath" possible: { diff --git a/tools/submissions.js b/tools/submissions.js index c4221be2..7fdb9c72 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -3,7 +3,6 @@ const { resolve, join } = require("path"); const { colors, Errors, unused, reserialize, filesystem } = require("svcorelib"); const prompt = require("prompts"); const promiseAllSeq = require("promise-all-sequential"); -const keypress = require("keypress"); const languages = require("../src/languages"); const parseJokes = require("../src/parseJokes"); @@ -40,8 +39,6 @@ let lastKeyInvalid = false; async function run() { - keypress(process.stdin); - try { await languages.init(); @@ -268,12 +265,8 @@ function editSubmission(sub) }, ]; - process.stdout.write("\n\n"); + process.stdout.write("\n"); - printSubmission(sub); - - process.stdout.write("\n\n"); - const { editProperty } = await prompt({ message: "Edit property", type: "select", @@ -463,11 +456,11 @@ function getKey(prompt) if(key && key.ctrl && ["c", "d"].includes(key.name)) process.exit(0); - process.stdin.setRawMode(false); process.stdin.pause(); - process.stdin.removeListener("keypress", onKey); + process.stdin.setRawMode(false); + prompt && process.stdout.write("\n"); return res({ @@ -655,8 +648,8 @@ function saveSubmission(sub) const { lang } = sub; const joke = reformatJoke(sub.joke); - const jokeFilePath = join(settings.jokes.jokeSubmissionPath, `jokes-${lang}.json`); - const templatePath = join(settings.jokes.jokeSubmissionPath, settings.jokes.jokesTemplateFile); + const jokeFilePath = join(settings.jokes.jokesFolderPath, `jokes-${lang}.json`); + const templatePath = join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile); if(!(await filesystem.exists(jokeFilePath))) await copyFile(templatePath, jokeFilePath); @@ -675,6 +668,8 @@ function saveSubmission(sub) currentJokesFile.jokes = currentJokes; + // TODO: id is null for some reason + await writeFile(jokeFilePath, JSON.stringify(currentJokesFile, undefined, 4)); await rm(sub.path); From fdae885da89aff6a901218d3bde9ea70441b5a0e Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 19 Oct 2021 16:34:12 +0200 Subject: [PATCH 15/62] stuff --- package.json | 3 ++- tools/cli.js | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 839e2605..179128f7 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "link": "npm link" }, "bin": { - "jokeapi": "tools/cli.js" + "jokeapi": "tools/cli.js", + "japi": "tools/cli.js" }, "repository": { "type": "git", diff --git a/tools/cli.js b/tools/cli.js index 2d0946b8..3600a932 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -54,7 +54,7 @@ async function run() break; case "generate-changelog": case "gen-cl": case "c": action = "Generate changelog"; - // file = "./generate-changelog.js"; + file = "./generate-changelog.js"; break; // case "stresstest": case "str": // action = "Stress test"; @@ -79,6 +79,8 @@ async function run() action && console.log(`${settings.info.name} CLI - ${action}`); + // TODO: pwd / cwd is not set correctly when called from a folder that's not JokeAPI's root + return importFresh(file); } catch(err) @@ -136,13 +138,13 @@ function prepareCLI() }); }); - yargs.command([ "ip-info", "ip" ], "Starts a server at '127.0.0.1:8074' that just prints information about each request's IP", cmd => { - cmd.option("color-cycle", { - alias: "c", - describe: "Cycles the color of the output after each request (to make spotting a new request easier)", - type: "boolean" - }); - }); + // yargs.command([ "ip-info", "ip" ], "Starts a server at '127.0.0.1:8074' that just prints information about each request's IP", cmd => { + // cmd.option("color-cycle", { + // alias: "c", + // describe: "Cycles the color of the output after each request (to make spotting a new request easier)", + // type: "boolean" + // }); + // }); // yargs.command([ "stresstest", "str" ], `Sends lots of requests to ${settings.info.name} to stresstest it (requires the API to run in another process on the same machine)`); From d0a963e63facee55e8ce9d36d32e9ee1b600dea0 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 20:31:12 +0200 Subject: [PATCH 16/62] version bump + fix vulns --- package-lock.json | 105 +++++++++------------------------------------- package.json | 6 +-- 2 files changed, 22 insertions(+), 89 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97c6aba0..16702505 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@sv443/jokeapi", - "version": "2.3.1", + "version": "2.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sv443/jokeapi", - "version": "2.3.1", + "version": "2.3.2", "license": "MIT", "dependencies": { "@pm2/io": "^5.0.0", "dotenv": "^10.0.0", - "farmhash": "^3.1.0", + "farmhash": "^3.2.1", "fs-extra": "^10.0.0", "fuse.js": "^6.4.1", "http-ratelimit": "^0.2.3", @@ -33,6 +33,7 @@ "yargs": "^17.2.1" }, "bin": { + "japi": "tools/cli.js", "jokeapi": "tools/cli.js" }, "devDependencies": { @@ -41,7 +42,7 @@ "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", - "snyk": "^1.667.0", + "snyk": "^1.742.0", "table": "^6.0.1" } }, @@ -4609,9 +4610,9 @@ } }, "node_modules/snyk": { - "version": "1.729.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.729.0.tgz", - "integrity": "sha512-+JFr+wvJCUJajsaEUF298Z7oJTkIrGQgBeqW6R8ZKOjUzawue8s406ILJ+E/40Jh14QkT00iOLKxr1pjS/CUIw==", + "version": "1.742.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.742.0.tgz", + "integrity": "sha512-NaYeL52r/kRVs+GTvId6IimKTQPbqQQj1W50DfZBWH4mGFEnNWl54G3TRRVB2ntoEK+RvjwkA40GqU5ozpAw3g==", "dev": true, "bin": { "snyk": "bin/snyk" @@ -5168,50 +5169,11 @@ "dev": true }, "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/word-wrap": { @@ -8787,9 +8749,9 @@ } }, "snyk": { - "version": "1.729.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.729.0.tgz", - "integrity": "sha512-+JFr+wvJCUJajsaEUF298Z7oJTkIrGQgBeqW6R8ZKOjUzawue8s406ILJ+E/40Jh14QkT00iOLKxr1pjS/CUIw==", + "version": "1.742.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.742.0.tgz", + "integrity": "sha512-NaYeL52r/kRVs+GTvId6IimKTQPbqQQj1W50DfZBWH4mGFEnNWl54G3TRRVB2ntoEK+RvjwkA40GqU5ozpAw3g==", "dev": true }, "source-map": { @@ -9223,40 +9185,11 @@ "dev": true }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "word-wrap": { diff --git a/package.json b/package.json index 179128f7..29255ed0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sv443/jokeapi", - "version": "2.3.1", + "version": "2.3.2", "description": "A REST API that serves jokes from many categories while also offering a lot of filtering methods", "main": "JokeAPI.js", "homepage": "https://v2.jokeapi.dev", @@ -86,7 +86,7 @@ "dependencies": { "@pm2/io": "^5.0.0", "dotenv": "^10.0.0", - "farmhash": "^3.1.0", + "farmhash": "^3.2.1", "fs-extra": "^10.0.0", "fuse.js": "^6.4.1", "http-ratelimit": "^0.2.3", @@ -113,7 +113,7 @@ "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", - "snyk": "^1.667.0", + "snyk": "^1.742.0", "table": "^6.0.1" }, "snyk": true From f2d3805b1fb2f8d194952fba2957a3ae594a5dee Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 21:48:32 +0200 Subject: [PATCH 17/62] fixed #343 --- .env.template | 1 + .vscode/launch.json | 2 +- package.json | 2 +- settings.js | 57 +++++++++++++++++-------------- src/env.js | 82 +++++++++++++++++++++++++++++++++++++++++++++ src/logRequest.js | 7 ++-- src/main.js | 7 ++-- src/types/env.d.ts | 5 +++ tools/cli.js | 55 ++++++++++++++++++++++-------- 9 files changed, 173 insertions(+), 45 deletions(-) create mode 100644 src/env.js create mode 100644 src/types/env.d.ts diff --git a/.env.template b/.env.template index 60a424d0..37093a17 100755 --- a/.env.template +++ b/.env.template @@ -1,3 +1,4 @@ RESTART_TOKEN=123456789 # A POST request to "[JokeAPI_URL]/restart" with this token as a "text/plain" payload will restart JokeAPI - alternatively, open the JavaScript console on the documentation page and enter "restart()" DB_USERNAME=User123 # A user with access to the analytics database DB_PASSWORD=password123 # The password of the above user +NODE_ENV=stage # The deployment environment of JokeAPI (accepts "prod" / "production" or "stage" - case insensitive, defaults to "stage") diff --git a/.vscode/launch.json b/.vscode/launch.json index 29d9d4ce..6b84728e 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ { "type": "node", "request": "launch", - "name": "Debug JokeAPI", + "name": "JokeAPI", "skipFiles": [ "/**" ], diff --git a/package.json b/package.json index 29255ed0..41993775 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "2.3.2", "description": "A REST API that serves jokes from many categories while also offering a lot of filtering methods", "main": "JokeAPI.js", - "homepage": "https://v2.jokeapi.dev", + "homepage": "https://jokeapi.dev", "scripts": { "start": "node JokeAPI", "test": "node tools/test", diff --git a/settings.js b/settings.js index 296e7d23..487a1c78 100755 --- a/settings.js +++ b/settings.js @@ -1,8 +1,19 @@ -const packageJSON = require("./package.json"); const jsl = require("svjsl"); + +const packageJSON = require("./package.json"); +const { getProp } = require("./src/env"); + const col = jsl.colors.fg; const bgc = jsl.colors.bg; + +/* + * Notes: + * - to change environment-dependent properties that use getProp(), go to './src/env.js' + * - to change the environment, set the `NODE_ENV` environment variable (in the '.dotenv' file) + */ + + const settings = { debug: { verboseLogging: true, // set to true to enable extra debug output @@ -10,12 +21,12 @@ const settings = { onlyLogErrors: true, // set to true to disable sending any console logs but error messages }, info: { - name: "JokeAPI", // the name of JokeAPI + name: getProp("name"), // the name of JokeAPI desc: packageJSON.description, // the description of JokeAPI projGitHub: "https://github.com/Sv443/JokeAPI", // URL to the project's GitHub page version: packageJSON.version, // the version as a string versionInt: packageJSON.version.split("."), // the version as a number array - docsURL: packageJSON.homepage, // the URL to the documentation of JokeAPI + docsURL: getProp("baseUrl"), // the URL to the documentation of JokeAPI author: { name: packageJSON.author.name, // author name email: packageJSON.author.email, // author email @@ -27,7 +38,7 @@ const settings = { }, wrapper: { mainFilePath: "./src/main.js", // main script file - skipWrapping: true, // whether or not to skip the wrapping through node-wrap + skipWrapping: true, // whether or not to skip the wrapping through node-wrap wrapperSettings: { console: true, // whether Node-Wrap should log to the console crashTimeout: 2000, // timeout (in ms) until the process should be restarted after a crash @@ -56,10 +67,10 @@ const settings = { blacklistLoggingEnabled: true, // whether or not to log the character when an IP is on the blacklist }, jokes: { - jokesFormatVersion: 3, // current joke format version - jokesFolderPath: "./data/jokes/", // path to the jokes folder - needs trailing slash - jokeSubmissionURL: `${packageJSON.homepage}#submit`, // joke submission url - jokeSubmissionPath: "./data/submissions/", // path to a directory where joke submissions should be saved to - needs trailing slash + jokesFormatVersion: 3, // current joke format version + jokesFolderPath: "./data/jokes/", // path to the jokes folder - needs trailing slash + jokeSubmissionURL: `${getProp("baseUrl")}#submit`, // joke submission url + jokeSubmissionPath: "./data/submissions/", // path to a directory where joke submissions should be saved to - needs trailing slash submissions: { timeFrame: 60, // time frame of submission rate limiter (in seconds) rateLimiting: 5, // how many requests per timeframe should be allowed @@ -109,28 +120,24 @@ const settings = { }, lastIDsMaxLength: 15, // the maximum amount of joke IDs that get saved to the blacklist-array jokeRandomizationAttempts: 25, // after how many attempts of selecting a random joke to stop trying - splitChars: [",", "+", "-"], // which characters should separate the values of parameters with support for multiple values + splitChars: [ ",", "+", "-" ], // which characters should separate the values of parameters with support for multiple values splitCharRegex: /[,+-]/gm, // which characters should separate the values of parameters with support for multiple values maxAmount: 10, // the maximum amount of jokes that can be fetched with a single call to the get jokes endpoint encodeAmount: 5, // if more than this number of jokes is requested, encode them }, httpServer: { - port: 8076, // http server port - allowCORS: true, // whether or not to allow Cross Origin Resource Sharing - rateLimiting: 120, // amount of allowed requests per below defined timeframe - timeFrame: 60, // timeframe in seconds - urlPathOffset: 0, // example: "/jokeapi/info" with an offset of 1 will only start parsing the path beginning at "info" - an Apache reverse proxy will do this automatically though - maxPayloadSize: 5120, // max size (in bytes) that will be accepted in a PUT request - if payload exceeds this size, it will abort with status 413 - maxUrlLength: 250, // max amount of characters of the URL - if the URL is longer than this, the request will abort with status 414 - disableCache: true, // whether or not to disable the cache - default: true (setting to false may prevent the users from getting new jokes) - infoHeaders: true, // whether or not to add an informational header about JokeAPI to each request - reverseProxy: true, // whether or not JokeAPI gets its requests from a reverse proxy - startupTimeout: 30, // in seconds, timeout after which startup fails if the HTTP server couldn't start up (blocked port, etc.) - ssl: { - enabled: false, // whether SSL is enabled - certFile: "./.ssl/cert-xy.pem" // to be implemented (issue #185) - }, - ipSanitization: { // used to sanitize IP addresses so they can be used in file paths + port: getProp("httpPort"), // http server port + allowCORS: true, // whether or not to allow Cross Origin Resource Sharing + rateLimiting: 120, // amount of allowed requests per below defined timeframe + timeFrame: 60, // timeframe in seconds + urlPathOffset: 0, // example: "/jokeapi/info" with an offset of 1 will only start parsing the path beginning at "info" - an Apache reverse proxy will do this automatically though + maxPayloadSize: 5120, // max size (in bytes) that will be accepted in a PUT request - if payload exceeds this size, it will abort with status 413 + maxUrlLength: 250, // max amount of characters of the URL - if the URL is longer than this, the request will abort with status 414 + disableCache: true, // whether or not to disable the cache - default: true (setting to false may prevent the users from getting new jokes) + infoHeaders: true, // whether or not to add an informational header about JokeAPI to each request + reverseProxy: true, // whether or not JokeAPI gets its requests from a reverse proxy + startupTimeout: 30, // in seconds, timeout after which startup fails if the HTTP server couldn't start up (blocked port, etc.) + ipSanitization: { // used to sanitize IP addresses so they can be used in file paths regex: /[^A-Za-z0-9\-_./]|^COM[0-9]([/.]|$)|^LPT[0-9]([/.]|$)|^PRN([/.]|$)|^CLOCK\$([/.]|$)|^AUX([/.]|$)|^NUL([/.]|$)|^CON([/.]|$)/gm, replaceChar: "#", // what character to use instead of illegal characters }, diff --git a/src/env.js b/src/env.js new file mode 100644 index 00000000..2e084ac4 --- /dev/null +++ b/src/env.js @@ -0,0 +1,82 @@ +const dotenv = require("dotenv"); + +/** @typedef {import("svcorelib").JSONCompatible} JSONCompatible*/ +/** @typedef {import("./types/env").Env} Env */ +/** @typedef {import("./types/env").EnvDependentProp} EnvDependentProp */ + + +/** All environment-dependent settings */ +const envSettings = Object.freeze({ + prod: { + name: "JokeAPI", + httpPort: 8076, + baseUrl: "https://v2.jokeapi.dev", + }, + stage: { + name: "JokeAPI_ST", + httpPort: 8075, + baseUrl: "https://stage.jokeapi.dev", + }, +}); + +let initialized = false; + + +/** + * Initializes the deployment environment module + */ +function init() +{ + if(initialized) + return; + + dotenv.config(); + initialized = true; +} + +/** + * Normalizes the deployment environment passed as the env var `NODE_ENV` and returns it + * @returns {Env} + */ +function getEnv() +{ + if(!initialized) + init(); + + if(!process.env) + return "stage"; + + const nodeEnv = process.env.NODE_ENV ? process.env.NODE_ENV.toLowerCase() : null; + + switch(nodeEnv) + { + case "prod": + case "production": + return "prod"; + } + + return "stage"; +} + +/** + * + * @param {EnvDependentProp} prop + * @returns {JSONCompatible} + */ +function getProp(prop) +{ + const deplEnv = getEnv(); + + try + { + return envSettings[deplEnv][prop]; + } + catch(err) + { + console.error(`Error while resolving environment-dependent settings property '${prop}' in current env '${deplEnv}':\n${err instanceof Error ? err.stack : err}`); + process.exit(1); + } +} + + +module.exports = { init, getEnv, getProp }; diff --git a/src/logRequest.js b/src/logRequest.js index 406398a6..523ce34a 100755 --- a/src/logRequest.js +++ b/src/logRequest.js @@ -1,8 +1,11 @@ const jsl = require("svjsl"); + const logger = require("./logger"); const parseJokes = require("./parseJokes"); const analytics = require("./analytics"); const languages = require("./languages"); +const { getEnv } = require("./env"); + const settings = require("../settings"); @@ -160,14 +163,14 @@ const logRequest = (type, additionalInfo, analyticsData) => { const initMsg = (initTimestamp) => { let initMs = (new Date().getTime() - initTimestamp).toFixed(0); - console.log(`\n${jsl.colors.fg.blue}[${logger.getTimestamp(" | ")}] ${jsl.colors.rst}- ${jsl.colors.fg.green}${settings.info.name} v${settings.info.version}${jsl.colors.rst}`); + console.log(`\n${jsl.colors.fg.blue}[${logger.getTimestamp(" | ")}] ${jsl.colors.rst}- ${jsl.colors.fg.green}${settings.info.name} v${settings.info.version}${jsl.colors.rst} [${getEnv()}]`); console.log(` ├─ Registered and validated ${jsl.colors.fg.green}${parseJokes.jokeCount}${jsl.colors.rst} jokes from ${jsl.colors.fg.green}${languages.jokeLangs().length}${jsl.colors.rst} languages`); console.log(` ├─ ${jsl.colors.fg.green}${settings.jokes.possible.categories.length}${jsl.colors.rst} categories, ${jsl.colors.fg.green}${settings.jokes.possible.flags.length}${jsl.colors.rst} flags, ${jsl.colors.fg.green}${settings.jokes.possible.formats.length}${jsl.colors.rst} formats`); if(analytics.connectionInfo && analytics.connectionInfo.connected) console.log(` ├─ Connected to analytics database at ${jsl.colors.fg.green}${analytics.connectionInfo.info}${jsl.colors.rst}`); else console.log(` ├─ Analytics database ${settings.analytics.enabled ? jsl.colors.fg.red : jsl.colors.fg.yellow}not connected${settings.analytics.enabled ? "" : " (disabled)"}${jsl.colors.rst}`); - console.log(` ├─ ${settings.info.name} is listening at ${jsl.colors.fg.green}http://127.0.0.1:${settings.httpServer.port}${jsl.colors.rst} (SSL ${settings.httpServer.ssl.enabled ? `${jsl.colors.fg.green}enabled${jsl.colors.rst}` : `${jsl.colors.fg.yellow}disabled${jsl.colors.rst}`})`); + console.log(` ├─ ${settings.info.name} is listening at ${jsl.colors.fg.green}http://127.0.0.1:${settings.httpServer.port}${jsl.colors.rst}`); console.log(` └─ Initialization took around ${jsl.colors.fg.green}${initMs}ms${initMs == 69 ? " (nice)" : ""}${jsl.colors.rst}`); process.stdout.write("\n"); console.log(`Colors: ${jsl.colors.fg.green}Success ${jsl.colors.fg.yellow}Warning ${jsl.colors.fg.red}Error${jsl.colors.rst}`); diff --git a/src/main.js b/src/main.js index 2eec6327..15890647 100755 --- a/src/main.js +++ b/src/main.js @@ -6,9 +6,10 @@ const jsl = require("svjsl"); const fs = require("fs-extra"); +const promiseAllSequential = require("promise-all-sequential"); require("dotenv").config(); -const settings = require("../settings"); +const env = require("./env"); const debug = require("./verboseLogging"); const parseJokes = require("./parseJokes"); const httpServer = require("./httpServer"); @@ -20,7 +21,7 @@ const auth = require("./auth"); const languages = require("./languages"); const translate = require("./translate"); const meter = require("./meter"); -const promiseAllSequential = require("promise-all-sequential"); +const settings = require("../settings"); const col = jsl.colors.fg; process.debuggerActive = jsl.inDebugger(); @@ -32,6 +33,8 @@ settings.init.exitSignals.forEach(sig => { //#MARKER init all const initAll = () => { + env.init(); + let initTimestamp = new Date().getTime(); console.log(`Initializing ${settings.info.name}...\n`); diff --git a/src/types/env.d.ts b/src/types/env.d.ts new file mode 100644 index 00000000..36237dd6 --- /dev/null +++ b/src/types/env.d.ts @@ -0,0 +1,5 @@ +/** Normalized deployment environment name */ +export type Env = "prod" | "stage"; + +/** Environment-dependent global property */ +export type EnvDependentProp = "name" | "httpPort" | "baseUrl"; diff --git a/tools/cli.js b/tools/cli.js index 3600a932..d40cc6a9 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -3,56 +3,82 @@ const yargs = require("yargs"); const importFresh = require("import-fresh"); const { colors, Errors } = require("svcorelib"); +const { resolve } = require("path"); +const dotenv = require("dotenv"); const settings = require("../settings"); const { exit } = process; const col = colors.fg; -const argv = prepareCLI(); + +/** Absolute path to JokeAPI's root directory */ +const rootDir = resolve(__dirname, "../"); // if this file is moved, make sure to change this accordingly //#SECTION run async function run() -{ +{ try { - const command = argv._[0]; + // ensure cwd is correct if the binary is called in a global context + process.chdir(rootDir); + + dotenv.config(); + + const argv = prepareCLI(); + + + /** @type {string|null} */ + const command = argv && argv._ ? argv._[0] : null; let file, action; // TODO: (v2.4) remove comments below switch(command) { - case "start": case "run": + case "start": + case "run": file = "../JokeAPI.js"; break; - case "submissions": case "sub": case "s": + case "submissions": + case "sub": + case "s": action = "Joke submissions"; file = "./submissions.js"; break; - case "add-joke": case "add": case "j": + case "add-joke": + case "add": + case "j": action = "Add joke"; file = "./add-joke.js"; break; - case "reassign-ids": case "re-id": case "r": + case "reassign-ids": + case "re-id": + case "r": action = "Reassign IDs"; file = "./reassign-ids.js"; break; - case "add-token": case "token": case "t": + case "add-token": + case "token": + case "t": action = "Add API token"; file = "./add-token.js"; break; - case "validate-ids": case "vi": + case "validate-ids": + case "vi": action = "Validate IDs"; file = "./validate-ids.js"; break; - case "validate-jokes": case "vj": + case "validate-jokes": + case "vj": action = "Validate jokes"; file = "./validate-jokes.js"; break; - case "generate-changelog": case "gen-cl": case "c": + case "generate-changelog": + case "gen-cl": + case "c": action = "Generate changelog"; file = "./generate-changelog.js"; break; @@ -67,7 +93,9 @@ async function run() // case "ip-info": case "ip": // action = "IP info"; // file = "./ip-info.js"; - case undefined: case null: case "": + case undefined: + case null: + case "": console.log(`${settings.info.name} CLI v${settings.info.version}\n`); return yargs.showHelp(); default: @@ -79,8 +107,6 @@ async function run() action && console.log(`${settings.info.name} CLI - ${action}`); - // TODO: pwd / cwd is not set correctly when called from a folder that's not JokeAPI's root - return importFresh(file); } catch(err) @@ -99,6 +125,7 @@ function prepareCLI() yargs.scriptName("jokeapi") .usage("Usage: $0 ") .version(`${settings.info.name} v${settings.info.version} - ${settings.info.projGitHub}`) + .alias("v", "version") .help() .alias("h", "help"); From 4332ead71ced258fc2a714ae7c869b0cc277cc79 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 22:32:40 +0200 Subject: [PATCH 18/62] more submission script stuff --- src/jokeSubmission.js | 5 +-- tools/submissions.js | 81 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/jokeSubmission.js b/src/jokeSubmission.js index 86958bf2..8dd5799e 100755 --- a/src/jokeSubmission.js +++ b/src/jokeSubmission.js @@ -17,6 +17,7 @@ const fileFormatConverter = require("./fileFormatConverter"); jsl.unused(http, analytics, tr); /** @typedef {parseJokes.SingleJoke|parseJokes.TwopartJoke} JokeSubmission */ +/** @typedef {import("./types/jokes").Joke} Joke */ /** @@ -161,8 +162,8 @@ function writeJokeToFile(res, filePath, submittedJoke, fileFormat, ip, analytics /** * Coarse filter that ensures that a joke is formatted as expected. * This doesn't do any validation and omits missing properties! - * @param {JokeSubmission} joke - * @returns {JokeSubmission} Returns the reformatted joke + * @param {Joke|JokeSubmission} joke + * @returns {Joke|JokeSubmission} Returns the reformatted joke */ function reformatJoke(joke) { diff --git a/tools/submissions.js b/tools/submissions.js index 7fdb9c72..0f7589ea 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,15 +1,15 @@ -const { readdir, readFile, writeFile, copyFile, rm } = require("fs-extra"); +const { readdir, readFile, writeFile, copyFile, rm, rmdir } = require("fs-extra"); const { resolve, join } = require("path"); -const { colors, Errors, unused, reserialize, filesystem } = require("svcorelib"); +const { colors, Errors, reserialize, filesystem, isEmpty } = require("svcorelib"); const prompt = require("prompts"); const promiseAllSeq = require("promise-all-sequential"); const languages = require("../src/languages"); +const translate = require("../src/translate"); const parseJokes = require("../src/parseJokes"); const { reformatJoke } = require("../src/jokeSubmission"); const settings = require("../settings"); -const { isEmpty } = require("lodash"); const col = colors.fg; const { exit } = process; @@ -43,6 +43,8 @@ async function run() { await languages.init(); + await translate.init(); + await parseJokes.init(); } catch(err) @@ -94,6 +96,10 @@ async function promptSubmissions(allSubmissions) const proms = submissions.map((sub) => (() => actSubmission(sub))); await promiseAllSeq(proms); + + const langSubfolderPath = resolve(settings.jokes.jokeSubmissionPath, lang); + + await cleanupDir(langSubfolderPath); } return finishPrompts(); @@ -160,6 +166,7 @@ function actSubmission(sub) break; case "d": // delete lastSubmissionType = "deleted"; + await deleteSubmission(sub); return res(); default: // invalid key lastKeyInvalid = true; @@ -299,6 +306,7 @@ function editSubmission(sub) type: "text", message: `Enter new value for '${editProperty}' property`, name: "val", + initial: editedSub.joke[editProperty] || "", validate: (val) => (!isEmpty(val) && val.length >= settings.jokes.submissions.minLength), })).val; break; @@ -366,6 +374,7 @@ function editSubmission(sub) if(del) { lastSubmissionType = "deleted"; + await deleteSubmission(sub); return res(null); } @@ -384,6 +393,53 @@ function editSubmission(sub) }); } +/** + * Deletes/discards a submission + * @param {Submission} sub + * @returns {Promise} + */ +function deleteSubmission(sub) +{ + return new Promise(async (res, rej) => { + try + { + await rm(sub.path); + + await cleanupDir(sub); + + return res(); + } + catch(err) + { + return rej(new Error(`Error while deleting submission at path '${sub.path}': ${err}`)); + } + }); +} + +/** + * Cleans up the submission directories if they're empty + * @param {string} path Path to the submission language subfolder + * @returns {Promise} + */ +function cleanupDir(path) +{ + return new Promise(async (res, rej) => { + try + { + const subDirFiles = await readdir(path); + + if(subDirFiles.length === 0) + await rmdir(path); + + return res(); + } + catch(err) + { + return rej(new Error(`Error while cleaning up directories: ${err}`)); + } + }); +} + //#SECTION print submission /** @@ -434,7 +490,9 @@ function extractFlags(joke) */ function finishPrompts() { - console.log(""); + console.log("\nFinished going through submissions. Exiting.\n"); + + // TODO: display stats exit(0); } @@ -584,7 +642,7 @@ function getSubmissions(lang) for await(const fileName of files) { - const path = join(submissionsFolder, fileName); + const path = resolve(submissionsFolder, fileName); const file = await readFile(path); /** @type {JokeSubmission} */ @@ -596,9 +654,7 @@ function getSubmissions(lang) if(Array.isArray(valRes)) errors = valRes; - const { client, timestamp, index } = parseFileName(fileName); - - unused(index); + const { client, timestamp } = parseFileName(fileName); submissions.push({ client, joke, timestamp, errors, lang, path }); } @@ -644,7 +700,6 @@ function saveSubmission(sub) return new Promise(async (res, rej) => { try { - // TODO: test this const { lang } = sub; const joke = reformatJoke(sub.joke); @@ -657,19 +712,21 @@ function saveSubmission(sub) /** @type {JokesFile} */ const currentJokesFile = JSON.parse((await readFile(jokeFilePath)).toString()); + /** @type {any} */ const currentJokes = reserialize(currentJokesFile.jokes); - const lastId = [currentJokes.length - 1].id; + const lastId = currentJokes[currentJokes.length - 1].id; + // ensure props match and strip extraneous props joke.id = lastId + 1; + joke.lang && delete joke.lang; + joke.formatVersion && delete joke.formatVersion; currentJokes.push(joke); currentJokesFile.jokes = currentJokes; - // TODO: id is null for some reason - await writeFile(jokeFilePath, JSON.stringify(currentJokesFile, undefined, 4)); await rm(sub.path); From 533dc449f61db63cafc0caf5f7aa36970083c116 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 23:03:17 +0200 Subject: [PATCH 19/62] submission script pretty much done now :) --- tools/submissions.js | 72 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/tools/submissions.js b/tools/submissions.js index 0f7589ea..34e8c767 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -1,3 +1,11 @@ +/** + * Enjoy this over-engineered pile of garbage that is actually pretty cool + * + * @author Sv443 + * @since 2.3.2 + * @ref #340 - https://github.com/Sv443/JokeAPI/issues/340 + */ + const { readdir, readFile, writeFile, copyFile, rm, rmdir } = require("fs-extra"); const { resolve, join } = require("path"); const { colors, Errors, reserialize, filesystem, isEmpty } = require("svcorelib"); @@ -36,7 +44,20 @@ let currentSub; /** @type {boolean} */ let lastKeyInvalid = false; +const stats = { + /** How many submissions were acted upon */ + submissionsActAmt: 0, + /** How many submissions were saved */ + savedSubmissions: 0, + /** How many submissions were deleted / discarded */ + deletedSubmissions: 0, + /** How many submissions were edited */ + editedSubmissions: 0, +}; +/** + * Entrypoint of this tool + */ async function run() { try @@ -59,6 +80,12 @@ async function run() const langCodes = await getLangCodes(); const { submissions, amount } = await readSubmissions(langCodes); + if(amount < 1) + { + console.log("\nFound no submissions to go through. Exiting.\n"); + exit(0); + } + const langCount = Object.keys(submissions).length; const { proceed } = await prompt({ @@ -92,7 +119,7 @@ async function promptSubmissions(allSubmissions) /** @type {Submission[]} */ const submissions = allSubmissions[lang]; - // /** @type {(() => Promise)[]} */ + /** @type {(() => Promise)[]} */ const proms = submissions.map((sub) => (() => actSubmission(sub))); await promiseAllSeq(proms); @@ -220,10 +247,13 @@ function editSubmission(sub) await getKey("Press any key to try again."); - return res(editSubmission(finalSub)); + return res(editSubmission(finalSub)); // async recursion, who doesn't love it } else + { + stats.editedSubmissions++; return res(Object.freeze(finalSub)); + } }; try @@ -374,7 +404,9 @@ function editSubmission(sub) if(del) { lastSubmissionType = "deleted"; + await deleteSubmission(sub); + return res(null); } @@ -405,7 +437,8 @@ function deleteSubmission(sub) { await rm(sub.path); - await cleanupDir(sub); + stats.submissionsActAmt++; + stats.deletedSubmissions++; return res(); } @@ -490,9 +523,18 @@ function extractFlags(joke) */ function finishPrompts() { - console.log("\nFinished going through submissions. Exiting.\n"); + console.log("\nFinished going through submissions.\n"); - // TODO: display stats + const statLines = [ + `Stats:`, + ` Submissions acted upon: ${stats.submissionsActAmt}`, + ` Submissions edited: ${stats.editedSubmissions}`, + ` Submissions deleted: ${stats.deletedSubmissions}`, + ]; + + console.log(statLines.join("\n")); + + console.log(`\nExiting.\n`); exit(0); } @@ -584,21 +626,26 @@ function readSubmissions(langCodes) { const folders = await readdir(resolve(settings.jokes.jokeSubmissionPath)); + let amount = 0; + if(folders.length < 1) - return res(null); + { + return res({ + submissions: [], + amount, + }); + } /** @type {Promise[]} */ const readPromises = []; - let amount = 0; - folders.forEach(langCode => { langCode = langCode.toString(); if(!langCodes.includes(langCode)) // ignore folders that aren't valid return; - readPromises.push(new Promise(async res => { + readPromises.push(new Promise(async readRes => { const subm = await getSubmissions(langCode); if(subm.length > 0) @@ -606,7 +653,7 @@ function readSubmissions(langCodes) amount += subm.length; - return res(); + return readRes(); })); }); @@ -614,7 +661,7 @@ function readSubmissions(langCodes) return res({ submissions: allSubmissions, - amount + amount, }); } catch(err) @@ -700,6 +747,9 @@ function saveSubmission(sub) return new Promise(async (res, rej) => { try { + stats.savedSubmissions++; + stats.submissionsActAmt++; + const { lang } = sub; const joke = reformatJoke(sub.joke); From fa07dec0c0be252a86d0e45dc57ef523b51a6fcb Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 23:12:19 +0200 Subject: [PATCH 20/62] changelog --- changelog.md | 13 +++++++++++-- changelog.txt | 11 +++++++++-- tools/cli.js | 5 ++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/changelog.md b/changelog.md index 2b0ae787..1b9e9b1e 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,4 @@ -# JokeAPI Changelog (Version 2.3.1) +# JokeAPI Changelog (Version 2.3.2)


@@ -11,7 +11,16 @@


-## [CURRENT: 2.3.1] - The Safe Mode Hotfix, because bugs exist for some reason ([pull request #214](https://github.com/Sv443/JokeAPI/pull/214)) +## [CURRENT: 2.3.2] - Spooky seasonal update 2021 +- Added new jokes (especially from the "Spooky" category, for Halloween) +- Rewrote the submission script to make it much more streamlined ([issue #340](https://github.com/Sv443/JokeAPI/issues/340)) +- Added a global CLI interface ([issue #344](https://github.com/Sv443/JokeAPI/issues/344)) +- API now adjusts environment-dependent settings automatically ([issue #343](https://github.com/Sv443/JokeAPI/issues/343)) + + +


+ +## [2.3.1] - The Safe Mode Hotfix, because bugs exist for some reason ([pull request #214](https://github.com/Sv443/JokeAPI/pull/214)) - Fixed bug "API Error 500 - Cannot read property 'msBeforeNext' of null" ([issue #212](https://github.com/Sv443/JokeAPI/issues/212)) - Fixed bug where API responded with Error 106 when using format=txt on endpoint /joke ([issue #218](https://github.com/Sv443/JokeAPI/issues/218)) - Re-flagged joke 79 ([issue #220](https://github.com/Sv443/JokeAPI/issues/220)) diff --git a/changelog.txt b/changelog.txt index 12aadf14..4a79fb96 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ ===================== JokeAPI Changelog - - Version 2.3.1 - + - Version 2.3.2 - ===================== @@ -11,7 +11,14 @@ - Serve docs with nginx to speed up page load times (issue #118) -[CURRENT: 2.3.1] - The Safe Mode Hotfix, because bugs exist for some reason (PR #214) +[CURRENT: 2.3.2] - Spooky seasonal update 2021 + - Added new jokes (especially from the "Spooky" category, for Halloween) + - Rewrote the submission script to make it much more streamlined (issue #340) + - Added a global CLI interface (issue #344) + - API now adjusts environment-dependent settings automatically (issue #343) + + +[2.3.1] - The Safe Mode Hotfix, because bugs exist for some reason (PR #214) - Fixed bug "API Error 500 - Cannot read property 'msBeforeNext' of null" (issue #212) - Fixed bug where API responded with Error 106 when using format=txt on endpoint /joke (issue #218) - Re-flagged joke 79 (issue #220) diff --git a/tools/cli.js b/tools/cli.js index d40cc6a9..de7f5003 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -77,8 +77,7 @@ async function run() file = "./validate-jokes.js"; break; case "generate-changelog": - case "gen-cl": - case "c": + case "cl": action = "Generate changelog"; file = "./generate-changelog.js"; break; @@ -157,7 +156,7 @@ function prepareCLI() yargs.command([ "validate-jokes", "vj" ], "Goes through each joke file and checks the validity of each joke and whether they can all be loaded to memory"); - yargs.command([ "generate-changelog", "gen-cl", "c" ], "Turns the changelog.txt file into a markdown file (changelog.md)", cmd => { + yargs.command([ "generate-changelog", "cl" ], "Turns the changelog.txt file into a markdown file (changelog.md)", cmd => { cmd.option("generate-json", { alias: "j", describe: "Use this argument to generate a changelog-data.json file in addition to the markdown file", From af89782d3a977de366f01786fd67982a4dacaa3a Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 20 Oct 2021 23:38:40 +0200 Subject: [PATCH 21/62] stuff --- .vscode/settings.json | 4 +++- tools/add-token.js | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 059af4a5..c62c02b0 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -50,5 +50,7 @@ "files.exclude": { // hide files so they can't be opened in the IDE "docs/compiled": true, // to prevent accidentally changing the compiled documentation to only have it be overridden after the next compile "dev/madge": true, // the files don't need to be modified, they only serve as a distraction - } + }, + + "deno.enable": false } \ No newline at end of file diff --git a/tools/add-token.js b/tools/add-token.js index 84ec312c..7aac937c 100755 --- a/tools/add-token.js +++ b/tools/add-token.js @@ -6,8 +6,6 @@ try { let amount; - console.log(process.argv); - try { amount = parseInt( From d2079a09305406b7fe3c2b7450c0db2abe89f874 Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 11:43:57 +0200 Subject: [PATCH 22/62] change some CLI aliases --- tools/cli.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/cli.js b/tools/cli.js index de7f5003..bfeee503 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -49,19 +49,18 @@ async function run() file = "./submissions.js"; break; case "add-joke": - case "add": + case "aj": case "j": action = "Add joke"; file = "./add-joke.js"; break; case "reassign-ids": - case "re-id": - case "r": + case "ri": action = "Reassign IDs"; file = "./reassign-ids.js"; break; case "add-token": - case "token": + case "at": case "t": action = "Add API token"; file = "./add-token.js"; @@ -134,11 +133,11 @@ function prepareCLI() yargs.command([ "submissions", "sub", "s" ], "Goes through all joke submissions, prompting to edit, add or delete them"); - yargs.command([ "add-joke", "add", "j" ], "Runs an interactive prompt that adds a joke"); + yargs.command([ "add-joke", "aj", "j" ], "Runs an interactive prompt that adds a joke"); - yargs.command([ "reassign-ids", "re-id", "r" ], "Goes through each joke file and reassigns IDs to each one, consecutively"); + yargs.command([ "reassign-ids", "ri", "r" ], "Goes through each joke file and reassigns IDs to each one, consecutively"); - yargs.command([ "add-token [amount]", "token", "t" ], "Generates one or multiple API tokens to be used to gain unlimited access to the API", cmd => { + yargs.command([ "add-token [amount]", "at", "t" ], "Generates one or multiple API tokens to be used to gain unlimited access to the API", cmd => { cmd.positional("amount", { describe: "Specifies the amount of tokens to generate - min is 1, max is 10", type: "number", From 803ee89afd3995277efcc984bc1e9d7859e6c45b Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 11:44:04 +0200 Subject: [PATCH 23/62] new german jokes --- data/jokes/jokes-de.json | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/data/jokes/jokes-de.json b/data/jokes/jokes-de.json index 53b49042..d8d16d42 100755 --- a/data/jokes/jokes-de.json +++ b/data/jokes/jokes-de.json @@ -503,6 +503,69 @@ }, "id": 31, "safe": true + }, + { + "category": "Pun", + "type": "twopart", + "setup": "Mir ist heute Morgen ein Joghurtbecher aus der Hand gefallen.", + "delivery": "Er war nicht mehr haltbar.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "id": 32, + "safe": true + }, + { + "category": "Pun", + "type": "twopart", + "setup": "Im EDEKA ist gestern das Obstregal umgefallen.", + "delivery": "Es entstand ein Schaden in Melonenhöhe.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "id": 33, + "safe": true + }, + { + "category": "Pun", + "type": "twopart", + "setup": "Gab es in Ihrer Familie jemals Fälle von Inzest?", + "delivery": "Mitnichten!", + "flags": { + "nsfw": true, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "id": 34, + "safe": false + }, + { + "category": "Pun", + "type": "single", + "joke": "Stauseen sind auch nur verdammte Flüsse.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "id": 35, + "safe": true } ] } \ No newline at end of file From 4d84e7ac85726c827e2c15168f422c847468e59b Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 11:51:00 +0200 Subject: [PATCH 24/62] remove stray_submissions --- .../submission_022f031d_0_1594147478227.json | 13 ------------- .../submission_022f031d_0_1595032862990.json | 13 ------------- .../submission_022f031d_0_1596129130517.json | 13 ------------- .../submission_0250038b_0_1595727870127.json | 13 ------------- .../submission_060042f6_0_1593853351072.json | 14 -------------- .../submission_061e8f06_0_1594019017919.json | 13 ------------- .../submission_061e8f06_0_1594019056899.json | 13 ------------- .../submission_08ddecd2_0_1595228523472.json | 13 ------------- .../submission_099ef367_0_1594052436392.json | 13 ------------- .../submission_0b84b39d_0_1595160203706.json | 13 ------------- .../submission_1654c9b5_0_1593948759419.json | 13 ------------- .../submission_1654c9b5_0_1595034650731.json | 13 ------------- .../submission_1654c9b5_0_1596207140531.json | 13 ------------- .../submission_1654c9b5_0_1596221696684.json | 13 ------------- .../submission_1654c9b5_0_1596221741771.json | 13 ------------- .../submission_1c386b99_0_1595176231404.json | 13 ------------- .../submission_1eb49671_0_1594836993613.json | 14 -------------- .../submission_1eb49671_0_1594837312176.json | 14 -------------- .../submission_22bbb7ab_0_1596188409701.json | 13 ------------- .../submission_2348c52e_0_1595292312117.json | 13 ------------- .../submission_23a6d209_0_1594447873531.json | 14 -------------- .../submission_25c9415e_0_1595480470204.json | 13 ------------- .../submission_29b89f2b_0_1595916305646.json | 13 ------------- .../submission_2d17c613_0_1594883594713.json | 14 -------------- .../submission_2d17c613_0_1594883848139.json | 14 -------------- .../submission_2d17c613_0_1594896754294.json | 14 -------------- .../submission_2d17c613_0_1594913654104.json | 14 -------------- .../submission_2d17c613_0_1594977330736.json | 14 -------------- .../submission_2d17c613_0_1594977641364.json | 14 -------------- .../submission_2d17c613_0_1594982088560.json | 14 -------------- .../submission_2d17c613_0_1595148454098.json | 14 -------------- .../submission_2d17c613_0_1595153086179.json | 14 -------------- .../submission_2d17c613_0_1595156068409.json | 14 -------------- .../submission_2d17c613_0_1595158666516.json | 13 ------------- .../submission_2ea0ea77_0_1594980676551.json | 13 ------------- .../submission_30bd2a25_0_1594745472162.json | 13 ------------- .../submission_30bd2a25_0_1594745472888.json | 13 ------------- .../submission_30bd2a25_0_1594747623699.json | 13 ------------- .../submission_30bd2a25_0_1594750365758.json | 14 -------------- .../submission_3c0dc8a5_0_1594884110030.json | 13 ------------- .../submission_3d7c57f9_0_1595336332300.json | 13 ------------- .../submission_3d930596_0_1593904548043.json | 13 ------------- .../submission_3e3c29f3_0_1595493038239.json | 13 ------------- .../submission_3e3c29f3_0_1595493354617.json | 13 ------------- .../submission_3fccfbc9_0_1593819325939.json | 13 ------------- .../submission_3fccfbc9_0_1593819326014.json | 13 ------------- .../submission_3fccfbc9_0_1593819326664.json | 13 ------------- .../submission_3fccfbc9_0_1593819326871.json | 13 ------------- .../submission_3fccfbc9_0_1593819327043.json | 13 ------------- .../submission_4b98767e_0_1595177705504.json | 13 ------------- .../submission_4b98767e_0_1595177708629.json | 13 ------------- .../submission_4b98767e_0_1595177856613.json | 13 ------------- .../submission_4b98767e_0_1595177856625.json | 13 ------------- .../submission_4b98767e_0_1595177979363.json | 13 ------------- .../submission_4b98767e_0_1595177981919.json | 13 ------------- .../submission_4b98767e_0_1595178056737.json | 13 ------------- .../submission_4b98767e_0_1595180883022.json | 13 ------------- .../submission_4b98767e_0_1595181347361.json | 13 ------------- .../submission_4b98767e_0_1595181627885.json | 14 -------------- .../submission_4b98767e_0_1595181659547.json | 14 -------------- .../submission_4b98767e_0_1595181660828.json | 14 -------------- .../submission_4b98767e_0_1595181692648.json | 14 -------------- .../submission_4b98767e_0_1595181694196.json | 14 -------------- .../submission_4b98767e_0_1595182109823.json | 13 ------------- .../submission_4b98767e_0_1595182262092.json | 14 -------------- .../submission_4b98767e_0_1595182277982.json | 14 -------------- .../submission_4b98767e_0_1595182357752.json | 14 -------------- .../submission_4b98767e_0_1595183033740.json | 13 ------------- .../submission_4b98767e_0_1595183058010.json | 13 ------------- .../submission_502c4e4d_0_1594507921297.json | 13 ------------- .../submission_502c4e4d_0_1594632774607.json | 13 ------------- .../submission_502c4e4d_0_1595854868925.json | 13 ------------- .../submission_50fa4483_0_1595683541401.json | 13 ------------- .../submission_5c2dbd22_0_1595873466904.json | 13 ------------- .../submission_5d02e9d5_0_1594107697183.json | 13 ------------- .../submission_5eace918_0_1595754605229.json | 13 ------------- .../submission_602cadd8_0_1594822759087.json | 13 ------------- .../submission_613de857_0_1595148290846.json | 14 -------------- .../submission_613de857_0_1595148853036.json | 14 -------------- .../submission_613de857_0_1595155922082.json | 14 -------------- .../submission_613de857_0_1595156259274.json | 14 -------------- .../submission_613de857_0_1595158645578.json | 13 ------------- .../submission_613de857_0_1595158705307.json | 13 ------------- .../submission_613de857_0_1595158815379.json | 13 ------------- .../submission_613de857_0_1595158851135.json | 13 ------------- .../submission_613de857_0_1595161969812.json | 14 -------------- .../submission_613de857_0_1595161970302.json | 13 ------------- .../submission_626d1df0_0_1594790582307.json | 13 ------------- .../submission_62d13056_0_1594370521286.json | 13 ------------- .../submission_631cf488_0_1595882737544.json | 14 -------------- .../submission_66f5d8ad_0_1595604197925.json | 13 ------------- .../submission_6a091eef_0_1595776917472.json | 13 ------------- .../submission_6e591608_0_1595906160079.json | 13 ------------- .../submission_6e591608_0_1595906182255.json | 13 ------------- .../submission_6e591608_0_1595906279021.json | 13 ------------- .../submission_6e591608_0_1595906283549.json | 13 ------------- .../submission_6e591608_0_1595906788919.json | 13 ------------- .../submission_7006ffb1_0_1594588493748.json | 13 ------------- .../submission_768239a5_0_1593948699863.json | 13 ------------- .../submission_768239a5_0_1596079125216.json | 13 ------------- .../submission_768239a5_0_1596221753662.json | 13 ------------- .../submission_7932d021_0_1594353164979.json | 13 ------------- .../submission_79f5ebc9_0_1595409433291.json | 13 ------------- .../submission_7abb203a_0_1594757859250.json | 13 ------------- .../submission_7abb203a_0_1594956668674.json | 13 ------------- .../submission_7f27bbc3_0_1594719906966.json | 13 ------------- .../submission_83c79041_0_1594836539748.json | 13 ------------- .../submission_83c79041_0_1594837206321.json | 13 ------------- .../submission_849aa2ce_0_1595660414933.json | 14 -------------- .../submission_8867cbd8_0_1594667844829.json | 13 ------------- .../submission_8a5a5757_0_1594836051857.json | 14 -------------- .../submission_8d37d436_0_1595423294889.json | 13 ------------- .../submission_90a5f056_0_1594727689674.json | 13 ------------- .../submission_90b8dc94_0_1595760403960.json | 13 ------------- .../submission_92ecd989_0_1594599963730.json | 13 ------------- .../submission_94b3b81e_0_1595868103910.json | 14 -------------- .../submission_95a699be_0_1593871819391.json | 13 ------------- .../submission_98e3a9b2_0_1594977244636.json | 14 -------------- .../submission_98e3a9b2_0_1594985086172.json | 14 -------------- .../submission_98e3a9b2_0_1594985207740.json | 14 -------------- .../submission_98e3a9b2_0_1594985285896.json | 14 -------------- .../submission_98e3a9b2_0_1594985328079.json | 14 -------------- .../submission_98e3a9b2_0_1594985339158.json | 14 -------------- .../submission_98e3a9b2_0_1594985391786.json | 14 -------------- .../submission_98e3a9b2_0_1594985507099.json | 14 -------------- .../submission_98e3a9b2_0_1594985525884.json | 14 -------------- .../submission_98e3a9b2_0_1594985799255.json | 14 -------------- .../submission_9d3123f4_0_1593928003178.json | 13 ------------- .../submission_a16b5f90_0_1596186994545.json | 13 ------------- .../submission_a1b46e76_0_1595737905567.json | 13 ------------- .../submission_a1b46e76_0_1595737906573.json | 13 ------------- .../submission_a2ad4340_0_1594901130109.json | 13 ------------- .../submission_a2ad4340_0_1594901212703.json | 13 ------------- .../submission_a2ad4340_0_1594901445791.json | 14 -------------- .../submission_a2ad4340_0_1594901776228.json | 13 ------------- .../submission_a2ad4340_0_1594902381338.json | 13 ------------- .../submission_a2ad4340_0_1594902428964.json | 13 ------------- .../submission_a2ad4340_0_1594902486475.json | 14 -------------- .../submission_a3e76772_0_1594484451457.json | 13 ------------- .../submission_a3e76772_0_1594484500228.json | 13 ------------- .../submission_a4bac8e5_0_1594193216109.json | 13 ------------- .../submission_aa796fa1_0_1595493509785.json | 13 ------------- .../submission_b0b75a73_0_1594085147980.json | 13 ------------- .../submission_b0b75a73_0_1594085154806.json | 13 ------------- .../submission_b0b75a73_0_1594085159425.json | 13 ------------- .../submission_b0b75a73_0_1594085164629.json | 13 ------------- .../submission_b0b75a73_0_1594085164665.json | 13 ------------- .../submission_b0b75a73_0_1594085170309.json | 13 ------------- .../submission_b0b75a73_0_1594085170492.json | 13 ------------- .../submission_b0b75a73_0_1594085174908.json | 13 ------------- .../submission_b0b75a73_0_1594085175073.json | 13 ------------- .../submission_b0b75a73_0_1594085175259.json | 13 ------------- .../submission_b0b75a73_0_1594085180103.json | 13 ------------- .../submission_b0b75a73_0_1594085180289.json | 13 ------------- .../submission_b0b75a73_0_1594085180762.json | 13 ------------- .../submission_b4929f0c_0_1595046845375.json | 13 ------------- .../submission_b8640390_0_1595000499541.json | 13 ------------- .../submission_b92619fc_0_1595725145583.json | 13 ------------- .../submission_ba4ad314_0_1595063690823.json | 13 ------------- .../submission_bba39610_0_1594820059639.json | 13 ------------- .../submission_bba39610_0_1594820075271.json | 13 ------------- .../submission_bd6eed48_0_1594954563080.json | 13 ------------- .../submission_bdd0ab14_0_1595612654745.json | 13 ------------- .../submission_c38248c4_0_1594796472874.json | 14 -------------- .../submission_c38248c4_0_1594797911699.json | 13 ------------- .../submission_c78304c5_0_1594781587719.json | 13 ------------- .../submission_c844742e_0_1594418196341.json | 13 ------------- .../submission_c88a66b8_0_1595314291875.json | 13 ------------- .../submission_d2152cf5_0_1594016626541.json | 13 ------------- .../submission_d8df0ea7_0_1595998244279.json | 13 ------------- .../submission_db3ec700_0_1595364901137.json | 13 ------------- .../submission_db3ec700_0_1595365642231.json | 13 ------------- .../submission_e272f9b7_0_1594883998911.json | 13 ------------- .../submission_e272f9b7_0_1594884000014.json | 13 ------------- .../submission_e31e6d7c_0_1594882146828.json | 14 -------------- .../submission_e31e6d7c_0_1594882377897.json | 14 -------------- .../submission_e31e6d7c_0_1594882713456.json | 14 -------------- .../submission_e31e6d7c_0_1594883575378.json | 14 -------------- .../submission_e31e6d7c_0_1594883812575.json | 14 -------------- .../submission_e31e6d7c_0_1594883820219.json | 14 -------------- .../submission_e31e6d7c_0_1594896351549.json | 14 -------------- .../submission_e7b66860_0_1596271859915.json | 13 ------------- .../submission_e88bfcdb_0_1594749157071.json | 13 ------------- .../submission_f27aeded_0_1594083864640.json | 14 -------------- .../submission_f46b65a2_0_1595643753428.json | 13 ------------- .../submission_f5ea7804_0_1594846684201.json | 13 ------------- .../submission_fbb5c451_0_1594839865988.json | 14 -------------- 187 files changed, 2485 deletions(-) delete mode 100755 data/stray_submissions/submission_022f031d_0_1594147478227.json delete mode 100755 data/stray_submissions/submission_022f031d_0_1595032862990.json delete mode 100755 data/stray_submissions/submission_022f031d_0_1596129130517.json delete mode 100755 data/stray_submissions/submission_0250038b_0_1595727870127.json delete mode 100755 data/stray_submissions/submission_060042f6_0_1593853351072.json delete mode 100755 data/stray_submissions/submission_061e8f06_0_1594019017919.json delete mode 100755 data/stray_submissions/submission_061e8f06_0_1594019056899.json delete mode 100755 data/stray_submissions/submission_08ddecd2_0_1595228523472.json delete mode 100755 data/stray_submissions/submission_099ef367_0_1594052436392.json delete mode 100755 data/stray_submissions/submission_0b84b39d_0_1595160203706.json delete mode 100755 data/stray_submissions/submission_1654c9b5_0_1593948759419.json delete mode 100755 data/stray_submissions/submission_1654c9b5_0_1595034650731.json delete mode 100755 data/stray_submissions/submission_1654c9b5_0_1596207140531.json delete mode 100755 data/stray_submissions/submission_1654c9b5_0_1596221696684.json delete mode 100755 data/stray_submissions/submission_1654c9b5_0_1596221741771.json delete mode 100755 data/stray_submissions/submission_1c386b99_0_1595176231404.json delete mode 100755 data/stray_submissions/submission_1eb49671_0_1594836993613.json delete mode 100755 data/stray_submissions/submission_1eb49671_0_1594837312176.json delete mode 100755 data/stray_submissions/submission_22bbb7ab_0_1596188409701.json delete mode 100755 data/stray_submissions/submission_2348c52e_0_1595292312117.json delete mode 100755 data/stray_submissions/submission_23a6d209_0_1594447873531.json delete mode 100755 data/stray_submissions/submission_25c9415e_0_1595480470204.json delete mode 100755 data/stray_submissions/submission_29b89f2b_0_1595916305646.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594883594713.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594883848139.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594896754294.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594913654104.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594977330736.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594977641364.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1594982088560.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1595148454098.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1595153086179.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1595156068409.json delete mode 100755 data/stray_submissions/submission_2d17c613_0_1595158666516.json delete mode 100755 data/stray_submissions/submission_2ea0ea77_0_1594980676551.json delete mode 100755 data/stray_submissions/submission_30bd2a25_0_1594745472162.json delete mode 100755 data/stray_submissions/submission_30bd2a25_0_1594745472888.json delete mode 100755 data/stray_submissions/submission_30bd2a25_0_1594747623699.json delete mode 100755 data/stray_submissions/submission_30bd2a25_0_1594750365758.json delete mode 100755 data/stray_submissions/submission_3c0dc8a5_0_1594884110030.json delete mode 100755 data/stray_submissions/submission_3d7c57f9_0_1595336332300.json delete mode 100755 data/stray_submissions/submission_3d930596_0_1593904548043.json delete mode 100755 data/stray_submissions/submission_3e3c29f3_0_1595493038239.json delete mode 100755 data/stray_submissions/submission_3e3c29f3_0_1595493354617.json delete mode 100755 data/stray_submissions/submission_3fccfbc9_0_1593819325939.json delete mode 100755 data/stray_submissions/submission_3fccfbc9_0_1593819326014.json delete mode 100755 data/stray_submissions/submission_3fccfbc9_0_1593819326664.json delete mode 100755 data/stray_submissions/submission_3fccfbc9_0_1593819326871.json delete mode 100755 data/stray_submissions/submission_3fccfbc9_0_1593819327043.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177705504.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177708629.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177856613.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177856625.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177979363.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595177981919.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595178056737.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595180883022.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181347361.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181627885.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181659547.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181660828.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181692648.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595181694196.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595182109823.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595182262092.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595182277982.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595182357752.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595183033740.json delete mode 100755 data/stray_submissions/submission_4b98767e_0_1595183058010.json delete mode 100755 data/stray_submissions/submission_502c4e4d_0_1594507921297.json delete mode 100755 data/stray_submissions/submission_502c4e4d_0_1594632774607.json delete mode 100755 data/stray_submissions/submission_502c4e4d_0_1595854868925.json delete mode 100755 data/stray_submissions/submission_50fa4483_0_1595683541401.json delete mode 100755 data/stray_submissions/submission_5c2dbd22_0_1595873466904.json delete mode 100755 data/stray_submissions/submission_5d02e9d5_0_1594107697183.json delete mode 100755 data/stray_submissions/submission_5eace918_0_1595754605229.json delete mode 100755 data/stray_submissions/submission_602cadd8_0_1594822759087.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595148290846.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595148853036.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595155922082.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595156259274.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595158645578.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595158705307.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595158815379.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595158851135.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595161969812.json delete mode 100755 data/stray_submissions/submission_613de857_0_1595161970302.json delete mode 100755 data/stray_submissions/submission_626d1df0_0_1594790582307.json delete mode 100755 data/stray_submissions/submission_62d13056_0_1594370521286.json delete mode 100755 data/stray_submissions/submission_631cf488_0_1595882737544.json delete mode 100755 data/stray_submissions/submission_66f5d8ad_0_1595604197925.json delete mode 100755 data/stray_submissions/submission_6a091eef_0_1595776917472.json delete mode 100755 data/stray_submissions/submission_6e591608_0_1595906160079.json delete mode 100755 data/stray_submissions/submission_6e591608_0_1595906182255.json delete mode 100755 data/stray_submissions/submission_6e591608_0_1595906279021.json delete mode 100755 data/stray_submissions/submission_6e591608_0_1595906283549.json delete mode 100755 data/stray_submissions/submission_6e591608_0_1595906788919.json delete mode 100755 data/stray_submissions/submission_7006ffb1_0_1594588493748.json delete mode 100755 data/stray_submissions/submission_768239a5_0_1593948699863.json delete mode 100755 data/stray_submissions/submission_768239a5_0_1596079125216.json delete mode 100755 data/stray_submissions/submission_768239a5_0_1596221753662.json delete mode 100755 data/stray_submissions/submission_7932d021_0_1594353164979.json delete mode 100755 data/stray_submissions/submission_79f5ebc9_0_1595409433291.json delete mode 100755 data/stray_submissions/submission_7abb203a_0_1594757859250.json delete mode 100755 data/stray_submissions/submission_7abb203a_0_1594956668674.json delete mode 100755 data/stray_submissions/submission_7f27bbc3_0_1594719906966.json delete mode 100755 data/stray_submissions/submission_83c79041_0_1594836539748.json delete mode 100755 data/stray_submissions/submission_83c79041_0_1594837206321.json delete mode 100755 data/stray_submissions/submission_849aa2ce_0_1595660414933.json delete mode 100755 data/stray_submissions/submission_8867cbd8_0_1594667844829.json delete mode 100755 data/stray_submissions/submission_8a5a5757_0_1594836051857.json delete mode 100755 data/stray_submissions/submission_8d37d436_0_1595423294889.json delete mode 100755 data/stray_submissions/submission_90a5f056_0_1594727689674.json delete mode 100755 data/stray_submissions/submission_90b8dc94_0_1595760403960.json delete mode 100755 data/stray_submissions/submission_92ecd989_0_1594599963730.json delete mode 100755 data/stray_submissions/submission_94b3b81e_0_1595868103910.json delete mode 100755 data/stray_submissions/submission_95a699be_0_1593871819391.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594977244636.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985086172.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985207740.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985285896.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985328079.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985339158.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985391786.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985507099.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985525884.json delete mode 100755 data/stray_submissions/submission_98e3a9b2_0_1594985799255.json delete mode 100755 data/stray_submissions/submission_9d3123f4_0_1593928003178.json delete mode 100755 data/stray_submissions/submission_a16b5f90_0_1596186994545.json delete mode 100755 data/stray_submissions/submission_a1b46e76_0_1595737905567.json delete mode 100755 data/stray_submissions/submission_a1b46e76_0_1595737906573.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594901130109.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594901212703.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594901445791.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594901776228.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594902381338.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594902428964.json delete mode 100755 data/stray_submissions/submission_a2ad4340_0_1594902486475.json delete mode 100755 data/stray_submissions/submission_a3e76772_0_1594484451457.json delete mode 100755 data/stray_submissions/submission_a3e76772_0_1594484500228.json delete mode 100755 data/stray_submissions/submission_a4bac8e5_0_1594193216109.json delete mode 100755 data/stray_submissions/submission_aa796fa1_0_1595493509785.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085147980.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085154806.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085159425.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085164629.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085164665.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085170309.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085170492.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085174908.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085175073.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085175259.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085180103.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085180289.json delete mode 100755 data/stray_submissions/submission_b0b75a73_0_1594085180762.json delete mode 100755 data/stray_submissions/submission_b4929f0c_0_1595046845375.json delete mode 100755 data/stray_submissions/submission_b8640390_0_1595000499541.json delete mode 100755 data/stray_submissions/submission_b92619fc_0_1595725145583.json delete mode 100755 data/stray_submissions/submission_ba4ad314_0_1595063690823.json delete mode 100755 data/stray_submissions/submission_bba39610_0_1594820059639.json delete mode 100755 data/stray_submissions/submission_bba39610_0_1594820075271.json delete mode 100755 data/stray_submissions/submission_bd6eed48_0_1594954563080.json delete mode 100755 data/stray_submissions/submission_bdd0ab14_0_1595612654745.json delete mode 100755 data/stray_submissions/submission_c38248c4_0_1594796472874.json delete mode 100755 data/stray_submissions/submission_c38248c4_0_1594797911699.json delete mode 100755 data/stray_submissions/submission_c78304c5_0_1594781587719.json delete mode 100755 data/stray_submissions/submission_c844742e_0_1594418196341.json delete mode 100755 data/stray_submissions/submission_c88a66b8_0_1595314291875.json delete mode 100755 data/stray_submissions/submission_d2152cf5_0_1594016626541.json delete mode 100755 data/stray_submissions/submission_d8df0ea7_0_1595998244279.json delete mode 100755 data/stray_submissions/submission_db3ec700_0_1595364901137.json delete mode 100755 data/stray_submissions/submission_db3ec700_0_1595365642231.json delete mode 100755 data/stray_submissions/submission_e272f9b7_0_1594883998911.json delete mode 100755 data/stray_submissions/submission_e272f9b7_0_1594884000014.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594882146828.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594882377897.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594882713456.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594883575378.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594883812575.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594883820219.json delete mode 100755 data/stray_submissions/submission_e31e6d7c_0_1594896351549.json delete mode 100755 data/stray_submissions/submission_e7b66860_0_1596271859915.json delete mode 100755 data/stray_submissions/submission_e88bfcdb_0_1594749157071.json delete mode 100755 data/stray_submissions/submission_f27aeded_0_1594083864640.json delete mode 100755 data/stray_submissions/submission_f46b65a2_0_1595643753428.json delete mode 100755 data/stray_submissions/submission_f5ea7804_0_1594846684201.json delete mode 100755 data/stray_submissions/submission_fbb5c451_0_1594839865988.json diff --git a/data/stray_submissions/submission_022f031d_0_1594147478227.json b/data/stray_submissions/submission_022f031d_0_1594147478227.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_022f031d_0_1594147478227.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_022f031d_0_1595032862990.json b/data/stray_submissions/submission_022f031d_0_1595032862990.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_022f031d_0_1595032862990.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_022f031d_0_1596129130517.json b/data/stray_submissions/submission_022f031d_0_1596129130517.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_022f031d_0_1596129130517.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_0250038b_0_1595727870127.json b/data/stray_submissions/submission_0250038b_0_1595727870127.json deleted file mode 100755 index 1541e427..00000000 --- a/data/stray_submissions/submission_0250038b_0_1595727870127.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I am a megabyte away from falling of this cliff." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_060042f6_0_1593853351072.json b/data/stray_submissions/submission_060042f6_0_1593853351072.json deleted file mode 100755 index dbc22bd9..00000000 --- a/data/stray_submissions/submission_060042f6_0_1593853351072.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "cx scxzcscsdcdscdscdscdscdscdscsd", - "delivery": "zxczxczxczxc" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_061e8f06_0_1594019017919.json b/data/stray_submissions/submission_061e8f06_0_1594019017919.json deleted file mode 100755 index 4554e1e0..00000000 --- a/data/stray_submissions/submission_061e8f06_0_1594019017919.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": " I visited my friend at his new house. He told me to make myself at home. So I threw him out. I hate having visitors." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_061e8f06_0_1594019056899.json b/data/stray_submissions/submission_061e8f06_0_1594019056899.json deleted file mode 100755 index 04c77df8..00000000 --- a/data/stray_submissions/submission_061e8f06_0_1594019056899.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "\"Knock Knock!\" \"Who's there?\" \"It's Dave!\" \"Dave who?\" Dave bursts into tears, realizing that his grandmother's Alzheimers has progressed to the point where she no longer remembers him." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_08ddecd2_0_1595228523472.json b/data/stray_submissions/submission_08ddecd2_0_1595228523472.json deleted file mode 100755 index bd6833f7..00000000 --- a/data/stray_submissions/submission_08ddecd2_0_1595228523472.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "hi, I am a programmer" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_099ef367_0_1594052436392.json b/data/stray_submissions/submission_099ef367_0_1594052436392.json deleted file mode 100755 index b3ec0c0e..00000000 --- a/data/stray_submissions/submission_099ef367_0_1594052436392.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "what in the world" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_0b84b39d_0_1595160203706.json b/data/stray_submissions/submission_0b84b39d_0_1595160203706.json deleted file mode 100755 index 867b28cf..00000000 --- a/data/stray_submissions/submission_0b84b39d_0_1595160203706.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Cat" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1654c9b5_0_1593948759419.json b/data/stray_submissions/submission_1654c9b5_0_1593948759419.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_1654c9b5_0_1593948759419.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1654c9b5_0_1595034650731.json b/data/stray_submissions/submission_1654c9b5_0_1595034650731.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_1654c9b5_0_1595034650731.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1654c9b5_0_1596207140531.json b/data/stray_submissions/submission_1654c9b5_0_1596207140531.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_1654c9b5_0_1596207140531.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1654c9b5_0_1596221696684.json b/data/stray_submissions/submission_1654c9b5_0_1596221696684.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_1654c9b5_0_1596221696684.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1654c9b5_0_1596221741771.json b/data/stray_submissions/submission_1654c9b5_0_1596221741771.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_1654c9b5_0_1596221741771.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1c386b99_0_1595176231404.json b/data/stray_submissions/submission_1c386b99_0_1595176231404.json deleted file mode 100755 index 9dad8cd1..00000000 --- a/data/stray_submissions/submission_1c386b99_0_1595176231404.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "coucou" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1eb49671_0_1594836993613.json b/data/stray_submissions/submission_1eb49671_0_1594836993613.json deleted file mode 100755 index c9697416..00000000 --- a/data/stray_submissions/submission_1eb49671_0_1594836993613.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "this is Bernaud's joke", - "delivery": "nice from a first try" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_1eb49671_0_1594837312176.json b/data/stray_submissions/submission_1eb49671_0_1594837312176.json deleted file mode 100755 index 49f9c00c..00000000 --- a/data/stray_submissions/submission_1eb49671_0_1594837312176.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "this is Bernaud's new jokes from the api", - "delivery": "nice for a first try" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_22bbb7ab_0_1596188409701.json b/data/stray_submissions/submission_22bbb7ab_0_1596188409701.json deleted file mode 100755 index 4faf3c18..00000000 --- a/data/stray_submissions/submission_22bbb7ab_0_1596188409701.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2348c52e_0_1595292312117.json b/data/stray_submissions/submission_2348c52e_0_1595292312117.json deleted file mode 100755 index 7ca387e9..00000000 --- a/data/stray_submissions/submission_2348c52e_0_1595292312117.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Documentation is like sex:\nWhen it's good, it's very good.\nWhen it's bad, it's better than nothing..." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_23a6d209_0_1594447873531.json b/data/stray_submissions/submission_23a6d209_0_1594447873531.json deleted file mode 100755 index 3317a5a3..00000000 --- a/data/stray_submissions/submission_23a6d209_0_1594447873531.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "category": "Miscellaneous", - "error": false, - "flags": { - "nsfw": false, - "political": false, - "racist": false, - "religious": false, - "sexist": false - }, - "formatVersion": 2, - "joke": "text\n", - "type": "single" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_25c9415e_0_1595480470204.json b/data/stray_submissions/submission_25c9415e_0_1595480470204.json deleted file mode 100755 index a87df985..00000000 --- a/data/stray_submissions/submission_25c9415e_0_1595480470204.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "hi\n" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_29b89f2b_0_1595916305646.json b/data/stray_submissions/submission_29b89f2b_0_1595916305646.json deleted file mode 100755 index deb1f7c5..00000000 --- a/data/stray_submissions/submission_29b89f2b_0_1595916305646.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "111" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594883594713.json b/data/stray_submissions/submission_2d17c613_0_1594883594713.json deleted file mode 100755 index 9c540903..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594883594713.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "This is not funny for me.", - "delivery": "But you are not normal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594883848139.json b/data/stray_submissions/submission_2d17c613_0_1594883848139.json deleted file mode 100755 index 72c2b8ea..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594883848139.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "There is a time for everything", - "delivery": "Yes and the time is now." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594896754294.json b/data/stray_submissions/submission_2d17c613_0_1594896754294.json deleted file mode 100755 index f6379198..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594896754294.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "I'm tired of following my dreams.", - "delivery": " I'm just going to ask them where they are going and meet up with them later." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594913654104.json b/data/stray_submissions/submission_2d17c613_0_1594913654104.json deleted file mode 100755 index f6379198..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594913654104.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "I'm tired of following my dreams.", - "delivery": " I'm just going to ask them where they are going and meet up with them later." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594977330736.json b/data/stray_submissions/submission_2d17c613_0_1594977330736.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594977330736.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594977641364.json b/data/stray_submissions/submission_2d17c613_0_1594977641364.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594977641364.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1594982088560.json b/data/stray_submissions/submission_2d17c613_0_1594982088560.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1594982088560.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1595148454098.json b/data/stray_submissions/submission_2d17c613_0_1595148454098.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1595148454098.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1595153086179.json b/data/stray_submissions/submission_2d17c613_0_1595153086179.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1595153086179.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1595156068409.json b/data/stray_submissions/submission_2d17c613_0_1595156068409.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1595156068409.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2d17c613_0_1595158666516.json b/data/stray_submissions/submission_2d17c613_0_1595158666516.json deleted file mode 100755 index 1c2f2f70..00000000 --- a/data/stray_submissions/submission_2d17c613_0_1595158666516.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_2ea0ea77_0_1594980676551.json b/data/stray_submissions/submission_2ea0ea77_0_1594980676551.json deleted file mode 100755 index cf85fb7c..00000000 --- a/data/stray_submissions/submission_2ea0ea77_0_1594980676551.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "test" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_30bd2a25_0_1594745472162.json b/data/stray_submissions/submission_30bd2a25_0_1594745472162.json deleted file mode 100755 index 325423b1..00000000 --- a/data/stray_submissions/submission_30bd2a25_0_1594745472162.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "thi ss s s ss" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_30bd2a25_0_1594745472888.json b/data/stray_submissions/submission_30bd2a25_0_1594745472888.json deleted file mode 100755 index 325423b1..00000000 --- a/data/stray_submissions/submission_30bd2a25_0_1594745472888.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "thi ss s s ss" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_30bd2a25_0_1594747623699.json b/data/stray_submissions/submission_30bd2a25_0_1594747623699.json deleted file mode 100755 index e6dbed44..00000000 --- a/data/stray_submissions/submission_30bd2a25_0_1594747623699.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "this this\n" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_30bd2a25_0_1594750365758.json b/data/stray_submissions/submission_30bd2a25_0_1594750365758.json deleted file mode 100755 index 3ee2c9a5..00000000 --- a/data/stray_submissions/submission_30bd2a25_0_1594750365758.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "ssdsdds", - "delivery": "dsdsdsdsdsd" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3c0dc8a5_0_1594884110030.json b/data/stray_submissions/submission_3c0dc8a5_0_1594884110030.json deleted file mode 100755 index 551546b3..00000000 --- a/data/stray_submissions/submission_3c0dc8a5_0_1594884110030.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "debugging" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3d7c57f9_0_1595336332300.json b/data/stray_submissions/submission_3d7c57f9_0_1595336332300.json deleted file mode 100755 index e1e9d683..00000000 --- a/data/stray_submissions/submission_3d7c57f9_0_1595336332300.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Python is master" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3d930596_0_1593904548043.json b/data/stray_submissions/submission_3d930596_0_1593904548043.json deleted file mode 100755 index 40248c8f..00000000 --- a/data/stray_submissions/submission_3d930596_0_1593904548043.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Alex" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3e3c29f3_0_1595493038239.json b/data/stray_submissions/submission_3e3c29f3_0_1595493038239.json deleted file mode 100755 index b7eb37ca..00000000 --- a/data/stray_submissions/submission_3e3c29f3_0_1595493038239.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Test" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3e3c29f3_0_1595493354617.json b/data/stray_submissions/submission_3e3c29f3_0_1595493354617.json deleted file mode 100755 index e75b9b54..00000000 --- a/data/stray_submissions/submission_3e3c29f3_0_1595493354617.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Have you heard about the two tomatoes that wanted to cross the road? One of them got run over by a car and the other said: \"Come on Ketchup\"" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3fccfbc9_0_1593819325939.json b/data/stray_submissions/submission_3fccfbc9_0_1593819325939.json deleted file mode 100755 index 77f4f637..00000000 --- a/data/stray_submissions/submission_3fccfbc9_0_1593819325939.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Yo mama is so old, she knew Burger King while he was still a prince" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3fccfbc9_0_1593819326014.json b/data/stray_submissions/submission_3fccfbc9_0_1593819326014.json deleted file mode 100755 index 77f4f637..00000000 --- a/data/stray_submissions/submission_3fccfbc9_0_1593819326014.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Yo mama is so old, she knew Burger King while he was still a prince" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3fccfbc9_0_1593819326664.json b/data/stray_submissions/submission_3fccfbc9_0_1593819326664.json deleted file mode 100755 index 77f4f637..00000000 --- a/data/stray_submissions/submission_3fccfbc9_0_1593819326664.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Yo mama is so old, she knew Burger King while he was still a prince" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3fccfbc9_0_1593819326871.json b/data/stray_submissions/submission_3fccfbc9_0_1593819326871.json deleted file mode 100755 index 77f4f637..00000000 --- a/data/stray_submissions/submission_3fccfbc9_0_1593819326871.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Yo mama is so old, she knew Burger King while he was still a prince" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_3fccfbc9_0_1593819327043.json b/data/stray_submissions/submission_3fccfbc9_0_1593819327043.json deleted file mode 100755 index 77f4f637..00000000 --- a/data/stray_submissions/submission_3fccfbc9_0_1593819327043.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Yo mama is so old, she knew Burger King while he was still a prince" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177705504.json b/data/stray_submissions/submission_4b98767e_0_1595177705504.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177705504.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177708629.json b/data/stray_submissions/submission_4b98767e_0_1595177708629.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177708629.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177856613.json b/data/stray_submissions/submission_4b98767e_0_1595177856613.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177856613.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177856625.json b/data/stray_submissions/submission_4b98767e_0_1595177856625.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177856625.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177979363.json b/data/stray_submissions/submission_4b98767e_0_1595177979363.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177979363.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595177981919.json b/data/stray_submissions/submission_4b98767e_0_1595177981919.json deleted file mode 100755 index 5fe16d12..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595177981919.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595178056737.json b/data/stray_submissions/submission_4b98767e_0_1595178056737.json deleted file mode 100755 index b7466474..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595178056737.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Act your age, not your shoe size" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595180883022.json b/data/stray_submissions/submission_4b98767e_0_1595180883022.json deleted file mode 100755 index b7466474..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595180883022.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Act your age, not your shoe size" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181347361.json b/data/stray_submissions/submission_4b98767e_0_1595181347361.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181347361.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181627885.json b/data/stray_submissions/submission_4b98767e_0_1595181627885.json deleted file mode 100755 index ed286dad..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181627885.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "Q: What’s the difference between England and a tea bag? ", - "delivery": "A: The tea bag stays in the cup longer.”" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181659547.json b/data/stray_submissions/submission_4b98767e_0_1595181659547.json deleted file mode 100755 index ed286dad..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181659547.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "Q: What’s the difference between England and a tea bag? ", - "delivery": "A: The tea bag stays in the cup longer.”" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181660828.json b/data/stray_submissions/submission_4b98767e_0_1595181660828.json deleted file mode 100755 index ed286dad..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181660828.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "Q: What’s the difference between England and a tea bag? ", - "delivery": "A: The tea bag stays in the cup longer.”" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181692648.json b/data/stray_submissions/submission_4b98767e_0_1595181692648.json deleted file mode 100755 index 558c4480..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181692648.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "What’s the difference between England and a tea bag? ", - "delivery": "The tea bag stays in the cup longer" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595181694196.json b/data/stray_submissions/submission_4b98767e_0_1595181694196.json deleted file mode 100755 index 558c4480..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595181694196.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "What’s the difference between England and a tea bag? ", - "delivery": "The tea bag stays in the cup longer" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595182109823.json b/data/stray_submissions/submission_4b98767e_0_1595182109823.json deleted file mode 100755 index 6af6a6e6..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595182109823.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "joke": "What’s the difference between England and a tea bag? The tea bag stays in the cup longer", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595182262092.json b/data/stray_submissions/submission_4b98767e_0_1595182262092.json deleted file mode 100755 index 7a5fc81a..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595182262092.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "setup": "What’s the difference between England and a tea bag? ", - "delivery": "The tea bag stays in the cup longer", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595182277982.json b/data/stray_submissions/submission_4b98767e_0_1595182277982.json deleted file mode 100755 index e6ca38e4..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595182277982.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "setup": "What’s the difference between England and a tea bag?", - "delivery": "The tea bag stays in the cup longer", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595182357752.json b/data/stray_submissions/submission_4b98767e_0_1595182357752.json deleted file mode 100755 index ec7f3009..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595182357752.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "setup": "What’s the difference between England and a tea bags?", - "delivery": "The tea bag stays in the cup longer", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595183033740.json b/data/stray_submissions/submission_4b98767e_0_1595183033740.json deleted file mode 100755 index c19c88fc..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595183033740.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "joke": "What’s the difference between England and a tea bags?", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_4b98767e_0_1595183058010.json b/data/stray_submissions/submission_4b98767e_0_1595183058010.json deleted file mode 100755 index 64f73fcc..00000000 --- a/data/stray_submissions/submission_4b98767e_0_1595183058010.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "joke": "What’s the difference between England and a tea bags?", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": true - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_502c4e4d_0_1594507921297.json b/data/stray_submissions/submission_502c4e4d_0_1594507921297.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_502c4e4d_0_1594507921297.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_502c4e4d_0_1594632774607.json b/data/stray_submissions/submission_502c4e4d_0_1594632774607.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_502c4e4d_0_1594632774607.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_502c4e4d_0_1595854868925.json b/data/stray_submissions/submission_502c4e4d_0_1595854868925.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_502c4e4d_0_1595854868925.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_50fa4483_0_1595683541401.json b/data/stray_submissions/submission_50fa4483_0_1595683541401.json deleted file mode 100755 index 50126afa..00000000 --- a/data/stray_submissions/submission_50fa4483_0_1595683541401.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "ha ha ha" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_5c2dbd22_0_1595873466904.json b/data/stray_submissions/submission_5c2dbd22_0_1595873466904.json deleted file mode 100755 index 73ca7d23..00000000 --- a/data/stray_submissions/submission_5c2dbd22_0_1595873466904.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "la" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_5d02e9d5_0_1594107697183.json b/data/stray_submissions/submission_5d02e9d5_0_1594107697183.json deleted file mode 100755 index 25a862b9..00000000 --- a/data/stray_submissions/submission_5d02e9d5_0_1594107697183.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "I am a frontend dev and my gf is working on backend these days, some would say we are a full stack couple!" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_5eace918_0_1595754605229.json b/data/stray_submissions/submission_5eace918_0_1595754605229.json deleted file mode 100755 index b17e28ea..00000000 --- a/data/stray_submissions/submission_5eace918_0_1595754605229.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Hello this is a joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_602cadd8_0_1594822759087.json b/data/stray_submissions/submission_602cadd8_0_1594822759087.json deleted file mode 100755 index 39b13f72..00000000 --- a/data/stray_submissions/submission_602cadd8_0_1594822759087.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "massola" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595148290846.json b/data/stray_submissions/submission_613de857_0_1595148290846.json deleted file mode 100755 index 1e5776a6..00000000 --- a/data/stray_submissions/submission_613de857_0_1595148290846.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "Life is cool as ...", - "delivery": "sure !!!" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595148853036.json b/data/stray_submissions/submission_613de857_0_1595148853036.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_613de857_0_1595148853036.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595155922082.json b/data/stray_submissions/submission_613de857_0_1595155922082.json deleted file mode 100755 index 4badc931..00000000 --- a/data/stray_submissions/submission_613de857_0_1595155922082.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595156259274.json b/data/stray_submissions/submission_613de857_0_1595156259274.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_613de857_0_1595156259274.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595158645578.json b/data/stray_submissions/submission_613de857_0_1595158645578.json deleted file mode 100755 index 1c2f2f70..00000000 --- a/data/stray_submissions/submission_613de857_0_1595158645578.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595158705307.json b/data/stray_submissions/submission_613de857_0_1595158705307.json deleted file mode 100755 index acc60f12..00000000 --- a/data/stray_submissions/submission_613de857_0_1595158705307.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595158815379.json b/data/stray_submissions/submission_613de857_0_1595158815379.json deleted file mode 100755 index acc60f12..00000000 --- a/data/stray_submissions/submission_613de857_0_1595158815379.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595158851135.json b/data/stray_submissions/submission_613de857_0_1595158851135.json deleted file mode 100755 index acc60f12..00000000 --- a/data/stray_submissions/submission_613de857_0_1595158851135.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595161969812.json b/data/stray_submissions/submission_613de857_0_1595161969812.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_613de857_0_1595161969812.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_613de857_0_1595161970302.json b/data/stray_submissions/submission_613de857_0_1595161970302.json deleted file mode 100755 index acc60f12..00000000 --- a/data/stray_submissions/submission_613de857_0_1595161970302.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "1+1 =11\n2+2 =22\n3+3 =33\n...\n10+10=1010" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_626d1df0_0_1594790582307.json b/data/stray_submissions/submission_626d1df0_0_1594790582307.json deleted file mode 100755 index 2f25a06a..00000000 --- a/data/stray_submissions/submission_626d1df0_0_1594790582307.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "bruh" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_62d13056_0_1594370521286.json b/data/stray_submissions/submission_62d13056_0_1594370521286.json deleted file mode 100755 index 94a7f6f7..00000000 --- a/data/stray_submissions/submission_62d13056_0_1594370521286.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "Uwus" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_631cf488_0_1595882737544.json b/data/stray_submissions/submission_631cf488_0_1595882737544.json deleted file mode 100755 index 04903ba7..00000000 --- a/data/stray_submissions/submission_631cf488_0_1595882737544.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "Why does Doctor Peper come in a bottle?", - "delivery": "Because his wife died!" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_66f5d8ad_0_1595604197925.json b/data/stray_submissions/submission_66f5d8ad_0_1595604197925.json deleted file mode 100755 index 6fbdc5a3..00000000 --- a/data/stray_submissions/submission_66f5d8ad_0_1595604197925.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": true, - "sexist": true - }, - "joke": "Joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6a091eef_0_1595776917472.json b/data/stray_submissions/submission_6a091eef_0_1595776917472.json deleted file mode 100755 index 0e6ff4bd..00000000 --- a/data/stray_submissions/submission_6a091eef_0_1595776917472.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Programming" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6e591608_0_1595906160079.json b/data/stray_submissions/submission_6e591608_0_1595906160079.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_6e591608_0_1595906160079.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6e591608_0_1595906182255.json b/data/stray_submissions/submission_6e591608_0_1595906182255.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_6e591608_0_1595906182255.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6e591608_0_1595906279021.json b/data/stray_submissions/submission_6e591608_0_1595906279021.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_6e591608_0_1595906279021.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6e591608_0_1595906283549.json b/data/stray_submissions/submission_6e591608_0_1595906283549.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_6e591608_0_1595906283549.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_6e591608_0_1595906788919.json b/data/stray_submissions/submission_6e591608_0_1595906788919.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_6e591608_0_1595906788919.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_7006ffb1_0_1594588493748.json b/data/stray_submissions/submission_7006ffb1_0_1594588493748.json deleted file mode 100755 index 56213f31..00000000 --- a/data/stray_submissions/submission_7006ffb1_0_1594588493748.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "test" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_768239a5_0_1593948699863.json b/data/stray_submissions/submission_768239a5_0_1593948699863.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_768239a5_0_1593948699863.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_768239a5_0_1596079125216.json b/data/stray_submissions/submission_768239a5_0_1596079125216.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_768239a5_0_1596079125216.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_768239a5_0_1596221753662.json b/data/stray_submissions/submission_768239a5_0_1596221753662.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_768239a5_0_1596221753662.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_7932d021_0_1594353164979.json b/data/stray_submissions/submission_7932d021_0_1594353164979.json deleted file mode 100755 index 25de0fbd..00000000 --- a/data/stray_submissions/submission_7932d021_0_1594353164979.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "ddffsdf" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_79f5ebc9_0_1595409433291.json b/data/stray_submissions/submission_79f5ebc9_0_1595409433291.json deleted file mode 100755 index 373969be..00000000 --- a/data/stray_submissions/submission_79f5ebc9_0_1595409433291.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "hello" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_7abb203a_0_1594757859250.json b/data/stray_submissions/submission_7abb203a_0_1594757859250.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_7abb203a_0_1594757859250.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_7abb203a_0_1594956668674.json b/data/stray_submissions/submission_7abb203a_0_1594956668674.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_7abb203a_0_1594956668674.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_7f27bbc3_0_1594719906966.json b/data/stray_submissions/submission_7f27bbc3_0_1594719906966.json deleted file mode 100755 index 2c02df7b..00000000 --- a/data/stray_submissions/submission_7f27bbc3_0_1594719906966.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "bloahhhhh" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_83c79041_0_1594836539748.json b/data/stray_submissions/submission_83c79041_0_1594836539748.json deleted file mode 100755 index 2a4c1480..00000000 --- a/data/stray_submissions/submission_83c79041_0_1594836539748.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "this is Bernaud's joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_83c79041_0_1594837206321.json b/data/stray_submissions/submission_83c79041_0_1594837206321.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_83c79041_0_1594837206321.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_849aa2ce_0_1595660414933.json b/data/stray_submissions/submission_849aa2ce_0_1595660414933.json deleted file mode 100755 index f421776b..00000000 --- a/data/stray_submissions/submission_849aa2ce_0_1595660414933.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": true, - "sexist": false - }, - "setup": "What's the difference between a phone and a black person?", - "delivery": "A phone is actually useful." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_8867cbd8_0_1594667844829.json b/data/stray_submissions/submission_8867cbd8_0_1594667844829.json deleted file mode 100755 index 77f4797e..00000000 --- a/data/stray_submissions/submission_8867cbd8_0_1594667844829.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "xxxx" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_8a5a5757_0_1594836051857.json b/data/stray_submissions/submission_8a5a5757_0_1594836051857.json deleted file mode 100755 index 507426ab..00000000 --- a/data/stray_submissions/submission_8a5a5757_0_1594836051857.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "HDFHDFHFDHDFH", - "delivery": "HFGFGFG" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_8d37d436_0_1595423294889.json b/data/stray_submissions/submission_8d37d436_0_1595423294889.json deleted file mode 100755 index b5b9bc89..00000000 --- a/data/stray_submissions/submission_8d37d436_0_1595423294889.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "ffjjfjffj" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_90a5f056_0_1594727689674.json b/data/stray_submissions/submission_90a5f056_0_1594727689674.json deleted file mode 100755 index a6529354..00000000 --- a/data/stray_submissions/submission_90a5f056_0_1594727689674.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "what the heck is that" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_90b8dc94_0_1595760403960.json b/data/stray_submissions/submission_90b8dc94_0_1595760403960.json deleted file mode 100755 index c657525f..00000000 --- a/data/stray_submissions/submission_90b8dc94_0_1595760403960.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "joke": "Miscellaneous" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_92ecd989_0_1594599963730.json b/data/stray_submissions/submission_92ecd989_0_1594599963730.json deleted file mode 100755 index 065534b4..00000000 --- a/data/stray_submissions/submission_92ecd989_0_1594599963730.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "C" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_94b3b81e_0_1595868103910.json b/data/stray_submissions/submission_94b3b81e_0_1595868103910.json deleted file mode 100755 index c0d67276..00000000 --- a/data/stray_submissions/submission_94b3b81e_0_1595868103910.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "What will to call a beginner at programming", - "delivery": "a beginnergrammer" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_95a699be_0_1593871819391.json b/data/stray_submissions/submission_95a699be_0_1593871819391.json deleted file mode 100755 index 6fbdc5a3..00000000 --- a/data/stray_submissions/submission_95a699be_0_1593871819391.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": true, - "sexist": true - }, - "joke": "Joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594977244636.json b/data/stray_submissions/submission_98e3a9b2_0_1594977244636.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594977244636.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985086172.json b/data/stray_submissions/submission_98e3a9b2_0_1594985086172.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985086172.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985207740.json b/data/stray_submissions/submission_98e3a9b2_0_1594985207740.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985207740.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985285896.json b/data/stray_submissions/submission_98e3a9b2_0_1594985285896.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985285896.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985328079.json b/data/stray_submissions/submission_98e3a9b2_0_1594985328079.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985328079.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985339158.json b/data/stray_submissions/submission_98e3a9b2_0_1594985339158.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985339158.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985391786.json b/data/stray_submissions/submission_98e3a9b2_0_1594985391786.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985391786.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985507099.json b/data/stray_submissions/submission_98e3a9b2_0_1594985507099.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985507099.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985525884.json b/data/stray_submissions/submission_98e3a9b2_0_1594985525884.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985525884.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_98e3a9b2_0_1594985799255.json b/data/stray_submissions/submission_98e3a9b2_0_1594985799255.json deleted file mode 100755 index 112fff75..00000000 --- a/data/stray_submissions/submission_98e3a9b2_0_1594985799255.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "That is the way it has always been ", - "delivery": "It just change" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_9d3123f4_0_1593928003178.json b/data/stray_submissions/submission_9d3123f4_0_1593928003178.json deleted file mode 100755 index 941353e3..00000000 --- a/data/stray_submissions/submission_9d3123f4_0_1593928003178.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": true, - "sexist": false - }, - "joke": "what's the word that contains all letters in alphabet?\nPost box" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a16b5f90_0_1596186994545.json b/data/stray_submissions/submission_a16b5f90_0_1596186994545.json deleted file mode 100755 index 4ac69aac..00000000 --- a/data/stray_submissions/submission_a16b5f90_0_1596186994545.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": true, - "racist": true, - "sexist": true - }, - "joke": "joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a1b46e76_0_1595737905567.json b/data/stray_submissions/submission_a1b46e76_0_1595737905567.json deleted file mode 100755 index f37aa4e7..00000000 --- a/data/stray_submissions/submission_a1b46e76_0_1595737905567.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "j" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a1b46e76_0_1595737906573.json b/data/stray_submissions/submission_a1b46e76_0_1595737906573.json deleted file mode 100755 index f37aa4e7..00000000 --- a/data/stray_submissions/submission_a1b46e76_0_1595737906573.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "j" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594901130109.json b/data/stray_submissions/submission_a2ad4340_0_1594901130109.json deleted file mode 100755 index 84a50eab..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594901130109.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "my joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594901212703.json b/data/stray_submissions/submission_a2ad4340_0_1594901212703.json deleted file mode 100755 index 84a50eab..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594901212703.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "my joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594901445791.json b/data/stray_submissions/submission_a2ad4340_0_1594901445791.json deleted file mode 100755 index e46706f0..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594901445791.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "my joke", - "id": 156 -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594901776228.json b/data/stray_submissions/submission_a2ad4340_0_1594901776228.json deleted file mode 100755 index c4c95474..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594901776228.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "my joke 1" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594902381338.json b/data/stray_submissions/submission_a2ad4340_0_1594902381338.json deleted file mode 100755 index 656c2bf1..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594902381338.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "What's yellow and can't swim?" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594902428964.json b/data/stray_submissions/submission_a2ad4340_0_1594902428964.json deleted file mode 100755 index 923c757b..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594902428964.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "What's yellow and can't swim?" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a2ad4340_0_1594902486475.json b/data/stray_submissions/submission_a2ad4340_0_1594902486475.json deleted file mode 100755 index 7660970a..00000000 --- a/data/stray_submissions/submission_a2ad4340_0_1594902486475.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "setup": "What's yellow and can't swim?", - "delivery": "A bus full of children." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a3e76772_0_1594484451457.json b/data/stray_submissions/submission_a3e76772_0_1594484451457.json deleted file mode 100755 index ae2d3cde..00000000 --- a/data/stray_submissions/submission_a3e76772_0_1594484451457.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": false - }, - "joke": "black" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a3e76772_0_1594484500228.json b/data/stray_submissions/submission_a3e76772_0_1594484500228.json deleted file mode 100755 index 755b3820..00000000 --- a/data/stray_submissions/submission_a3e76772_0_1594484500228.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": false - }, - "joke": "i was just trying to use the site :( not suggesting any joke :D" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_a4bac8e5_0_1594193216109.json b/data/stray_submissions/submission_a4bac8e5_0_1594193216109.json deleted file mode 100755 index 952fcee9..00000000 --- a/data/stray_submissions/submission_a4bac8e5_0_1594193216109.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "hello world" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_aa796fa1_0_1595493509785.json b/data/stray_submissions/submission_aa796fa1_0_1595493509785.json deleted file mode 100755 index 09a81a9e..00000000 --- a/data/stray_submissions/submission_aa796fa1_0_1595493509785.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "ASCII silly question, get a silly ANSI." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085147980.json b/data/stray_submissions/submission_b0b75a73_0_1594085147980.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085147980.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085154806.json b/data/stray_submissions/submission_b0b75a73_0_1594085154806.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085154806.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085159425.json b/data/stray_submissions/submission_b0b75a73_0_1594085159425.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085159425.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085164629.json b/data/stray_submissions/submission_b0b75a73_0_1594085164629.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085164629.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085164665.json b/data/stray_submissions/submission_b0b75a73_0_1594085164665.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085164665.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085170309.json b/data/stray_submissions/submission_b0b75a73_0_1594085170309.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085170309.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085170492.json b/data/stray_submissions/submission_b0b75a73_0_1594085170492.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085170492.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085174908.json b/data/stray_submissions/submission_b0b75a73_0_1594085174908.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085174908.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085175073.json b/data/stray_submissions/submission_b0b75a73_0_1594085175073.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085175073.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085175259.json b/data/stray_submissions/submission_b0b75a73_0_1594085175259.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085175259.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085180103.json b/data/stray_submissions/submission_b0b75a73_0_1594085180103.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085180103.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085180289.json b/data/stray_submissions/submission_b0b75a73_0_1594085180289.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085180289.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b0b75a73_0_1594085180762.json b/data/stray_submissions/submission_b0b75a73_0_1594085180762.json deleted file mode 100755 index e4c2bf40..00000000 --- a/data/stray_submissions/submission_b0b75a73_0_1594085180762.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "fuck " -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b4929f0c_0_1595046845375.json b/data/stray_submissions/submission_b4929f0c_0_1595046845375.json deleted file mode 100755 index b5337e72..00000000 --- a/data/stray_submissions/submission_b4929f0c_0_1595046845375.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "nnnn" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b8640390_0_1595000499541.json b/data/stray_submissions/submission_b8640390_0_1595000499541.json deleted file mode 100755 index 28a0d1c0..00000000 --- a/data/stray_submissions/submission_b8640390_0_1595000499541.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": true, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "hashsf" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_b92619fc_0_1595725145583.json b/data/stray_submissions/submission_b92619fc_0_1595725145583.json deleted file mode 100755 index 39355c5d..00000000 --- a/data/stray_submissions/submission_b92619fc_0_1595725145583.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "single" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_ba4ad314_0_1595063690823.json b/data/stray_submissions/submission_ba4ad314_0_1595063690823.json deleted file mode 100755 index fd27389b..00000000 --- a/data/stray_submissions/submission_ba4ad314_0_1595063690823.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": true, - "racist": false, - "sexist": false - }, - "joke": "Hi" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_bba39610_0_1594820059639.json b/data/stray_submissions/submission_bba39610_0_1594820059639.json deleted file mode 100755 index ed107b95..00000000 --- a/data/stray_submissions/submission_bba39610_0_1594820059639.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "How did you fix the bugs ? Through keuboard\n" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_bba39610_0_1594820075271.json b/data/stray_submissions/submission_bba39610_0_1594820075271.json deleted file mode 100755 index 41b2dc19..00000000 --- a/data/stray_submissions/submission_bba39610_0_1594820075271.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "How did you fix the bugs ? Through keyboard\n" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_bd6eed48_0_1594954563080.json b/data/stray_submissions/submission_bd6eed48_0_1594954563080.json deleted file mode 100755 index b1344eee..00000000 --- a/data/stray_submissions/submission_bd6eed48_0_1594954563080.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": true, - "racist": true, - "sexist": true - }, - "joke": "Joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_bdd0ab14_0_1595612654745.json b/data/stray_submissions/submission_bdd0ab14_0_1595612654745.json deleted file mode 100755 index 6273d9be..00000000 --- a/data/stray_submissions/submission_bdd0ab14_0_1595612654745.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_c38248c4_0_1594796472874.json b/data/stray_submissions/submission_c38248c4_0_1594796472874.json deleted file mode 100755 index 811a39cc..00000000 --- a/data/stray_submissions/submission_c38248c4_0_1594796472874.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "I am starving!!!", - "delivery": "Drink water!!!" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_c38248c4_0_1594797911699.json b/data/stray_submissions/submission_c38248c4_0_1594797911699.json deleted file mode 100755 index d370a5bf..00000000 --- a/data/stray_submissions/submission_c38248c4_0_1594797911699.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "joke": "How hungry are you?" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_c78304c5_0_1594781587719.json b/data/stray_submissions/submission_c78304c5_0_1594781587719.json deleted file mode 100755 index a9e871ad..00000000 --- a/data/stray_submissions/submission_c78304c5_0_1594781587719.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_c844742e_0_1594418196341.json b/data/stray_submissions/submission_c844742e_0_1594418196341.json deleted file mode 100755 index d8a9cb35..00000000 --- a/data/stray_submissions/submission_c844742e_0_1594418196341.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": false, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "yep" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_c88a66b8_0_1595314291875.json b/data/stray_submissions/submission_c88a66b8_0_1595314291875.json deleted file mode 100755 index abd3c9ff..00000000 --- a/data/stray_submissions/submission_c88a66b8_0_1595314291875.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "programming is easy" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_d2152cf5_0_1594016626541.json b/data/stray_submissions/submission_d2152cf5_0_1594016626541.json deleted file mode 100755 index ad202926..00000000 --- a/data/stray_submissions/submission_d2152cf5_0_1594016626541.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "am i a joke to you." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_d8df0ea7_0_1595998244279.json b/data/stray_submissions/submission_d8df0ea7_0_1595998244279.json deleted file mode 100755 index bc184113..00000000 --- a/data/stray_submissions/submission_d8df0ea7_0_1595998244279.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "you might always think about you but you are not thing about you actually" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_db3ec700_0_1595364901137.json b/data/stray_submissions/submission_db3ec700_0_1595364901137.json deleted file mode 100755 index ef2321d7..00000000 --- a/data/stray_submissions/submission_db3ec700_0_1595364901137.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "animal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_db3ec700_0_1595365642231.json b/data/stray_submissions/submission_db3ec700_0_1595365642231.json deleted file mode 100755 index 56213f31..00000000 --- a/data/stray_submissions/submission_db3ec700_0_1595365642231.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "test" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e272f9b7_0_1594883998911.json b/data/stray_submissions/submission_e272f9b7_0_1594883998911.json deleted file mode 100755 index 3af42325..00000000 --- a/data/stray_submissions/submission_e272f9b7_0_1594883998911.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Any" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e272f9b7_0_1594884000014.json b/data/stray_submissions/submission_e272f9b7_0_1594884000014.json deleted file mode 100755 index 3af42325..00000000 --- a/data/stray_submissions/submission_e272f9b7_0_1594884000014.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Any" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594882146828.json b/data/stray_submissions/submission_e31e6d7c_0_1594882146828.json deleted file mode 100755 index 9c540903..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594882146828.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "This is not funny for me.", - "delivery": "But you are not normal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594882377897.json b/data/stray_submissions/submission_e31e6d7c_0_1594882377897.json deleted file mode 100755 index 9c540903..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594882377897.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "This is not funny for me.", - "delivery": "But you are not normal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594882713456.json b/data/stray_submissions/submission_e31e6d7c_0_1594882713456.json deleted file mode 100755 index 9c540903..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594882713456.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "This is not funny for me.", - "delivery": "But you are not normal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594883575378.json b/data/stray_submissions/submission_e31e6d7c_0_1594883575378.json deleted file mode 100755 index 9c540903..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594883575378.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "This is not funny for me.", - "delivery": "But you are not normal" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594883812575.json b/data/stray_submissions/submission_e31e6d7c_0_1594883812575.json deleted file mode 100755 index 72c2b8ea..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594883812575.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "There is a time for everything", - "delivery": "Yes and the time is now." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594883820219.json b/data/stray_submissions/submission_e31e6d7c_0_1594883820219.json deleted file mode 100755 index 72c2b8ea..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594883820219.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "There is a time for everything", - "delivery": "Yes and the time is now." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e31e6d7c_0_1594896351549.json b/data/stray_submissions/submission_e31e6d7c_0_1594896351549.json deleted file mode 100755 index f6379198..00000000 --- a/data/stray_submissions/submission_e31e6d7c_0_1594896351549.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "I'm tired of following my dreams.", - "delivery": " I'm just going to ask them where they are going and meet up with them later." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e7b66860_0_1596271859915.json b/data/stray_submissions/submission_e7b66860_0_1596271859915.json deleted file mode 100755 index 172c24c9..00000000 --- a/data/stray_submissions/submission_e7b66860_0_1596271859915.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "This is not a joke" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_e88bfcdb_0_1594749157071.json b/data/stray_submissions/submission_e88bfcdb_0_1594749157071.json deleted file mode 100755 index 9a9fbe71..00000000 --- a/data/stray_submissions/submission_e88bfcdb_0_1594749157071.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "single", - "flags": { - "nsfw": true, - "religious": true, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "It is not funny,seriously." -} \ No newline at end of file diff --git a/data/stray_submissions/submission_f27aeded_0_1594083864640.json b/data/stray_submissions/submission_f27aeded_0_1594083864640.json deleted file mode 100755 index 86e52a1a..00000000 --- a/data/stray_submissions/submission_f27aeded_0_1594083864640.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Programming", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": true, - "sexist": true - }, - "setup": "Kevin", - "delivery": "asdas" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_f46b65a2_0_1595643753428.json b/data/stray_submissions/submission_f46b65a2_0_1595643753428.json deleted file mode 100755 index 4e121e43..00000000 --- a/data/stray_submissions/submission_f46b65a2_0_1595643753428.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Miscellaneous", - "type": "single", - "joke": "A horse walks into a bar...", - "flags": { - "nsfw": true, - "religious": false, - "political": true, - "racist": false, - "sexist": false - } -} \ No newline at end of file diff --git a/data/stray_submissions/submission_f5ea7804_0_1594846684201.json b/data/stray_submissions/submission_f5ea7804_0_1594846684201.json deleted file mode 100755 index 780ebce3..00000000 --- a/data/stray_submissions/submission_f5ea7804_0_1594846684201.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "single", - "flags": { - "nsfw": false, - "religious": false, - "political": false, - "racist": false, - "sexist": false - }, - "joke": "Bungee jumping is a great decision making tool if you are suicidal and indecisive at the same time" -} \ No newline at end of file diff --git a/data/stray_submissions/submission_fbb5c451_0_1594839865988.json b/data/stray_submissions/submission_fbb5c451_0_1594839865988.json deleted file mode 100755 index 8516ce67..00000000 --- a/data/stray_submissions/submission_fbb5c451_0_1594839865988.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "formatVersion": 2, - "category": "Dark", - "type": "twopart", - "flags": { - "nsfw": false, - "religious": true, - "political": true, - "racist": false, - "sexist": false - }, - "setup": "Yes I am going to heaven", - "delivery": "But you need to die first" -} \ No newline at end of file From 080b54ff5cdf4094e563390a78b2f0e85d79b6be Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 13:07:25 +0200 Subject: [PATCH 25/62] tools readme --- tools/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tools/README.md diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..8c1a571d --- /dev/null +++ b/tools/README.md @@ -0,0 +1,20 @@ +# JokeAPI CLI tools +Since v2.3.2, JokeAPI has a globally callable command line binary, which acts as an interface to all command-line tools inside this `./tools` folder. + +
+ +## Setup: +To register the JokeAPI binary, run the command `npm run link` +If you get an `EACCES` error, try using `sudo npm run link`, otherwise you probably need to reinstall Node.js through a version manager like [nvm](https://github.com/nvm-sh/nvm) + +Afterwards, the binary will be globally callable with the commands `jokeapi` and `japi` + +To display a list of all commands, run `jokeapi -h` +To get command-specific help and show the command's arguments, run `jokeapi -h ` + +
+ +## Commands: +| Command | Description | +| :-- | :-- | +| `jokeapi start` | Starts JokeAPI (equivalent to running `npm start` or `node .`) | From 7309c7323b5cc4b03cef7b99d47e46e9de59edbd Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 14:08:41 +0200 Subject: [PATCH 26/62] update cascadia code font --- .../CascadiaCode-Regular-VTT_1911.21.ttf | Bin 213476 -> 0 bytes docs/static/external/CascadiaCode_2108.26.ttf | Bin 0 -> 649748 bytes settings.js | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/static/external/CascadiaCode-Regular-VTT_1911.21.ttf create mode 100644 docs/static/external/CascadiaCode_2108.26.ttf diff --git a/docs/static/external/CascadiaCode-Regular-VTT_1911.21.ttf b/docs/static/external/CascadiaCode-Regular-VTT_1911.21.ttf deleted file mode 100644 index fee603fa21c77de3affba8e86597c4cf91db1ffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213476 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 z%0A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 literal 0 HcmV?d00001 diff --git a/settings.js b/settings.js index 487a1c78..fc79a256 100755 --- a/settings.js +++ b/settings.js @@ -171,7 +171,7 @@ const settings = { rawDirPath: "./docs/raw/", // path to the raw documentation files directory - needs trailing slash daemonInterval: 2, // interval (in seconds) at which the daemon checks for changes in the documentation directory errorPagePath: "./docs/raw/errorPage.html", // path to the error page - codeFontFileName: "static/external/CascadiaCode-Regular-VTT_1911.21.ttf", // the name of the font file that is going to be used in code blocks - has to be in the directory specified with the above property "dirPath" + codeFontFileName: "static/external/CascadiaCode_2108.26.ttf", // the name of the font file that is going to be used in code blocks - relative to the directory specified with the above property "dirPath" submissionForm: { dirPath: "./docs/raw/", // path to the submission form directory - needs trailing slash fileNames: { From 4941446e2e65d08b76bec757a127b18cb105dd38 Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 21 Oct 2021 14:12:11 +0200 Subject: [PATCH 27/62] fixed font weight --- docs/raw/index.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/raw/index.css b/docs/raw/index.css index 3e7bcff4..d51edab9 100755 --- a/docs/raw/index.css +++ b/docs/raw/index.css @@ -397,6 +397,7 @@ mark { display: inline-block; padding: 1px; font-family: "Cascadia Code", "Roboto Mono", "Courier New", monospace; + font-weight: normal; font-variant-ligatures: none; color: #ccc; transition: background-color ease-out var(--sidenav-colorblur-speed); @@ -462,6 +463,7 @@ body[data-sidenav="opened"] mark { body[data-sidenav="closed"] code, body code { font-family: "Cascadia Code", "Inconsolata", "Courier New", "Consolas", monospace; + font-weight: normal; font-variant-ligatures: none; font-size: 15px; @@ -521,6 +523,7 @@ body code .nocode.codeheader::before { kbd { font-family: "Cascadia Code", "Inconsolata", "Roboto Mono", "Courier New", monospace; + font-weight: normal; font-variant-ligatures: none; font-size: 13px; display: inline-block; @@ -565,6 +568,7 @@ ul.lispacer li { .antiBotE.shown { font-family: "Roboto Mono", "Cascadia Code", "Courier New", monospace; + font-weight: normal; } /*#SECTION Endpoints*/ From 0ab93ff0e6ae75de53935ed6f90ef67aa86d2ffb Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 13:14:47 +0200 Subject: [PATCH 28/62] tsconf --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 5e1c0236..42da65de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + // for importing types from JSON files: "resolveJsonModule": true } } \ No newline at end of file From 7318d248a3a9ad134616936252e4b27056e47f57 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 13:29:24 +0200 Subject: [PATCH 29/62] remove unncecessary IP from whitelist --- data/lists/ipWhitelist.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/lists/ipWhitelist.json b/data/lists/ipWhitelist.json index 71a90706..a35bbeda 100755 --- a/data/lists/ipWhitelist.json +++ b/data/lists/ipWhitelist.json @@ -4,7 +4,6 @@ "::1", "127.0.0.1", "localhost", - "192.168.178.58", "#MARKER UptimeRobot:", From 811b25b22a283e6d1554091f8a74c83dc06e8565 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 13:31:57 +0200 Subject: [PATCH 30/62] disable ratelimit log file --- data/lists/consoleBlacklist.json | 1 - data/lists/ipWhitelist.json | 2 -- src/logRequest.js | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/data/lists/consoleBlacklist.json b/data/lists/consoleBlacklist.json index 3584680d..575dabb6 100755 --- a/data/lists/consoleBlacklist.json +++ b/data/lists/consoleBlacklist.json @@ -59,7 +59,6 @@ "138.197.150.151", "34.233.66.117", - "#MARKER Freshping", "35.173.69.86", diff --git a/data/lists/ipWhitelist.json b/data/lists/ipWhitelist.json index a35bbeda..cac25137 100755 --- a/data/lists/ipWhitelist.json +++ b/data/lists/ipWhitelist.json @@ -5,7 +5,6 @@ "127.0.0.1", "localhost", - "#MARKER UptimeRobot:", "216.144.250.150", @@ -66,7 +65,6 @@ "138.197.150.151", "34.233.66.117", - "#MARKER Freshping", "35.173.69.86", diff --git a/src/logRequest.js b/src/logRequest.js index 523ce34a..28fe4a99 100755 --- a/src/logRequest.js +++ b/src/logRequest.js @@ -67,7 +67,7 @@ const logRequest = (type, additionalInfo, analyticsData) => { break; case "ratelimited": color = settings.colors.ratelimit; - logType = "ratelimit"; + // logType = "ratelimit"; if(!jsl.isEmpty(analyticsData)) { From 24471a9d062af8e19e362c09a63faeb28753f9b3 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 13:44:26 +0200 Subject: [PATCH 31/62] fix error if no lang prop present --- src/jokeSubmission.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/jokeSubmission.js b/src/jokeSubmission.js index 8dd5799e..48e6c4c4 100755 --- a/src/jokeSubmission.js +++ b/src/jokeSubmission.js @@ -199,8 +199,9 @@ function reformatJoke(joke) if(joke.lang) retJoke.lang = joke.lang; - - retJoke.lang = retJoke.lang.toLowerCase(); + + if(typeof retJoke.lang === "string") + retJoke.lang = retJoke.lang.toLowerCase(); if(joke.id) retJoke.id = joke.id; From c24b9eef532545292d61ece3bdcaa0d4f71a10a1 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 13:51:13 +0200 Subject: [PATCH 32/62] disable debug log on translation (too spammy) --- src/translate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translate.js b/src/translate.js index 21380580..feaf3e00 100755 --- a/src/translate.js +++ b/src/translate.js @@ -68,7 +68,7 @@ function translate(lang, id, ...args) }); } - debug("Translate", `Translating "${id}" into ${lang} - result: ${translation}`); + // debug("Translate", `Translating "${id}" into ${lang} - result: ${translation}`); return translation; } From a68cf4e94143d48837ba52d48cd5ede4f08720dd Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 14:23:09 +0200 Subject: [PATCH 33/62] went through stray submissions + added disclaimers --- data/jokes/jokes-cs.json | 1 + data/jokes/jokes-de.json | 1 + data/jokes/jokes-en.json | 109 +++++++++++++++++++++++++++++++++++++++ data/jokes/jokes-es.json | 1 + data/jokes/jokes-fr.json | 1 + data/jokes/jokes-pt.json | 1 + tools/submissions.js | 18 ++++--- 7 files changed, 125 insertions(+), 7 deletions(-) diff --git a/data/jokes/jokes-cs.json b/data/jokes/jokes-cs.json index 68f64c7a..7fd91922 100644 --- a/data/jokes/jokes-cs.json +++ b/data/jokes/jokes-cs.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "Mnohé z níže uvedených vtipů jsou rasistické, sexistické nebo jinak explicitní. Vstup na vlastní nebezpečí!", "formatVersion": 3 }, "jokes": [ diff --git a/data/jokes/jokes-de.json b/data/jokes/jokes-de.json index d8d16d42..c6e6b74d 100755 --- a/data/jokes/jokes-de.json +++ b/data/jokes/jokes-de.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "Viele der folgenden Witze sind rassistisch, sexistisch oder in anderer Weise explizit. Betreten auf eigene Gefahr!", "formatVersion": 3 }, "jokes": [ diff --git a/data/jokes/jokes-en.json b/data/jokes/jokes-en.json index e6e59980..bd7c6519 100755 --- a/data/jokes/jokes-en.json +++ b/data/jokes/jokes-en.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "A lot of the jokes below are racist, sexist and explicit in other ways. View at your own risk and don't complain if you're offended.", "formatVersion": 3 }, "jokes": [ @@ -4784,6 +4785,114 @@ }, "safe": true, "id": 303 + }, + { + "category": "Misc", + "type": "single", + "joke": "I visited my friend at his new house. He told me to make myself at home. So I threw him out. I hate having visitors.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 304 + }, + { + "category": "Programming", + "type": "single", + "joke": "Documentation is like sex:\nWhen it's good, it's very good.\nWhen it's bad, it's better than nothing...", + "flags": { + "nsfw": true, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": false, + "id": 305 + }, + { + "category": "Misc", + "type": "single", + "joke": "Yo mama is so old, she knew Burger King while he was still a prince.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 306 + }, + { + "category": "Misc", + "type": "single", + "joke": "I went to the zoo the other day. There was only a dog in it – it was a shihtzu.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": true + }, + "safe": false, + "id": 307 + }, + { + "category": "Misc", + "type": "twopart", + "setup": "What's the difference between England and a tea bag?", + "delivery": "The tea bag stays in the cup longer.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 308 + }, + { + "category": "Dark", + "type": "twopart", + "setup": "What's the difference between a phone and a black person?", + "delivery": "A phone is actually useful.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": true, + "sexist": false, + "explicit": false + }, + "safe": false, + "id": 309 + }, + { + "category": "Dark", + "type": "twopart", + "setup": "What's yellow and can't swim?", + "delivery": "A bus full of children.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": false, + "id": 310 } ] } \ No newline at end of file diff --git a/data/jokes/jokes-es.json b/data/jokes/jokes-es.json index 49563cad..c5b19c0c 100755 --- a/data/jokes/jokes-es.json +++ b/data/jokes/jokes-es.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "Muchos de los chistes a continuación son racistas, sexistas o explícitos. ¡Entrar a su propio riesgo!", "formatVersion": 3 }, "jokes": [ diff --git a/data/jokes/jokes-fr.json b/data/jokes/jokes-fr.json index 639294da..b3dab9a6 100644 --- a/data/jokes/jokes-fr.json +++ b/data/jokes/jokes-fr.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "La plupart des blagues ci-dessous sont racistes, sexistes ou explicites. Entrez à vos risques et périls!", "formatVersion": 3 }, "jokes": [ diff --git a/data/jokes/jokes-pt.json b/data/jokes/jokes-pt.json index aa3064bb..e46aab33 100644 --- a/data/jokes/jokes-pt.json +++ b/data/jokes/jokes-pt.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "Muitas das piadas abaixo são racistas, sexistas ou de outra forma explícitas. Entre por seu próprio risco!", "formatVersion": 3 }, "jokes": [ diff --git a/tools/submissions.js b/tools/submissions.js index 34e8c767..7dd6040f 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -182,30 +182,31 @@ function actSubmission(sub) safe = true; lastSubmissionType = "accepted_safe"; finalSub = reserialize(sub); + currentSub++; break; case "u": // add unsafe lastSubmissionType = "accepted_unsafe"; finalSub = reserialize(sub); + currentSub++; break; case "e": // edit lastSubmissionType = "edited"; finalSub = await editSubmission(sub); + currentSub++; break; case "d": // delete lastSubmissionType = "deleted"; await deleteSubmission(sub); + currentSub++; return res(); default: // invalid key lastKeyInvalid = true; return await actSubmission(sub); } - if(finalSub) + if(finalSub && lastSubmissionType != "edited") finalSub.joke.safe = safe; - if(lastSubmissionType !== "invalid") - currentSub++; - // if not deleted in editSubmission() if(finalSub !== null) await saveSubmission(finalSub); @@ -234,6 +235,9 @@ function editSubmission(sub) /** @param {Submission} finalSub */ const trySubmit = async (finalSub) => { + if(typeof finalSub.joke.lang !== "string") + finalSub.joke.lang = finalSub.lang; + const validateRes = parseJokes.validateSingle(finalSub.joke, finalSub.lang); const allErrors = Array.isArray(validateRes) ? validateRes : []; @@ -501,9 +505,9 @@ function printSubmission(sub) } /** - * Extracts flags of a joke submission, returning a string + * Extracts flags of a joke submission, returning a string representation * @param {JokeSubmission} joke - * @returns {string} Returns "(none)" if no flags are set + * @returns {string} Returns flags delimited with `, ` or "none" if no flags are set */ function extractFlags(joke) { @@ -515,7 +519,7 @@ function extractFlags(joke) flags.push(key); }); - return flags.length > 0 ? flags.join(", ") : "(none)"; + return flags.length > 0 ? flags.join(", ") : "none"; } /** From 3dd48c3841644d9121334544f851701f80efe29b Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 14:33:21 +0200 Subject: [PATCH 34/62] disclaimer fix --- data/jokes/jokes-en.json | 2 +- data/jokes/template.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/data/jokes/jokes-en.json b/data/jokes/jokes-en.json index bd7c6519..21d3ea80 100755 --- a/data/jokes/jokes-en.json +++ b/data/jokes/jokes-en.json @@ -1,6 +1,6 @@ { "info": { - "disclaimer": "A lot of the jokes below are racist, sexist and explicit in other ways. View at your own risk and don't complain if you're offended.", + "disclaimer": "A lot of the jokes below are racist, sexist and explicit in other ways. Proceed at your own risk!", "formatVersion": 3 }, "jokes": [ diff --git a/data/jokes/template.json b/data/jokes/template.json index 8842b472..ae1cf275 100755 --- a/data/jokes/template.json +++ b/data/jokes/template.json @@ -1,5 +1,6 @@ { "info": { + "disclaimer": "A lot of the jokes below are racist, sexist and explicit in other ways. Proceed at your own risk!", "formatVersion": 3 }, "jokes": [ From 367b6acb81cd3f03863a3ce4fc67208724ee540f Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 14:54:51 +0200 Subject: [PATCH 35/62] cli stuff --- tools/README.md | 1 + tools/cli.js | 2 ++ tools/info.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tools/info.js diff --git a/tools/README.md b/tools/README.md index 8c1a571d..c623f061 100644 --- a/tools/README.md +++ b/tools/README.md @@ -18,3 +18,4 @@ To get command-specific help and show the command's arguments, run `jokeapi -h < | Command | Description | | :-- | :-- | | `jokeapi start` | Starts JokeAPI (equivalent to running `npm start` or `node .`) | +| `jokeapi info` | Prints information about JokeAPI, like the /info endpoint | diff --git a/tools/cli.js b/tools/cli.js index bfeee503..d716faac 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -131,6 +131,8 @@ function prepareCLI() // TODO: (v2.4) remove comments below yargs.command([ "start", "run" ], `Starts ${settings.info.name} (equivalent to 'npm start')`); + yargs.command([ "info", "i" ], `Prints information about ${settings.info.name}, like the /info endpoint`); + yargs.command([ "submissions", "sub", "s" ], "Goes through all joke submissions, prompting to edit, add or delete them"); yargs.command([ "add-joke", "aj", "j" ], "Runs an interactive prompt that adds a joke"); diff --git a/tools/info.js b/tools/info.js new file mode 100644 index 00000000..d3860bf2 --- /dev/null +++ b/tools/info.js @@ -0,0 +1,45 @@ +const { Errors, colors } = require("svcorelib"); + +const settings = require("../settings"); + +const col = colors.fg; +const { exit } = process; + + +async function run() +{ + try + { + const lines = [ + `${settings.info.name} v${settings.info.version} - Info`, + ``, + `TODO:`, + ]; + + process.stdout.write(`${lines.join("\n")}\n`); + + exit(0); + } + catch(err) + { + console.log(`\n${col.red}Error while displaying info:${col.rst}\n${err}\n`); + exit(1); + } +} + + +//#SECTION on execute + +try +{ + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else + run(); +} +catch(err) +{ + console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); + + exit(0); +} From 6aa8727c40cdc5464997b5a381a7da12efbe7a7c Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 14:55:37 +0200 Subject: [PATCH 36/62] i forgor --- tools/cli.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/cli.js b/tools/cli.js index d716faac..56c08a98 100755 --- a/tools/cli.js +++ b/tools/cli.js @@ -48,6 +48,10 @@ async function run() action = "Joke submissions"; file = "./submissions.js"; break; + case "info": + case "i": + file = "./info.js"; + break; case "add-joke": case "aj": case "j": From 4904b9ef5ffffd00d6bed1776a4f6433bd5c34b5 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 22:00:05 +0200 Subject: [PATCH 37/62] whoops --- settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.js b/settings.js index fc79a256..b7a1173e 100755 --- a/settings.js +++ b/settings.js @@ -88,7 +88,7 @@ const settings = { "Spooky", "Christmas" ], - categoryAliases: { // aliases of categories. Alias at key gets resolved to category at value. Value has to be present in the "categories" array above - case insensitive / readable names + categoryAliases: { // aliases of categories. Alias at key gets resolved to category at value. Value has to be present in the "categories" array above - case sensitive / readable names "Miscellaneous": "Misc", "Coding": "Programming", "Development": "Programming", From 26f256936da8f129ff4691f5717352ab15b9ed52 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sat, 23 Oct 2021 22:36:49 +0200 Subject: [PATCH 38/62] add-joke script --- package-lock.json | 15 +- package.json | 3 +- tools/add-joke.bak.js | 215 +++++++++++++++++++++++ tools/add-joke.js | 397 ++++++++++++++++++++++-------------------- tools/submissions.js | 2 +- tools/types.d.ts | 12 +- 6 files changed, 455 insertions(+), 189 deletions(-) create mode 100644 tools/add-joke.bak.js diff --git a/package-lock.json b/package-lock.json index 16702505..37cb2c67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,8 @@ "madge": "^4.0.1", "nyc": "^15.1.0", "snyk": "^1.742.0", - "table": "^6.0.1" + "table": "^6.0.1", + "tsdef": "^0.0.14" } }, "node_modules/@babel/compat-data": { @@ -4987,6 +4988,12 @@ "node": ">=4" } }, + "node_modules/tsdef": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/tsdef/-/tsdef-0.0.14.tgz", + "integrity": "sha512-UjMD4XKRWWFlFBfwKVQmGFT5YzW/ZaF8x6KpCDf92u9wgKeha/go3FU0e5WqDjXsCOdfiavCkfwfVHNDxRDGMA==", + "dev": true + }, "node_modules/tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", @@ -9050,6 +9057,12 @@ "tsconfig-paths": "^3.9.0" } }, + "tsdef": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/tsdef/-/tsdef-0.0.14.tgz", + "integrity": "sha512-UjMD4XKRWWFlFBfwKVQmGFT5YzW/ZaF8x6KpCDf92u9wgKeha/go3FU0e5WqDjXsCOdfiavCkfwfVHNDxRDGMA==", + "dev": true + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", diff --git a/package.json b/package.json index 41993775..89097241 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,8 @@ "madge": "^4.0.1", "nyc": "^15.1.0", "snyk": "^1.742.0", - "table": "^6.0.1" + "table": "^6.0.1", + "tsdef": "^0.0.14" }, "snyk": true } diff --git a/tools/add-joke.bak.js b/tools/add-joke.bak.js new file mode 100644 index 00000000..7a5dcc9c --- /dev/null +++ b/tools/add-joke.bak.js @@ -0,0 +1,215 @@ +const jsl = require("svjsl"); +const readline = require("readline"); +const settings = require("../settings"); +const fs = require("fs-extra"); +const { join } = require("path"); + +const jokeSubmission = require("../src/jokeSubmission"); +const languages = require("../src/languages"); + + +const init = async () => { + let joke = {}; + + if(!process.stdin.isTTY) + { + console.log(`${jsl.colors.fg.red}Error: process doesn't have a stdin to read from${jsl.colors.rst}`); + process.exit(1); + } + + process.stdin.setRawMode(true); + + await languages.init(); + + joke["category"] = await getJokeCategory(); + joke["type"] = await getJokeType(); + let jokeLang = await getJokeLang(); + + let rl = readline.createInterface(process.stdin, process.stdout); + rl.pause(); + + let contFlags = () => { + process.stdout.write("\n"); + + joke["flags"] = {}; + let allFlags = settings.jokes.possible.flags; + + let flagIteration = idx => { + if(idx >= allFlags.length) + return flagIterFinished(); + else + { + jsl.pause(`Is this joke ${allFlags[idx]}? (y/N):`).then(key => { + if(key.toLowerCase() == "y") + joke["flags"][allFlags[idx]] = true; + else joke["flags"][allFlags[idx]] = false; + + return flagIteration(++idx); + }).catch(err => { + console.error(`Error: ${err}`); + return process.exit(1); + }); + } + }; + + let jokesFileName = `jokes-${jokeLang}.json`; + + let flagIterFinished = () => { + let fPath = join(settings.jokes.jokesFolderPath, jokesFileName); + + if(!fs.existsSync(fPath)) + fs.copySync(join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile), fPath); + + fs.readFile(fPath, (err, res) => { + if(!err) + { + let jokeFile = JSON.parse(res.toString()); + + joke = jokeSubmission.reformatJoke(joke); + + joke["id"] = jokeFile.jokes.length || 0; + + jokeFile.jokes.push(joke); + + fs.writeFile(fPath, JSON.stringify(jokeFile, null, 4), (err) => { + if(err) + { + console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); + process.exit(1); + } + else + { + console.clear(); + console.log(`${jsl.colors.fg.green}\nJoke was successfully added to file "${jokesFileName}":${jsl.colors.rst}\n\n${JSON.stringify(joke, null, 4)}\n\n\n`); + + jsl.pause("Add another joke? (y/N): ").then(key => { + if(key.toLowerCase() === "y") + { + console.clear(); + return init(); + } + else return process.exit(0); + }).catch(err => { + console.error(`Error: ${err}`); + return process.exit(1); + }); + } + }); + } + else + { + console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); + process.exit(1); + } + }); + } + + return flagIteration(0); + }; + + console.log(`Use "\\n" for a line break. Special characters like double quotes do not need to be escaped.\n`); + + if(joke["type"] != "twopart") + { + rl.resume(); + rl.question("Enter Joke: ", jokeText => { + rl.pause(); + joke["joke"] = jokeText.replace(/\\n/gm, "\n"); + + return contFlags(); + }); + } + else + { + rl.resume(); + rl.question("Enter Joke Setup: ", jokeSetup => { + rl.question("Enter Joke Delivery: ", jokeDelivery => { + rl.pause(); + joke["setup"] = jokeSetup.replace(/\\n/gm, "\n"); + joke["delivery"] = jokeDelivery.replace(/\\n/gm, "\n"); + + return contFlags(); + }); + }); + } +}; + +const getJokeCategory = () => { + return new Promise((resolve) => { + let catMP = new jsl.MenuPrompt({ + retryOnInvalid: true, + onFinished: res => { + resolve(settings.jokes.possible.categories[res[0].optionIndex]); + }, + autoSubmit: true + }); + let catOptions = []; + settings.jokes.possible.categories.forEach((cat, i) => { + catOptions.push({ + key: (i + 1), + description: cat + }); + }); + catMP.addMenu({ + title: "Choose Category", + options: catOptions + }); + catMP.open(); + }); +}; + +const getJokeType = () => { + return new Promise((resolve) => { + let typeMP = new jsl.MenuPrompt({ + retryOnInvalid: true, + onFinished: res => { + resolve(settings.jokes.possible.types[res[0].optionIndex]); + }, + autoSubmit: true + }); + let typeOptions = []; + settings.jokes.possible.types.forEach((type, i) => { + typeOptions.push({ + key: (i + 1), + description: type + }); + }); + typeMP.addMenu({ + title: "Choose Joke Type", + options: typeOptions + }); + typeMP.open(); + }); +}; + +function getJokeLang() +{ + return new Promise(resolve => { + let langRL = readline.createInterface(process.stdin, process.stdout); + + let tryGetLang = () => { + langRL.resume(); + langRL.question("Enter two-character language code (en): ", ans => { + langRL.pause(); + + if(!ans) + ans = settings.languages.defaultLanguage; + + ans = ans.toString().toLowerCase(); + + if(languages.isValidLang(ans) === true) + return resolve(ans); + else + { + console.clear(); + console.log(`\n${jsl.colors.fg.red}Invalid lang code!${jsl.colors.rst}\n\n`); + return tryGetLang(); + } + }); + } + + return tryGetLang(); + }); +} + +init(); diff --git a/tools/add-joke.js b/tools/add-joke.js index 7a5dcc9c..449832ba 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -1,215 +1,244 @@ -const jsl = require("svjsl"); -const readline = require("readline"); -const settings = require("../settings"); -const fs = require("fs-extra"); -const { join } = require("path"); +const prompt = require("prompts"); +const { colors, Errors } = require("svcorelib"); -const jokeSubmission = require("../src/jokeSubmission"); const languages = require("../src/languages"); +// const settings = require("../settings"); +const { validateSingle } = require("../src/parseJokes"); -const init = async () => { - let joke = {}; +const col = colors.fg; +const { exit } = process; - if(!process.stdin.isTTY) - { - console.log(`${jsl.colors.fg.red}Error: process doesn't have a stdin to read from${jsl.colors.rst}`); - process.exit(1); - } - - process.stdin.setRawMode(true); - await languages.init(); +/** @typedef {import("tsdef").NullableProps} NullableProps */ +/** @typedef {import("./types").AddJoke} AddJoke */ +/** @typedef {import("../src/types/jokes").Joke} Joke */ +/** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ - joke["category"] = await getJokeCategory(); - joke["type"] = await getJokeType(); - let jokeLang = await getJokeLang(); - let rl = readline.createInterface(process.stdin, process.stdout); - rl.pause(); +async function run() +{ + try + { + await init(); - let contFlags = () => { - process.stdout.write("\n"); + const joke = await promptJoke(); - joke["flags"] = {}; - let allFlags = settings.jokes.possible.flags; + // await saveJoke(joke); + } + catch(err) + { + exitError(err); + } +} - let flagIteration = idx => { - if(idx >= allFlags.length) - return flagIterFinished(); - else - { - jsl.pause(`Is this joke ${allFlags[idx]}? (y/N):`).then(key => { - if(key.toLowerCase() == "y") - joke["flags"][allFlags[idx]] = true; - else joke["flags"][allFlags[idx]] = false; - - return flagIteration(++idx); - }).catch(err => { - console.error(`Error: ${err}`); - return process.exit(1); - }); - } - }; - - let jokesFileName = `jokes-${jokeLang}.json`; +/** + * Initializes the add-joke script + * @returns {Promise} + */ +function init() +{ + return new Promise(async (res, rej) => { + try + { + languages.init(); - let flagIterFinished = () => { - let fPath = join(settings.jokes.jokesFolderPath, jokesFileName); + return res(); + } + catch(err) + { + const e = new Error(`Couldn't initialize: ${err.message}`).stack += err.stack; + return rej(e); + } + }); +} - if(!fs.existsSync(fPath)) - fs.copySync(join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile), fPath); +/** + * Prompts the user to enter all joke properties + * @param {Joke} currentJoke + * @returns {Promise} + */ +function promptJoke(currentJoke) +{ + return new Promise(async (res, rej) => { + try + { + if(!currentJoke) + currentJoke = createEmptyJoke(); + + /** + * Makes a title for the prompt below + * @param {string} propName Name of the property (case sensitive) + * @param {string} curProp The current value of the property to display + * @returns {string} + */ + const makeTitle = (propName, curProp) => { + const validationRes = validateSingle(currentJoke); + const valid = !Array.isArray(validationRes); + const titleCol = valid ? col.red : ""; + + return `${titleCol}${propName} (${col.rst}${curProp}${titleCol})${col.rst}`; + }; + + const jokeChoices = currentJoke.type === "single" ? [ + { + title: makeTitle("Joke", currentJoke.joke), + value: "joke", + }, + ] : [ + { + title: makeTitle("Setup", currentJoke.setup), + value: "setup", + }, + { + title: makeTitle("Delivery", currentJoke.delivery), + value: "delivery", + }, + ]; - fs.readFile(fPath, (err, res) => { - if(!err) + const choices = [ + { + title: makeTitle("Category", currentJoke.category), + value: "category", + }, + { + title: makeTitle("Type", currentJoke.type), + value: "type", + }, + ...jokeChoices, + { + title: makeTitle("Flags", extractFlags(currentJoke.joke)), + value: "flags", + }, { - let jokeFile = JSON.parse(res.toString()); - - joke = jokeSubmission.reformatJoke(joke); - - joke["id"] = jokeFile.jokes.length || 0; - - jokeFile.jokes.push(joke); - - fs.writeFile(fPath, JSON.stringify(jokeFile, null, 4), (err) => { - if(err) - { - console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); - process.exit(1); - } - else - { - console.clear(); - console.log(`${jsl.colors.fg.green}\nJoke was successfully added to file "${jokesFileName}":${jsl.colors.rst}\n\n${JSON.stringify(joke, null, 4)}\n\n\n`); - - jsl.pause("Add another joke? (y/N): ").then(key => { - if(key.toLowerCase() === "y") - { - console.clear(); - return init(); - } - else return process.exit(0); - }).catch(err => { - console.error(`Error: ${err}`); - return process.exit(1); - }); - } - }); - } - else + title: makeTitle("Safe", currentJoke.safe), + value: "safe", + }, { - console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); - process.exit(1); - } + title: `${col.green}[Submit]${col.rst}`, + value: "submit", + }, + { + title: `${col.red}[Exit]${col.rst}`, + value: "exit", + }, + ]; + + process.stdout.write("\n"); + + const { editProperty } = await prompt({ + message: "Edit property", + type: "select", + name: "editProperty", + hint: "- Use arrow-keys. Return to select. Esc or Ctrl+C to submit.", + choices, }); - } - return flagIteration(0); - }; + switch(editProperty) + { + case "category": - console.log(`Use "\\n" for a line break. Special characters like double quotes do not need to be escaped.\n`); + break; + case "type": - if(joke["type"] != "twopart") - { - rl.resume(); - rl.question("Enter Joke: ", jokeText => { - rl.pause(); - joke["joke"] = jokeText.replace(/\\n/gm, "\n"); + break; + case "joke": - return contFlags(); - }); - } - else - { - rl.resume(); - rl.question("Enter Joke Setup: ", jokeSetup => { - rl.question("Enter Joke Delivery: ", jokeDelivery => { - rl.pause(); - joke["setup"] = jokeSetup.replace(/\\n/gm, "\n"); - joke["delivery"] = jokeDelivery.replace(/\\n/gm, "\n"); - - return contFlags(); - }); - }); - } -}; - -const getJokeCategory = () => { - return new Promise((resolve) => { - let catMP = new jsl.MenuPrompt({ - retryOnInvalid: true, - onFinished: res => { - resolve(settings.jokes.possible.categories[res[0].optionIndex]); - }, - autoSubmit: true - }); - let catOptions = []; - settings.jokes.possible.categories.forEach((cat, i) => { - catOptions.push({ - key: (i + 1), - description: cat - }); - }); - catMP.addMenu({ - title: "Choose Category", - options: catOptions - }); - catMP.open(); - }); -}; - -const getJokeType = () => { - return new Promise((resolve) => { - let typeMP = new jsl.MenuPrompt({ - retryOnInvalid: true, - onFinished: res => { - resolve(settings.jokes.possible.types[res[0].optionIndex]); - }, - autoSubmit: true - }); - let typeOptions = []; - settings.jokes.possible.types.forEach((type, i) => { - typeOptions.push({ - key: (i + 1), - description: type - }); - }); - typeMP.addMenu({ - title: "Choose Joke Type", - options: typeOptions - }); - typeMP.open(); - }); -}; + break; + case "setup": -function getJokeLang() -{ - return new Promise(resolve => { - let langRL = readline.createInterface(process.stdin, process.stdout); + break; + case "delivery": - let tryGetLang = () => { - langRL.resume(); - langRL.question("Enter two-character language code (en): ", ans => { - langRL.pause(); + break; + case "flags": - if(!ans) - ans = settings.languages.defaultLanguage; + break; + case "safe": - ans = ans.toString().toLowerCase(); + break; + case "submit": + return res(); + case "exit": + exit(0); + break; + default: + return exitError(new Error(`Selected invalid option '${editProperty}'`)); + } - if(languages.isValidLang(ans) === true) - return resolve(ans); - else - { - console.clear(); - console.log(`\n${jsl.colors.fg.red}Invalid lang code!${jsl.colors.rst}\n\n`); - return tryGetLang(); - } - }); + // TODO: } + catch(err) + { + const e = new Error(`Error while prompting for joke: ${err.message}`).stack += err.stack; + return rej(e); + } + }); +} + +/** + * Extracts flags of a joke submission, returning a string representation + * @param {JokeSubmission} joke + * @returns {string} Returns flags delimited with `, ` or "none" if no flags are set + */ +function extractFlags(joke) +{ + /** @type {JokeFlags[]} */ + const flags = []; - return tryGetLang(); + Object.keys(joke.flags).forEach(key => { + if(joke.flags[key] === true) + flags.push(key); }); + + return flags.length > 0 ? flags.join(", ") : "none"; } -init(); +/** + * Returns a joke where everything is set to a default but empty value + * @returns {NullableProps} + */ +function createEmptyJoke() +{ + return { + category: null, + type: "single", + joke: null, + flags: { + nsfw: false, + religious: false, + political: false, + racist: false, + sexist: false, + explicit: false, + }, + lang: "en", + safe: false, + }; +} + + +//#SECTION on execute + +try +{ + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else + run(); +} +catch(err) +{ + exitError(err); +} + +/** + * Prints an error and instantly queues exit with status 1 (all async tasks are immediately canceled) + * @param {Error} err + */ +function exitError(err) +{ + console.error(`${col.red}${err instanceof Error ? `${err.message}${col.rst}\n${err.stack}` : err.toString().replace(/\n/, `${col.rst}\n`)}${col.rst}\n`); + + exit(1); +} diff --git a/tools/submissions.js b/tools/submissions.js index 7dd6040f..0b0f2d04 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -809,5 +809,5 @@ catch(err) { console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); - exit(0); + exit(1); } diff --git a/tools/types.d.ts b/tools/types.d.ts index c0020d82..9379611d 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -1,8 +1,8 @@ -import { JokeSubmission } from "../src/types/jokes"; +import { Joke, JokeSubmission } from "../src/types/jokes"; import { LangCode } from "../src/types/languages"; -//#SECTION submissions +//#MARKER submissions /** * A single joke submission @@ -54,3 +54,11 @@ export interface Keypress { sequence?: string; code?: string; } + +//#MARKER add-joke + +export type AddJoke = Joke & { lang: LangCode, safe: boolean }; + +export type NullableObj = { + [P in keyof T]: (T[P] | null); +}; From 9a10cf8004d4f422060d5cfd1ace338bf881eef9 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sun, 24 Oct 2021 21:10:34 +0200 Subject: [PATCH 39/62] add-joke script stuff --- .vscode/launch.json | 2 +- src/translate.js | 8 ++- tools/add-joke.js | 131 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 116 insertions(+), 25 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6b84728e..58fab486 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -30,7 +30,7 @@ "console": "integratedTerminal" }, { - "program": "${workspaceFolder}/tools/submissions.js", + "program": "${workspaceFolder}/tools/add-joke.js", "name": "Tools/xy", "request": "launch", "type": "node", diff --git a/src/translate.js b/src/translate.js index feaf3e00..8686c564 100755 --- a/src/translate.js +++ b/src/translate.js @@ -5,7 +5,9 @@ const debug = require("./verboseLogging") const settings = require("../settings"); -var trFile = {}; +/** Whether this module was initialized */ +let initialized = false; +let trFile = {}; /** * Initializes the translation module by caching the translations so they only need to be read from disk once @@ -22,6 +24,7 @@ function init() { trFile = JSON.parse(res.toString()); debug("Translate", `Found ${Object.keys(trFile.tr).length} translations`); + initialized = true; return resolve(); } }); @@ -37,6 +40,9 @@ function init() */ function translate(lang, id, ...args) { + if(!initialized) + throw new Error("translate module isnt't initialized"); + if(!lang) lang = settings.languages.defaultLanguage; diff --git a/tools/add-joke.js b/tools/add-joke.js index 449832ba..a8be71fd 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -2,13 +2,22 @@ const prompt = require("prompts"); const { colors, Errors } = require("svcorelib"); const languages = require("../src/languages"); +const { init: trInit } = require("../src/translate"); // const settings = require("../settings"); const { validateSingle } = require("../src/parseJokes"); +const { writeFile } = require("fs-extra"); const col = colors.fg; const { exit } = process; +/** Global data that persists until the process exits */ +const data = { + /** Whether the init() function has been called yet */ + initialized: false, +}; + +//#SECTION types /** @typedef {import("tsdef").NullableProps} NullableProps */ /** @typedef {import("./types").AddJoke} AddJoke */ @@ -16,15 +25,61 @@ const { exit } = process; /** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ +//#MARKER init + +//#SECTION on execute + +try +{ + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else + run(); +} +catch(err) +{ + exitError(err); +} + +/** + * Prints an error and instantly queues exit with status 1 (all async tasks are immediately canceled) + * @param {Error} err + */ +function exitError(err) +{ + console.error(`${col.red}${err instanceof Error ? `${err.message}${col.rst}\n${err.stack}` : err.toString().replace(/\n/, `${col.rst}\n`)}${col.rst}\n`); + + exit(1); +} + async function run() { try { - await init(); + if(!data.initialized) + await init(); + + data.initialized = true; const joke = await promptJoke(); - // await saveJoke(joke); + await addJoke(joke); + + blankLine(); + + const { another } = await prompt({ + type: "confirm", + message: "Add another joke?", + name: "another", + initial: false, + }); + + if(another) + return run(); + + blankLine(); + + exit(0); } catch(err) { @@ -41,7 +96,9 @@ function init() return new Promise(async (res, rej) => { try { - languages.init(); + await languages.init(); + + await trInit(); return res(); } @@ -53,6 +110,8 @@ function init() }); } +//#MARKER prompts + /** * Prompts the user to enter all joke properties * @param {Joke} currentJoke @@ -176,6 +235,39 @@ function promptJoke(currentJoke) }); } +//#MARKER other + +/** + * Adds a joke to its language file + * @param {AddJoke} joke + * @returns {Promise} + */ +function addJoke(joke) +{ + return new Promise(async (res, rej) => { + try + { + const { lang } = joke; + + // TODO: + // - give ID to joke + // - validate joke, throw custom ValidationError to enable custom catching behavior + // - write joke to joke file + + await writeFile(); + + return res(); + } + catch(err) + { + const e = new Error(`Couldn't add joke: ${err.message}`).stack += err.stack; + return rej(e); + } + }); +} + +//#SECTION prompt deps + /** * Extracts flags of a joke submission, returning a string representation * @param {JokeSubmission} joke @@ -194,6 +286,8 @@ function extractFlags(joke) return flags.length > 0 ? flags.join(", ") : "none"; } +//#SECTION other deps + /** * Returns a joke where everything is set to a default but empty value * @returns {NullableProps} @@ -217,28 +311,19 @@ function createEmptyJoke() }; } - -//#SECTION on execute - -try -{ - if(!process.stdin.isTTY) - throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); - else - run(); -} -catch(err) -{ - exitError(err); -} - /** - * Prints an error and instantly queues exit with status 1 (all async tasks are immediately canceled) - * @param {Error} err + * Inserts a blank line (or more if `amount` is set) + * @param {number} [amount=1] */ -function exitError(err) +function blankLine(amount = 1) { - console.error(`${col.red}${err instanceof Error ? `${err.message}${col.rst}\n${err.stack}` : err.toString().replace(/\n/, `${col.rst}\n`)}${col.rst}\n`); + if(typeof amount !== "number") + throw new TypeError(`Parameter 'amount' is ${isNaN(amount) ? "NaN" : "not of type number"}`); - exit(1); + let lfChars = ""; + + for(let u = 0; u < amount; u++) + lfChars += "\n"; + + process.stdout.write(lfChars); } From 912c52865f003dd587fe8eccbc92250ea99fe14c Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sun, 24 Oct 2021 21:22:20 +0200 Subject: [PATCH 40/62] add-joke stuff again --- tools/add-joke.js | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tools/add-joke.js b/tools/add-joke.js index a8be71fd..8cf76ffa 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -83,7 +83,15 @@ async function run() } catch(err) { - exitError(err); + if(err instanceof ValidationError) + { + console.log("err msg: ", err.message); + console.log("err props:", err.invalidProps); + console.log("err date: ", err.date); + console.log(`err stack:\n${err.stack}`); + } + else + exitError(err); } } @@ -166,7 +174,7 @@ function promptJoke(currentJoke) }, ...jokeChoices, { - title: makeTitle("Flags", extractFlags(currentJoke.joke)), + title: makeTitle("Flags", extractFlags(currentJoke)), value: "flags", }, { @@ -217,7 +225,7 @@ function promptJoke(currentJoke) break; case "submit": - return res(); + return res(currentJoke); case "exit": exit(0); break; @@ -254,9 +262,15 @@ function addJoke(joke) // - validate joke, throw custom ValidationError to enable custom catching behavior // - write joke to joke file - await writeFile(); + //#DEBUG showing off how ValidationError works: + const invalidProps = [ "category", "joke" ]; + const valErr = new ValidationError(`Joke has ${invalidProps.length} invalid properties`); + valErr.invalidProps = invalidProps; + return rej(valErr); - return res(); + // await writeFile(); + + // return res(); } catch(err) { @@ -327,3 +341,18 @@ function blankLine(amount = 1) process.stdout.write(lfChars); } + +class ValidationError extends Errors.SCLError +{ + constructor(message, ...params) + { + super(message, ...params); + this.name = "Validation Error"; + + if(Error.captureStackTrace) + Error.captureStackTrace(this, ValidationError); + + /** @type {string[]} */ + this.invalidProps = []; + } +} From e50bf6bbbb8906d7347719d0ae7cd56d3f7332f1 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Sun, 24 Oct 2021 21:28:49 +0200 Subject: [PATCH 41/62] more stuff --- src/parseJokes.js | 18 +++++++++++++++++- tools/add-joke.js | 39 ++++++++++++++++----------------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/parseJokes.js b/src/parseJokes.js index 8048cf53..a999a8a0 100755 --- a/src/parseJokes.js +++ b/src/parseJokes.js @@ -2,6 +2,7 @@ const fs = require("fs-extra"); const jsl = require("svjsl"); +const { Errors } = require("svcorelib"); const settings = require("../settings"); const debug = require("./verboseLogging"); @@ -408,4 +409,19 @@ function resolveCategoryAliases(categories) return categories.map(cat => resolveCategoryAlias(cat)); } -module.exports = { init, validateSingle, resolveCategoryAlias, resolveCategoryAliases } +class ValidationError extends Errors.SCLError +{ + constructor(message, ...params) + { + super(message, ...params); + this.name = "Validation Error"; + + if(Error.captureStackTrace) + Error.captureStackTrace(this, ValidationError); + + /** @type {string[]} */ + this.invalidProps = []; + } +} + +module.exports = { ValidationError, init, validateSingle, resolveCategoryAlias, resolveCategoryAliases } diff --git a/tools/add-joke.js b/tools/add-joke.js index 8cf76ffa..16c4fd97 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -5,7 +5,7 @@ const languages = require("../src/languages"); const { init: trInit } = require("../src/translate"); // const settings = require("../settings"); -const { validateSingle } = require("../src/parseJokes"); +const { validateSingle, ValidationError } = require("../src/parseJokes"); const { writeFile } = require("fs-extra"); const col = colors.fg; @@ -248,7 +248,7 @@ function promptJoke(currentJoke) /** * Adds a joke to its language file * @param {AddJoke} joke - * @returns {Promise} + * @returns {Promise} if instance of ValidationError, some properties about validation results are added */ function addJoke(joke) { @@ -263,14 +263,22 @@ function addJoke(joke) // - write joke to joke file //#DEBUG showing off how ValidationError works: - const invalidProps = [ "category", "joke" ]; - const valErr = new ValidationError(`Joke has ${invalidProps.length} invalid properties`); - valErr.invalidProps = invalidProps; - return rej(valErr); + let errored = true; - // await writeFile(); + if(errored) + { + const invalidProps = [ "category", "joke" ]; + const err = new ValidationError(`Joke has ${invalidProps.length} invalid properties`); + err.invalidProps = invalidProps; + + return rej(err); + } + else + { + await writeFile(`TODO:jokes-${lang}.json`, ); - // return res(); + return res(); + } } catch(err) { @@ -341,18 +349,3 @@ function blankLine(amount = 1) process.stdout.write(lfChars); } - -class ValidationError extends Errors.SCLError -{ - constructor(message, ...params) - { - super(message, ...params); - this.name = "Validation Error"; - - if(Error.captureStackTrace) - Error.captureStackTrace(this, ValidationError); - - /** @type {string[]} */ - this.invalidProps = []; - } -} From f32f86466195f77e01836f10c184aabb9336e8d7 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 25 Oct 2021 09:08:16 +0200 Subject: [PATCH 42/62] add-joke edit props prompts --- tools/submissions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/submissions.js b/tools/submissions.js index 0b0f2d04..09aa570a 100755 --- a/tools/submissions.js +++ b/tools/submissions.js @@ -356,7 +356,7 @@ function editSubmission(sub) })).type; break; case "flags": - { + { const flagKeys = Object.keys(editedSub.joke.flags); const flagChoices = []; From 5a28d00a47bc96af755e1d4ab692827be62febbf Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 25 Oct 2021 09:08:25 +0200 Subject: [PATCH 43/62] tf --- tools/add-joke.js | 82 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/tools/add-joke.js b/tools/add-joke.js index 16c4fd97..c939c79a 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -1,12 +1,12 @@ const prompt = require("prompts"); -const { colors, Errors } = require("svcorelib"); +const { colors, Errors, isEmpty } = require("svcorelib"); +const { writeFile } = require("fs-extra"); const languages = require("../src/languages"); const { init: trInit } = require("../src/translate"); - -// const settings = require("../settings"); const { validateSingle, ValidationError } = require("../src/parseJokes"); -const { writeFile } = require("fs-extra"); + +const settings = require("../settings"); const col = colors.fg; const { exit } = process; @@ -204,25 +204,81 @@ function promptJoke(currentJoke) switch(editProperty) { case "category": + { + const catChoices = settings.jokes.possible.categories.map(cat => ({ title: cat, value: cat })); - break; - case "type": + const { category } = await prompt({ + type: "select", + message: `Select new category`, + name: "category", + choices: catChoices, + initial: settings.jokes.possible.categories.indexOf("Misc"), + }); + currentJoke.category = category; break; + } case "joke": - - break; case "setup": - - break; case "delivery": - + currentJoke[editProperty] = (await prompt({ + type: "text", + message: `Enter value for '${editProperty}' property`, + name: "val", + initial: currentJoke[editProperty] || "", + validate: (val) => (!isEmpty(val) && val.length >= settings.jokes.submissions.minLength), + })).val; + break; + case "type": + currentJoke.type = (await prompt({ + type: "select", + message: "Select a joke type", + choices: [ + { title: "Single", value: "single" }, + { title: "Two Part", value: "twopart" }, + ], + name: "type", + })).type; break; case "flags": + { + const flagKeys = Object.keys(currentJoke.flags); + const flagChoices = []; + + flagKeys.forEach(key => { + flagChoices.push({ + title: key, + selected: currentJoke.flags[key] === true, + }); + }); + + const { newFlags } = await prompt({ + type: "multiselect", + message: "Edit joke flags", + choices: flagChoices, + name: "newFlags", + instructions: false, + hint: "- arrow-keys to move, space to toggle, return to submit", + }); + + Object.keys(currentJoke.flags).forEach(key => { + currentJoke.flags[key] = false; + }); + + newFlags.forEach(setFlagIdx => { + const key = flagKeys[setFlagIdx]; + currentJoke.flags[key] = true; + }); break; + } case "safe": - + currentJoke.safe = (await prompt({ + type: "confirm", + message: "Is this joke safe?", + initial: false, + name: "safe", + })).safe; break; case "submit": return res(currentJoke); @@ -233,7 +289,7 @@ function promptJoke(currentJoke) return exitError(new Error(`Selected invalid option '${editProperty}'`)); } - // TODO: + return res(await promptJoke(currentJoke)); } catch(err) { From 6dba3c4dfe8953466f7c43a05eca727fce100333 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 25 Oct 2021 09:10:36 +0200 Subject: [PATCH 44/62] update eslint --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 37cb2c67..b8f3f77f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ }, "devDependencies": { "dependency-cruiser": "^10.0.6", - "eslint": "^8.0.1", + "eslint": "^8.1.0", "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", @@ -1880,9 +1880,9 @@ } }, "node_modules/eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", + "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.3", @@ -6693,9 +6693,9 @@ } }, "eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", + "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.3", diff --git a/package.json b/package.json index 89097241..dbd4508b 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ }, "devDependencies": { "dependency-cruiser": "^10.0.6", - "eslint": "^8.0.1", + "eslint": "^8.1.0", "lodash": "^4.17.21", "madge": "^4.0.1", "nyc": "^15.1.0", From ad30e02963ae00cf47afbe35848f7175af5142cb Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 26 Oct 2021 18:48:27 +0200 Subject: [PATCH 45/62] fix codeql issue --- tools/add-joke.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/add-joke.js b/tools/add-joke.js index 16c4fd97..b29c4648 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -47,7 +47,16 @@ catch(err) */ function exitError(err) { - console.error(`${col.red}${err instanceof Error ? `${err.message}${col.rst}\n${err.stack}` : err.toString().replace(/\n/, `${col.rst}\n`)}${col.rst}\n`); + if(!(err instanceof Error)) + { + console.error(`\n${col.red}${err.toString()}${col.rst}\n`); + exit(1); + } + + const stackLines = err.stack.toString().split(/\n/g); + stackLines.shift(); + const stackStr = stackLines.join("\n"); + console.error(`\n${col.red}${err.message.match(/(E|e)rror/) ? "" : "Error: "}${err.message}${col.rst}\n${stackStr}\n`); exit(1); } From 17891dd0c1170f7c54d6b33ab4ead335cbc48c03 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 26 Oct 2021 18:51:16 +0200 Subject: [PATCH 46/62] fix broken anchor --- docs/raw/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/raw/index.html b/docs/raw/index.html index a7ca50b3..b3ea04d3 100644 --- a/docs/raw/index.html +++ b/docs/raw/index.html @@ -919,7 +919,7 @@

By using this website and API you are agreeing to th -
§ Language Code:
+
§ Language Code:
GET /langcode/[Language] From 83898c2e8afe87120b425ed6b74476cea70c26ac Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 26 Oct 2021 19:32:29 +0200 Subject: [PATCH 47/62] lots of improvements to add-joke --- src/jokeSubmission.js | 2 +- src/parseJokes.js | 16 ++++--- tools/add-joke.js | 109 ++++++++++++++++++++++++++++++++---------- 3 files changed, 96 insertions(+), 31 deletions(-) diff --git a/src/jokeSubmission.js b/src/jokeSubmission.js index 48e6c4c4..a565f790 100755 --- a/src/jokeSubmission.js +++ b/src/jokeSubmission.js @@ -174,7 +174,7 @@ function reformatJoke(joke) retJoke = { ...retJoke, - category: parseJokes.resolveCategoryAlias(joke.category), + category: typeof joke.category === "string" ? parseJokes.resolveCategoryAlias(joke.category) : joke.category, type: joke.type }; diff --git a/src/parseJokes.js b/src/parseJokes.js index a999a8a0..1abf1844 100755 --- a/src/parseJokes.js +++ b/src/parseJokes.js @@ -19,6 +19,8 @@ const tr = require("./translate"); /** @type {CategoryAlias[]} */ var categoryAliases = []; +/** @type {number|undefined} */ +let jokeFormatVersion; /** @@ -192,7 +194,7 @@ function init() let fmtVer = allJokesObj.getFormatVersion("en"); module.exports.jokeFormatVersion = fmtVer; - this.jokeFormatVersion = fmtVer; + jokeFormatVersion = fmtVer; debug("JokeParser", `Done parsing all ${parsedJokesAmount} jokes. Errors: ${errors.length === 0 ? jsl.colors.fg.green : jsl.colors.fg.red}${errors.length}${jsl.colors.rst}`); @@ -299,9 +301,9 @@ function validateSingle(joke, lang) //#MARKER format version if(joke.formatVersion != null) { - if(joke.formatVersion != settings.jokes.jokesFormatVersion || joke.formatVersion != this.jokeFormatVersion) + if(joke.formatVersion != settings.jokes.jokesFormatVersion || joke.formatVersion != jokeFormatVersion) { - jokeErrors.push(tr(lang, "parseJokesFormatVersionMismatch", joke.formatVersion, this.jokeFormatVersion)); + jokeErrors.push(tr(lang, "parseJokesFormatVersionMismatch", joke.formatVersion, jokeFormatVersion)); // jokeObj.formatVersion = false; // TODO: version 2.3.2: repeat this for everything below } } @@ -324,15 +326,17 @@ function validateSingle(joke, lang) else jokeErrors.push(tr(lang, "parseJokesNoTypeProperty")); //#MARKER joke category - let jokeCat = resolveCategoryAlias(joke.category); + let jokeCat = typeof joke.category === "string" ? resolveCategoryAlias(joke.category) : joke.category; if(joke.category == null) jokeErrors.push(tr(lang, "parseJokesNoCategoryProperty")); + else if(typeof jokeCat !== "string") + jokeErrors.push(tr(lang, "parseJokesInvalidCategory")); else { let categoryValid = false; settings.jokes.possible.categories.forEach(cat => { - if(jokeCat.toLowerCase() == cat.toLowerCase()) + if(jokeCat.toLowerCase() === cat.toLowerCase()) categoryValid = true; }); if(!categoryValid) @@ -420,7 +424,7 @@ class ValidationError extends Errors.SCLError Error.captureStackTrace(this, ValidationError); /** @type {string[]} */ - this.invalidProps = []; + this.errors = []; } } diff --git a/tools/add-joke.js b/tools/add-joke.js index 907d8d93..29ef145c 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -1,10 +1,13 @@ const prompt = require("prompts"); -const { colors, Errors, isEmpty } = require("svcorelib"); -const { writeFile } = require("fs-extra"); +const { colors, Errors, isEmpty, filesystem, reserialize } = require("svcorelib"); +const { writeFile, copyFile, readFile } = require("fs-extra"); +const { join } = require("path"); const languages = require("../src/languages"); -const { init: trInit } = require("../src/translate"); -const { validateSingle, ValidationError } = require("../src/parseJokes"); +const translate = require("../src/translate"); +const parseJokes = require("../src/parseJokes"); +const { validateSingle, ValidationError } = parseJokes; +const { reformatJoke } = require("../src/jokeSubmission"); const settings = require("../settings"); @@ -92,15 +95,7 @@ async function run() } catch(err) { - if(err instanceof ValidationError) - { - console.log("err msg: ", err.message); - console.log("err props:", err.invalidProps); - console.log("err date: ", err.date); - console.log(`err stack:\n${err.stack}`); - } - else - exitError(err); + exitError(err); } } @@ -115,7 +110,9 @@ function init() { await languages.init(); - await trInit(); + await translate.init(); + + await parseJokes.init(); return res(); } @@ -153,7 +150,16 @@ function promptJoke(currentJoke) const valid = !Array.isArray(validationRes); const titleCol = valid ? col.red : ""; - return `${titleCol}${propName} (${col.rst}${curProp}${titleCol})${col.rst}`; + const truncateLength = 64; + + if(typeof curProp === "string" && curProp.length > truncateLength) + curProp = `${curProp.substr(0, truncateLength)}…`; + + const boolDeco = typeof curProp === "boolean" ? (curProp === true ? ` ${col.green}✔ ` : ` ${col.red}✘ `) : ""; + + const propCol = curProp != null ? col.blue : col.red; + + return `${titleCol}${propName}${col.rst} ${titleCol}(${col.rst}${propCol}${curProp}${col.rst}${boolDeco}${titleCol || col.rst})${col.rst}`; }; const jokeChoices = currentJoke.type === "single" ? [ @@ -186,6 +192,10 @@ function promptJoke(currentJoke) title: makeTitle("Flags", extractFlags(currentJoke)), value: "flags", }, + { + title: makeTitle("Language", currentJoke.lang), + value: "lang", + }, { title: makeTitle("Safe", currentJoke.safe), value: "safe", @@ -203,7 +213,7 @@ function promptJoke(currentJoke) process.stdout.write("\n"); const { editProperty } = await prompt({ - message: "Edit property", + message: "Edit new joke's properties", type: "select", name: "editProperty", hint: "- Use arrow-keys. Return to select. Esc or Ctrl+C to submit.", @@ -281,6 +291,15 @@ function promptJoke(currentJoke) break; } + case "lang": + currentJoke.lang = (await prompt({ + type: "text", + message: "Enter joke language", + initial: currentJoke.lang, + name: "lang", + validate: ((val) => languages.isValidLang(val, "en") === true), + })).lang; + break; case "safe": currentJoke.safe = (await prompt({ type: "confirm", @@ -292,8 +311,17 @@ function promptJoke(currentJoke) case "submit": return res(currentJoke); case "exit": - exit(0); + { + const { confirmExit } = await prompt({ + type: "confirm", + message: "Do you really want to exit?", + name: "confirmExit", + initial: true, + }); + + confirmExit && exit(0); break; + } default: return exitError(new Error(`Selected invalid option '${editProperty}'`)); } @@ -320,8 +348,32 @@ function addJoke(joke) return new Promise(async (res, rej) => { try { + const initialJoke = reserialize(joke); const { lang } = joke; + joke = reformatJoke(joke); + + const jokeFilePath = join(settings.jokes.jokesFolderPath, `jokes-${lang}.json`); + const templatePath = join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile); + + if(!(await filesystem.exists(jokeFilePath))) + await copyFile(templatePath, jokeFilePath); + + + /** @type {JokesFile} */ + const currentJokesFile = JSON.parse((await readFile(jokeFilePath)).toString()); + /** @type {any} */ + const currentJokes = reserialize(currentJokesFile.jokes); + + const lastId = currentJokes[currentJokes.length - 1].id; + + const validationRes = validateSingle(joke, lang); + + // ensure props match and strip extraneous props + joke.id = lastId + 1; + joke.lang && delete joke.lang; + joke.formatVersion && delete joke.formatVersion; + // TODO: // - give ID to joke // - validate joke, throw custom ValidationError to enable custom catching behavior @@ -332,11 +384,19 @@ function addJoke(joke) if(errored) { - const invalidProps = [ "category", "joke" ]; - const err = new ValidationError(`Joke has ${invalidProps.length} invalid properties`); - err.invalidProps = invalidProps; + console.error(`\n${col.red}Joke is invalid:${col.rst}\n - ${validationRes.join("\n - ")}\n`); - return rej(err); + const { retry } = await prompt({ + type: "confirm", + message: "Do you want to retry?", + name: "retry", + initial: true, + }); + + if(retry) + return promptJoke(initialJoke); + + exit(0); } else { @@ -347,7 +407,7 @@ function addJoke(joke) } catch(err) { - const e = new Error(`Couldn't add joke: ${err.message}`).stack += err.stack; + const e = new Error(`Couldn't save joke: ${err.message}`).stack += err.stack; return rej(e); } }); @@ -382,9 +442,10 @@ function extractFlags(joke) function createEmptyJoke() { return { - category: null, + formatVersion: 3, + category: undefined, type: "single", - joke: null, + joke: undefined, flags: { nsfw: false, religious: false, From 6d46bc028b853349bd49f1e529c5d70051e8980d Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Tue, 26 Oct 2021 19:38:47 +0200 Subject: [PATCH 48/62] finished add-joke script --- src/parseJokes.js | 17 +---------------- tools/add-joke.js | 32 ++++++++++++-------------------- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/src/parseJokes.js b/src/parseJokes.js index 1abf1844..c44ae1b7 100755 --- a/src/parseJokes.js +++ b/src/parseJokes.js @@ -413,19 +413,4 @@ function resolveCategoryAliases(categories) return categories.map(cat => resolveCategoryAlias(cat)); } -class ValidationError extends Errors.SCLError -{ - constructor(message, ...params) - { - super(message, ...params); - this.name = "Validation Error"; - - if(Error.captureStackTrace) - Error.captureStackTrace(this, ValidationError); - - /** @type {string[]} */ - this.errors = []; - } -} - -module.exports = { ValidationError, init, validateSingle, resolveCategoryAlias, resolveCategoryAliases } +module.exports = { init, validateSingle, resolveCategoryAlias, resolveCategoryAliases } diff --git a/tools/add-joke.js b/tools/add-joke.js index 29ef145c..40616db3 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -6,7 +6,7 @@ const { join } = require("path"); const languages = require("../src/languages"); const translate = require("../src/translate"); const parseJokes = require("../src/parseJokes"); -const { validateSingle, ValidationError } = parseJokes; +const { validateSingle } = parseJokes; const { reformatJoke } = require("../src/jokeSubmission"); const settings = require("../settings"); @@ -146,10 +146,6 @@ function promptJoke(currentJoke) * @returns {string} */ const makeTitle = (propName, curProp) => { - const validationRes = validateSingle(currentJoke); - const valid = !Array.isArray(validationRes); - const titleCol = valid ? col.red : ""; - const truncateLength = 64; if(typeof curProp === "string" && curProp.length > truncateLength) @@ -157,9 +153,9 @@ function promptJoke(currentJoke) const boolDeco = typeof curProp === "boolean" ? (curProp === true ? ` ${col.green}✔ ` : ` ${col.red}✘ `) : ""; - const propCol = curProp != null ? col.blue : col.red; + const propCol = curProp != null ? col.green : col.magenta; - return `${titleCol}${propName}${col.rst} ${titleCol}(${col.rst}${propCol}${curProp}${col.rst}${boolDeco}${titleCol || col.rst})${col.rst}`; + return `${propName}${col.rst} ${propCol}(${col.rst}${curProp}${col.rst}${boolDeco}${propCol})${col.rst}`; }; const jokeChoices = currentJoke.type === "single" ? [ @@ -304,7 +300,7 @@ function promptJoke(currentJoke) currentJoke.safe = (await prompt({ type: "confirm", message: "Is this joke safe?", - initial: false, + initial: true, name: "safe", })).safe; break; @@ -341,7 +337,7 @@ function promptJoke(currentJoke) /** * Adds a joke to its language file * @param {AddJoke} joke - * @returns {Promise} if instance of ValidationError, some properties about validation results are added + * @returns {Promise} */ function addJoke(joke) { @@ -351,8 +347,6 @@ function addJoke(joke) const initialJoke = reserialize(joke); const { lang } = joke; - joke = reformatJoke(joke); - const jokeFilePath = join(settings.jokes.jokesFolderPath, `jokes-${lang}.json`); const templatePath = join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile); @@ -374,15 +368,9 @@ function addJoke(joke) joke.lang && delete joke.lang; joke.formatVersion && delete joke.formatVersion; - // TODO: - // - give ID to joke - // - validate joke, throw custom ValidationError to enable custom catching behavior - // - write joke to joke file - - //#DEBUG showing off how ValidationError works: - let errored = true; + joke = reformatJoke(joke); - if(errored) + if(Array.isArray(validationRes)) { console.error(`\n${col.red}Joke is invalid:${col.rst}\n - ${validationRes.join("\n - ")}\n`); @@ -400,7 +388,11 @@ function addJoke(joke) } else { - await writeFile(`TODO:jokes-${lang}.json`, ); + currentJokes.push(joke); + + currentJokesFile.jokes = currentJokes; + + await writeFile(jokeFilePath, JSON.stringify(currentJokesFile, undefined, 4)); return res(); } From 44d81b5e2ef1469dd2b2fb2110bf0c3b71b64faf Mon Sep 17 00:00:00 2001 From: Sven Date: Wed, 27 Oct 2021 16:29:15 +0200 Subject: [PATCH 49/62] a few fixes --- data/translations.json | 10 ++++------ src/parseJokes.js | 6 ++++-- tools/add-joke.js | 11 ++++++++--- tools/types.d.ts | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/data/translations.json b/data/translations.json index 80b6d988..0b13a370 100755 --- a/data/translations.json +++ b/data/translations.json @@ -471,12 +471,10 @@ "cs": "Vlastnost \"lang\" je neplatná: %1", "it": "La proprietà \"lang\" non è valida: %1" }, - "parseJokesCantParseJson": { - "en": "Joke couldn't be parsed as JSON.", - "de": "Joke konnte nicht als JSON geparst werden.", - "ru": "Шутка не может быть разбита на JSON.", - "cs": "Vtip nelze parsovat jako JSON", - "it": "Barzelletta non può essere formattata come JSON" + "parseJokesCantParse": { + "en": "Joke couldn't be parsed: %1", + "de": "Joke konnte nicht geparst werden: %1", + "ru": "Шутка не может быть разбита: %1" }, "langModuleInitError": { "en": "Internal error: language module was not correctly initialized.", diff --git a/src/parseJokes.js b/src/parseJokes.js index c44ae1b7..6b6576f7 100755 --- a/src/parseJokes.js +++ b/src/parseJokes.js @@ -2,7 +2,6 @@ const fs = require("fs-extra"); const jsl = require("svjsl"); -const { Errors } = require("svcorelib"); const settings = require("../settings"); const debug = require("./verboseLogging"); @@ -378,7 +377,7 @@ function validateSingle(joke, lang) } catch(err) { - jokeErrors.push(tr(lang, "parseJokesCantParseJson")); + jokeErrors.push(tr(lang, "parseJokesCantParse", err.toString())); } if(jsl.isEmpty(jokeErrors)) @@ -396,6 +395,9 @@ function resolveCategoryAlias(category) { let cat = category; categoryAliases.forEach(catAlias => { + if(typeof category !== "string") + throw new TypeError(`Can't resolve category alias because '${category}' is not of type string`); + if(category.toLowerCase() == catAlias.alias.toLowerCase()) cat = catAlias.value; }); diff --git a/tools/add-joke.js b/tools/add-joke.js index 40616db3..ceb14c93 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -24,6 +24,7 @@ const data = { /** @typedef {import("tsdef").NullableProps} NullableProps */ /** @typedef {import("./types").AddJoke} AddJoke */ +/** @typedef {import("./types").Keypress} Keypress */ /** @typedef {import("../src/types/jokes").Joke} Joke */ /** @typedef {import("../src/types/jokes").JokeSubmission} JokeSubmission */ @@ -64,7 +65,11 @@ function exitError(err) exit(1); } -async function run() +/** + * Runs this tool + * @param {AddJoke} [incompleteJoke] + */ +async function run(incompleteJoke = undefined) { try { @@ -73,7 +78,7 @@ async function run() data.initialized = true; - const joke = await promptJoke(); + const joke = await promptJoke(incompleteJoke); await addJoke(joke); @@ -457,7 +462,7 @@ function createEmptyJoke() */ function blankLine(amount = 1) { - if(typeof amount !== "number") + if(typeof amount !== "number" || isNaN(amount)) throw new TypeError(`Parameter 'amount' is ${isNaN(amount) ? "NaN" : "not of type number"}`); let lfChars = ""; diff --git a/tools/types.d.ts b/tools/types.d.ts index 9379611d..b2cfb1e0 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -57,7 +57,7 @@ export interface Keypress { //#MARKER add-joke -export type AddJoke = Joke & { lang: LangCode, safe: boolean }; +export type AddJoke = Joke & { formatVersion: number, lang: LangCode, safe: boolean }; export type NullableObj = { [P in keyof T]: (T[P] | null); From 6d752d5be398661134b3c98f9a54300b538d33c4 Mon Sep 17 00:00:00 2001 From: Sven Date: Wed, 27 Oct 2021 16:33:52 +0200 Subject: [PATCH 50/62] update dependency --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8f3f77f..20425c6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", "prompts": "^2.4.2", - "rate-limiter-flexible": "^2.2.4", + "rate-limiter-flexible": "^2.3.2", "request-ip": "^2.1.3", "svcorelib": "^1.14.0", "svjsl": "^1.9.4", @@ -4166,9 +4166,9 @@ ] }, "node_modules/rate-limiter-flexible": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.3.1.tgz", - "integrity": "sha512-u4Ual0ssf/RHHxK3rqKo9W2S7ulVoNdCAOrsk1gR9JLtzqg7fGw+yaCeyBAEncsL2n6XqHh/0qJk3BPDn49BjA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.3.2.tgz", + "integrity": "sha512-Q9isA+O+L5opvwB9sYAj49SYA0EA7fndVIKne0M9OSVpzaSZm3fv/9vE61B0c9A7PvLAxzeu0l/tYM2+JTi6qw==" }, "node_modules/rc": { "version": "1.2.8", @@ -8426,9 +8426,9 @@ "dev": true }, "rate-limiter-flexible": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.3.1.tgz", - "integrity": "sha512-u4Ual0ssf/RHHxK3rqKo9W2S7ulVoNdCAOrsk1gR9JLtzqg7fGw+yaCeyBAEncsL2n6XqHh/0qJk3BPDn49BjA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.3.2.tgz", + "integrity": "sha512-Q9isA+O+L5opvwB9sYAj49SYA0EA7fndVIKne0M9OSVpzaSZm3fv/9vE61B0c9A7PvLAxzeu0l/tYM2+JTi6qw==" }, "rc": { "version": "1.2.8", diff --git a/package.json b/package.json index dbd4508b..3fe2dcc5 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "node-wrap": "^0.2.0", "promise-all-sequential": "^1.0.0", "prompts": "^2.4.2", - "rate-limiter-flexible": "^2.2.4", + "rate-limiter-flexible": "^2.3.2", "request-ip": "^2.1.3", "svcorelib": "^1.14.0", "svjsl": "^1.9.4", From 7afd81d76d54a12b4ae1087e7aacb2da4fc18483 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Wed, 27 Oct 2021 22:48:35 +0200 Subject: [PATCH 51/62] delete old add-joke --- tools/add-joke.bak.js | 215 ------------------------------------------ 1 file changed, 215 deletions(-) delete mode 100644 tools/add-joke.bak.js diff --git a/tools/add-joke.bak.js b/tools/add-joke.bak.js deleted file mode 100644 index 7a5dcc9c..00000000 --- a/tools/add-joke.bak.js +++ /dev/null @@ -1,215 +0,0 @@ -const jsl = require("svjsl"); -const readline = require("readline"); -const settings = require("../settings"); -const fs = require("fs-extra"); -const { join } = require("path"); - -const jokeSubmission = require("../src/jokeSubmission"); -const languages = require("../src/languages"); - - -const init = async () => { - let joke = {}; - - if(!process.stdin.isTTY) - { - console.log(`${jsl.colors.fg.red}Error: process doesn't have a stdin to read from${jsl.colors.rst}`); - process.exit(1); - } - - process.stdin.setRawMode(true); - - await languages.init(); - - joke["category"] = await getJokeCategory(); - joke["type"] = await getJokeType(); - let jokeLang = await getJokeLang(); - - let rl = readline.createInterface(process.stdin, process.stdout); - rl.pause(); - - let contFlags = () => { - process.stdout.write("\n"); - - joke["flags"] = {}; - let allFlags = settings.jokes.possible.flags; - - let flagIteration = idx => { - if(idx >= allFlags.length) - return flagIterFinished(); - else - { - jsl.pause(`Is this joke ${allFlags[idx]}? (y/N):`).then(key => { - if(key.toLowerCase() == "y") - joke["flags"][allFlags[idx]] = true; - else joke["flags"][allFlags[idx]] = false; - - return flagIteration(++idx); - }).catch(err => { - console.error(`Error: ${err}`); - return process.exit(1); - }); - } - }; - - let jokesFileName = `jokes-${jokeLang}.json`; - - let flagIterFinished = () => { - let fPath = join(settings.jokes.jokesFolderPath, jokesFileName); - - if(!fs.existsSync(fPath)) - fs.copySync(join(settings.jokes.jokesFolderPath, settings.jokes.jokesTemplateFile), fPath); - - fs.readFile(fPath, (err, res) => { - if(!err) - { - let jokeFile = JSON.parse(res.toString()); - - joke = jokeSubmission.reformatJoke(joke); - - joke["id"] = jokeFile.jokes.length || 0; - - jokeFile.jokes.push(joke); - - fs.writeFile(fPath, JSON.stringify(jokeFile, null, 4), (err) => { - if(err) - { - console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); - process.exit(1); - } - else - { - console.clear(); - console.log(`${jsl.colors.fg.green}\nJoke was successfully added to file "${jokesFileName}":${jsl.colors.rst}\n\n${JSON.stringify(joke, null, 4)}\n\n\n`); - - jsl.pause("Add another joke? (y/N): ").then(key => { - if(key.toLowerCase() === "y") - { - console.clear(); - return init(); - } - else return process.exit(0); - }).catch(err => { - console.error(`Error: ${err}`); - return process.exit(1); - }); - } - }); - } - else - { - console.log(`${jsl.colors.fg.red}\n${err}${jsl.colors.rst}\n\n`); - process.exit(1); - } - }); - } - - return flagIteration(0); - }; - - console.log(`Use "\\n" for a line break. Special characters like double quotes do not need to be escaped.\n`); - - if(joke["type"] != "twopart") - { - rl.resume(); - rl.question("Enter Joke: ", jokeText => { - rl.pause(); - joke["joke"] = jokeText.replace(/\\n/gm, "\n"); - - return contFlags(); - }); - } - else - { - rl.resume(); - rl.question("Enter Joke Setup: ", jokeSetup => { - rl.question("Enter Joke Delivery: ", jokeDelivery => { - rl.pause(); - joke["setup"] = jokeSetup.replace(/\\n/gm, "\n"); - joke["delivery"] = jokeDelivery.replace(/\\n/gm, "\n"); - - return contFlags(); - }); - }); - } -}; - -const getJokeCategory = () => { - return new Promise((resolve) => { - let catMP = new jsl.MenuPrompt({ - retryOnInvalid: true, - onFinished: res => { - resolve(settings.jokes.possible.categories[res[0].optionIndex]); - }, - autoSubmit: true - }); - let catOptions = []; - settings.jokes.possible.categories.forEach((cat, i) => { - catOptions.push({ - key: (i + 1), - description: cat - }); - }); - catMP.addMenu({ - title: "Choose Category", - options: catOptions - }); - catMP.open(); - }); -}; - -const getJokeType = () => { - return new Promise((resolve) => { - let typeMP = new jsl.MenuPrompt({ - retryOnInvalid: true, - onFinished: res => { - resolve(settings.jokes.possible.types[res[0].optionIndex]); - }, - autoSubmit: true - }); - let typeOptions = []; - settings.jokes.possible.types.forEach((type, i) => { - typeOptions.push({ - key: (i + 1), - description: type - }); - }); - typeMP.addMenu({ - title: "Choose Joke Type", - options: typeOptions - }); - typeMP.open(); - }); -}; - -function getJokeLang() -{ - return new Promise(resolve => { - let langRL = readline.createInterface(process.stdin, process.stdout); - - let tryGetLang = () => { - langRL.resume(); - langRL.question("Enter two-character language code (en): ", ans => { - langRL.pause(); - - if(!ans) - ans = settings.languages.defaultLanguage; - - ans = ans.toString().toLowerCase(); - - if(languages.isValidLang(ans) === true) - return resolve(ans); - else - { - console.clear(); - console.log(`\n${jsl.colors.fg.red}Invalid lang code!${jsl.colors.rst}\n\n`); - return tryGetLang(); - } - }); - } - - return tryGetLang(); - }); -} - -init(); From 55b904a975f7be212910fb8ff09cd54a34865f27 Mon Sep 17 00:00:00 2001 From: Sven Date: Thu, 28 Oct 2021 15:41:20 +0200 Subject: [PATCH 52/62] info script stuff --- tools/info.js | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/info.js b/tools/info.js index d3860bf2..46a8bc59 100644 --- a/tools/info.js +++ b/tools/info.js @@ -1,4 +1,6 @@ -const { Errors, colors } = require("svcorelib"); +const { Errors, colors, allOfType } = require("svcorelib"); + +const { getEnv } = require("../src/env"); const settings = require("../settings"); @@ -10,13 +12,26 @@ async function run() { try { + const { jokes, subm } = getInfo("submissions"); + + /** Decorates a value with colors and other stuff */ + const v = val => { + return `${Array.isArray(val) ? `(${val.length}) ` : ""}${col.green}${Array.isArray(val) && allOfType(val, "string") ? val.join(", ") : val}${col.rst}`; + }; + const lines = [ - `${settings.info.name} v${settings.info.version} - Info`, + `${settings.info.name} v${settings.info.version} [${getEnv()}] - Info`, + ``, + `${col.blue}Jokes:${col.rst}`, + ` Total amount: ${v(jokes.totalAmt)}`, + ` Joke languages: ${v(jokes.languages)}`, ``, - `TODO:`, + `${col.blue}Submissions:${col.rst}`, + ` Amount: ${v(subm.amount)}`, + ` Languages: ${v(subm.languages)}`, ]; - process.stdout.write(`${lines.join("\n")}\n`); + process.stdout.write(`\n${lines.join("\n")}\n\n`); exit(0); } @@ -27,6 +42,24 @@ async function run() } } +/** + * Returns all information about JokeAPI + */ +function getInfo() +{ + // mockup + return { + jokes: { + totalAmt: 420, + languages: [ "en", "de", "fr", "pt" ], + }, + subm: { + amount: 69, + languages: [ "en", "de" ], + } + } +} + //#SECTION on execute From 658a77cda3a6d16acf4266ad5c2b12a438ad7438 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 28 Oct 2021 20:40:03 +0200 Subject: [PATCH 53/62] fixed wrong format in reformatJoke function, yikes --- src/jokeSubmission.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jokeSubmission.js b/src/jokeSubmission.js index a565f790..1ccac442 100755 --- a/src/jokeSubmission.js +++ b/src/jokeSubmission.js @@ -202,12 +202,12 @@ function reformatJoke(joke) if(typeof retJoke.lang === "string") retJoke.lang = retJoke.lang.toLowerCase(); - + + retJoke.safe = joke.safe || false; + if(joke.id) retJoke.id = joke.id; - retJoke.safe = joke.safe || false; - return retJoke; } From 38a9ce6f73c7f59d7921de34a88ac0e44d6b7da0 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 28 Oct 2021 20:49:19 +0200 Subject: [PATCH 54/62] add a few more jokes --- data/jokes/jokes-en.json | 80 ++++++++++++++++++++++++++++++++++++++++ tools/add-joke.js | 3 ++ 2 files changed, 83 insertions(+) diff --git a/data/jokes/jokes-en.json b/data/jokes/jokes-en.json index 21d3ea80..861b23e1 100755 --- a/data/jokes/jokes-en.json +++ b/data/jokes/jokes-en.json @@ -4893,6 +4893,86 @@ }, "safe": false, "id": 310 + }, + { + "category": "Spooky", + "type": "twopart", + "setup": "What happened to the cannibal who showed up late to Halloween dinner?", + "delivery": "They gave him the cold shoulder.", + "flags": { + "nsfw": true, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": false, + "id": 311 + }, + { + "category": "Pun", + "type": "twopart", + "setup": "Do you know what killed the man who had a two ton pumpkin fall on him?", + "delivery": "He was squashed.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 312 + }, + { + "category": "Spooky", + "type": "twopart", + "setup": "I'm not saying my son is ugly...", + "delivery": "But on Halloween he went to tell the neighbors to turn down their TV and they gave him some candy.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 313 + }, + { + "category": "Pun", + "type": "twopart", + "setup": "What happened to the man who got behind on payments to his exorcist?", + "delivery": "He got repossessed.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": false + }, + "safe": true, + "id": 314 + }, + { + "category": "Spooky", + "type": "twopart", + "setup": "Why did the ghost go to the bar?", + "delivery": "To get sheet faced.", + "flags": { + "nsfw": false, + "religious": false, + "political": false, + "racist": false, + "sexist": false, + "explicit": true + }, + "safe": false, + "id": 315 } ] } \ No newline at end of file diff --git a/tools/add-joke.js b/tools/add-joke.js index ceb14c93..858dba31 100755 --- a/tools/add-joke.js +++ b/tools/add-joke.js @@ -92,7 +92,10 @@ async function run(incompleteJoke = undefined) }); if(another) + { + blankLine(2); return run(); + } blankLine(); From 2cbca6f814c04fdbef7b881729e6e9e3d7696a08 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 28 Oct 2021 20:57:52 +0200 Subject: [PATCH 55/62] changelog --- changelog.md | 5 +++-- changelog.txt | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index 1b9e9b1e..12093e92 100644 --- a/changelog.md +++ b/changelog.md @@ -11,9 +11,10 @@


-## [CURRENT: 2.3.2] - Spooky seasonal update 2021 -- Added new jokes (especially from the "Spooky" category, for Halloween) +## [CURRENT: 2.3.2] - Joke update +- Added new jokes - Rewrote the submission script to make it much more streamlined ([issue #340](https://github.com/Sv443/JokeAPI/issues/340)) +- Rewrote the add-joke script so it's easier for me to use - Added a global CLI interface ([issue #344](https://github.com/Sv443/JokeAPI/issues/344)) - API now adjusts environment-dependent settings automatically ([issue #343](https://github.com/Sv443/JokeAPI/issues/343)) diff --git a/changelog.txt b/changelog.txt index 4a79fb96..bd62102a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -11,9 +11,10 @@ - Serve docs with nginx to speed up page load times (issue #118) -[CURRENT: 2.3.2] - Spooky seasonal update 2021 - - Added new jokes (especially from the "Spooky" category, for Halloween) +[CURRENT: 2.3.2] - Joke update + - Added new jokes - Rewrote the submission script to make it much more streamlined (issue #340) + - Rewrote the add-joke script so it's easier for me to use - Added a global CLI interface (issue #344) - API now adjusts environment-dependent settings automatically (issue #343) From 04129929c27d49e63d65f7bff6f18700e2c6da56 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 28 Oct 2021 21:29:43 +0200 Subject: [PATCH 56/62] info script improvements --- .vscode/launch.json | 2 +- tools/info.js | 86 +++++++++++++++++++++++++++++++++++++++------ tools/types.d.ts | 8 +++++ 3 files changed, 85 insertions(+), 11 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 58fab486..12ee2a33 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -30,7 +30,7 @@ "console": "integratedTerminal" }, { - "program": "${workspaceFolder}/tools/add-joke.js", + "program": "${workspaceFolder}/tools/info.js", "name": "Tools/xy", "request": "launch", "type": "node", diff --git a/tools/info.js b/tools/info.js index 46a8bc59..8802f1c6 100644 --- a/tools/info.js +++ b/tools/info.js @@ -1,22 +1,48 @@ const { Errors, colors, allOfType } = require("svcorelib"); +const { join, resolve } = require("path"); const { getEnv } = require("../src/env"); +const parseJokes = require("../src/parseJokes"); +const languages = require("../src/languages"); +const translate = require("../src/translate"); const settings = require("../settings"); +const { readdir } = require("fs-extra"); const col = colors.fg; const { exit } = process; +/** @typedef {import("./types").SubmissionCountResult} SubmissionCountResult */ + + async function run() { try { - const { jokes, subm } = getInfo("submissions"); + try + { + await languages.init(); + + await translate.init(); + + await parseJokes.init(); + } + catch(err) + { + console.log(`\n${col.red}Error while initializing:${col.rst}${err instanceof Error ? `${err.message}\n${err.stack}` : `\n${err.toString()}`}\n`); + exit(1); + } + + const { jokes, subm } = await getInfo("submissions"); /** Decorates a value with colors and other stuff */ const v = val => { - return `${Array.isArray(val) ? `(${val.length}) ` : ""}${col.green}${Array.isArray(val) && allOfType(val, "string") ? val.join(", ") : val}${col.rst}`; + const valCol = typeof val === "number" ? (val > 0 ? col.green : col.yellow) : ""; + const counter = Array.isArray(val) ? `${val.length === 0 ? `${col.yellow}(` : `(${col.green}`}${val.length}${val.length !== 0 ? col.rst : ""})${col.rst} ` : ""; + const value = Array.isArray(val) && allOfType(val, "string") ? val.join(`${col.rst}, ${valCol}`) : val; + + return `${counter}${valCol}${value}${col.rst}`; }; const lines = [ @@ -37,7 +63,7 @@ async function run() } catch(err) { - console.log(`\n${col.red}Error while displaying info:${col.rst}\n${err}\n`); + console.log(`\n${col.red}Error while displaying info:${col.rst}${err instanceof Error ? `${err.message}\n${err.stack}` : `\n${err.toString()}`}\n`); exit(1); } } @@ -45,21 +71,61 @@ async function run() /** * Returns all information about JokeAPI */ -function getInfo() +async function getInfo() { - // mockup + const { allJokes } = parseJokes; + + const jokeLangs = Object.keys(allJokes.getJokeCountPerLang()); + + const { submCount, submLangs } = await getSubmissionCount(); + + // TODO: return { jokes: { - totalAmt: 420, - languages: [ "en", "de", "fr", "pt" ], + totalAmt: allJokes._jokeCount, + languages: jokeLangs, }, subm: { - amount: 69, - languages: [ "en", "de" ], - } + amount: submCount, + languages: submLangs, + }, + // ... } } +/** + * Resolves with the amount of submissions JokeAPI has saved locally + * @returns {Promise} + */ +function getSubmissionCount() +{ + return new Promise(async (res, rej) => { + try + { + const submBasePath = resolve(settings.jokes.jokeSubmissionPath); + + const langs = await readdir(submBasePath); + + const submFolders = langs.map(lang => join(submBasePath, lang)); + + const submissionFiles = []; + + for await(const folder of submFolders) + (await readdir(folder)) + .forEach(file => submissionFiles.push(file)); + + return res({ + submCount: submissionFiles.length, + submLangs: langs, + }); + } + catch(err) + { + return rej(err); + } + }); +} + //#SECTION on execute diff --git a/tools/types.d.ts b/tools/types.d.ts index b2cfb1e0..210299f6 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -62,3 +62,11 @@ export type AddJoke = Joke & { formatVersion: number, lang: LangCode, safe: bool export type NullableObj = { [P in keyof T]: (T[P] | null); }; + +//#MARKER info + +export interface SubmissionCountResult +{ + submCount: number; + submLangs: LangCode[]; +} From 6559cdef95ceaf4b0f7dcaa31543e5b540c2c575 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Thu, 28 Oct 2021 21:33:11 +0200 Subject: [PATCH 57/62] changelog --- changelog.md | 1 + changelog.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/changelog.md b/changelog.md index 12093e92..a170d703 100644 --- a/changelog.md +++ b/changelog.md @@ -15,6 +15,7 @@ - Added new jokes - Rewrote the submission script to make it much more streamlined ([issue #340](https://github.com/Sv443/JokeAPI/issues/340)) - Rewrote the add-joke script so it's easier for me to use +- Added a new info script to make working with JokeAPI easier for me - Added a global CLI interface ([issue #344](https://github.com/Sv443/JokeAPI/issues/344)) - API now adjusts environment-dependent settings automatically ([issue #343](https://github.com/Sv443/JokeAPI/issues/343)) diff --git a/changelog.txt b/changelog.txt index bd62102a..013d4320 100644 --- a/changelog.txt +++ b/changelog.txt @@ -15,6 +15,7 @@ - Added new jokes - Rewrote the submission script to make it much more streamlined (issue #340) - Rewrote the add-joke script so it's easier for me to use + - Added a new info script to make working with JokeAPI easier for me - Added a global CLI interface (issue #344) - API now adjusts environment-dependent settings automatically (issue #343) From 20d8c195c90d3e0e52d9d9c0c20b9130d2895d1c Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 29 Oct 2021 15:59:01 +0200 Subject: [PATCH 58/62] info script stuff --- src/env.js | 24 ++++++++++++++++++------ tools/info.js | 48 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/src/env.js b/src/env.js index 2e084ac4..0f4f84d1 100644 --- a/src/env.js +++ b/src/env.js @@ -1,5 +1,9 @@ const dotenv = require("dotenv"); +const { colors } = require("svcorelib"); + +const col = colors.fg; + /** @typedef {import("svcorelib").JSONCompatible} JSONCompatible*/ /** @typedef {import("./types/env").Env} Env */ /** @typedef {import("./types/env").EnvDependentProp} EnvDependentProp */ @@ -36,26 +40,34 @@ function init() /** * Normalizes the deployment environment passed as the env var `NODE_ENV` and returns it + * @param {boolean} [colored=false] Set to `true` to color in the predefined env colors * @returns {Env} */ -function getEnv() +function getEnv(colored = false) { if(!initialized) init(); if(!process.env) - return "stage"; + throw new Error("no process environment found, please make sure a NODE_ENV variable is defined"); const nodeEnv = process.env.NODE_ENV ? process.env.NODE_ENV.toLowerCase() : null; + + /** @type {Env} */ + let env = "stage"; + switch(nodeEnv) { - case "prod": - case "production": - return "prod"; + case "prod": + case "production": + env = "prod"; + break; } - return "stage"; + const envCol = env === "prod" ? col.green : col.cyan; + + return colored === true ? `${envCol}${env}${col.rst}` : env; } /** diff --git a/tools/info.js b/tools/info.js index 8802f1c6..a8b4fc7e 100644 --- a/tools/info.js +++ b/tools/info.js @@ -1,7 +1,7 @@ const { Errors, colors, allOfType } = require("svcorelib"); const { join, resolve } = require("path"); -const { getEnv } = require("../src/env"); +const { getEnv, getProp } = require("../src/env"); const parseJokes = require("../src/parseJokes"); const languages = require("../src/languages"); @@ -13,6 +13,7 @@ const col = colors.fg; const { exit } = process; +/** @typedef {import("svcorelib").Stringifiable} Stringifiable */ /** @typedef {import("./types").SubmissionCountResult} SubmissionCountResult */ @@ -34,27 +35,47 @@ async function run() exit(1); } - const { jokes, subm } = await getInfo("submissions"); + /** + * Decorates an array value with colors and other stuff + * @param {Stringifiable[]} val + */ + const n = val => { + const ln = val.length; - /** Decorates a value with colors and other stuff */ + const lhs = `(${ln > 0 ? "" : col.yellow}${val.length}${col.rst})`; + const rhs = `${col.green}${val.join(`${col.rst}, ${col.green}`)}${col.rst}`; + return `${lhs}: ${rhs}`; + }; + + /** + * Decorates a value with colors and other stuff + * @param {number|string} val + */ const v = val => { - const valCol = typeof val === "number" ? (val > 0 ? col.green : col.yellow) : ""; - const counter = Array.isArray(val) ? `${val.length === 0 ? `${col.yellow}(` : `(${col.green}`}${val.length}${val.length !== 0 ? col.rst : ""})${col.rst} ` : ""; + const valCol = typeof val === "number" ? (val > 0 ? col.green : col.yellow) : col.green; const value = Array.isArray(val) && allOfType(val, "string") ? val.join(`${col.rst}, ${valCol}`) : val; - return `${counter}${valCol}${value}${col.rst}`; + return ` ${valCol}${value}${col.rst}`; }; + + const { jokes, subm, http } = await getInfo("submissions"); + + /** The lines that get printed to the console to display JokeAPI's info */ const lines = [ - `${settings.info.name} v${settings.info.version} [${getEnv()}] - Info`, + `${col.blue}${settings.info.name}${col.rst} v${settings.info.version} [${getEnv(true)}] - Info`, ``, `${col.blue}Jokes:${col.rst}`, - ` Total amount: ${v(jokes.totalAmt)}`, - ` Joke languages: ${v(jokes.languages)}`, + ` Total amount: ${v(jokes.totalAmt)}`, + ` Joke languages ${n(jokes.languages)}`, ``, `${col.blue}Submissions:${col.rst}`, - ` Amount: ${v(subm.amount)}`, - ` Languages: ${v(subm.languages)}`, + ` Amount: ${v(subm.amount)}`, + ` Languages ${n(subm.languages)}`, + ``, + `${col.blue}HTTP Server:${col.rst}`, + ` Port: ${v(http.port)}`, + ` BaseURL: ${v(http.baseUrl)}`, ]; process.stdout.write(`\n${lines.join("\n")}\n\n`); @@ -79,7 +100,6 @@ async function getInfo() const { submCount, submLangs } = await getSubmissionCount(); - // TODO: return { jokes: { totalAmt: allJokes._jokeCount, @@ -89,6 +109,10 @@ async function getInfo() amount: submCount, languages: submLangs, }, + http: { + port: getProp("httpPort"), + baseUrl: getProp("baseUrl"), + }, // ... } } From 435e799e556b6d71a10d5260f2ac3d3e7c4f7b9d Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 29 Oct 2021 16:02:36 +0200 Subject: [PATCH 59/62] mode info script --- tools/info.js | 15 ++++++++++----- tools/types.d.ts | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tools/info.js b/tools/info.js index a8b4fc7e..8eecf312 100644 --- a/tools/info.js +++ b/tools/info.js @@ -14,7 +14,8 @@ const { exit } = process; /** @typedef {import("svcorelib").Stringifiable} Stringifiable */ -/** @typedef {import("./types").SubmissionCountResult} SubmissionCountResult */ +/** @typedef {import("./types").SubmissionInfoResult} SubmissionInfoResult */ +/** @typedef {import("../src/types/languages").LangCode} LangCode */ async function run() @@ -96,19 +97,23 @@ async function getInfo() { const { allJokes } = parseJokes; + /** @type {LangCode[]} */ const jokeLangs = Object.keys(allJokes.getJokeCountPerLang()); - const { submCount, submLangs } = await getSubmissionCount(); + const { submCount, submLangs } = await getSubmissionInfo(); return { + /** Internal jokes */ jokes: { totalAmt: allJokes._jokeCount, languages: jokeLangs, }, + /** Joke submissions */ subm: { amount: submCount, languages: submLangs, }, + /** HTTP server */ http: { port: getProp("httpPort"), baseUrl: getProp("baseUrl"), @@ -118,10 +123,10 @@ async function getInfo() } /** - * Resolves with the amount of submissions JokeAPI has saved locally - * @returns {Promise} + * Resolves with some info about the submissions JokeAPI has received + * @returns {Promise} */ -function getSubmissionCount() +function getSubmissionInfo() { return new Promise(async (res, rej) => { try diff --git a/tools/types.d.ts b/tools/types.d.ts index 210299f6..700b7726 100644 --- a/tools/types.d.ts +++ b/tools/types.d.ts @@ -65,7 +65,7 @@ export type NullableObj = { //#MARKER info -export interface SubmissionCountResult +export interface SubmissionInfoResult { submCount: number; submLangs: LangCode[]; From 77b348ad65d972b28300ff4194bb87136a74b536 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 29 Oct 2021 16:03:18 +0200 Subject: [PATCH 60/62] finished --- tools/info.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/tools/info.js b/tools/info.js index 8eecf312..d36c325f 100644 --- a/tools/info.js +++ b/tools/info.js @@ -158,16 +158,18 @@ function getSubmissionInfo() //#SECTION on execute -try -{ - if(!process.stdin.isTTY) - throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); - else - run(); -} -catch(err) -{ - console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); +(() => { + try + { + if(!process.stdin.isTTY) + throw new Errors.NoStdinError("The process doesn't have an stdin channel to read input from"); + else + run(); + } + catch(err) + { + console.error(`${col.red}${err.message}${col.rst}\n${err.stack}\n`); - exit(0); -} + exit(0); + } +})(); From b9083bfd70656ba08eb6c3d48d6c2412afc8bc23 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 29 Oct 2021 16:25:42 +0200 Subject: [PATCH 61/62] set engine requirements --- package-lock.json | 3 +++ package.json | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/package-lock.json b/package-lock.json index 20425c6d..76e7df0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,9 @@ "snyk": "^1.742.0", "table": "^6.0.1", "tsdef": "^0.0.14" + }, + "engines": { + "npm": "^7.0.0" } }, "node_modules/@babel/compat-data": { diff --git a/package.json b/package.json index 3fe2dcc5..bc539653 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,10 @@ "url": "https://github.com/Sv443/JokeAPI/issues/new/choose", "email": "contact@sv443.net" }, + "engines": { + "node": "^11.7.0", + "npm": "^7.0.0" + }, "dependencies": { "@pm2/io": "^5.0.0", "dotenv": "^10.0.0", From b8487844c5484a9f4002fc7f8b4ace4e4afbf640 Mon Sep 17 00:00:00 2001 From: Sven Fehler Date: Fri, 29 Oct 2021 16:26:42 +0200 Subject: [PATCH 62/62] fixed it --- package-lock.json | 3 ++- package.json | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76e7df0f..674ea058 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,8 @@ "tsdef": "^0.0.14" }, "engines": { - "npm": "^7.0.0" + "node": ">=11.7.0", + "npm": ">=7.0.0" } }, "node_modules/@babel/compat-data": { diff --git a/package.json b/package.json index bc539653..55aae366 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "email": "contact@sv443.net" }, "engines": { - "node": "^11.7.0", - "npm": "^7.0.0" + "node": ">=11.7.0", + "npm": ">=7.0.0" }, "dependencies": { "@pm2/io": "^5.0.0",