first commit

This commit is contained in:
Andrzej Stepien 2023-07-16 20:11:21 +02:00
commit 2ca923889e
8 changed files with 1541 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
node_modules/
src/data/
prod/
*.log

1382
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

16
package.json Normal file
View File

@ -0,0 +1,16 @@
{
"name": "micro365",
"version": "1.0.0",
"description": "a server that delivers daily writing prompts via REST API",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Andrzej Stepien",
"license": "GPL-3.0-or-later",
"devDependencies": {
"json-index": "^1.1.0",
"spellchecker": "^3.7.1",
"sqlite3": "^5.1.6"
}
}

View File

@ -0,0 +1,23 @@
const Spellchecker = require("spellchecker")
const sqlite3 = require("sqlite3").verbose()
const db = new sqlite3.Database("data/database")
db.serialize(() => {
db.each("SELECT * FROM prompts", [],
function (err, row) {
if (err) {
return console.error(err.message)
}
if (Spellchecker.isMisspelled(row.word)) {
db.run("DELETE from prompts WHERE word=?", [row.word], function (err) { if (err) { return console.error(err.message) } })
console.log(`deleted non-word ${row.word}`)
}
},
function (err, rows) {
if (err) { return console.error(err.message) }
console.log(`${rows} rows`)
db.close()
console.log("db closed")
})
})

49
src/importJSON.cjs Normal file
View File

@ -0,0 +1,49 @@
const StreamArray = require('stream-json/streamers/StreamArray');
const fs = require('fs');
const pipeline = fs.createReadStream('data/dp/wiktionary-grouped-objects-array.json').pipe(StreamArray.withParser());
const sqlite3 = require("sqlite3").verbose()
const db = new sqlite3.Database("data/database")
const queries = []
pipeline.on('data', data => {
const term = data.value.word
// if(term==="unpalatable"){console.log("test word found!!")}
const object = JSON.stringify(makeObject(data.value))
// db.run('UPDATE prompts SET object=? WHERE word=?',[object,term],
// function(err){
// if(err){return console.error(err.message)}
// console.log(`word: ${term} -- ${this.changes} changes`)
// console.log(`object: ${object}`)
// })
queries.push(`${queries}UPDATE prompts
SET object='${object}'
WHERE word='${term}';
`)
console.log(queries)
});
db.exec(queries.join()).close(err=>{
if(err){return console.error(err.message)}
console.log("Database closed successfully")
})
const makeObject = (obj) => {
const meaningsArray = []
obj.data.forEach(element => {
meaningsArray.push({
type:element.type,
definition:element.definition[0]
})
});
return {
word: obj.word,
pronunciation: obj.data[0].pronunciation,
meanings: meaningsArray
}
}

9
src/index.js Normal file
View File

@ -0,0 +1,9 @@
import makeToot from "./makeToot.js"
const word = "and"
const output = fetch(`https://api.dictionaryapi.dev/api/v2/entries/en/${word}`)
.then(res=>res.json()).then(json=>{
makeToot(json[0])
})

33
src/makeToot.js Normal file
View File

@ -0,0 +1,33 @@
export default function makeToot(data){
console.dir(data)
let newString = ""
const maxIterations = 3
for(let i=0;i<=data.meanings.length-1;i++){
const e = data.meanings[i]
newString=newString+`
**${e.partOfSpeech}**
`
for(let j=0;j<=e.definitions.length-1;j++){
const definition = e.definitions[j]
newString =
`${newString} *${definition.definition}*
${definition.example ? `> ${definition.example}
` : ``}`
if(j+1>=maxIterations){break}
}
if(i+1>=maxIterations){break}
}
const definitionsArray = data.meanings[0].definition
const string =
`Today's prompt is:
# **${data.word}**
*${data.phonetic}*
${newString}
${data.sourceUrls}`
console.log(string)
}

25
src/sendToot.js Normal file
View File

@ -0,0 +1,25 @@
export default function sendToot(){
// Example POST method implementation:
async function postData(url = "", data = {}) {
// Default options are marked with *
const response = await fetch(url, {
method: "POST", // *GET, POST, PUT, DELETE, etc.
mode: "cors", // no-cors, *cors, same-origin
cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
credentials: "same-origin", // include, *same-origin, omit
headers: {
"Content-Type": "application/json",
// 'Content-Type': 'application/x-www-form-urlencoded',
},
redirect: "follow", // manual, *follow, error
referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: JSON.stringify(data), // body data type must match "Content-Type" header
});
return response.json(); // parses JSON response into native JavaScript objects
}
postData("https://example.com/answer", { answer: 42 }).then((data) => {
console.log(data); // JSON data parsed by `data.json()` call
});
}