From a33bec7e71dd68e74c0c31049b3df3b907d83ebb Mon Sep 17 00:00:00 2001 From: mrfry Date: Thu, 25 Feb 2021 10:22:07 +0100 Subject: [PATCH] old serverStats.js rm, minor text changes --- publicDirs/public/favicon.ico | Bin 258062 -> 4286 bytes scripts/serverStats.js | 209 ------------------------------ scripts/serverStats.sh | 195 ---------------------------- src/modules.json | 6 +- src/sharedViews/404.ejs | 2 +- src/sharedViews/login.ejs | 2 +- submodules/moodle-test-userscript | 2 +- submodules/qmining-data-editor | 2 +- submodules/qmining-page | 2 +- 9 files changed, 8 insertions(+), 412 deletions(-) delete mode 100644 scripts/serverStats.js delete mode 100755 scripts/serverStats.sh diff --git a/publicDirs/public/favicon.ico b/publicDirs/public/favicon.ico index fa7241a8d37df4731adab800a7c2fa81c3b43406..dc09ab1a3a40d7994d23cb0ed46122e486ef09e8 100755 GIT binary patch literal 4286 zcmcJS30PBC7RMig2*m|i0u=$rX>B_$Bb86;R;kMXdD%z^86}ZT5RoWgM~J~13zi0P z!D_AGhd?VTj-`r<3rekuA8rUJF@O+61hE1xND@fSoQLEaCOVc@`uP5wd+)pN{?0jf zc`pQEf`8-25!8R;fHgtT2!i+!g-wJfifaEo7mvqtUlI`TU36Gj4Uf&zF*qFXTO80U zwjUqfBo3bszW)BeB1s5eB5H_Tx$^s>qM{iC8SJ za0+G|I0-X*bqcMqUf!FPcN*sWy9m7Y9fja+JAut&Hl-$Q$hlQkHtTgh0DuYAE|bZI z`1<v=KWoKv9)YMEg_JPmmn^JA%<>gj|g@yDT>!cO@ueZV2lDlAb4|z=h zL_IpGdTFULL6!UK6HgeX)PUK(v;QO0?fYRw@-FaA`35B773JUUNRt@zsko`O{h680 z+qa}{WV2W;Gk-V+X7ySi8US1#05~s=0!J?f3}3(i^EzbLq9|*ShbP$9Xut$>V7?{= zOye*IYg2*PnF~Xd&%u3vA*@)tu5I=5?qHvL=p*LOrKkb| zx9;j$D~>ET@Qm$OlGq7hqJX{2Hp+i}@5EIgFm4-+Kj^U@=0%FZ>AVvD>P^D5CLFi= zRsPg^ia!^eFLZ*<4Gj#Xd~8HMYV4Vt5V(D}HeuDu8^&Bi{cD-bWmQyUGMnqyivG}ZkXKeHG@`h(-WU!M~$0~VSz6Gb!hTiAxFb}klD42Xf2^RCom+U*ptf71W z7^3I_GmM+pi1R<)vv;lb&I`rH*zGGGfww#jL;`+Y{=tKZ#@zn(+}vD;O$m~8A0M9% zc1AAPmp?=wkP|2dkBdq$`HTT0F=o3uz1l{lZyH&xdu($}qqmqc2bMKq{-=HVa&6+e zF>Qfvhg+?>1>ffboyqJxv};F}QmLHYpZB`5R4SdF^m)utZy!3$J9rXCRruRZM8lRqB`2o8l%VL;=V zVW>5#N=Ma=cb~Hk9FXAg|_DQ&50?pFN%0<_A@q{oqp=n zDJ$c#2U4fzs-U32E@;V;oWHob>SR|HJ>(sZ$ z=>XPubt^}^xZLf~Xu;0b_Q{IK$TW#WV&DJyw=J8Sn`a-dyrUlD=-9a>W6#ka+n;ge zYW=wcfX9hXH3h>*kG`qZBHza5X+%WCy12Nw0q?be_-0{YkzIUSsmA=iNZusRDY}2( zb_>25B>>SI)IFrtsL>L88m)QiprcYv`dA8@UiZr;2(o5N<;;@aQvXYlRp?8+P* z9MrfMADEe$o#+>P0lqs;LxY2}I9zUxzrX*NgUzST{l*~I|HQ% z2?<$8^?#+qTQqPu9P9Y_cmdi*^kLuYhC+5GNs?8;!NJnx>+?t3@GN_e#bU{D zZM7leE|wEfU!pG?I4sV3%HlUWHTNB1VPWZ*E9&RZpj_eM;X`pwdH79Ij%=XQ>A)oE zt)ZfS-V=uf)(QDM6_ZYH#q%CWk^x*Uw=y<1HVoh6gR%!jB9RrYryz{2g25oKlO+8T zi%C{+1p<{=B54+ehN`$c-%8BKWjdWvj{Qmk0s`WLf`Y~kMgpkc2j~M0$9Lni*^>ho zEt;6LBi%PR|LRXZ1=V-M3a=bYFFwxLyl1=Hq9u!_2n2$^BY&(|EFLx(eB&`>TlZQo zE@}w>`0Vov=hNL!JW5`aMpZS1?#{~_)HBzZYpBQNopG6ese7aIY3&Qk!fu#wuDdPp zd|T4m!@s<1=<{dVy~Xtw;U{W2(@#ICq7`dkUg4wb+jA7mHAfze_#<33LCozS2v<*n z7-i7USne+s*0B#IS2bZVw}&9sQv$*SKt{>5pXUF!oO}U*5_O;IYfy(PK%f2tFa!i1 literal 258062 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 HiSGXctY#nw diff --git a/scripts/serverStats.js b/scripts/serverStats.js deleted file mode 100644 index f1b1e1f..0000000 --- a/scripts/serverStats.js +++ /dev/null @@ -1,209 +0,0 @@ -// ----------------------------------------------------------------- -// CONFIG -// ----------------------------------------------------------------- - -const maxStatLength = 15 -const statNameSpacing = 5 -const coloredWords = { - red: ['lred'], -} - -// ----------------------------------------------------------------- - -const fs = require('fs') - -const dir = process.argv[2] -if (!dir) { - console.log('No params') - process.exit() -} - -function getDayIndex(offset) { - if (!offset) { - offset = 0 - } - - let date = new Date() - if (offset) { - date.setDate(date.getDate() + offset) - } - return ( - date.getFullYear() + - '/' + - ('0' + (date.getMonth() + 1)).slice(-2) + - '/' + - ('0' + date.getDate()).slice(-2) - ) -} - -function C(color) { - if (color !== undefined) { - color = color.toLowerCase() - } - - if (color === 'redbg') { - return '\x1b[41m' - } - if (color === 'bluebg') { - return '\x1b[44m' - } - if (color === 'green') { - return '\x1b[32m' - } - if (color === 'red') { - return '\x1b[31m' - } - if (color === 'yellow') { - return '\x1b[33m' - } - if (color === 'blue') { - return '\x1b[34m' - } - if (color === 'magenta') { - return '\x1b[35m' - } - if (color === 'cyan') { - return '\x1b[36m' - } - return '\x1b[0m' -} - -function readJSON(name) { - return JSON.parse(fs.readFileSync(name, 'utf8')) -} - -function tail(text, number) { - let splitedText = text.split('\n') - return splitedText.slice(Math.max(splitedText.length - number, 1)).join('\n') -} - -function head(text, number) { - return text - .split('\n') - .slice(0, number) - .join('\n') -} - -function readFile(name) { - return fs.readFileSync(name, 'utf8') -} - -function getLetterNTimes(letter, number) { - let res = '' - while (res.length < number) { - res += letter - } - return res -} - -function pCols() { - // console.log(arguments) - let maxLength = 0 - Object.keys(arguments).forEach((key) => { - if (arguments[key].length > maxLength) { - maxLength = arguments[key].length - } - }) - for (let i = 0; i < maxLength; i++) { - let row = [] - Object.keys(arguments) - .reverse() - .forEach((key) => { - const val = arguments[key] - if (!val[i]) { - return - } - - const keyName = val[i].name || '' - - let slicedName = keyName.slice(0, maxStatLength) - let toColor = Object.keys(coloredWords).reduce((acc, key) => { - const colorArray = coloredWords[key] - - const includes = colorArray.some((colorableIdName) => { - return keyName.includes(colorableIdName) - }) - - if (includes) { - return key - } - - return acc - }, '') - - while (slicedName.length < maxStatLength) { - slicedName = ' ' + slicedName - } - - let ammount = val[i].val ? val[i].val.toString() : 0 - while (ammount.length < 4) { - ammount = ammount + ' ' - } - - if (toColor) { - row.push(C(toColor) + slicedName + ': ' + ammount + C()) - } else { - row.push(slicedName + ' ' + ammount) - } - }) - console.log(row.join(getLetterNTimes(' ', statNameSpacing))) - } -} - -// ------------------------------------------------------------------------------ -const dailyStats = readJSON(`${dir}stats/vstats`) -function preProcessDailyStats(obj) { - return Object.keys(obj).map((key) => { - return { name: key, val: obj[key] } - }) -} - -pCols( - preProcessDailyStats(dailyStats[getDayIndex()]), - preProcessDailyStats(dailyStats[getDayIndex(-1)]), - preProcessDailyStats(dailyStats[getDayIndex(-2)]) -) - -// ------------------------------------------------------------------------------ -const userIdTestSolving = readJSON(`${dir}stats/idvstats`) -function preProcessUIdTestSolving(obj) { - if (!obj) { - return [{ val: 0 }] - } - return [{ val: Object.keys(obj).length }] -} - -pCols( - preProcessUIdTestSolving(userIdTestSolving[getDayIndex()]), - preProcessUIdTestSolving(userIdTestSolving[getDayIndex(-1)]), - preProcessUIdTestSolving(userIdTestSolving[getDayIndex(-2)]) -) - -// ------------------------------------------------------------------------------ -const clientIdTestSolving = readJSON(`${dir}stats/uvstats`) - -pCols( - preProcessUIdTestSolving(clientIdTestSolving[getDayIndex()]), - preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(-1)]), - preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(-2)]) -) - -// ------------------------------------------------------------------------------ -const dailyDataCount = readFile(`${dir}stats/dailyDataCount`) - -printLastDataCount([ - JSON.parse(head(tail(dailyDataCount, 1), 1)), - JSON.parse(head(tail(dailyDataCount, 2), 1)), - JSON.parse(head(tail(dailyDataCount, 3), 1)), -]) - -function printLastDataCount(data) { - const res = [[], [], []] - data.forEach((dataCount, i) => { - res[i].push({ val: dataCount.userCount }) - res[i].push({ val: dataCount.subjectCount }) - res[i].push({ val: dataCount.questionCount }) - }) - - pCols(...res) -} diff --git a/scripts/serverStats.sh b/scripts/serverStats.sh deleted file mode 100755 index 8e5893c..0000000 --- a/scripts/serverStats.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -if [ "$#" -ne "1" ]; then - echo not enough params! please specify server root directory! - exit 1 -fi - -export TERM=xterm-256color - -# COLORS -NC='' -# GRAY='' -R='' -G='' -# YELLOW='' -B='' -P='' -C='' -sep="${P}----------------------------------------------------------------------------------------------------------------------------<=$NC" - -pcolumns() { - mlength=35 - NUM=0 - l=$(echo $"$1" | wc -l) - sizeof2=$(echo $"$2" | wc -l) - sizeof3=$(echo $"$3" | wc -l) - - if [ "$l" -lt "$sizeof2" ]; then - l=$(echo $"$2" | wc -l) - fi - if [ "$l" -lt "$sizeof3" ]; then - l=$(echo $"$3" | wc -l) - fi - - for i in $(eval echo {0..$l}); do - line=$(echo -ne $"$1" | cut -d$'\n' -f $(($NUM + 1))) - sliced="${line:0:$mlength}" - last="${line: -3}" - size=${#sliced} - diff=$(($mlength - $size)) - - if [ "$sliced" == "null" ]; then - echo -en "\t" - else - echo -en "\t$sliced" - fi - if [ "$diff" -gt "0" ]; then - diff=$((diff + 2)) - for j in $(eval echo {0..$diff}); do - echo -n " " - done - else - echo -en "$last" - fi - - sr=$(echo -ne $"$2" | cut -d$'\n' -f $(($NUM + 1))) - r=$"${sr:0:$mlength}" - last="${r: -3}" - size=${#r} - diff=$(($mlength - $size)) - if [ "$r" == "null" ]; then - echo -ne '' - else - echo -ne "$r" - fi - - if [ "$diff" -gt "0" ]; then - diff=$((diff + 2)) - for j in $(eval echo {0..$diff}); do - echo -n " " - done - else - echo -en "$last" - fi - - tr=$(echo -ne $"$3" | cut -d$'\n' -f $(($NUM + 1))) - r=$"${tr:0:$mlength}" - - if [ "$r" == "null" ]; then - echo '' - else - echo "$r" - fi - - NUM=$((NUM + 1)) - done -} - -function jsonStats() { - dateind=$(date '+%Y-%m-%d') - a=$(cat "$1" | jq ".[\"$dateind\"]" | grep -ve '^{' | grep -ve '}$' | grep -ve '^\s*}' | sort) - ac=$(cat "$1" | jq ".[\"$dateind\"] | length") - a="\t${ac}\n${a}" - - dateind=$(date -d '-1 day' '+%Y-%m-%d') - b=$(cat "$1" | jq ".[\"$dateind\"]" | grep -ve '^{' | grep -ve '}$' | grep -ve '^\s*}' | sort) - bc=$(cat "$1" | jq ".[\"$dateind\"] | length") - b="\t${bc}\n${b}" - - dateind=$(date -d '-2 day' '+%Y-%m-%d') - c=$(cat "$1" | jq ".[\"$dateind\"]" | grep -ve '^{' | grep -ve '}$' | grep -ve '^\s*}' | sort) - cc=$(cat "$1" | jq ".[\"$dateind\"] | length") - c="\t${cc}\n${c}" - - pcolumns $"$c" $"$b" $"$a" | sed -E \ - -e "s,/getVeteranPw,${C}&${NC},g" \ - -e "s,/getveteranpw,${C}&${NC},g" \ - -e "s,/pwRequest,${C}&${NC},g" \ - -e "s,/getpw,${C}&${NC},g" \ - -e "s,/avaiblePWS,${C}&${NC},g" \ - -e "s,/pwRequest,${C}&${NC},g" \ - -e "s,/login,${C}&${NC},g" \ - -e "s,/logout,${C}&${NC},g" \ - -e "s,/manual,${G}&${NC},g" \ - -e "s,/todos,${G}&${NC},g" \ - -e "s,/allQuestions,${G}&${NC},g" \ - -e "s,/subjectBrowser,${G}&${NC},g" \ - -e "s,/repos,${G}&${NC},g" \ - -e "s,/contribute,${G}&${NC},g" \ - -e "s,/reops,${G}&${NC},g" \ - -e "s,/feedback,${G}&${NC},g" \ - -e "s,/addQuestion,${G}&${NC},g" \ - -e "s,/dataCount,${G}&${NC},g" \ - -e "s,/menuClick,${G}&${NC},g" \ - -e "s,/ranklist,${G}&${NC},g" \ - -e "s,/uploaddata,${G}&${NC},g" \ - -e "s,/legacy,${G}&${NC},g" \ - -e "s,/donate,${P}&${NC},g" \ - -e "s,/tiszai,${P}&${NC},g" \ - -e "s,/install,${P}&${NC},g" \ - -e "s,/irc,${P}&${NC},g" \ - -e "s,/postfeedback,${P}&${NC},g" \ - -e "s,/voteTodo,${P}&${NC},g" \ - -e "s,/registerscript,${P}&${NC},g" \ - -e "s,/quickvote,${P}&${NC},g" \ - -e "s,/servergit,${P}&${NC},g" \ - -e "s,/scriptgit,${P}&${NC},g" \ - -e "s,/classesgit,${P}&${NC},g" \ - -e "s,/lred,${R}&${NC},g" \ - -e "s,/thanks,${R}&${NC},g" \ - -e "s,/isAdding,${B}&${NC},g" \ - -e "s,/allqr,${B}&${NC},g" \ - -e "s,/ask,${B}&${NC},g" -} - -function jsonStatsLength() { - dateind=$(date '+%Y-%m-%d') - ac=$(cat "$1" | jq ".[\"$dateind\"] | length") - a="\t${ac}\n" - - dateind=$(date -d '-1 day' '+%Y-%m-%d') - bc=$(cat "$1" | jq ".[\"$dateind\"] | length") - b="\t${bc}\n" - - dateind=$(date -d '-2 day' '+%Y-%m-%d') - cc=$(cat "$1" | jq ".[\"$dateind\"] | length") - c="\t${cc}\n" - - pcolumns $"$c" $"$b" $"$a" -} - -echo -e "${G}Site requests before / yesterday / today:$NC" -jsonStats "${1}/stats/vstats" - -echo -e "$sep" -echo -e "${G}User ID test solving count before / yesterday / today:$NC" -jsonStatsLength "${1}/stats/idvstats" - -echo -e "$sep" -echo -e "${G}User ID requests before / yesterday / today:$NC" -jsonStatsLength "${1}/stats/uvstats" - -echo -e "$sep" -echo -e "${G}User/data count day before / day before / yesterday + new ones yesterday:$NC" -s=$(cat "${1}/stats/dailyDataCount" | tail -n 1 | jq '.subjectCount') -q=$(cat "${1}/stats/dailyDataCount" | tail -n 1 | jq '.questionCount') -u=$(cat "${1}/stats/dailyDataCount" | tail -n 1 | jq '.userCount') - -st=$(cat "${1}/stats/dailyDataCount" | tail -n 2 | head -n 1 | jq '.subjectCount') -qt=$(cat "${1}/stats/dailyDataCount" | tail -n 2 | head -n 1 | jq '.questionCount') -ut=$(cat "${1}/stats/dailyDataCount" | tail -n 2 | head -n 1 | jq '.userCount') - -sy=$(cat "${1}/stats/dailyDataCount" | tail -n 3 | head -n 1 | jq '.subjectCount') -qy=$(cat "${1}/stats/dailyDataCount" | tail -n 3 | head -n 1 | jq '.questionCount') -uy=$(cat "${1}/stats/dailyDataCount" | tail -n 3 | head -n 1 | jq '.userCount') - -sd=$((s - st)) -qd=$((q - qt)) -ud=$((u - ut)) - -echo -e "Users:\t\t${G}${uy}${NC}\t\t\t\t\t${G}${ut}${NC}\t\t\t\t\t${G}${u}${NC}\t+${B}${ud}${NC}" -echo -e "Subjects:\t${G}${sy}${NC}\t\t\t\t\t${G}${st}${NC}\t\t\t\t\t${G}${s}${NC}\t+${B}${sd}${NC}" -echo -e "Questions:\t${G}${qy}${NC}\t\t\t\t\t${G}${qt}${NC}\t\t\t\t\t${G}${q}${NC}\t+${B}${qd}${NC}" - -echo -e "$sep" diff --git a/src/modules.json b/src/modules.json index df25d58..479ca8f 100644 --- a/src/modules.json +++ b/src/modules.json @@ -19,8 +19,7 @@ "nextdir": "nextStatic/qminingPagePublic", "name": "qmining", "urls": [ - "qmining.frylabs.net", - "localhost" + "qmining.frylabs.net" ], "isNextJs": true }, @@ -31,7 +30,8 @@ ], "name": "api", "urls": [ - "api.frylabs.net" + "api.frylabs.net", + "localhost" ] }, "main": { diff --git a/src/sharedViews/404.ejs b/src/sharedViews/404.ejs index 64be699..4126305 100755 --- a/src/sharedViews/404.ejs +++ b/src/sharedViews/404.ejs @@ -18,7 +18,7 @@

404

- +
diff --git a/src/sharedViews/login.ejs b/src/sharedViews/login.ejs index bb413bc..b9aed1b 100644 --- a/src/sharedViews/login.ejs +++ b/src/sharedViews/login.ejs @@ -165,7 +165,7 @@ function ShowFeedback () { const form = document.getElementById('form').style.display = "none"; const feedback = document.getElementById('feedback').style.display = "block"; - document.getElementById('text').innerText = 'Jelszót meglévő felhasználóktól lehet kérni!' + document.getElementById('text').innerText = 'Jelszót meglévő felhasználóktól lehet kérni! (nem itt)' } function HandleResp (resp) { const button = document.getElementById('sendButton') diff --git a/submodules/moodle-test-userscript b/submodules/moodle-test-userscript index dc07c90..73c1cb7 160000 --- a/submodules/moodle-test-userscript +++ b/submodules/moodle-test-userscript @@ -1 +1 @@ -Subproject commit dc07c903d39003a5cc13302a9ee6e6e3e0b6ee17 +Subproject commit 73c1cb76f096b728d156d8d50b06c80b99049cac diff --git a/submodules/qmining-data-editor b/submodules/qmining-data-editor index 83ed7f3..a19c39c 160000 --- a/submodules/qmining-data-editor +++ b/submodules/qmining-data-editor @@ -1 +1 @@ -Subproject commit 83ed7f3b312e0de67505601d13774bdcf2971420 +Subproject commit a19c39c651bfbc57eb0ef2bb3371c58e1ea82cb0 diff --git a/submodules/qmining-page b/submodules/qmining-page index 6b6b9a4..599ef00 160000 --- a/submodules/qmining-page +++ b/submodules/qmining-page @@ -1 +1 @@ -Subproject commit 6b6b9a43d4d9c2e429adaf76c461c0304dad1133 +Subproject commit 599ef00635c15d500dfcc1a9c226212000e74707