I'm a freshman student.
What does my program solve?
This is actually a bot for reddit, and there are language learning subreddits on that website, sometimes when discussing something with people, we may need to show declension or conjugation tables to them, instead of sending a link, this bot will help you to comment it automatically.
What does my code do in my opinion?
It only works for lithuanian language, there is a website for declensions or conjugations for lithuanian language, and my program goes to that website, scrapes the html table off of it, makes it form into a table, and then replies in the comments.
Why do I want a review?
Well actually, this was supposed to be a learning project, I want to know the weaknesses in my code, stuff I've done wrong or the parts that I could code it better. It does work for sure, but I dont think that's enough to be a good programmer.
Is my code clean enough? Is my code DRY enough or not? Is it slow? Anything broken or wrong? Any suggestions? Did I seperate the folders correctly? You can find all the source code here on github This is how a comment looks like
This is how my directory looks like:
>src
>config
>lietuvos-config.js
>service
>bot.js
>util
>extract-word.js
>get-table.js
>pretty-stringified.js
>app.js
>package.lock
>readme.md
>package.json
extract-word.js
const extractor = function(query){
const pattern = /<[a-zA-Z]+>/; //only works with latin letters for now, to be updated
const stringToSplit = query; //make it case insensitive
const extractedWord= stringToSplit.match(pattern)
extractedWord[0] = extractedWord[0].replace("<","")
extractedWord[0] = extractedWord[0].replace(">","")
return extractedWord
}
module.exports={
extractor: extractor
}
get-table.js
var scraper = require('table-scraper');
const {prettifier} = require('../util/pretty-stringified')
const tableOfContent = function(query){
return scraper.get('https://morfologija.lietuviuzodynas.lt/zodzio-formos/'+query)
.then(function(tableData){
console.log(tableData)
return prettifier(tableData).toString() //JSON.stringify(tableData)
})
.catch((error)=>{
return "error"
})
}
module.exports = {
tableOfContent: tableOfContent
}
pretty-stringified.js
const tablemark = require('tablemark')
const prettifier = function(query){
const decider = nounOrVerb(query);
if(decider == "noun"){
return declineNouns(query)
}else if(decider == "verb"){
return conjugateVerbs(query)
}else if(decider == "adjective"){
return declineAdjectives(query)
}
}
const convertArrays = function(array){
var newArr = [];
for(var i = 0; i < array.length; i++){
newArr = newArr.concat(array[i]);
}
return newArr
}
const declineNouns = function (query){
const newArr = convertArrays(query)
var tidiedArr = []
for (var i = 0; i < newArr.length; i++) {
tidiedArr.push(newArr[i]["\Š\."])
tidiedArr.push(newArr[i].Vienaskaita)
}
var redditTable = tablemark([
{Form:"**V.**",Vienaskaita:tidiedArr[0],Daugiskaita:tidiedArr[1]},
{Form:"**K.**",Vienaskaita:tidiedArr[2],Daugiskaita:tidiedArr[3]},
{Form:"**K.**",Vienaskaita:tidiedArr[4],Daugiskaita:tidiedArr[5]},
{Form:"**G.**",Vienaskaita:tidiedArr[6],Daugiskaita:tidiedArr[7]},
{Form:"**Įn.**",Vienaskaita:tidiedArr[8],Daugiskaita:tidiedArr[9]},
{Form:"**Vt.**",Vienaskaita:tidiedArr[10],Daugiskaita:tidiedArr[11]},
{Form:"**Š.**",Vienaskaita:tidiedArr[12],Daugiskaita:tidiedArr[13]},
])
return redditTable;
}
const conjugateVerbs = function(query){
const newArr = convertArrays(query)
var tidiedArr = []
for (var i = 0; i < newArr.length; i++) {
tidiedArr.push(newArr[i]["Jie/jos"])
tidiedArr.push(newArr[i]["Esamasis laikas"])
tidiedArr.push(newArr[i]["Būtasis kartinis laikas"])
tidiedArr.push(newArr[i]["Būtasis dažninis"])
}
var redditTable = tablemark([
{Įvardis:"**Aš**","**Esamasis laikas**":tidiedArr[0],"**Būtasis kartinis laikas**":tidiedArr[1],"**Būtasis dažninis**":tidiedArr[2],"**Būsimasis laikas**":tidiedArr[3]},
{Įvardis:"**Tu**","**Esamasis laikas**":tidiedArr[4],"**Būtasis kartinis laikas**":tidiedArr[5],"**Būtasis dažninis**":tidiedArr[6],"**Būsimasis laikas**":tidiedArr[7]},
{Įvardis:"**Jis/ji**","**Esamasis laikas**":tidiedArr[8],"**Būtasis kartinis laikas**":tidiedArr[9],"**Būtasis dažninis**":tidiedArr[10],"**Būsimasis laikas**":tidiedArr[11]},
{Įvardis:"**Mes**","**Esamasis laikas**":tidiedArr[12],"**Būtasis kartinis laikas**":tidiedArr[13],"**Būtasis dažninis**":tidiedArr[14],"**Būsimasis laikas**":tidiedArr[15]},
{Įvardis:"**Jūs**","**Esamasis laikas**":tidiedArr[16],"**Būtasis kartinis laikas**":tidiedArr[17],"**Būtasis dažninis**":tidiedArr[18],"**Būsimasis laikas**":tidiedArr[19]},
{Įvardis:"**Jie/jos**","**Esamasis laikas**":tidiedArr[20],"**Būtasis kartinis laikas**":tidiedArr[21],"**Būtasis dažninis**":tidiedArr[22],"**Būsimasis laikas**":tidiedArr[23]},
])
return redditTable;
}
const declineAdjectives = function(query){
const newArr = convertArrays(query)
var tidiedArr = []
for (var i = 0; i < newArr.length; i++) {
tidiedArr.push(newArr[i]["\Š\."])
tidiedArr.push(newArr[i].Vienaskaita)
tidiedArr.push(newArr[i].Daugiskaita)
tidiedArr.push(newArr[i]["Vienaskaita_2"])
}
var redditTable = tablemark([
{Form: "",name:"**Vienaskaita**",name2:"**Daugiskaita**",name3:"**Vienaskaita**",name4:"**Daugiskaita**"},
{Form:"**V.**",name:tidiedArr[0],name2:tidiedArr[1],name3:tidiedArr[2],name4:tidiedArr[3]},
{Form:"**K.**",name:tidiedArr[4],name2:tidiedArr[5],name3:tidiedArr[6],name4:tidiedArr[7]},
{Form:"**K.**",name:tidiedArr[8],name2:tidiedArr[9],name3:tidiedArr[10],name4:tidiedArr[11]},
{Form:"**G.**",name:tidiedArr[12],name2:tidiedArr[13],name3:tidiedArr[14],name4:tidiedArr[15]},
{Form:"**Įn.**",name:tidiedArr[16],name2:tidiedArr[17],name3:tidiedArr[18],name4:tidiedArr[19]},
{Form:"**Vt.**",name:tidiedArr[20],name2:tidiedArr[21],name3:tidiedArr[22],name4:tidiedArr[23]},
{Form:"**Š.**",name:tidiedArr[24],name2:tidiedArr[25],name3:tidiedArr[26],name4:tidiedArr[27]},
],{
columns:[
"Form",
{name: "Vyriškoji giminė"},
{name:" "},
{name: "Moteriškoji giminė"},
{name:" "}
]
})
return redditTable;
}
const nounOrVerb = function(array){
try{
const listOfTable = Object.keys(array[0][0]);
if(listOfTable[0] == "Jie/jos"){
return "verb"
}else if(listOfTable[3] =="Vienaskaita_2"){
return "adjective"
}else if(listOfTable[0] == "Š."){
return "noun"
}
}catch{
return "Error"
}
}
module.exports = {
prettifier:prettifier
}
bot.js
const {comments} = require('../config/lietuvos-config')
const {extractor} = require('../util/extract-word')
const {tableOfContent} = require('../util/get-table')
const BOT_START = Date.now() / 1000;
const canSummon = (msg) => {
/*if(msg){
msg.toLowerCase().includes('!inspect');
//function
return;
}
return*/
return msg && msg.toLowerCase().includes('!inspect');
};
const commenting = function(){
comments.on('item',async (item) => {
try{
var replyString = "labas u/"+item.author.name+"! esu robotas ir pateikiu lentelę apie žodžius, veiksmažodžius, būdvardžius."+
" jei prieš nieko, čia tavo žodžio lentelė. net galite sužinot daugiau čia ^[šaltinis](https://morfologija.lietuviuzodynas.lt/zodzio-formos/"+extractedWord+
") \n\n "
var errorReply= "labas u/"+item.author.name+"! esu bandęs rasti žodį, kurį rašėi, atsiprašau ir dėja, bet negalėjau rasti. "+
"gal tas žodis neegzistuoja lietuvių kalboj, rašėi neteisingai - arba yra klaida mano kode.\n šiaip ar taip, galite bandyt rast savarankiškai čia ^[žodynas](https://morfologija.lietuviuzodynas.lt/"
var replyStringEnder = " \n\n \*\*\* \n ^feel ^free ^to ^report ^bugs ^or ^errors\n ^\[[source-code]\](https://github.com/wulfharth7/lietuvos-robotas) ^| ^\[[buy-me-a-coffee☕]\](https://www.buymeacoffee.com/beriscen)"
if(item.created_utc < BOT_START) return;
if(!canSummon(item.body)) return;
var extractedWord = extractor(item.body)
tableOfContent(extractedWord).then(function(tableofLog){
if(tableofLog !== "error"){
item.reply(replyString+ tableofLog+replyStringEnder)
}else{
item.reply(errorReply+replyStringEnder)
}
})
}catch(Error){
var errorReply= "labas u/"+item.author.name+"! esu bandęs rasti žodį, kurį rašėi, atsiprašau ir dėja, bet negalėjau rasti. "+
"gal tas žodis neegzistuoja lietuvių kalboj, rašėi neteisingai - arba yra klaida mano kode.\n\n šiaip ar taip, galite bandyt rast savarankiškai čia ^[žodynas](https://morfologija.lietuviuzodynas.lt/)"
item.reply(errorReply+replyStringEnder)
}
});
}
module.exports={
commenting: commenting
}