'use strict'; // Howto: see README.md //function getUserHome() { //return process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME']; //} const profilePath = require('os').homedir(); var skinDir = profilePath + "/minetest/games/ENLIVEN/mods/codercore/coderskins/textures"; var tz_offset = 240; //subtract this from server time to get local time; 4hrs is 240; 5hrs is 300 //TODO: handle tz_offset not divisible by 60 //var selected_date_s = null; //selected_date_s = "2018-05-08"; var express = require('express'), //var exphbs = require("express-handlebars"); // exphbs = require('../../'); // "express-handlebars" cookieParser = require('cookie-parser'), bodyParser = require('body-parser'), //session = require('express-session'), fs = require('fs'), readlines = require('n-readlines'); const os = require('os'); var formidable = require('formidable') var querystring = require("querystring"); // built-in // var util = require('util') var app = express(); //app.engine('handlebars', exphbs({defaultLayout: 'main'})); //app.set('view engine', 'handlebars'); var players = []; var player_indices = {}; var play_dates = []; //see https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/Introduction var prev_line = null; //#region derived from mtsenliven.py var msgprefix_flags = ["WARNING[Server]: ", "ACTION[Server]: "] var msgprefix_lists = {} // where flag is key var mf_len = msgprefix_flags.length; for (var mf_i=0; mf_i -1) { msgprefix_number = mf_i; msgprefix = msgprefix_flags[mf_i]; break; } } var skip_date_enable = false; for (var uf_i=0; uf_i -1) { verb_number = uf_i; verb = unique_flags[uf_i]; date_s = line.substring(0,10).trim(); //if (selected_date_s==null || selected_date_s==date_s) { //console.log("(verbose message in process_logline) using '" + date_s + "' since selected '"+selected_date_s+"'"); time_s = line.substring(time_start_i, time_start_i+8); //console.log("using time "+time_s); if (msgprefix!=null) { player_name = line.substring(msgprefix_i+msgprefix.length, verb_i).trim(); var ip_flag = " ["; var ip_i = player_name.indexOf(ip_flag); if (ip_i > -1) { player_ip = player_name.substring(ip_i+ip_flag.length, player_name.length-1); player_name = player_name.substring(0,ip_i); } } else { player_name = "<missing msgprefix&rt;"; } //} //else { // skip_date_enable = true; //console.log("WARNING in process_logline: skipping '" + date_s + "' since not '"+selected_date_s+"'"); //} break; } } var index = -1; // player index if (player_name != null) { if (player_name.length > 0) { if (player_indices.hasOwnProperty(player_name)) { index = player_indices[player_name]; index_msg = "cached "; } else { index = players.length; //players.push({}); players[index] = {}; players[index].display_name = player_name; player_indices[player_name] = index; //console.log("created new index "+index); } } else { console.log("WARNING in process_logline: zero-length player name"); } } if (index<0 && (verb=="leaves game"||verb=="joins game")) { console.log("(ERROR in process_logline) " + index_msg + "index was '"+index+"' but date was present '" + date_s + "' for '"+line+"' (no player found, but" + "verb is a player verb)."); } var play_date_enable = false; if (verb == "leaves game") { if (index > -1) { var play_i = -1; if (!players[index].hasOwnProperty("plays")) { players[index].plays = {}; } if (!players[index].plays.hasOwnProperty(date_s)) { //leave login time blank--player must have logged in before the available part of the log began players[index].plays[date_s] = []; players[index].plays[date_s].push({}); play_i = 0; } else { if (players[index].plays[date_s].length==0) players[index].plays[date_s].push({}); play_i = players[index].plays[date_s].length - 1; if (players[index].plays[date_s][play_i].hasOwnProperty("logout_time")) { //If last entry is incomplete, start a new one: players[index].plays[date_s].push({}); play_i++; } } players[index].plays[date_s][play_i].logout_time = time_s; play_date_enable = true; } } else if (verb == "joins game") { if (index > -1) { if (player_ip!=null) { players[index].player_ip = player_ip; var play_i = -1; if (!players[index].hasOwnProperty("plays")) { players[index].plays = {}; } if (!players[index].plays.hasOwnProperty(date_s)) { players[index].plays[date_s] = []; play_i = 0; } else play_i = players[index].plays[date_s].length; players[index].plays[date_s].push({}); //console.log(verb+" on "+date_s+" (length "+players[index].plays[date_s].length+") play "+play_i+"+1 for player ["+index+"] "+player_name+"..."); players[index].plays[date_s][play_i].login_time = time_s; play_date_enable = true; } // else redundant (server writes " joins game " again // and shows list of players instead of ip). //TODO: else analyze list of players to confirm in case player logged in all day } } if (play_date_enable) { if (date_s.length>0) { if (play_dates.indexOf(date_s) < 0) { play_dates.push(date_s); } } } } function store_unique_log_data(output, line_number, err_flag=false) { var ret = ""; var output_strip = output.trim(); var u_prefix = "active block modifiers took "; var u_suffix = "ms (longer than 200ms)"; // (out_bytes is bytes) var show_enable = true; var found_flag = null; var f_i = null; var always_show_enable = false; var msg_msg = "previous message"; var uf_len = unique_flags.length; for (var uf_i=0; uf_i= 0) { found_flag = msgprefix_flags[mf_i]; break; } } if (found_flag!=null) { var sub_msg = output.substring(f_i+flag.length).trim(); var nuw_len = non_unique_wraps.length; for (var nuw_i=0; nuw_i -1) { show_enable = false; } else { msgprefix_lists[found_flag].push(sub_msg); } } } if (show_enable) { ret = output_strip; if (found_flag != null) { ret += "\n [ EnlivenMinetest ] " + msg_msg + " will be suppressed"; } } return ret; } function read_log() { if (players==null) players = []; if (player_indices==null) player_indices = {}; // os.homedir() + "/.minetest/debug_archived/2018/05/08.txt", // var log_paths = [os.homedir() + "/.minetest/debug.txt"]; var log_paths = [os.homedir() + "/minetest/bin/debug.txt"]; var lp_len = log_paths.length; for (var lp_i=0; lp_i\n"; console.log(msg); next(err); } else { var thisData = destNameNoExt + ".png"; fs.writeFile(indirectPath, thisData, function(err, data) { if (err) console.log(err); console.log("Successfully wrote " + thisData + " to "+indirectPath+"."); }); } res.end(); }); } else { console.log("userFile is undefined."); } }); //form.on('fileBegin', function (name, file){ ////file.path = __dirname + '/uploads/' + file.name; //// file.path = skinDir + "/" + file.name; //// manual_path = "player_" + //}); form.on('file', function (name, file){ msg = 'Uploaded ' + file.name + "
\n"; console.log(msg); }); //res.sendFile(__dirname + '/index.html'); res.redirect("/?msg=" + querystring.stringify(msg)); }); app.get('/', function (req, res) { var ret = ""; ret += ''; // Whenever server starts the following is logged // (see also etc/example-input.txt): // //------------- // Separator //------------- // var selected_date_s = null; if (req.query.date) selected_date_s = req.query.date if (req.query.msg != undefined) { ret += "
\n"; //ret += "" + querystring.parse(req.query.msg) + "
\n"; // line above causes: //TypeError: Cannot convert object to primitive value //at /home/owner/git/EnlivenMinetest/webapp/server.js:390:16 //at Layer.handle [as handle_request] (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/layer.js:95:5) //at next (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/route.js:137:13) //at Route.dispatch (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/route.js:112:3) //at Layer.handle [as handle_request] (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/layer.js:95:5) //at /home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/index.js:281:22 //at Function.process_params (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/index.js:335:12) //at next (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/index.js:275:10) //at expressInit (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/middleware/init.js:40:5) //at Layer.handle [as handle_request] (/home/owner/git/EnlivenMinetest/webapp/node_modules/express/lib/router/layer.js:95:5) ret += "
\n"; } ret += "assuming minetestserver ran as: " + os.homedir() + "
\n"; ret += "timezone (tz_offset/60*-1): " + (Math.floor(tz_offset/60)*-1) + '
\n'; ret += 'date: ' + selected_date_s + '
'+"\n"; //ret += 'var play_dates = [];'; var pdLength = 0; if (play_dates != null) pdLength = play_dates.length; for (var pd_i = 0; pd_i < pdLength; pd_i++) { //ret += 'play_dates.push("' + play_dates[pd_i] + '");'; if (selected_date_s!=play_dates[pd_i]) { ret += ''+play_dates[pd_i]+' '; } else { ret += play_dates[pd_i]+' '; } } //if (selected_date_s==null) { //ret += '2018-05-08'; //} //see ~/.minetest/debug.txt //and logs archived by EnlivenMinetest: //~/.minetest/debug_archived/2018/05/08.txt ret += `
Your browser does not support the canvas element.
loading...
`; ret += ''; res.send(ret); //res.render('home'); }); var server = app.listen(3000, function () { //console.log('express-handlebars example server listening on: 3000'); var host = server.address().address; var port = server.address().port; console.log("server address:"); console.log(JSON.stringify(server.address())); console.log("reading log..."); read_log(); console.log("EnlivenMinetest webapp is listening at http://%s:%s", host, port); });