Greasy Fork镜像 支持简体中文。

GN_CardState

Статистика карточных игр персонажа

  1. // ==UserScript==
  2. // @name GN_CardState
  3. // @namespace Gradient
  4. // @description Статистика карточных игр персонажа
  5. // @include /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/pl_info\.php\?id=\d+/
  6. // @version 1.1.8
  7. // ==/UserScript==
  8.  
  9. "use strict";
  10.  
  11. //----------------------------------------------------------------------------//
  12.  
  13. var script_name = 'GN_CardState'; // Enter your script name here
  14. var script_version = '1.1.8';
  15.  
  16. //----------------------------------------------------------------------------//
  17.  
  18. (function(){ try{ // wrapper start
  19.  
  20. //----------------------------------------------------------------------------//
  21. // UnifiedLibrary 1.7.0 start
  22. //----------------------------------------------------------------------------//
  23.  
  24. //----------------------------------------------------------------------------//
  25. // SysUtils
  26. //----------------------------------------------------------------------------//
  27.  
  28. var GN_SysUtils = new SysUtils(script_name);
  29. var SU = GN_SysUtils;
  30.  
  31. //----------------------------------------------------------------------------//
  32.  
  33. function SysUtils(name){ // wrapper start
  34.  
  35. //----------------------------------------------------------------------------//
  36.  
  37. this.show_error = function(error_string, use_alert){
  38. if(use_alert)
  39. alert(error_string);
  40.  
  41. throw new Error(error_string);
  42. };
  43.  
  44. if(arguments.length != 1)
  45. this.show_error('Wrong SysUtils arguments');
  46.  
  47. if(!arguments[0])
  48. this.show_error('Empty SysUtils argument');
  49.  
  50. //----------------------------------------------------------------------------//
  51.  
  52. this.compare = function(a, b){
  53. return (a == b) ? 0 : (a > b ? 1 : -1);
  54. };
  55.  
  56. //----------------------------------------------------------------------------//
  57.  
  58. this.send_get = function(url)
  59. {
  60. var xhr = new XMLHttpRequest();
  61. xhr.open('GET', url, false);
  62. xhr.overrideMimeType('text/plain; charset=windows-1251');
  63. xhr.send(null);
  64.  
  65. if(xhr.status == 200)
  66. return xhr.responseText;
  67.  
  68. return null;
  69. };
  70.  
  71. //----------------------------------------------------------------------------//
  72.  
  73. this.save_value = function(desc, value){
  74. var div = document.getElementById('GN_GM_Handler');
  75. div.setAttribute('desc', desc);
  76. div.setAttribute('value', value);
  77. div.setAttribute('operation', 'save');
  78.  
  79. div.click();
  80.  
  81. if(div.getAttribute('state') != 'complete')
  82. this.show_error('Ошибка при сохранении значения');
  83. };
  84.  
  85. //----------------------------------------------------------------------------//
  86.  
  87. this.load_value = function(value, def){
  88. var div = document.getElementById('GN_GM_Handler');
  89. div.setAttribute('desc', value);
  90. div.setAttribute('operation', 'load');
  91.  
  92. div.click();
  93.  
  94. if(div.getAttribute('state') != 'complete')
  95. this.show_error('Ошибка при загрузке значения');
  96.  
  97. return (div.getAttribute('is_null') == 'true' ? def : div.getAttribute('value'));
  98. };
  99.  
  100. //----------------------------------------------------------------------------//
  101.  
  102. this.remove_value = function(value){
  103. var div = document.getElementById('GN_GM_Handler');
  104. div.setAttribute('desc', value);
  105. div.setAttribute('operation', 'remove');
  106.  
  107. div.click();
  108.  
  109. if(div.getAttribute('state') != 'complete')
  110. this.show_error('Ошибка при удалении значения');
  111. };
  112.  
  113. //----------------------------------------------------------------------------//
  114.  
  115. var current_id = null;
  116.  
  117. //----------------------------------------------------------------------------//
  118.  
  119. function check_mandatory_scripts(alerter){
  120. var persistent_storage_sign = document.getElementById('GN_GM_Handler');
  121. var common_values_sign = document.getElementById('GN_CommonValuesSign');
  122. var alert_sign = document.getElementById('GN_AlertSign');
  123.  
  124. if(!alert_sign){
  125. alert_sign = document.createElement('div');
  126. alert_sign.id = 'GN_AlertSign';
  127. alert_sign.setAttribute('alerted', 'false');
  128. document.body.appendChild(alert_sign);
  129. }
  130.  
  131. var alerted = alert_sign.getAttribute('alerted') != 'false';
  132.  
  133. if(!persistent_storage_sign){
  134. alert_sign.setAttribute('alerted', 'true');
  135. alerter('Скрипт ' + name + ' требует для своей работы скрипт управления данными (GN_PersistentStorage), который должен стоять первым в порядке выполнения скриптов.\n'
  136. + 'Подробнее здесь: "https://gf.qytechs.cn/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  137. }
  138.  
  139. if(!common_values_sign){
  140. alert_sign.setAttribute('alerted', 'true');
  141. alerter('Скрипт ' + name + ' требует для своей работы скрипт, хранящий данные (GN_CommonValuesFiller), который должен стоять вторым в порядке выполнения скриптов.\n'
  142. + 'Подробнее здесь: "https://gf.qytechs.cn/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  143. }
  144. }
  145.  
  146. this.check_login = function(){
  147. var re = /.*?pl_id=(\d+)[^\d]*?/gmi;
  148. var matches = re.exec(document.cookie.toString());
  149.  
  150. if(matches){
  151. current_id = +matches[1];
  152.  
  153. check_mandatory_scripts(this.show_error);
  154. }
  155. };
  156.  
  157. //----------------------------------------------------------------------------//
  158.  
  159. this.save_file = function(text, info){
  160. var res = 'data:text/csv;charset=utf-8,' + encodeURI(text);
  161.  
  162. if(info)
  163. alert(info);
  164.  
  165. window.open(res);
  166. };
  167.  
  168. //----------------------------------------------------------------------------//
  169.  
  170. this.string_to_date = function(str){
  171. var matches = /(\d{2})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})/.exec(str);
  172.  
  173. return new Date(2000 + +matches[3], +matches[2] - 1, +matches[1], +matches[4], +matches[5]);
  174. };
  175.  
  176. //----------------------------------------------------------------------------//
  177.  
  178. this.show_el = function(el, visible){
  179. el.style.display = visible ? '' : 'none';
  180. };
  181.  
  182. //----------------------------------------------------------------------------//
  183.  
  184. this.reload_page = function(){
  185. document.location.href = document.location.href;
  186. };
  187.  
  188. //----------------------------------------------------------------------------//
  189.  
  190. this.check_login();
  191.  
  192. //----------------------------------------------------------------------------//
  193.  
  194. } // wrapper end
  195.  
  196. //----------------------------------------------------------------------------//
  197. // CommonValues
  198. //----------------------------------------------------------------------------//
  199.  
  200. var GN_CommonValues = new CommonValues();
  201.  
  202. //----------------------------------------------------------------------------//
  203.  
  204. function CommonValues(){ // wrapper start
  205.  
  206. //----------------------------------------------------------------------------//
  207. // Card types
  208. //----------------------------------------------------------------------------//
  209.  
  210. this.enum_sct = { // sync?
  211. tavern: 0,
  212. tour_pvp: 1,
  213. tour_pve: 2
  214. };
  215.  
  216. this.sorted_card_types = JSON.parse(SU.load_value('GN_CommonValues_SortedCardTypes', '[]'));
  217. this.card_types = JSON.parse(SU.load_value('GN_CommonValues_CardTypes', '[]'));
  218.  
  219. //----------------------------------------------------------------------------//
  220.  
  221. this.get_card_type = function(id){
  222. for(var i = 0; i < this.card_types.length; ++i)
  223. if(this.card_types[i].id == id)
  224. return this.card_types[i];
  225.  
  226. return null;
  227. };
  228.  
  229. //----------------------------------------------------------------------------//
  230.  
  231. this.get_sorted_card_type = function(id){
  232. for(var i = 0; i < this.sorted_card_types.length; ++i)
  233. if(this.sorted_card_types[i].id == id)
  234. return this.sorted_card_types[i];
  235.  
  236. return null;
  237. };
  238.  
  239. //----------------------------------------------------------------------------//
  240.  
  241. } // wrapper end
  242.  
  243. //----------------------------------------------------------------------------//
  244. // UnifiedLibrary end
  245. //----------------------------------------------------------------------------//
  246.  
  247. var show_error = SU.show_error;
  248. var load_value = SU.load_value;
  249. var save_value = SU.save_value;
  250. var remove_value = SU.remove_value;
  251. var send_get = SU.send_get;
  252. var compare = SU.compare;
  253. var save_file = SU.save_file;
  254. var show_el = SU.show_el;
  255. var string_to_date = SU.string_to_date;
  256. var reload_page = SU.reload_page;
  257.  
  258. var CV = GN_CommonValues;
  259. var sorted_card_types = CV.sorted_card_types;
  260. var enum_sct = CV.enum_sct;
  261.  
  262. //----------------------------------------------------------------------------//
  263.  
  264. var card_states = load_states();
  265. var parser_info = load_parser_info();
  266. var is_parser_running = false;
  267.  
  268. //----------------------------------------------------------------------------//
  269.  
  270. var table_width = 0;
  271. start_work();
  272.  
  273. //----------------------------------------------------------------------------//
  274.  
  275. function start_work(){
  276. var prev_sibling = get_sibling();
  277.  
  278. if(!prev_sibling)
  279. show_error('Не найден элемент привязки');
  280.  
  281. table_width = prev_sibling.width;
  282.  
  283. var header = draw_header_table(prev_sibling);
  284. draw_table(header);
  285. draw_expand_all(header);
  286. }
  287.  
  288. //----------------------------------------------------------------------------//
  289.  
  290. function get_sibling(){
  291. var transfer = document.querySelector('table > tbody > tr > td > a[href*="pl_transfers.php?id="]');
  292. return transfer ? transfer.parentNode.parentNode.parentNode.parentNode : null;
  293. }
  294.  
  295. //----------------------------------------------------------------------------//
  296.  
  297. function draw_expand_all(next_sibling){
  298. var table = document.createElement('table');
  299. table.className = 'wblight';
  300. table.width = table_width;
  301. table.align = 'center';
  302. next_sibling.parentNode.insertBefore(table, next_sibling);
  303.  
  304. var tr = document.createElement('tr');
  305. table.appendChild(tr);
  306.  
  307. var script_desc = 'Карточная статистика ' + script_version;
  308.  
  309. var expander = document.createElement('td');
  310. expander.setAttribute('align', 'center');
  311. expander.setAttribute('colspan', '6');
  312. var is_expanded = load_value(script_name + 'Expand', 'false') == 'true';
  313. expander.setAttribute('expand', is_expanded ? 'true' : 'false');
  314. expander.textContent = script_desc + (is_expanded ? ' (скрыть)' : ' (показать)');
  315. expander.addEventListener('click', function(e){
  316. e.preventDefault();
  317.  
  318. var expanded = expander.getAttribute('expand') == 'false';
  319. show_el(next_sibling, expanded);
  320. show_el(next_sibling.nextSibling, expanded);
  321.  
  322. save_value(script_name + 'Expand', expanded ? 'true' : 'false');
  323.  
  324. expander.setAttribute('expand', expanded ? 'true' : 'false');
  325. expander.textContent = expanded ? (script_desc + ' (скрыть)') : (script_desc + ' (показать)');
  326. });
  327.  
  328. tr.appendChild(expander);
  329.  
  330. show_el(next_sibling, is_expanded);
  331. show_el(next_sibling.nextSibling, is_expanded);
  332. }
  333.  
  334. //----------------------------------------------------------------------------//
  335.  
  336. function draw_header_table(prev_sibling){
  337. var table = document.createElement('table');
  338. table.className = 'wblight';
  339. table.width = table_width;
  340. table.align = 'center';
  341. table.id = script_name + 'ContentHeader';
  342.  
  343. prev_sibling.parentNode.insertBefore(table, prev_sibling.nextSibling);
  344.  
  345. var tr = document.createElement('tr');
  346. table.appendChild(tr);
  347.  
  348. var td = document.createElement('td');
  349. td.id = script_name + 'RefreshDate';
  350. tr.appendChild(td);
  351. td.textContent = 'Дата последнего обновления: ' + (parser_info.refresh_date ? parser_info.refresh_date.toLocaleString() : 'еще не считывалось');
  352.  
  353. td = document.createElement('td');
  354. td.align = 'right';
  355. tr.appendChild(td);
  356.  
  357. var refresh_button = document.createElement('input');
  358. refresh_button.type = 'button';
  359. refresh_button.value = 'Обновить данные';
  360. refresh_button.id = script_name + 'Refresh';
  361. refresh_button.addEventListener('click', parse_data);
  362. td.appendChild(refresh_button);
  363.  
  364. tr = document.createElement('tr');
  365. table.appendChild(tr);
  366.  
  367. td = document.createElement('td');
  368. td.id = script_name + 'ParseDate';
  369. tr.appendChild(td);
  370. td.textContent = 'Дата последней считанной игры: ' + (parser_info.parse_date ? parser_info.parse_date.toLocaleString() : 'еще не считывалось');
  371.  
  372. td = document.createElement('td');
  373. td.align = 'right';
  374. tr.appendChild(td);
  375.  
  376. var export_button = document.createElement('input');
  377. export_button.type = 'button';
  378. export_button.value = 'Экспорт в файл';
  379. export_button.id = script_name + 'Export';
  380. export_button.addEventListener('click', export_to_file);
  381. td.appendChild(export_button);
  382.  
  383. var remove_button = document.createElement('input');
  384. remove_button.type = 'button';
  385. remove_button.value = 'Очистить статистику';
  386. remove_button.id = script_name + 'Remove';
  387. remove_button.addEventListener('click', remove_data);
  388. td.appendChild(remove_button);
  389.  
  390. return table;
  391. }
  392.  
  393. //----------------------------------------------------------------------------//
  394.  
  395. function draw_table(prev_sibling){
  396. var table = document.createElement('table');
  397. table.className = 'wblight';
  398. table.width = table_width;
  399. table.align = 'center';
  400. table.id = script_name + 'Content';
  401. prev_sibling.parentNode.insertBefore(table, prev_sibling.nextSibling);
  402.  
  403. update_content(table, false);
  404.  
  405. return table;
  406. }
  407.  
  408. //----------------------------------------------------------------------------//
  409.  
  410. function update_content(parent, remove_childs){
  411. if(remove_childs)
  412. while(parent.lastChild)
  413. parent.removeChild(parent.lastChild);
  414.  
  415. if(card_states.length){
  416. draw_header(parent);
  417.  
  418. sorted_card_types.forEach(function(current){
  419. current.win = current.loss = current.total = 0;
  420. });
  421.  
  422. card_states.forEach(function(current){
  423. var card_type = CV.get_card_type(current.id);
  424. var sorted_card_type = CV.get_sorted_card_type(card_type.type);
  425.  
  426. sorted_card_type.win += current.win;
  427. sorted_card_type.loss += current.loss;
  428. sorted_card_type.total += current.total;
  429. });
  430.  
  431. sorted_card_types.sort(function(a, b){
  432. var a_pt = a.win*100/(a.win + a.loss);
  433. var b_pt = b.win*100/(b.win + b.loss);
  434.  
  435. if(isNaN(a_pt) || isNaN(b_pt))
  436. return isNaN(a_pt) ? 1 : -1;
  437.  
  438. if(a_pt == b_pt)
  439. return compare(b.win, a.win);
  440.  
  441. return compare(b_pt, a_pt);
  442. });
  443.  
  444. sorted_card_types.forEach(function(current){
  445. if(current.win + current.loss > 0)
  446. draw_sorted_row(parent, current);
  447. });
  448.  
  449. draw_bottom_header(parent);
  450. }
  451. }
  452.  
  453. //----------------------------------------------------------------------------//
  454.  
  455. function draw_header(parent){
  456. var tr = document.createElement('tr');
  457. parent.appendChild(tr);
  458.  
  459. ['Тип игры', 'Баланс', 'Победы', 'Поражения', 'Процент побед', 'Итого'].forEach(function(current){
  460. var td = document.createElement('td');
  461. tr.appendChild(td);
  462.  
  463. var b = document.createElement('b');
  464. td.appendChild(b);
  465. b.textContent = current;
  466. });
  467. }
  468.  
  469. //----------------------------------------------------------------------------//
  470.  
  471. function draw_sorted_row(parent, content){
  472. var tr = document.createElement('tr');
  473. tr.setAttribute('bgcolor', content.color);
  474. parent.appendChild(tr);
  475.  
  476. var td = document.createElement('td');
  477. tr.appendChild(td);
  478.  
  479. var a = document.createElement('a');
  480. a.setAttribute('expanded', 'false');
  481. a.addEventListener('click', function(){
  482. var expanded = a.getAttribute('expanded') == 'false';
  483.  
  484. if(expanded){
  485. card_states.sort(function(a, b){
  486. var a_pt = a.win*100/(a.win + a.loss);
  487. var b_pt = b.win*100/(b.win + b.loss);
  488.  
  489. if(a_pt == b_pt)
  490. return compare(a.win, b.win);
  491.  
  492. return compare(a_pt, b_pt);
  493. });
  494.  
  495. var count = 0;
  496. card_states.forEach(function(current){
  497. var card_type = CV.get_card_type(current.id);
  498.  
  499. if(card_type.type == content.id){
  500. draw_row(tr, content.id, current, count % 2 === 0 ? '#ffffff' : '#eeeeee');
  501. ++count;
  502. }
  503. });
  504. }
  505. else
  506. while(tr.nextSibling && tr.nextSibling.getAttribute('id') && tr.nextSibling.getAttribute('id').indexOf(script_name + '_' + content.id + '_') != -1)
  507. parent.removeChild(tr.nextSibling);
  508.  
  509. a.setAttribute('expanded', expanded ? 'true' : 'false');
  510. });
  511. td.appendChild(a);
  512.  
  513. var type = CV.get_sorted_card_type(content.id);
  514.  
  515. var u = document.createElement('u');
  516. u.textContent = type.desc;
  517. a.appendChild(u);
  518.  
  519. var sum = content.win + content.loss;
  520. var percent = content.win*100/sum;
  521.  
  522. [content.total, content.win, content.loss, percent.toFixed(2) + '%', sum].forEach(function(current){
  523. td = document.createElement('td');
  524. tr.appendChild(td);
  525. td.textContent = current;
  526. });
  527. }
  528.  
  529. //----------------------------------------------------------------------------//
  530.  
  531. function draw_row(prev_sibling, sibling_id, content, color){
  532. var tr = document.createElement('tr');
  533. tr.id = script_name + '_' + sibling_id + '_' + content.id;
  534. tr.setAttribute('bgcolor', color);
  535. prev_sibling.parentNode.insertBefore(tr, prev_sibling.nextSibling);
  536.  
  537. var type = CV.get_card_type(content.id);
  538. var sum = content.win + content.loss;
  539. var percent = content.win*100/sum;
  540.  
  541. [type.desc, content.total, content.win, content.loss, percent.toFixed(2) + '%', sum].forEach(function(current){
  542. var td = document.createElement('td');
  543. tr.appendChild(td);
  544. td.textContent = current;
  545. });
  546. }
  547.  
  548. //----------------------------------------------------------------------------//
  549.  
  550. function draw_bottom_header(parent){
  551. var tr = document.createElement('tr');
  552. tr.id = script_name + 'BottomHeader';
  553. parent.appendChild(tr);
  554.  
  555. var win_sum = 0,
  556. loss_sum = 0,
  557. total_sum = 0;
  558.  
  559. card_states.forEach(function(current){
  560. win_sum += current.win;
  561. loss_sum += current.loss;
  562. total_sum += current.total;
  563. });
  564.  
  565. var sum = win_sum + loss_sum;
  566. var percent = win_sum*100/sum;
  567.  
  568. ['Все игры', total_sum, win_sum, loss_sum, percent.toFixed(2) + '%', sum].forEach(function(current){
  569. var td = document.createElement('td');
  570. tr.appendChild(td);
  571.  
  572. var b = document.createElement('b');
  573. td.appendChild(b);
  574. b.textContent = current;
  575. });
  576. }
  577.  
  578. //----------------------------------------------------------------------------//
  579.  
  580. function export_to_file(){
  581. if(!card_states.length)
  582. return;
  583.  
  584. var linebreak = '%0D%0A';
  585. var res = ['Тип игры', 'Баланс', 'Победы', 'Поражения', 'Процент побед', 'Итого'].join(';') + linebreak;
  586.  
  587. card_states.forEach(function(current){
  588. var card_type = CV.get_card_type(current.id);
  589. var sum = current.win + current.loss;
  590. var percent = current.win*100/sum;
  591.  
  592. res += [card_type.desc, current.total, current.win, current.loss, percent.toFixed(2) + '%', sum].join(';') + linebreak;
  593. });
  594.  
  595. save_file(res, 'Сейчас будет предложено сохранить файл с результатами. Переименуйте его в формат .csv, разделитель - ";"');
  596. }
  597.  
  598. //----------------------------------------------------------------------------//
  599.  
  600. function parse_data(){
  601. if(is_parser_running)
  602. return;
  603.  
  604. document.body.style.cursor = 'wait';
  605.  
  606. ['Refresh', 'Export', 'Remove'].forEach(function(current){
  607. var el = document.getElementById(script_name + current);
  608. el.setAttribute('disabled', '');
  609. });
  610.  
  611. is_parser_running = true;
  612.  
  613. var last_page = get_last_page();
  614.  
  615. var counter = {
  616. current_page: last_page - parser_info.parse_page_count + (parser_info.parse_page_count === 0 ? 0 : 2),
  617. last_page: last_page
  618. };
  619.  
  620. search_next(counter);
  621. }
  622.  
  623. //----------------------------------------------------------------------------//
  624.  
  625. function search_next(counter){
  626. var refresh_button = document.getElementById(script_name + 'Refresh');
  627. var diff = counter.last_page - counter.current_page + 1;
  628. refresh_button.value = 'Обработано ' + diff + '/' + (counter.last_page + 1) + ' страниц (' + Math.round(diff*100/(counter.last_page + 1)) + '%)';
  629.  
  630. var url = '/pl_cardlog.php?id=' + get_id() + '&page=' + counter.current_page;
  631. send_async_get(url, counter);
  632. }
  633. //----------------------------------------------------------------------------//
  634.  
  635. function send_async_get(url, counter)
  636. {
  637. var xhr = new XMLHttpRequest();
  638. xhr.open('GET', url, true);
  639. xhr.overrideMimeType('text/plain; charset=windows-1251');
  640. xhr.onreadystatechange = function(){
  641. if(xhr.readyState == 4){
  642. if(xhr.status == 200){
  643. --counter.current_page;
  644. search_value(xhr.response);
  645.  
  646. if(counter.current_page >= 0)
  647. search_next(counter);
  648. else
  649. {
  650. parser_info.refresh_date = new Date();
  651. parser_info.parse_page_count = counter.last_page + 1;
  652.  
  653. var refresh_td = document.getElementById(script_name + 'RefreshDate');
  654. refresh_td.textContent = 'Дата последнего обновления: ' + parser_info.refresh_date.toLocaleString();
  655.  
  656. var parse_td = document.getElementById(script_name + 'ParseDate');
  657. parse_td.textContent = 'Дата последней считанной игры: ' + (parser_info.parse_date ? parser_info.parse_date.toLocaleString() : 'еще не считывалось');
  658.  
  659. var refresh_button = document.getElementById(script_name + 'Refresh');
  660. refresh_button.value = 'Обновить данные';
  661.  
  662. var content_table = document.getElementById(script_name + 'Content');
  663. update_content(content_table, true);
  664.  
  665. save_value(script_name + '_States' + get_id(), JSON.stringify(card_states));
  666. save_value(script_name + '_ParserInfo' + get_id(), JSON.stringify(parser_info));
  667.  
  668. ['Refresh', 'Export', 'Remove'].forEach(function(current){
  669. document.getElementById(script_name + current).removeAttribute('disabled');
  670. });
  671.  
  672. document.body.style.cursor = 'default';
  673. is_parser_running = false;
  674. }
  675. }
  676. }
  677. };
  678.  
  679. xhr.send(null);
  680. }
  681.  
  682. //----------------------------------------------------------------------------//
  683.  
  684. function search_value(response_){
  685. var re = /.*?<a href="cgame\.php\?gameid=(\d+)">(\d{2}-\d{2}-\d{2}\s\d{2}:\d{2})(.+?)([+\-0-9]*)<\/td><\/tr>.*?/gmi;
  686.  
  687. var raw_data = [],
  688. matches = [];
  689.  
  690. while(matches = re.exec(response_))
  691. raw_data.push({ id: +matches[1], game_date: string_to_date(matches[2]), game_str: matches[3], game_bet: matches[4] ? +matches[4] : 0});
  692.  
  693. raw_data.sort(function(a, b){
  694. return compare(a.id, b.id);
  695. });
  696.  
  697. raw_data = raw_data.filter(function(current){
  698. if(!parser_info.last_id)
  699. return true;
  700.  
  701. return current.id > parser_info.last_id;
  702. });
  703.  
  704. if(!raw_data.length)
  705. return;
  706.  
  707. raw_data.forEach(function(current){
  708. re = /.*?arc_tour_hist\.php.*?/gmi;
  709. var type_id = (re.test(current.game_str) ? enum_sct.tour_pvp : enum_sct.tavern);
  710.  
  711. if(type_id == enum_sct.tour_pvp){
  712. re = /.*?(pl_info\.php\?id=).*?/gmi;
  713. var count = 0;
  714.  
  715. while(re.test(current.game_str))
  716. ++count;
  717.  
  718. type_id = count == 1 ? enum_sct.tour_pve : enum_sct.tour_pvp;
  719. }
  720.  
  721. var state_id = null;
  722. switch(type_id){
  723. case enum_sct.tavern:
  724. state_id = "bet" + Math.abs(current.game_bet);
  725. break;
  726.  
  727. case enum_sct.tour_pvp:
  728. case enum_sct.tour_pve:
  729. {
  730. var stage = 0;
  731. re = />1\/(\d+)</;
  732. matches = re.exec(current.game_str);
  733.  
  734. if(matches)
  735. stage = +matches[1];
  736.  
  737. if(/>Полуфинал</.test(current.game_str))
  738. stage = 2;
  739.  
  740. if(/>Финал</.test(current.game_str))
  741. stage = 1;
  742.  
  743. state_id = ((type_id == enum_sct.tour_pvp) ? "stage" : "bstage") + stage;
  744. }
  745. break;
  746. }
  747.  
  748. var state = get_card_state(state_id);
  749.  
  750. re = new RegExp('<a href="pl_info\\.php\\?id=' + get_id() + '" class=pi><b>');
  751. var win = re.test(current.game_str);
  752. win ? ++state.win : ++state.loss;
  753.  
  754. state.total += (type_id == enum_sct.tavern && win ? current.game_bet*0.95 : current.game_bet);
  755. });
  756.  
  757. parser_info.parse_date = raw_data[raw_data.length - 1].game_date;
  758. parser_info.last_id = raw_data[raw_data.length - 1].id;
  759. }
  760. //----------------------------------------------------------------------------//
  761.  
  762. function load_states(){
  763. var states = load_value(script_name + '_States' + get_id());
  764.  
  765. return states ? JSON.parse(states) : [];
  766. }
  767.  
  768. //----------------------------------------------------------------------------//
  769.  
  770. function load_parser_info(){
  771. var info = load_value(script_name + '_ParserInfo' + get_id());
  772.  
  773. if(!info)
  774. return { refresh_date: null, last_id: null, parse_date: null, parse_page_count : 0 };
  775.  
  776. info = JSON.parse(info);
  777. info.refresh_date = new Date(Date.parse(info.refresh_date));
  778. info.parse_date = new Date(Date.parse(info.parse_date));
  779.  
  780. return info;
  781. }
  782.  
  783. //----------------------------------------------------------------------------//
  784.  
  785. function remove_data(){
  786. if(!confirm('Все данные по этому игроку будут удалены. Вы уверены?'))
  787. return;
  788.  
  789. remove_value(script_name + '_ParserInfo' + get_id());
  790. remove_value(script_name + '_States' + get_id());
  791.  
  792. reload_page();
  793. }
  794.  
  795. //----------------------------------------------------------------------------//
  796.  
  797. function get_last_page(){
  798. var url = '/pl_cardlog.php?id=' + get_id() + '&page=999999';
  799. var response = send_get(url);
  800. var page = /<\/a>\|<b><font color=red>(\d+?)<\/font><\/b><\/center>/gmi.exec(response);
  801.  
  802. return page ? (+page[1] - 1) : 0;
  803. }
  804. //----------------------------------------------------------------------------//
  805.  
  806. function get_id(){
  807. return /.+id=(\d+)/.exec(document.location)[1];
  808. }
  809.  
  810. //----------------------------------------------------------------------------//
  811.  
  812. function get_card_state(id){
  813. for(var i = 0; i < card_states.length; ++i)
  814. if(card_states[i].id == id)
  815. return card_states[i];
  816.  
  817. var new_state = { id: id, total: 0, win: 0, loss: 0 };
  818. card_states.push(new_state);
  819.  
  820. return new_state;
  821. }
  822.  
  823. //----------------------------------------------------------------------------//
  824.  
  825. } catch(e){
  826. alert('Ошибка в скрипте ' + script_name + ', обратитесь к разработчику:\n' + e);
  827. throw e;
  828. }}()); // wrapper end
  829.  
  830. //----------------------------------------------------------------------------//

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址