Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.48 KB | None | 0 0
  1. // ==UserScript==
  2. // @name richard.kolisek
  3. // @version 1.8
  4. // @description utility
  5. // @grant none
  6. // @require http://code.jquery.com/jquery-1.10.2.min.js
  7. // @require https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.bundle.min.js
  8. // @include http://www.meliorannis.com/*
  9. // ==/UserScript==
  10.  
  11. Array.prototype.diff = function(a) {
  12. return this.filter(function(i) {return a.indexOf(i) < 0;});
  13. };
  14.  
  15. var percentColors = [
  16. { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },
  17. { pct: 0.5, color: { r: 168, g: 168, b: 168 } },
  18. { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } } ];
  19.  
  20. var percentToColor = function(pct)
  21. {
  22. for (var i = 0; i < percentColors.length; i++)
  23. {
  24. if (pct <= percentColors[i].pct)
  25. {
  26. var lower = (i === 0) ? percentColors[i] : percentColors[i - 1];
  27. var upper = (i === 0) ? percentColors[i + 1] : percentColors[i];
  28. var range = upper.pct - lower.pct;
  29. var rangePct = (pct - lower.pct) / range;
  30. var pctLower = 1 - rangePct;
  31. var pctUpper = rangePct;
  32.  
  33. var color =
  34. {
  35. r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),
  36. g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),
  37. b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper)
  38. };
  39.  
  40. return 'rgb(' + [color.r, color.g, color.b].join(',') + ')';
  41. }
  42. }
  43. };
  44.  
  45. function getLastDbValue(id, property, searchHoursInPast)
  46. {
  47. var dbValues = localStorage[id];
  48. if (dbValues)
  49. {
  50. dbValues = JSON.parse(dbValues);
  51. dbValues.reverse();
  52.  
  53. for (var i in dbValues) {
  54.  
  55. var hourDifference = Math.abs(new Date() - new Date(dbValues[i].date)) / 36e5;
  56. if (searchHoursInPast && hourDifference > searchHoursInPast)
  57. {
  58. if (dbValues[i][property])
  59. return dbValues[i][property];
  60. }
  61. else if (!searchHoursInPast)
  62. {
  63. if (dbValues[i][property])
  64. return dbValues[i][property];
  65. }
  66. }
  67. }
  68.  
  69. return -1;
  70. }
  71.  
  72. function renderChangesValue(id, power, area, powerPos, areaPos, row, ot, otPos, pastValueResolver)
  73. {
  74. var powerDb = pastValueResolver(id, 'power');
  75. var areaDb = pastValueResolver(id, 'area');
  76. var otDb = pastValueResolver(id, 'ot');
  77.  
  78. var columns = $(row).children();
  79.  
  80. var powerColumn = $(columns[powerPos]);
  81. renrerValue(id, 'power', power, powerDb==-1 ? power : powerDb, true, powerColumn);
  82.  
  83. $('#' + id + '-dialog').click(function() {
  84. $('#' + id + '-dialog').css("display", "none");
  85. });
  86.  
  87. if(areaPos)
  88. {
  89. var areaColumn = $(columns[areaPos]);
  90. renrerValue(id, 'area', area, areaDb==-1 ? area : areaDb, false, areaColumn);
  91. }
  92.  
  93. if (otPos)
  94. {
  95. var otPlus = Number(ot) - Number(otDb);
  96.  
  97. if (otPlus || otPlus > -1)
  98. {
  99. var otColumn = $(columns[otPos]);
  100. renrerValue(id, 'ot', otPlus, otPlus, false, otColumn);
  101. }
  102. }
  103. }
  104.  
  105. function renrerValue(id, type, value, valueDb, isPercent, whereToRender)
  106. {
  107.  
  108. var percent = Math.round(percent * 10) / 10;
  109. percent = (value / (valueDb / 100) - 100).toFixed(1) + '%';
  110.  
  111. var val = (Math.round((value - valueDb) / 100) / 10) + 'k';
  112.  
  113. if (type === 'ot')
  114. {
  115. val = value;
  116. }
  117.  
  118. var element = '<font size="2" class="to-remove">(<span id="' + id + '-' + type + '" class="' + type +'">' + (isPercent ? percent : val) + '</span>)';
  119. whereToRender.append(element);
  120. whereToRender.click(function()
  121. {
  122. var storage = localStorage[id];
  123. var fakeRowId = 'fakeRow' + id;
  124.  
  125. if (storage && $('#' + fakeRowId).length === 0)
  126. {
  127. var data = JSON.parse(storage);
  128. data.reverse();
  129.  
  130. $('<tr class="fakeRow"><td colspan="20" >' +
  131. '<div id="' + fakeRowId + '"style="background-color: white; width: 800px;"></div>' +
  132. '</td></tr>').insertAfter($(whereToRender.parent()));
  133.  
  134. renderChart(data, 'power', id, $('#' + fakeRowId));
  135. renderChart(data, 'area', id, $('#' + fakeRowId));
  136. renderChart(data, 'ot', id, $('#' + fakeRowId));
  137.  
  138. $('#' + fakeRowId).click(function() {$('.fakeRow').remove();});
  139. }
  140. else
  141. {
  142. $('.fakeRow').remove();
  143. }
  144.  
  145. });
  146. }
  147.  
  148. function renderChart(data, type, id, elemtToAppend)
  149. {
  150. var chartId = type + 'Chart' + id;
  151.  
  152. $(elemtToAppend).append('<canvas id="' + chartId + '" width="1000" height="200"/>');
  153.  
  154. var datasets = createDataSet(data, type);
  155.  
  156. var tempData = {
  157. type: "line",
  158. data: {
  159. datasets : [ {label : datasets.label, data : datasets.data}]
  160. },
  161. options: {
  162. responsive : true,
  163. scales: {
  164. yAxes: [
  165. { position : 'right'}
  166. ],
  167. xAxes: [{
  168. type: 'time',
  169. unit: 'hour',
  170. unitStepSize: 1,
  171. time: {
  172. displayFormats: {
  173. 'millisecond': 'HH:mm',
  174. 'second': 'HH:mm',
  175. 'minute': 'HH:mm',
  176. 'hour': 'HH:mm',
  177. 'day': 'HH:mm',
  178. 'week': 'HH:mm',
  179. 'month': 'HH:mm',
  180. 'quarter': 'HH:mm',
  181. 'year': 'HH:mm',
  182. },
  183. round : 'hour'
  184. }
  185. }]
  186. },
  187. title: {
  188. display: false
  189. }
  190. },
  191. };
  192.  
  193. var ctx = document.getElementById(chartId).getContext("2d");
  194. new Chart(ctx, tempData);
  195. }
  196.  
  197. function createDataSet(data, type)
  198. {
  199. var includedHours = [];
  200. var hoursBack = 48;
  201.  
  202. var clearData = $(data).filter(
  203. function(index, row)
  204. {
  205. var hourDiff = Math.round(((new Date() - new Date(row.date)) / 36e5) * 10) / 10;
  206. // every 1/10h should have one value, 24h back
  207. var result = row[type] && hourDiff < hoursBack;// && !includedHours.includes(hourDiff);
  208. includedHours.push(hourDiff);
  209. return result;
  210. });
  211.  
  212. var labels = [], chartData=[];
  213.  
  214. var yesterday = new Date(new Date().getTime() - (hoursBack * 60 * 60 * 1000));
  215. chartData.push({x : yesterday, y : null});
  216.  
  217. $.each(clearData, function(index, packet) {
  218. chartData.push({x : new Date(packet.date), y : parseFloat(packet[type])});
  219. });
  220.  
  221. var now = new Date();
  222. chartData.push({x : now, y : null});
  223.  
  224. return { label : type, labels : labels, data: chartData };
  225. }
  226.  
  227. function formatDate(date)
  228. {
  229. var d = new Date(date);
  230. return [d.getDate(), (d.getMonth()+1)].join('.') + ' ' +
  231. [ d.getHours(), d.getMinutes()].join(':');
  232. }
  233.  
  234. function spies()
  235. {
  236. var table = $('#spies_report');
  237.  
  238. if (table)
  239. {
  240. var id = table.find('sup').text().replace('(', '').replace(')', '');
  241. var powerColumn = table.find('td:contains("Síla provincie")').next();
  242. var power = Number(powerColumn.text().split('(')[0]);
  243. var powerMine = Number($('.value_power').text());
  244.  
  245. var powerDb = getLastDbValue(id, 'power');
  246.  
  247. if (powerColumn.length !== 0)
  248. {
  249. powerColumn.append('<br/><a id="adjustArmy" style="color: green;">Pripravit armadu</a>');
  250. renrerValue(id, 'power', power, powerDb==-1 ? power : powerDb, true, powerColumn);
  251. }
  252.  
  253. $('#adjustArmy').click(
  254. function() {
  255. localStorage.powerDiff = (power * 1.245) - powerMine;
  256. window.location.href = $( "a:contains('Armáda')" ).attr('href');
  257. });
  258. }
  259.  
  260. $('#left_column_wrapper').append('<label>Nazev jednotky stitu</label><br/>');
  261. $('#left_column_wrapper').append('<input type="text" id="shieldUnit" style="width: 120px;" />');
  262.  
  263. $('#shieldUnit').css('background', 'url("/html/img/inputs_sprite.png") 0 0 no-repeat transparent');
  264. $('#shieldUnit').val(localStorage.shieldUnit ? localStorage.shieldUnit : '');
  265. $('#shieldUnit').on("change keyup paste", function() { localStorage.shieldUnit = $('#shieldUnit').val();});
  266.  
  267. if (localStorage.powerDiff && localStorage.powerDiff !== '' && localStorage.shieldUnit)
  268. {
  269. var selectUnit = $($('select')[1]).find('option:contains(' + localStorage.shieldUnit + ')').val();
  270. var unitPower = Number($('#army_table_army tr:contains(' + localStorage.shieldUnit + ') .army_unit_power').text());
  271. var unitExp = Number($('#army_table_army tr:contains(' + localStorage.shieldUnit + ') .army_unit_exp').text().replace('%', '').trim());
  272.  
  273. var oneUnitPower;
  274.  
  275. if (localStorage.powerDiff < 0)
  276. {
  277. oneUnitPower = (unitPower / 100) * unitExp;
  278. $($('select')[0]).val(selectUnit);
  279. $($('input[name="kolik"]')[0]).val(Math.abs(Math.round(localStorage.powerDiff / oneUnitPower)));
  280. $($('input[name="kolik"]')[0]).change();
  281. }
  282. else
  283. {
  284. oneUnitPower = unitPower * 0.4;
  285. $($('select')[1]).val(selectUnit);
  286. $($('input[name="kolik"]')[1]).val(Math.abs(Math.round(localStorage.powerDiff / oneUnitPower)));
  287. $($('input[name="kolik"]')[1]).change();
  288. }
  289.  
  290. localStorage.powerDiff = '';
  291. }
  292. }
  293.  
  294. function makeTableOrderable()
  295. {
  296. var tables = $('table:contains("Síla"):contains("ID")');
  297.  
  298. $.each(
  299. tables,
  300. function (i, table)
  301. {
  302.  
  303. var headRow = $(table).find('.heading');
  304.  
  305. var headColumns = $(headRow).find('td');
  306. $.each(headColumns,
  307. function (index, value)
  308. {
  309. $(value).click(function(){
  310. var table = $(this).parents('table').eq(0)
  311. var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
  312. this.asc = !this.asc
  313. if (!this.asc){rows = rows.reverse()}
  314. for (var i = 0; i < rows.length; i++){table.append(rows[i])}
  315. })
  316. });
  317. });
  318.  
  319. function comparer(index) {
  320. return function(a, b) {
  321. var valA = getCellValue(a, index);
  322. var valB = getCellValue(b, index);
  323.  
  324. if ($.isNumeric(valA.replace(" ", "").replace(/ *\([^)]*\) */g, "")))
  325. {
  326. valA = valA.replace(" ", "").replace(/ *\([^)]*\) */g, "");
  327. valB = valB.replace(" ", "").replace(/ *\([^)]*\) */g, "");
  328. }
  329.  
  330. return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB);
  331. }
  332. }
  333. function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
  334. }
  335.  
  336. function renderTableInfo(table, pastValueResolver)
  337. {
  338. var rows = $(table).find('tr');
  339.  
  340. var headRow = $(table).find('.heading');
  341.  
  342. var idPos;
  343. var namePos;
  344. var powerPos;
  345. var areaPos;
  346. var otPos;
  347. var protPos;
  348.  
  349. var headColumns = $(headRow).find('td');
  350. if(headColumns.length === 0)
  351. headColumns = $(headRow).find('th');
  352. $.each(headColumns,
  353. function (index, value)
  354. {
  355. var text = $(value).text().trim();
  356. if(text==='ID')
  357. idPos = index;
  358. if(text==='Regent')
  359. namePos = index;
  360. if(text.indexOf("Síla")===0)
  361. powerPos = index;
  362. if(text==='Rozloha' || text === 'hAR')
  363. areaPos = index;
  364. if(text==='O.T.')
  365. otPos = index;
  366. if(text===' Protekce')
  367. protPos = index;
  368.  
  369. });
  370.  
  371. $.each(rows,
  372. function (index, value)
  373. {
  374. if (index > 0) // skip header row
  375. {
  376. var columns = $(value).children();
  377. var id = $(columns[idPos]).children("span").clone().children().remove().end().text().trim();
  378.  
  379. if (!id)
  380. {
  381. id = $(columns[idPos]).text().trim();
  382. }
  383.  
  384. var name = $(columns[namePos]).text().trim();
  385. var power = $(columns[powerPos]).text().split('*').join('').trim();
  386. var area;
  387. var ot;
  388. var prot;
  389.  
  390. if(areaPos)
  391. area = $(columns[areaPos]).text().trim();
  392. if(otPos)
  393. ot = $(columns[otPos]).text().trim();
  394. if (protPos)
  395. prot = $(value).find('.listings_prot_mil').length === 1 ? "true" : "false";
  396.  
  397. renderChangesValue(id, power, area, powerPos, areaPos, value, ot, otPos, pastValueResolver);
  398.  
  399. if(!isNaN(parseFloat(id)))
  400. {
  401. var data = localStorage[id];
  402. var array = [];
  403.  
  404. var lastDbValPower = getLastDbValue(id, 'power');
  405. var lastDbValOt = getLastDbValue(id, 'ot');
  406. var lastDbValArea = getLastDbValue(id, 'area');
  407. var lastDbValProt = getLastDbValue(id, 'prot');
  408. var dataChanged = true;
  409.  
  410. if (lastDbValPower || lastDbValOt)
  411. dataChanged = (power && power !== lastDbValPower) || (ot && ot !== lastDbValOt) || (area && area !== lastDbValArea) || (prot && prot !== lastDbValProt);
  412.  
  413. if(data)
  414. array= JSON.parse(data);
  415.  
  416. if (dataChanged)
  417. {
  418. array.push({"power" : power, "area" : area, "date" : Date(), "ot": ot, "name": name, "prot" : prot});
  419. localStorage[id] = JSON.stringify(array);
  420. }
  421. else
  422. {
  423. array[array.length-1].date = new Date();
  424. localStorage[id] = JSON.stringify(array);
  425. }
  426. }
  427. }
  428. });
  429.  
  430. colorPercentages(table, '.power');
  431. colorPercentages(table, '.area');
  432. colorPercentages(table, '.ot');
  433. }
  434.  
  435. function main()
  436. {
  437. var tables = $('table:contains("Síla"):contains("ID"):not(#onlinePlayers)');
  438.  
  439. var pastValueResolver = (id, prop) => getLastDbValue(id, prop);
  440. $.each(tables, function (i, table) { renderTableInfo(table, pastValueResolver); });
  441. }
  442.  
  443. function colorPercentages(table, selector)
  444. {
  445. var percentElements = $(table).find(selector);
  446. var percentValues = $.map(
  447. percentElements,
  448. function(value)
  449. {
  450. return $(value).text().replace('k','').replace('%', '').replace('(', '').replace(')', '');
  451. }
  452. );
  453. var percentMax = Math.max.apply(Math, percentValues);
  454. var percentMin = Math.min.apply(Math, percentValues);
  455.  
  456. percentMax = percentMax === 0 ? 1 : percentMax;
  457. percentMin = percentMin === 0 ? 1 : percentMin;
  458.  
  459. $.each(
  460. percentElements,
  461. function(index, value)
  462. {
  463.  
  464. var currentValue = $(value).text().replace('k','').replace('%', '').replace('(', '').replace(')', '');
  465. var relativePercent = 0;
  466.  
  467. if(currentValue >= 0)
  468. {
  469. relativePercent = 50 + (Math.abs(currentValue) / (Math.abs(percentMax) / 50));
  470. }
  471. else
  472. {
  473. relativePercent = 50 - (Math.abs(currentValue) / (Math.abs(percentMin) / 50));
  474. }
  475.  
  476. $(value).css('color', percentToColor(relativePercent / 100));
  477. }
  478. );
  479. }
  480.  
  481. function renderHistoryTextField()
  482. {
  483. var tables = $('table:contains("Síla"):contains("ID"):not(#onlinePlayers)');
  484.  
  485. $.each(
  486. tables,
  487. function (i, table)
  488. {
  489. $(table).after("<label>Pocet hodin do zadu</label><input id='hour-field" + i + "' type='text'/>");
  490. $('#hour-field' + i).change(function()
  491. {
  492. var searchHoursInPast = Number($( this ).val().trim());
  493. var pastValueResolver = (id, prop) => getLastDbValue(id, prop);
  494.  
  495. $(table).find(".to-remove").remove();
  496. renderTableInfo(table, pastValueResolver);
  497. });
  498. });
  499. }
  500.  
  501. function kokotMeasure()
  502. {
  503. if (!localStorage.kokotMeasure)
  504. localStorage.kokotMeasure = 0;
  505. localStorage.kokotMeasure = Number(localStorage.kokotMeasure) + 1;
  506. $('body').append('<label style="position: absolute; left: 0; top: 0;">Jak velky jsi kokot: ' + localStorage.kokotMeasure + '</div>');
  507. }
  508.  
  509. function myPower()
  510. {
  511. var power = $('.value_power').text();
  512. var powerDb = Number(localStorage.me);
  513. var powerDifference = (power - powerDb);
  514.  
  515. if (powerDifference)
  516. {
  517. $('#LS_power_value').append('<span id="powerId" style="padding-left: 5px;">' + powerDifference + '</span>');
  518.  
  519. if (powerDifference < 0)
  520. {
  521. $('#powerId').css('color', 'RGB(255, 0, 0)');
  522.  
  523. document.title = 'Pokles o ' + powerDifference;
  524. beep(powerDifference);
  525. }
  526. else
  527. {
  528. $('#powerId').css('color', 'RGB(0, 255, 0)');
  529. }
  530. }
  531.  
  532. localStorage.me = power;
  533. }
  534.  
  535. function beep(difference)
  536. {
  537. if (localStorage.powerDiffEnabled === "true" && Math.abs(difference) > Number(localStorage.powerDiffTreshold))
  538. {
  539. (new Audio('http://www.freespecialeffects.co.uk/soundfx/music/trumpets.wav')).play();
  540. }
  541. }
  542.  
  543. function checkNewMessage()
  544. {
  545. if (!localStorage.powerDiffTreshold)
  546. {
  547. localStorage.powerDiffTreshold = 0;
  548. }
  549.  
  550. $('#left_column_wrapper').append('<br/><label style="padding-right: 25px;">New message notifier</label>');
  551.  
  552. $('#left_column_wrapper').append('<input id="messageNotifier" type="checkbox"/><br/>');
  553. $('#messageNotifier').prop('checked', localStorage.messageNotifier === "true");
  554. $('#messageNotifier').on("change keyup paste", function() {localStorage.messageNotifier = $("#messageNotifier").is(':checked');});
  555.  
  556. if ($('.new_post').length > 0 && localStorage.messageNotifier === "true")
  557. {
  558. (new Audio('https://www.mediacollege.com/downloads/sound-effects/star-trek/tng/tng-worf-incomingmessage.wav')).play();
  559. }
  560. }
  561.  
  562. function renderShieldStackPerc()
  563. {
  564. var shieldPwrElem = $('#econ_units_list').find('tr.tr_even:first > td:nth-child(6)');
  565. var shieldPwr = Number(shieldPwrElem.text());
  566. var totalPwr = Number($('#econ_units_list').find('.tr_econ_summary > td:nth-child(3)').text());
  567.  
  568. if (shieldPwr && totalPwr)
  569. {
  570. var shieldPerc = (100 * shieldPwr) / totalPwr;
  571.  
  572. shieldPwrElem.append(' (<span style="color: RGB(0, 255, 0);">' + shieldPerc.toFixed(1) + '%</span>)');
  573. }
  574. }
  575.  
  576. function renderNotes()
  577. {
  578. $('#left_column_wrapper').append('<br/><label>Notes</label><br/>');
  579. $('#left_column_wrapper').append('<textarea rows="4" cols="50" id="notes"></textarea>');
  580. $('#notes').val(localStorage.notes ? localStorage.notes : '');
  581. $('#notes').on("change keyup paste", function() {
  582. localStorage.notes = $('#notes').val();
  583. });
  584. }
  585.  
  586.  
  587. function formatDuration(duration) {
  588. var seconds = (duration / 1000).toFixed(0);
  589.  
  590. if (seconds > 60) {
  591. var minutes = (seconds / 60).toFixed(0);
  592.  
  593. if (minutes > 60) {
  594. var hours = (minutes / 60).toFixed(0);
  595.  
  596. if (hours > 24) {
  597. var days = (hours / 24).toFixed(0);
  598.  
  599. return "před " + days + "d";
  600. } else {
  601. return "před " + hours + "h";
  602. }
  603. } else {
  604. return "před " + minutes + "m";
  605. }
  606. } else {
  607. return "před " + seconds + "s";
  608. }
  609. }
  610.  
  611. function renderPlayers() {
  612.  
  613. function getPlayerTable(players) {
  614. var currentTime = new Date();
  615.  
  616. var tableStart =
  617. '<table id="listings_table_top20"><tbody>' +
  618. '<tr class="heading">' +
  619. '<td class="attacks_id">ID</td>' +
  620. '<td class="attacks_regent">Regent</td>' +
  621. '<td class="attacks_pwr">Síla</td>' +
  622. '<td class="attacks_protection"></td>' +
  623. '<td class="attacks_time">Čas vložení</td>' +
  624. '</tr>';
  625.  
  626. for (var i = 0; i < players.length; i++) {
  627. tableStart = tableStart +
  628. '<tr>' +
  629. '<td class="attacks_id">' + players[i].id + '</td>' +
  630. '<td class="attacks_regent">' + players[i].name + '</td>' +
  631. '<td class="attacks_pwr">' + players[i].power + '</td>' +
  632. '<td class="attacks_protection">' + (players[i].protection ? '*' : '') + '</td>' +
  633. '<td class="attacks_time">' + (formatDuration(Math.abs(currentTime - new Date(players[i].lastUpdate)))) + '</td></tr>';
  634. }
  635.  
  636. var tableEnd = '</tbody></table></div></div>';
  637.  
  638. return tableStart + tableEnd;
  639. }
  640.  
  641. var playersLink = $('#Attacks_list_detail a').attr("href").replace("vypis=utoky_detailne", "players");
  642. $('#Attacks_list_detail').after('<li id="playersLink"><a href="' + playersLink + '">Hráči</a></li>');
  643.  
  644. if (window.location.href.indexOf("players") != -1) {
  645. $('#central_column_bottom').empty();
  646.  
  647. getAllPlayers(function(data) {
  648. $('#central_column_bottom').append(getPlayerTable(data));
  649. });
  650. }
  651. }
  652.  
  653. function autorefresh()
  654. {
  655.  
  656. $('#left_column_wrapper').append('<br/><label>Auto hlidka (sec)</label><br/>');
  657. $('#left_column_wrapper').append('<input id="watchInterval" type="text" style="width: 120px;">');
  658. $('#left_column_wrapper').append('<input id="autoWatch" type="checkbox"/><br/>');
  659. $('#left_column_wrapper').append('<label>Bestiar</label><input id="autowatchBestiar" type="checkbox"/><br/>');
  660. $('#left_column_wrapper').append('<label>Cska</label><input id="autowatchCs" type="checkbox"/><br/>');
  661. $('#left_column_wrapper').append('<label>Armada</label><input id="autowatchArmy" type="checkbox"/><br/>');
  662. $('#left_column_wrapper').append('<label>Hospodareni</label><input id="autowatchHospodareni" type="checkbox"/><br/>');
  663. $('#left_column_wrapper').append('<label>Kouzla</label><input id="autowatchMagic" type="checkbox"/><br/>');
  664. $('#left_column_wrapper').append('<label>Vase umisteni</label><input id="autowatchYourPlacing" type="checkbox"/><br/>');
  665. $('#left_column_wrapper').append('<label>Mozne cile</label><input id="autowatchAllowedTargets" type="checkbox"/><br/>');
  666.  
  667. $('#autoWatch').css('position', 'absolute');
  668. $('#autoWatch').css('top', '20px');
  669. $('#autoWatch').css('left', '5px');
  670.  
  671. $('#watchInterval').css('background', 'url("/html/img/inputs_sprite.png") 0 0 no-repeat transparent');
  672. $('#watchInterval').val(localStorage.watchInterval ? localStorage.watchInterval : '');
  673. $('#watchInterval').on("change keyup paste", function() { localStorage.watchInterval = $('#watchInterval').val();});
  674.  
  675. addCheckboxDbListener('autoWatch');
  676. addCheckboxDbListener('autowatchBestiar');
  677. addCheckboxDbListener('autowatchCs');
  678. addCheckboxDbListener('autowatchArmy');
  679. addCheckboxDbListener('autowatchHospodareni');
  680. addCheckboxDbListener('autowatchMagic');
  681. addCheckboxDbListener('autowatchYourPlacing');
  682. addCheckboxDbListener('autowatchAllowedTargets');
  683.  
  684. var timer;
  685.  
  686. if (localStorage.autoWatch === "true")
  687. {
  688. timer = startTimer();
  689. }
  690.  
  691. $('#autoWatch').on("change keyup paste",
  692. function()
  693. {
  694. if ($("#autoWatch").is(':checked'))
  695. {
  696. timer = startTimer();
  697. }
  698. else if(timer)
  699. {
  700. clearInterval(timer);
  701. }
  702. });
  703. }
  704.  
  705. function addCheckboxDbListener(id)
  706. {
  707. $('#' + id).prop('checked', localStorage[id] === "true");
  708. $('#' + id).on("change keyup paste", function() { localStorage[id] = $("#" + id).is(':checked')});
  709. }
  710.  
  711. function startTimer()
  712. {
  713. var counter = Number(localStorage.watchInterval) * 1000;
  714. var timer = setTimeout(
  715. function()
  716. {
  717. var settingArray = ['autowatchBestiar', 'autowatchCs', 'autowatchArmy', 'autowatchHospodareni', 'autowatchMagic', 'autowatchYourPlacing', 'autowatchAllowedTargets'];
  718. settingArray = settingArray.filter(setting => localStorage[setting] === 'true')
  719.  
  720. var type = settingArray[Math.floor(Math.random() * settingArray.length)];;
  721.  
  722. console.log(type);
  723.  
  724. if (type === 'autowatchBestiar')
  725. {
  726. window.location.href = $( "a:contains('Bestiář')" ).attr('href');
  727. }
  728. else if (type === 'autowatchCs')
  729. {
  730. window.location.href = $( "a:contains('Výpis útoků')" ).attr('href');
  731. }
  732. else if (type === 'autowatchArmy')
  733. {
  734. window.location.href = $( "a:contains('Armáda')" ).attr('href');
  735. }
  736. else if (type === 'autowatchHospodareni')
  737. {
  738. window.location.href = $( "a:contains('Hospodaření')" ).attr('href');
  739. }
  740. else if (type === 'autowatchMagic')
  741. {
  742. window.location.href = $( "a:contains('Magie a kouzla')" ).attr('href');
  743. }
  744. else if (type === 'autowatchYourPlacing')
  745. {
  746. window.location.href = $( "a:contains('Možné cíle')" ).attr('href').replace('&prehled=mozne_cile', '&prehled=vase_umisteni');
  747. }
  748. else if (type === 'autowatchAllowedTargets')
  749. {
  750. window.location.href = $( "a:contains('Možné cíle')" ).attr('href');
  751. }
  752.  
  753. timer = setTimeout(this, 1000 + counter * Math.random());
  754. }, (2500 + counter * Math.random()));
  755.  
  756. return timer;
  757. }
  758.  
  759. function powerDiffAlarm()
  760. {
  761. if (!localStorage.powerDiffTreshold)
  762. {
  763. localStorage.powerDiffTreshold = 0;
  764. }
  765.  
  766. $('#left_column_wrapper').append('<br/><label style="padding-right: 25px;">Power alarm (power)</label>');
  767.  
  768. $('#left_column_wrapper').append('<input id="powerDiffEnabled" type="checkbox"/><br/>');
  769. $('#powerDiffEnabled').prop('checked', localStorage.powerDiffEnabled === "true");
  770. $('#powerDiffEnabled').on("change keyup paste", function() {localStorage.powerDiffEnabled = $("#powerDiffEnabled").is(':checked');});
  771.  
  772. $('#left_column_wrapper').append('<input id="powerDiffTreshold" type="text" style="width: 120px;"><br/>');
  773. $('#powerDiffTreshold').css('background', 'url("/html/img/inputs_sprite.png") 0 0 no-repeat transparent');
  774. $('#powerDiffTreshold').val(localStorage.powerDiffTreshold);
  775. $('#powerDiffTreshold').on("change keyup paste", function() { localStorage.powerDiffTreshold = $('#powerDiffTreshold').val();});
  776. }
  777.  
  778. function checkBestiar()
  779. {
  780. $('#left_column_wrapper').append('<br/><label style="padding-right: 25px;">Bestiar check (unit.exp,unit2.exp)</label>');
  781.  
  782. $('#left_column_wrapper').append('<input id="bestiarEnabled" type="checkbox"/><br/>');
  783. $('#bestiarEnabled').prop('checked', localStorage.bestiarEnabled === "true");
  784. $('#bestiarEnabled').on("change keyup paste", function() { localStorage.bestiarEnabled = $("#bestiarEnabled").is(':checked'); });
  785.  
  786. $('#left_column_wrapper').append('<textarea id="bestiarText" rows="2" cols="50"><br/>');
  787.  
  788. $('#bestiarText').val(localStorage.bestiarText ? localStorage.bestiarText : '');
  789. $('#bestiarText').on("change keyup paste", function() { localStorage.bestiarText = $('#bestiarText').val();});
  790.  
  791. if (window.location.pathname.includes("obchod") && localStorage.bestiarText && localStorage.bestiarEnabled === "true")
  792. {
  793. var unitExpPairs = localStorage.bestiarText.split(",");
  794. var count = 0;
  795.  
  796. $.each(unitExpPairs,
  797. function(index, unitExpPair)
  798. {
  799. var unit = unitExpPair.split(".")[0].trim();
  800. var exp = Number(unitExpPair.split(".")[1].trim());
  801. var stack;
  802.  
  803. if (unit.includes("#"))
  804. {
  805. stack = unit.split('#')[1].trim();
  806. unit = unit.split('#')[0].trim();
  807. }
  808.  
  809. // unit elements
  810. var elements = $("#beast_shop tr:not(.best_me_buyer):contains('" + unit + "')");
  811.  
  812. elements = elements.filter(
  813. function(i, el)
  814. {
  815. var expEl = $(el).find(".beast_shop_unit_exp");
  816. var stackV = $(el).find(".beast_shop_unit_stack");
  817.  
  818. return exp <= Number($(expEl).text().replace('%', '')) || stack <= Number($(stackV).text());
  819. }
  820. );
  821.  
  822. $.each(elements,
  823. function(index, el)
  824. {
  825. $(el).css('background-color', 'darkred');
  826. });
  827.  
  828. // contains unit
  829. if (elements.length !== 0)
  830. {
  831. if (unit === 'Str')
  832. {
  833. unit = "Shooter stack bigger " + stack;
  834. }
  835.  
  836. var url = 'http://api.voicerss.org/?key=9ed0aef9a2c64bc5abd65ca333588164&c=wav&hl=ru-ru&src=' + unit;
  837.  
  838. setTimeout(function(){
  839. (new Audio(url)).play();}, 1000 * count);
  840. count++;
  841. }
  842. }
  843. );
  844. }
  845. }
  846.  
  847. function checkCs() {
  848. var csList = $(".attacks_list_wrapper:contains('Bráněné útoky') > .attacks_wrapper > .attacks_table > tbody > tr:not('.heading'):contains('nevráceno')");
  849.  
  850. var count = 0;
  851.  
  852. $.each(csList, function (i, cs) {
  853. var name = $(cs).find('.attacks_regent').text().trim();
  854. var id = $(cs).find('.attacks_id .tt_player').clone().children().remove().end().text().trim();
  855. var powerDb = getLastDbValue(id, 'power');
  856. var power = $(cs).find('.attacks_pwr').text().trim();
  857. var powerDiff = power - powerDb;
  858.  
  859. console.log('cs ' + cs + ' id ' + id + ' powerdiff: ' + powerDiff);
  860.  
  861. if (powerDiff < 0) {
  862. var url = 'http://soundbible.com/grab.php?id=2103&type=wav';
  863.  
  864. setTimeout(function() {
  865. (new Audio(url)).play();}, 1000 * count);
  866. count++;
  867. }
  868. });
  869. }
  870.  
  871. function renderPlayersOnline()
  872. {
  873.  
  874. $('#left_column_wrapper').append('<br/><label style="padding-right: 25px;">Online player treshold (h)</label>');
  875.  
  876. $('#left_column_wrapper').append('<input id="onlinePlayerEnabled" type="checkbox"/><br/>');
  877. $('#onlinePlayerEnabled').prop('checked', localStorage.onlinePlayerEnabled === "true");
  878. $('#onlinePlayerEnabled').on("change keyup paste", function(){localStorage.onlinePlayerEnabled = $("#onlinePlayerEnabled").is(':checked');});
  879.  
  880. $('#left_column_wrapper').append('<input type="text" id="onlinePlayerTreshold" style="width: 120px;" /><br/>');
  881.  
  882. $('#onlinePlayerTreshold').val(localStorage.onlinePlayerTreshold ? localStorage.onlinePlayerTreshold : '');
  883. $('#onlinePlayerTreshold').on("change keyup paste", function() { localStorage.onlinePlayerTreshold = $('#onlinePlayerTreshold').val();});
  884.  
  885. if (!localStorage.onlinePlayerTreshold)
  886. {
  887. localStorage.onlinePlayerTreshold = 0.5;
  888. }
  889.  
  890. if (localStorage.onlinePlayerEnabled !== "true")
  891. {
  892. return;
  893. }
  894.  
  895. var treshold = Number(localStorage.onlinePlayerTreshold);
  896. var changedValues = Array.apply(0, new Array(localStorage.length))
  897. .map(function (o, i) {return localStorage.key(i);})
  898. .filter(function(i){return /^\d+$/.test(i)})
  899. .map(function(id)
  900. {
  901. var otVal = getPreviousVal(id, treshold, "ot");
  902. var areaVal = getPreviousVal(id, treshold, "area");
  903. var powerVal = getPreviousVal(id, treshold, "power");
  904. var powerDb = getLastDbValue(id, 'power');
  905.  
  906. var dates = [otVal, areaVal, powerVal]
  907. .filter(val => val)
  908. .sort((a, b) => (a.date > b.date) ? 1 : -1);
  909.  
  910. if (dates && dates.length > 0)
  911. {
  912. var result = dates[0];
  913. result["id"] = id;
  914. result["timeDiff"] = Math.abs(new Date() - new Date(result.date));;
  915. if (powerVal)
  916. {
  917. result["power"] = powerVal.power;
  918. }
  919. if (areaVal)
  920. {
  921. result["area"] = areaVal.area;
  922. }
  923. if (otVal)
  924. {
  925. result["ot"] = otVal.ot;
  926. }
  927. return result;
  928. }
  929. })
  930. .filter(val => val)
  931. .sort((a, b) => (a.timeDiff > b.timeDiff) ? 1 : -1);;
  932.  
  933. var tableContent = changedValues.map(function(val)
  934. {
  935. var powerDb = getLastDbValue(val.id, 'power');
  936. var areaDb = getLastDbValue(val.id, 'area');
  937. var name = getLastDbValue(val.id, 'name');
  938. var timeDiff = val.timeDiff;
  939. var otsDiff = getLastDiff(val.id, treshold, "ot");
  940.  
  941. var protDb = getLastDbValue(val.id, 'prot') === 'true' ? '*' : '';
  942. return '<tr><td class="onlineIds">' + val.id + '</td><td style="word-break: break-all;">' + name + protDb + '</td><td>' +
  943. powerDb + '</td><td>' + areaDb + '</td><td>+' +
  944. otsDiff + '</td><td>' + formatDuration(timeDiff) + '</td></tr>';
  945. })
  946. .join('');
  947.  
  948. $(document.body).append('<table id="onlinePlayers" style="bottom: 0;width: 300px; position: fixed;right: 0px;background-color: black;overflow-y: scroll;max-height: 100%;">' +
  949. '<tr class="heading"><td>ID</td><td>Name</td><td>Síla</td><td>hAR</td><td>TU</td><td><td></tr>' +
  950. tableContent +
  951. '</table>');
  952.  
  953. var selectedIds = localStorage["selectedIds"] ? JSON.parse(localStorage["selectedIds"]) : [];
  954. var onlineIds = $('.onlineIds').map(function(){
  955. return $.trim($(this).text());
  956. }).get();
  957.  
  958. var selectedOnlineIds = selectedIds
  959. .filter(id => onlineIds.includes(id))
  960. .filter(function(item, pos, self) {return self.indexOf(item) == pos;}); // remove redundances;
  961.  
  962. // remove non online from map
  963. localStorage["selectedIds"] = JSON.stringify(selectedOnlineIds);
  964. selectedOnlineIds.forEach(id => markTableRowWithId(id, true));
  965.  
  966. $('.onlineIds').on('click', function(event)
  967. {
  968. var id = $(event.target).text().trim();
  969. var selectedIds = JSON.parse(localStorage["selectedIds"]);
  970. if (selectedIds.includes(id))
  971. {
  972. selectedIds.pop(id);
  973. markTableRowWithId(id, false);
  974. }
  975. else
  976. {
  977. selectedIds.push(id);
  978. markTableRowWithId(id, true);
  979. }
  980. localStorage["selectedIds"] = JSON.stringify(selectedIds);
  981. });
  982.  
  983. var pastValueResolver = (id, prop) =>
  984. {
  985. var filtered = changedValues.filter(val => val.id === id);
  986.  
  987. if (filtered && filtered[0][prop])
  988. {
  989. return filtered[0][prop];
  990. }
  991. return getLastDbValue(id, prop);
  992. }
  993. renderTableInfo($('#onlinePlayers'), pastValueResolver);
  994. }
  995.  
  996. function markTableRowWithId(id, mark)
  997. {
  998. var tr = $('table:contains("ID")').find('tr:contains("' + id +'")');
  999. if (tr && mark)
  1000. {
  1001. $(tr).css("background-color", "#9400D3");
  1002. $('html, body').animate({
  1003. scrollTop: ($(tr).first().offset().top)
  1004. },10);
  1005. }
  1006. else if (tr)
  1007. {
  1008. $(tr).css("background-color", "");
  1009. }
  1010. }
  1011.  
  1012.  
  1013. function getPreviousVal(id, treshold, property)
  1014. {
  1015. var arr = filterDbValuesByTimeTreashold(id, treshold);
  1016. var values = arr
  1017. .filter(function(val) {return val[property]})
  1018. .map(e => e[property])
  1019. .map((e, i, final) => final.indexOf(e) === i && i)
  1020. .filter(e => arr[e])
  1021. .map(e => arr[e]);
  1022.  
  1023. if (values.length > 1)
  1024. {
  1025. return values[1];
  1026. }
  1027. }
  1028.  
  1029. function getLastDiff(id, treshold, property)
  1030. {
  1031. var values = filterDbValuesByTimeTreashold(id, treshold)
  1032. .map(function(val) {return val[property]})
  1033. .filter(function(val) {return val})
  1034. .filter(function(item, pos, self) {return self.indexOf(item) == pos;}); // remove redundances
  1035.  
  1036. var diff = 0;
  1037.  
  1038. if (values.length > 1)
  1039. {
  1040. diff = values[0] - values[1];
  1041. }
  1042.  
  1043. return diff;
  1044. }
  1045.  
  1046. function filterDbValuesByTimeTreashold(id, treshold)
  1047. {
  1048. var dbValues = JSON.parse(localStorage[id]);
  1049.  
  1050. dbValues.reverse();
  1051. return dbValues.filter(function(i) {return ((Math.abs(new Date() - new Date(i.date)) + 1000) / 36e5) < treshold;});
  1052. }
  1053.  
  1054. function renderNoteForPlayer()
  1055. {
  1056. $('.tt_player').on('click', function(event)
  1057. {
  1058. // how to get id?
  1059. var id = $(event.target).text().trim().substring(0,4);
  1060.  
  1061. var popup = $('.tooltip:contains("' + id + '")')[0];
  1062.  
  1063. $('.tooltip').css('background-color', 'black');
  1064. if ($(popup).find('textarea').length === 0)
  1065. {
  1066. $(popup).append('<br/><label>Notes for player</label><br/>');
  1067. $(popup).append('<textarea rows="4" cols="50" id="notes' + id + '"></textarea>');
  1068. $('#notes' + id).val(localStorage["notes" + id] ? localStorage["notes" + id] : '');
  1069. $('#notes' + id).on("change keyup paste click", function(event)
  1070. {
  1071. localStorage["notes" + id] = $('#notes' + id).val();
  1072. event.stopPropagation();
  1073. });
  1074. }
  1075. });
  1076. }
  1077.  
  1078. function sendSlackNotification()
  1079. {
  1080. $.ajax({
  1081. data: 'payload=' + JSON.stringify({
  1082. "text": "David koberec, lul"
  1083. }),
  1084. dataType: 'json',
  1085. processData: false,
  1086. type: 'POST',
  1087. url: "https://hooks.slack.com/services/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"
  1088. });
  1089. }
  1090.  
  1091. function searchEnhance()
  1092. {
  1093. // only for search page
  1094. if (window.location.href.includes('multifunc'))
  1095. {
  1096. var rows = $('#search_results_table').find('tr:not(.heading):not(.tr_summary)')
  1097.  
  1098. $.each(rows,
  1099. function(index, el)
  1100. {
  1101. var id = $($(el).children()[0]).text().trim().substring(0,4);
  1102. var powerCol = $(el).children()[4];
  1103. var atackCol = $(el).children()[7];
  1104. var power = Number($(powerCol).text().trim());
  1105. var powerMine = Number($('.value_power').text());
  1106.  
  1107. $(atackCol).append('<br/><a id="adjustArmy' + id +'" style="color: green;">Pripravit armadu</a>');
  1108. $('#adjustArmy' + id).click(
  1109. function() {
  1110. localStorage.powerDiff = (power * 1.245) - powerMine;
  1111. var win = window.open($("a:contains('Armáda')" ).attr('href'));
  1112. win.focus();
  1113. });
  1114. });
  1115.  
  1116. }
  1117. }
  1118.  
  1119. searchEnhance();
  1120. checkCs();
  1121. renderNoteForPlayer();
  1122. renderPlayersOnline();
  1123. makeTableOrderable();
  1124. renderNotes();
  1125. checkBestiar();
  1126. powerDiffAlarm();
  1127. renderPlayers();
  1128. renderShieldStackPerc();
  1129. myPower();
  1130. kokotMeasure();
  1131. renderHistoryTextField();
  1132. main();
  1133. spies();
  1134. autorefresh();
  1135. checkNewMessage();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement