NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name SE - Roubo Graph // @namespace http://tampermonkey.net/ // @version 0.13 // @description try to take over the world! // @author Magnus Man // @match https://extreme.sysemp.com/menu.php* // @match https://extreme.sysemp.com/messages.php* // @match https://extreme.sysemp.com/mainview.php* // @require https://code.highcharts.com/highcharts.js // @require https://code.highcharts.com/modules/exporting.js // @require https://code.highcharts.com/modules/export-data.js // @require https://code.highcharts.com/modules/accessibility.js // @require http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js // @updateURL https://openuserjs.org/meta/emptydev/SE_-_Roubo_Graph.meta.js // @downloadURL https://openuserjs.org/install/emptydev/SE_-_Roubo_Graph.user.js // @copyright 2020, Magnus Man (https://openuserjs.org/users/emptydev) // @grant none // @license MIT // ==/UserScript== // 0.2 - Alterada a injeção do gráfico // 0.5 - melhorada a qualidade dos gráficos // - retirados os pontos das linhas // - melhoradas as cores // 0.6 - melhoradas do tooltip // 0.7 - adicionado o botão ao menu // 0.8 - adicionado o número de ataques por dia ao tooltip do gráfico // 0.9 - adicionado o gráfico de trocas do mercado // 0.10 - redução dos valores apresentados para 8 dias. // 0.11 - adicionada a opção de limpar todos os dados. (function () { 'use strict'; function n(v) { return parseInt(v.toString().replace(/\D+/g, '')) || 0; } function nf(amount, decimalCount = 0, decimal = ".", thousands = ".") { try { decimalCount = Math.abs(decimalCount); decimalCount = isNaN(decimalCount) ? 2 : decimalCount; const negativeSign = amount < 0 ? "-" : ""; let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString(); let j = (i.length > 3) ? i.length % 3 : 0; return amount == 0 ? '0' : negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : ""); } catch (e) { console.log(""); } } var graphData = JSON.parse(localStorage.getItem("graphData") || "[]"); $("tr:contains('Frota regressou de ataque')").each(function () { var timedate = $(this).find("td:eq(5)").text(); var datetime = timedate.split(" "); var time = datetime[0]; var date = datetime[1].split("/"); date[2] = "20" + date[2]; var fullDate = date[2] + "/" + date[1] + "/" + date[0] + " " + time; var resources = $(this).next().eq(0).find("tr").eq(1).text().split(", "); var res = [0, 0, 0, 0, 0]; var tempResources = ["m", "d", "h", "z", "n"]; for (var i = 0; i < resources.length; i++) { for (var j = 0; j < tempResources.length; j++) { if (resources[i].toLowerCase().indexOf(tempResources[j]) > -1) { res[j] = n(resources[i]); } } } var obj = { data: fullDate, resources: res }; var objExists = graphData.filter(function (item) { return JSON.stringify(item) == JSON.stringify(obj); }).length > 0; if (!objExists) { graphData.push(obj); } }); localStorage.setItem("graphData", JSON.stringify(graphData)); var marketGraph = JSON.parse(localStorage.getItem("marketGraph") || "[]"); $("tr:contains('Troca com o Mercado concluída')").each(function () { var timedate = $(this).find("td:eq(5)").text(); var datetime = timedate.split(" "); var time = datetime[0]; var date = datetime[1].split("/"); date[2] = "20" + date[2]; var fullDate = date[2] + "/" + date[1] + "/" + date[0] + " " + time; var resourcesReceived = $(this).next().eq(0).find("tr").eq(1).text().split(", "); var resourcesSent = $(this).next().eq(0).find("tr").eq(2).text().replace("A frota entregou no mercado: ", "").split(", "); var resRec = [0, 0, 0, 0, 0]; var resSen = [0, 0, 0, 0, 0]; var tempResources = ["m", "d", "h", "z", "n"]; for (var i = 0; i < resourcesReceived.length; i++) { for (var j = 0; j < tempResources.length; j++) { if (resourcesReceived[i].toLowerCase().indexOf(tempResources[j]) > -1) { resRec[j] = n(resourcesReceived[i]); } } } for (var i = 0; i < resourcesSent.length; i++) { for (var j = 0; j < tempResources.length; j++) { if (resourcesSent[i].toLowerCase().indexOf(tempResources[j]) > -1) { resSen[j] = n(resourcesSent[i]); } } } var obj = { data: fullDate, resourcesSent: resSen, resourcesReceived: resRec }; var objExists = marketGraph.filter(function (item) { return JSON.stringify(item) == JSON.stringify(obj); }).length > 0; if (!objExists) { marketGraph.push(obj); } }); localStorage.setItem("marketGraph", JSON.stringify(marketGraph)); function arraySum(arr) { var ret = 0; for (var i = 0; i < arr.length; i++) { ret += arr[i]; } return ret; } function getGraph() { var graphData = JSON.parse(localStorage.getItem("graphData") || "[]"); var resourcesLabel = ["Metal", "Diamante", "Hidrogénio", "Zion", "Nanite"]; var resourcesColor = ["#b5b5b5", "#2a80ff", "#ff002a", "#fcff00", "#222222"]; var dates = []; var labelDates = []; var resources = []; var todayResources = [0, 0, 0, 0, 0]; var totalAttacks = 0; $.each(graphData, function (i, e) { if (dates.findIndex(function (person) { return person.date == e.data.split(" ")[0] }) == -1) { dates.push({ date: e.data.split(" ")[0], resources: e.resources, attacks: 1 }); labelDates.push(e.data.split(" ")[0]); } else { var idx = dates.findIndex(function (person) { return person.date == e.data.split(" ")[0] }); for (var j = 0; j < resourcesLabel.length; j++) { dates[idx].resources[j] += e.resources[j]; } dates[idx].attacks += 1; } if (e.data.indexOf(moment().format("YYYY/MM/DD")) > -1) { totalAttacks += 1; for (var j = 0; j < resourcesLabel.length; j++) { todayResources[j] += e.resources[j]; } } }); var series = []; labelDates.sort(); labelDates = labelDates.slice(-8); for (var k = 0; k < resourcesLabel.length; k++) { var obj = { type: 'areaspline', name: resourcesLabel[k], data: [], color: resourcesColor[k] }; for (var i = 0; i < labelDates.length; i++) { var _resources = dates.filter(function (item) { return item.date == labelDates[i]; }); obj.data[i] = _resources[0].resources[k]; } series.push(obj); } var $divGraph = $("<div />", { class: "graphContainer", "style": "position:fixed; top:0; left:0; width:100%; height:100%; background: rgba(0,0,0,0.7);" }); var $closeGraph = $("<input />", { "type": "button", "class": "button", "style": "bottom: 50px; position:absolute;" }).val("Fechar").on("click", function () { $divGraph.remove(); }); var $clearGraph = $("<input />", { "type": "button", "class": "button", "style": "bottom: 50px; position:absolute; margin: 0 64px;" }).val("Limpar Gráfico").on("click", function () { $divGraph.remove(); localStorage.removeItem("graphData"); }); var $graphContainer = $("<div />", { "id": "graphAttacks", "style": "width:800px; height:400px;background-color:#FFF; margin:120px auto 0px auto;" }); $divGraph.append($("<center />").append($closeGraph, $clearGraph, $graphContainer)); var resources = [0, 0, 0, 0, 0]; var racios = [1, 2, 3, 6, 2000]; $.each(dates, function (i, e) { for (var i = 0; i < resourcesLabel.length; i++) { resources[i] += e.resources[i]; } }); var labels = ["<th style='border-top: 1px solid #69c;' colspan='2'>Hoje</th>"]; var values = ["<th style='border-top: 1px solid #69c;' class='blue' colspan='2'>" + totalAttacks + "</th>"]; var points = ["<th style='border-top: 1px solid #69c;' colspan='2'>Pontos</th>"]; var avgAttack = ["<th colspan='2' style='border-top: 1px solid #69c;' >Média Ataque</th>"]; var sumAvg = 0, sumDay = 0, sumPoints = 0; for (var i = 0; i < resourcesLabel.length; i++) { labels.push("<th>" + resourcesLabel[i] + "</th>"); values.push("<th style='border-top: 1px solid #69c;' class='orange' align='center'>" + nf(todayResources[i]) + "</th>"); points.push("<th style='border-top: 1px solid #69c;' class='orange' align='center'>" + nf(todayResources[i] * racios[i] / 1000) + "</th>"); sumAvg += todayResources[i] / totalAttacks; sumDay += todayResources[i] / totalAttacks; sumPoints += todayResources[i] * racios[i] / 1000; avgAttack.push("<th style='border-top: 1px solid #69c;' class='orange' align='center'>" + nf(todayResources[i] / totalAttacks) + "</th>"); } var $table3 = $("<table />", { "style": "margin-top:10px; border-collapse:collapse; background:rgba(0,0,0,0.5);", "align": "center", "cellpadding": "6" }); labels.push("<th style='border-top: 1px solid #69c;'>Total</th>"); values.push("<th style='border-top: 1px solid #69c;' class='blue'>" + nf(arraySum(todayResources)) + "</th>"); points.push("<th style='border-top: 1px solid #69c;' class='blue'>" + nf(sumPoints) + "</th>"); avgAttack.push("<th style='border-top: 1px solid #69c;' class='blue'>" + nf(sumAvg) + "</th>"); var $tr = $("<tr />").html(labels.join()); var $tr2 = $("<tr />").html(values.join()); var $tr5 = $("<tr />").html(points.join()); var $tr3 = $("<tr />").html(avgAttack.join()); $table3.append($tr, $tr2, $tr5, $tr3); $divGraph.append($table3); var pageFrame = $('frame[name="CMAIN"]', top.document)[0].contentDocument; $(pageFrame).find(".graphContainer").remove(); $(pageFrame).find("body").append($divGraph); Highcharts.chart(pageFrame.getElementById("graphAttacks"), { title: { text: 'Roubo por dia' }, chart: { style: { fontFamily: 'Verdana' } }, xAxis: { categories: labelDates }, yAxis: { min: 0, title: { text: 'Total recursos' }, stackLabels: { enabled: true } }, legend: { backgroundColor: Highcharts.defaultOptions.legend.backgroundColor || 'white', borderColor: '#CCC', borderWidth: 1, shadow: false }, tooltip: { shared: true, useHTML: true, formatter: function () { var html = "<table style='color: #000;'><tr><td colspan='3' align='center'><b>" + this.x + "</b></td></tr>"; var pontos = 0, totalEco = 0; var xx = this.x; $.each(this.points, function (i, e) { if (e.y > 0) { var lblIdx = resourcesLabel.indexOf(e.series.name); var racio = racios[lblIdx]; var color = resourcesColor[lblIdx]; html += "<tr><td align='right' style='white-space:nowrap; color:" + color + ";'>" + e.series.name + "</td><td style='white-space:nowrap;'><b>" + nf(e.y) + "</b></td><td><small>(" + nf(e.percentage, 2) + "%)</small></td></tr>"; pontos += e.y * racio / 1000; totalEco += e.y; } }); html += "<tr><td align='right'>Total</td><td colspan='2'><b>" + nf(totalEco) + "</b></td></tr>"; html += "<tr><td align='right' style='white-space:nowra;'>Pontos</td><td colspan='2'><b>" + nf(pontos) + "</b></td></tr>"; html += "<tr><td align='right'>Ataques</td><td colspan='2'><b>" + nf(dates.filter(function (item) { return item.date == xx; })[0].attacks) + "</b></td></tr></table>"; return html; }, positioner: function () { return { x: 50, y: 70 }; } }, plotOptions: { series: { stacking: 'normal', marker: { enabled: false } } }, series: series }); } function getMarketGraph() { var marketGraph = JSON.parse(localStorage.getItem("marketGraph") || "[]"); var resourcesLabel = ["Metal", "Diamante", "Hidrogénio", "Zion", "Nanite"]; var resourcesColor = ["#b5b5b5", "#2a80ff", "#ff002a", "#c6d91c", "#222222"]; var dates = []; var labelDates = []; var resourcesSent = []; var resourcesReceived = []; var todayResourcesSent = [0, 0, 0, 0, 0]; var todayResourcesReceived = [0, 0, 0, 0, 0]; var totalChanges = 0; $.each(marketGraph, function (i, e) { if (dates.findIndex(function (person) { return person.date == e.data.split(" ")[0] }) == -1) { dates.push({ date: e.data.split(" ")[0], resourcesSent: e.resourcesSent, resourcesReceived: e.resourcesReceived, changes: 1 }); labelDates.push(e.data.split(" ")[0]); } else { var idx = dates.findIndex(function (person) { return person.date == e.data.split(" ")[0] }); for (var j = 0; j < resourcesLabel.length; j++) { dates[idx].resourcesSent[j] += e.resourcesSent[j]; } for (var j = 0; j < resourcesLabel.length; j++) { dates[idx].resourcesReceived[j] += e.resourcesReceived[j]; } dates[idx].changes += 1; } if (e.data.indexOf(moment().format("YYYY/MM/DD")) > -1) { totalChanges += 1; for (var j = 0; j < resourcesLabel.length; j++) { todayResourcesSent[j] += e.resourcesSent[j]; } for (var j = 0; j < resourcesLabel.length; j++) { todayResourcesReceived[j] += e.resourcesReceived[j]; } } }); var $divGraph = $("<div />", { class: "graphContainer", "style": "position:fixed; top:0; left:0; width:100%; height:100%; background: rgba(0,0,0,0.7);" }); var $closeGraph = $("<input />", { "type": "button", "class": "button", "style": "bottom: 50px; position:absolute;" }).val("Fechar").on("click", function () { $divGraph.remove(); }); var $clearGraph = $("<input />", { "type": "button", "class": "button", "style": "bottom: 50px; position:absolute; margin: 0 64px;" }).val("Limpar Gráfico").on("click", function () { $divGraph.remove(); localStorage.removeItem("marketGraph"); }); var $graphContainer = $("<div />", { "id": "graphAttacks", "style": "width:800px; height:600px;background-color:#FFF; margin:120px auto 0px auto;" }); $divGraph.append($("<center />").append($closeGraph,$clearGraph, $graphContainer)); var resources = [0, 0, 0, 0, 0]; var racios = [1, 2, 3, 6, 2000]; var series = []; labelDates.sort(); labelDates = labelDates.slice(-8); for (var k = 0; k < resourcesLabel.length; k++) { var obj = { name: resourcesLabel[k], data: [], type: 'column', color: resourcesColor[k], id: 'resource' + (k) }; for (var i = 0; i < labelDates.length; i++) { var _resources = dates.filter(function (item) { return item.date == labelDates[i]; }); obj.data[i] = _resources[0].resourcesReceived[k]; } series.push(obj); } for (var k = 0; k < resourcesLabel.length; k++) { var obj = { name: resourcesLabel[k], data: [], type: 'column', color: resourcesColor[k], id: 'resource' + (k), linkedTo: 'resource' + (k) }; for (var i = 0; i < labelDates.length; i++) { var _resources = dates.filter(function (item) { return item.date == labelDates[i]; }); obj.data[i] = _resources[0].resourcesSent[k] * -1; } series.push(obj); } var pageFrame = $('frame[name="CMAIN"]', top.document)[0].contentDocument; $(pageFrame).find(".graphContainer").remove(); $(pageFrame).find("body").append($divGraph); Highcharts.chart(pageFrame.getElementById("graphAttacks"), { title: { text: 'Resumo de trocas' }, xAxis: { categories: labelDates }, yAxis: { title: { text: 'Total recursos' }, stackLabels: { enabled: true, formatter: function () { var v = this.total; if (v < 0) { v = v * -1; } return nf(v); } } }, tooltip: { shared: true, useHTML: true, formatter: function () { var html = "<table style='color:#000;'>"; html += "<tr><th colspan='2' align='center'>" + this.x + "</th></tr>"; html += "<tr><th colspan='2' align='center'>Vendido</th></tr>"; $.each(this.points, function (i, e) { if (e.y < 0) { var lblIdx = resourcesLabel.indexOf(e.series.name); var racio = racios[lblIdx]; var color = resourcesColor[lblIdx]; html += "<tr><td style='color:" + color + ";'>" + e.series.name + "</td><th align='left'>" + nf(e.y * -1) + "</th></tr>"; } }); html += "<tr><th colspan='2' align='center'>Comprado</th></tr>"; $.each(this.points, function (i, e) { if (e.y > 0) { var lblIdx = resourcesLabel.indexOf(e.series.name); var racio = racios[lblIdx]; var color = resourcesColor[lblIdx]; html += "<tr><td style='color:" + color + ";'>" + e.series.name + "</td><th align='left'>" + nf(e.y) + "</th></tr>"; } }); html += "</table>"; return html; } }, credits: { enabled: false }, plotOptions: { column: { stacking: 'normal', dataLabels: { enabled: false } } }, series: series }); } var menuEntry = $("<tr />").append($("<td />").append($("<div />", { class: "menuoptions" }).text("Gráfico Roubo"))); var menuEntryMarket = $("<tr />").append($("<td />").append($("<div />", { class: "menuoptions" }).text("Gráfico Mercado"))); var url = window.location.href; if (url.indexOf("menu.php") > -1) { $("table.menutable").append(menuEntry); $("table.menutable").append(menuEntryMarket); var pageFrame = $('frame[name="CMAIN"]', top.document)[0].contentDocument; menuEntry.on("click", function () { getGraph(); }); menuEntryMarket.on("click", function () { getMarketGraph(); }); } })();