diff --git a/xtrn/minesweeper/minesweeper.js b/xtrn/minesweeper/minesweeper.js index 24cc905deb840bddf7296c1aae48b31e849f3975..133b64b3c62f40849b15ee23f7ca22e56fc16a28 100644 --- a/xtrn/minesweeper/minesweeper.js +++ b/xtrn/minesweeper/minesweeper.js @@ -6,10 +6,11 @@ const title = "Synchronet Minesweeper"; const ini_section = "minesweeper"; -const REVISION = "3.00"; +const REVISION = "3.10"; const author = "Digital Man"; const header_height = 4; const winners_list = js.exec_dir + "winners.jsonl"; +const netwins_list = js.exec_dir + "netwins.jsonl"; const losers_list = js.exec_dir + "losers.jsonl"; const help_file = js.exec_dir + "minesweeper.hlp"; const welcome_image = js.exec_dir + "welcome.bin"; @@ -322,67 +323,89 @@ function get_winners(level) list = []; if(options.sub) { + var net_list = json_lines.get(netwins_list); + if(typeof net_list != 'object') + net_list = []; var msgbase = new MsgBase(options.sub); if(msgbase.get_index !== undefined && msgbase.open()) { - var to_crc = crc16_calc(title.toLowerCase()); - var winner_crc = crc16_calc(winner_subject.toLowerCase()); - var highscores_crc = crc16_calc(highscores_subject.toLowerCase()); - var index = msgbase.get_index(); - for(var i = 0; index && i < index.length; i++) { - var idx = index[i]; - if((idx.attr&MSG_DELETE) || idx.to != to_crc) - continue; - if(idx.subject != winner_crc && idx.subject != highscores_crc) - continue; - var hdr = msgbase.get_msg_header(true, idx.offset); - if(!hdr) - continue; - if(!hdr.from_net_type || hdr.to != title) - continue; - if(hdr.subject != winner_subject && hdr.subject != highscores_subject) - continue; - var body = msgbase.get_msg_body(hdr, false, false, false); - if(!body) - continue; - body = body.split("\n===", 1)[0]; - body = body.split("\n---", 1)[0]; - var obj; - try { - obj = JSON.parse(strip_ctrl(body)); - } catch(e) { - log(LOG_INFO, title + " " + e + ": " + options.sub + " msg " + hdr.number); - continue; - } - if(!obj.md5) // Ignore old test messages - continue; - if(idx.subject == highscores_crc && !obj.game) - continue; - obj.name = hdr.from; - var md5 = obj.md5; - obj.md5 = undefined; - var calced = md5_calc(JSON.stringify(idx.subject == winner_crc ? obj : obj.game)); - if(calced == md5) { - if(idx.subject == winner_crc) { - obj.net_addr = hdr.from_net_addr; // Not included in MD5 sum - if(!list_contains(list, obj)) - list.push(obj); - } else { - for(var j = 0; j < obj.game.length; j++) { - var game = obj.game[j]; - game.net_addr = hdr.from_net_addr; - if(!list_contains(list, game)) - list.push(game); + var file = new File(msgbase.cfg.data_dir + msgbase.cfg.code + ".ini"); + var ptr = 0; + if(file.open("r")) { + ptr = file.iniGetValue(ini_section, "import_ptr", 0); + file.close(); + } + if(msgbase.last_msg > ptr) { + var to_crc = crc16_calc(title.toLowerCase()); + var winner_crc = crc16_calc(winner_subject.toLowerCase()); + var highscores_crc = crc16_calc(highscores_subject.toLowerCase()); + var index = msgbase.get_index(); + for(var i = 0; index && i < index.length; i++) { + var idx = index[i]; + if(idx.number <= ptr) + continue; + if((idx.attr&MSG_DELETE) || idx.to != to_crc) + continue; + if(idx.subject != winner_crc && idx.subject != highscores_crc) + continue; + var hdr = msgbase.get_msg_header(true, idx.offset); + if(!hdr) + continue; + if(!hdr.from_net_type || hdr.to != title) + continue; + if(hdr.subject != winner_subject && hdr.subject != highscores_subject) + continue; + var body = msgbase.get_msg_body(hdr, false, false, false); + if(!body) + continue; + body = body.split("\n===", 1)[0]; + body = body.split("\n---", 1)[0]; + var obj; + try { + obj = JSON.parse(strip_ctrl(body)); + } catch(e) { + log(LOG_INFO, title + " " + e + ": " + options.sub + " msg " + hdr.number); + continue; + } + if(!obj.md5) // Ignore old test messages + continue; + if(idx.subject == highscores_crc && !obj.game) + continue; + obj.name = hdr.from; + var md5 = obj.md5; + obj.md5 = undefined; + var calced = md5_calc(JSON.stringify(idx.subject == winner_crc ? obj : obj.game)); + if(calced == md5) { + if(idx.subject == winner_crc) { + obj.net_addr = hdr.from_net_addr; // Not included in MD5 sum + if(!list_contains(net_list, obj)) { + net_list.push(obj); + json_lines.add(netwins_list, obj); + } + } else { + for(var j = 0; j < obj.game.length; j++) { + var game = obj.game[j]; + game.net_addr = hdr.from_net_addr; + if(!list_contains(net_list, game)) { + net_list.push(game); + json_lines.add(netwins_list, game); + } + } } + } else { + log(LOG_INFO, title + + " MD5 not " + calced + + " in: " + options.sub + + " msg " + hdr.number); } - } else { - log(LOG_INFO, title + - " MD5 not " + calced + - " in: " + options.sub + - " msg " + hdr.number); + } + if(file.open(file.exists ? "r+" : "w+")) { + file.iniSetValue(ini_section, "import_ptr", msgbase.last_msg); + file.close(); } } msgbase.close(); } + list = list.concat(net_list); } if(level)