diff --git a/package-lock.json b/package-lock.json index 76f37fe..a46f7d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "node-cron": "^3.0.2", "pino": "^8.15.0", "pino-http": "^8.4.0", + "pino-pretty": "^10.2.0", "promised-sqlite3": "^2.1.0", "undici": "^5.23.0" }, @@ -413,8 +414,7 @@ "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/commander": { "version": "10.0.1", @@ -467,6 +467,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -532,6 +540,14 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -683,6 +699,11 @@ "node": ">= 0.8" } }, + "node_modules/fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, "node_modules/fast-redact": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", @@ -691,6 +712,11 @@ "node": ">=6" } }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -864,6 +890,52 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/help-me/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -1088,6 +1160,14 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "optional": true }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, "node_modules/knex": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/knex/-/knex-2.5.1.tgz", @@ -1290,6 +1370,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -1683,6 +1771,45 @@ "process-warning": "^2.0.0" } }, + "node_modules/pino-pretty": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.2.0.tgz", + "integrity": "sha512-tRvpyEmGtc2D+Lr3FulIZ+R1baggQ4S3xD2Ar93KixFEDx6SEAUP3W5aYuEw1C73d6ROrNcB2IXLteW8itlwhA==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/pino-std-serializers": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", @@ -1740,6 +1867,15 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -1906,6 +2042,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -2160,6 +2301,17 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", diff --git a/package.json b/package.json index 3597af6..bf9015e 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "node-cron": "^3.0.2", "pino": "^8.15.0", "pino-http": "^8.4.0", + "pino-pretty": "^10.2.0", "promised-sqlite3": "^2.1.0", "undici": "^5.23.0" } diff --git a/src/checkAndPublish.mjs b/src/checkAndPublish.mjs index dd2028b..6238580 100644 --- a/src/checkAndPublish.mjs +++ b/src/checkAndPublish.mjs @@ -4,16 +4,14 @@ import makeText from "./makeText.mjs" import insertPublished from "./insertPublished.mjs" import logger from "./logger.mjs" import todaysPromptAlreadyPublished from "./todaysPromptAlreadyPublished.mjs" -const maxCount = 30000000 -const minCount = 200000 -const spamMode = false + export default async function checkAndPublish () { logger.trace("checkAndPublish called") logger.trace(todaysPromptAlreadyPublished()) if(!await todaysPromptAlreadyPublished()){ try { - const prompt = await getNewPrompt({ minCount, maxCount, rarityBias: 0.7 }) + const prompt = await getNewPrompt() try { const text = makeText(prompt) try { diff --git a/src/config.mjs b/src/config.mjs new file mode 100644 index 0000000..deb2f34 --- /dev/null +++ b/src/config.mjs @@ -0,0 +1,6 @@ +export default { + maxCount : 30000000, + minCount : 200000, + rarityBias: 0.7, + spamMode : false +} \ No newline at end of file diff --git a/src/createNote.mjs b/src/createNote.mjs index 4d93d7d..855973f 100644 --- a/src/createNote.mjs +++ b/src/createNote.mjs @@ -14,7 +14,7 @@ setGlobalDispatcher(agent) export default async function createNote(text) { const childLogger = logger.child({text}) childLogger.trace("createNote called") - const url = 'https://localhost:80/api/notes/create' + const url = 'http://localhost:3000/api/notes/create' const params = { text: text, } diff --git a/src/data/database b/src/data/database index 48854d0..83d777f 100644 Binary files a/src/data/database and b/src/data/database differ diff --git a/src/getAcceptablePrompts.mjs b/src/getAcceptablePrompts.mjs index 6cb5226..d3b0a6d 100644 --- a/src/getAcceptablePrompts.mjs +++ b/src/getAcceptablePrompts.mjs @@ -1,5 +1,6 @@ import logger from "./logger.mjs" import { db } from "./db.mjs" +import config from "./config.mjs" const blocklist = db.union([ db('bad_words').select('word'), @@ -8,14 +9,15 @@ const blocklist = db.union([ ]) export default async () => { + logger.trace("getAcceptablePrompt called") return db('dictionary') .select('*') .where({ derivative: 0, scientific: 0, }) - .andWhere('count', '<', maxCount) - .andWhere('count', '>', minCount) + .andWhere('count', '<', config.maxCount) + .andWhere('count', '>', config.minCount) .andWhere('word', 'not in', blocklist) .whereRaw('length(word) > 3') .whereNotNull('pronunciation') diff --git a/src/getNewPrompt.mjs b/src/getNewPrompt.mjs index 728ba5e..bb98ada 100644 --- a/src/getNewPrompt.mjs +++ b/src/getNewPrompt.mjs @@ -1,9 +1,9 @@ import logger from "./logger.mjs" import getAcceptablePrompts from "./getAcceptablePrompts.mjs" +import config from "./config.mjs" -export default async function getNewPrompt({ minCount = 200000, maxCount = 30000000, rarityBias = 0.5 }) { - const childLogger = logger.child({minCount,maxCount,rarityBias}) - childLogger.trace("getNewPrompt called") +export default async function getNewPrompt() { + logger.trace("getNewPrompt called") const getBiasedRng = (min, max, bias, influence) => { const random = Math.random() * (max - min) + min @@ -12,7 +12,7 @@ export default async function getNewPrompt({ minCount = 200000, maxCount = 30000 } const randomEntry = (array) => { - const random = getBiasedRng(0, 1, rarityBias, 1) + const random = getBiasedRng(0, 1, config.rarityBias, 1) const mix = Math.random() return array[ parseInt( diff --git a/src/index.mjs b/src/index.mjs index 4ac4283..57db91d 100644 --- a/src/index.mjs +++ b/src/index.mjs @@ -3,6 +3,7 @@ import bodyParser from "body-parser"; import logger from "./logger.mjs"; import pinoHTTP from 'pino-http' import start from "./start.mjs"; +import receiveMention from "./social-interaction/receiveMention.mjs"; const app = express() const port = 4000 app.use(bodyParser.json()) @@ -12,6 +13,7 @@ app.use( }) ) app.post('/api', (req,res) => { + receiveMention(req.body) logger.info("webhook received:",req.body.body.note.text) res.sendStatus(200) }) diff --git a/src/logger.mjs b/src/logger.mjs index 8114318..3c1b596 100644 --- a/src/logger.mjs +++ b/src/logger.mjs @@ -4,19 +4,25 @@ import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -const fileTransport = pino.transport({ - target: 'pino/file', - options: { destination: `${__dirname}/app.log` }, - }); - -export default pino({ - level: process.env.PINO_LOG_LEVEL || 'trace', - formatters: { +// const transport = pino.transport({ +// targets: [{ +// level: 'trace', +// target: 'pino-pretty' // must be installed separately +// }, { +// level: 'trace', +// target: 'pino/file', +// options: { destination: `${__dirname}/app.log` } +// }] +// }) +export default pino( + { + level: 'trace', + formatters: { level: (label) => { - return { severity: label.toUpperCase() }; + return { level: label.toUpperCase() }; }, + }, + timestamp: pino.stdTimeFunctions.isoTime, }, - timestamp: pino.stdTimeFunctions.isoTime, -}, -fileTransport -) \ No newline at end of file + //pino.destination(`${__dirname}/app.log`) + ); \ No newline at end of file diff --git a/src/social-interaction/receiveMention.mjs b/src/social-interaction/receiveMention.mjs new file mode 100644 index 0000000..7b8591b --- /dev/null +++ b/src/social-interaction/receiveMention.mjs @@ -0,0 +1,26 @@ +import logger from "../logger.mjs" +import getAcceptablePrompts from "../getAcceptablePrompts.mjs" +import { checkSpelling } from "spellchecker" + +export default async function (note) { + const childLogger = logger.child({note}) + childLogger.trace("receiveMention called") + const textArray = note.text + .replace(/@[a-z,A-Z,0-9]* /g, "") + .trim() + .match(/[a-z]*/ig) + if(textArray.length===1){ + const word = textArray[0] + if(checkSpelling(word)){ + if(await getAcceptablePrompts().indexOf(word)!=-1){ + + } + } + + + //ETC + }else if(textArray.length>1){ + //"Please reply with one word, I'm only a bot etc etc" + } + +} \ No newline at end of file