HWM_TransferSearch

Поиск по протоколу передач

  1. // ==UserScript==
  2. // @name HWM_TransferSearch
  3. // @namespace Рианти
  4. // @version 1.42.0
  5. // @homepage https://greasyfork.org/en/scripts/374608-hwm-transfersearch
  6. // @author Alex_2oo8, Рианти, CheckT
  7. // @description Поиск по протоколу передач
  8. // @include https://www.heroeswm.ru/pl_transfers.php*
  9. // @include http://178.248.235.15/pl_transfers.php*
  10. // ==/UserScript==
  11.  
  12.  
  13. // https://www.lordswm.com/pl_transfers.php*
  14.  
  15. (function(){
  16.  
  17. var debug = false;
  18.  
  19. var url = location.protocol+'//'+location.hostname+'/';
  20. var id = getId();
  21. window.protocol_regexp = /Протокол игрока <a.* href="pl_info\.php\?id=[0-9]*"><b>.*<\/b><\/a>/;
  22.  
  23. init_style();
  24. var elem = find_root_elem(); //корневой элемент
  25. create_header(elem);
  26. create_listeners(elem);
  27. var iDiv = create_div();
  28.  
  29. return; //only functions below
  30.  
  31. function request(url_req, callback, type, first_page){
  32. var objXMLHttpReq = createXMLHttpReq();
  33. try{
  34. objXMLHttpReq.open('GET', url_req, true);
  35. setXMLHttpReqHeaders(objXMLHttpReq);
  36. objXMLHttpReq.onreadystatechange = function() { callback(objXMLHttpReq, type, first_page); }
  37. objXMLHttpReq.send(null);
  38. }catch(e){console.log(e);alert("HWM_TransferSearch: "+e);}
  39. }
  40.  
  41. function search( id, elem, type ) {
  42. var stop = document.createElement( 'input' );
  43. stop.type = 'hidden';
  44. stop.value = '0';
  45. stop.id = 'stop';
  46. document.getElementsByTagName('body')[0].appendChild( stop );
  47. var first_page = Math.max(1, Math.floor(getNumberField('TSearch_inp_page', 1)));
  48. $('transferSearchDiv').style.display = 'none';
  49. $('TSearch').style.display = 'none';
  50.  
  51. request(url+'pl_transfers.php?page=9999&id=' + id, search_1_last_page, type, first_page);
  52. }
  53.  
  54. function search_1_last_page(objXMLHttpReq, type, first_page){
  55. if (objXMLHttpReq.readyState == 4 && objXMLHttpReq.status == 200) {
  56. iDiv.innerHTML = objXMLHttpReq.responseText;
  57. var td_arr = iDiv.getElementsByTagName('td');
  58. var element;
  59. for (var i = 0; i < td_arr.length; i++) {
  60. if ( td_arr[i].getElementsByTagName('center').length > 0 && window.protocol_regexp.test( td_arr[i].getElementsByTagName('center')[0].innerHTML ) ) {
  61. element = td_arr[i];
  62. break;
  63. }
  64. }
  65. if(!element)
  66. return;
  67.  
  68. var lastPg = 1;
  69. if ( element.getElementsByTagName('center').length > 1 )
  70. lastPg = element.getElementsByTagName('center')[1].getElementsByTagName('b')[0].getElementsByTagName('font')[0].innerHTML;
  71. first_page = Math.min(lastPg, first_page);
  72. search2( id, type, elem, lastPg, first_page);
  73. }
  74. }
  75.  
  76. function search2( id, type, elem, pgCount, first_page){
  77. var reg, search_str;
  78. switch(type){
  79. case 'Nick':
  80. search_str = $('TSearchNick').value;
  81. reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*<b>' + rep( search_str ) + '<\/b><\/a>' );
  82. break;
  83. case 'Fine':
  84. search_str = $('HWM_transfer_search_checkbox_label').className.indexOf('checked') != -1;
  85. reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: <b>Игрок' + ( search_str ? '' : ' оштрафован') );
  86. break;
  87. case 'Art':
  88. search_str = $('TSearchArt').value;
  89. /*!*/ reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .* ["\'].*' + rep( search_str ) + '.*["\']' );
  90. break;
  91. case 'Any':
  92. search_str = $('TSearchAll').value;
  93. reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*' + rep( search_str ) + '.*' );
  94. break;
  95. case 'Regexp':
  96. search_str = $('TSearch_inp_regexp').value;
  97. reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:' + search_str.replace(/\\/g, '\\'));
  98. break;
  99. case 'ID':
  100. search_str = $('TSearch_inp_id').value;
  101. reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*id=' + search_str);
  102. break;
  103. }
  104. var nick = elem.getElementsByTagName('center')[0].getElementsByTagName('a')[0].innerHTML;
  105. while( elem.lastChild ) {
  106. elem.removeChild( elem.lastChild );
  107. }
  108. elem.appendChild( document.createElement( 'br' ) );
  109. var center = document.createElement( 'center' );
  110. center.innerHTML = 'Поиск по протоколу передач игрока ';
  111. var a = document.createElement( 'a' );
  112. a.href = 'pl_info.php?id=' + id;
  113. a.style.textDecoration = 'none';
  114. a.innerHTML = nick;
  115. center.appendChild( a );
  116. elem.appendChild( center );
  117. elem.appendChild( document.createElement( 'br' ) );
  118. var center = document.createElement( 'center' );
  119. center.id = 'TSearch';
  120. center.innerHTML = 'Идёт поиск '
  121. + type.replace( 'Nick', 'по нику <a href="pl_info.php?nick=' + search_str + '" style="text-decoration: none;"><b>' + search_str + '</b></a>' )
  122. .replace( 'Fine', 'штрафов' + ( search_str ? ' и блокировок/разблокировок' : '' ) )
  123. .replace( 'Art', 'по артефакту "' + search_str + '"' )
  124. .replace( 'Any', 'по подстроке "' + search_str + '"' )
  125. .replace( 'Regexp', 'по рег. выражению "' + search_str + '"' )
  126. .replace( 'ID', 'по ID "' + search_str + '"' )
  127. + '... (<a href="javascript: void(0);" id="cancel" onclick="document.getElementById(\'stop\').value = \'1\';">стоп</a>)'
  128. + '<br />'
  129. + 'Просмотрено <text id="viewed">0</text> страничек из ' + (pgCount-first_page+1) + ' (с '+first_page+' по '+pgCount+'): <text id="percent">0</text>%'
  130. + '<br />'
  131. + 'Дата последней операции на текущей странице: <text id="curr_date"></text>'
  132. + '<br />'
  133. + 'Найдено <text id="matches">0</text> записей:'
  134. ;
  135. elem.appendChild( center );
  136. elem.appendChild( document.createElement( 'br' ) );
  137.  
  138. startSearch( first_page, id, reg, pgCount, elem, type, search_str, first_page, null );
  139. }
  140.  
  141. function startSearch( pg, id, reg, lastPg, elem, type, search_str, first_page, curr_page_date ) {
  142. if ( $('stop').value != '1' && pg <= lastPg ) {
  143. var args = {pg:pg, id:id, reg:reg, lastPg:lastPg, elem:elem, type:type, search_str:search_str, first_page:first_page};
  144. request(url+'pl_transfers.php?id=' + id + '&page=' + (pg-1), search_2_pages, args);
  145. } else {
  146. var matches = $('matches').innerHTML;
  147. $('TSearch').innerHTML = 'Поиск '
  148. + type.replace( 'Nick', 'по нику <a href="pl_info.php?nick=' + search_str + '" style="text-decoration: none;"><b>' + search_str + '</b></a>' )
  149. .replace( 'Fine', 'штрафов' + ( search_str ? ' и блокировок/разблокировок' : '' ) )
  150. .replace( 'Art', 'по артефакту "' + search_str + '"' )
  151. .replace( 'Any', 'по подстроке "' + search_str + '"' )
  152. .replace( 'Regexp', 'по рег. выражению "' + search_str + '"' )
  153. .replace( 'ID', 'по ID "' + search_str + '"' )
  154. + ' закончен!<br>Найдено ' + matches + ' записей на страницах '+first_page+'-'+(pg-1)+':'
  155. + (curr_page_date ? ('<br/>Дата последней операции на странице '+(pg-1)+': '+curr_page_date) : '')
  156. ;
  157. }
  158. }
  159.  
  160. function search_2_pages(objXMLHttpReq, args){
  161. if (objXMLHttpReq.readyState == 4 && objXMLHttpReq.status == 200) {
  162. iDiv.innerHTML = objXMLHttpReq.responseText;
  163. var td_arr = iDiv.getElementsByTagName('td');
  164. for (var i = 0; i < td_arr.length; i++) {
  165. if ( td_arr[i].getElementsByTagName('center').length > 0 && window.protocol_regexp.test( td_arr[i].getElementsByTagName('center')[0].innerHTML ) ) {
  166. var element = td_arr[i];
  167. break;
  168. }
  169. }
  170. if(!element)
  171. return;
  172.  
  173. var text = element.innerHTML //.substring( element.innerHTML.indexOf('&nbsp;&nbsp;') );
  174. var transfers = text.split('<br>');
  175. var first_time = null;
  176. var time_regexp = /&nbsp;&nbsp;(\d\d-\d\d-\d\d \d\d:\d\d):/;
  177. for ( var i = 0; i < transfers.length; i++ ) {
  178. if(!first_time){
  179. var time_match = time_regexp.exec( transfers[i] );
  180. if(time_match)
  181. first_time = time_match[1];
  182. }
  183. if ( args.reg.test( transfers[i] ) ) {
  184. $('matches').innerHTML = ( Number( $('matches').innerHTML ) + 1 );
  185. args.elem.innerHTML += transfers[i];
  186. args.elem.appendChild( document.createElement('br') );
  187. }
  188. }
  189. if(first_time)
  190. $('curr_date').innerHTML = first_time;
  191. $('viewed').innerHTML = ( Number( $('viewed').innerHTML ) + 1 );
  192. $('percent').innerHTML = ( Math.round( $('viewed').innerHTML * 100 / (args.lastPg-args.first_page+1) ) );
  193.  
  194. startSearch( args.pg+1, args.id, args.reg, args.lastPg, args.elem, args.type, args.search_str, args.first_page, first_time );
  195. }
  196. }
  197.  
  198. function find_root_elem(){
  199. var td_arr = document.getElementsByTagName('td');
  200.  
  201. for (var i = 0; i < td_arr.length; i++) {
  202. if ( td_arr[i].getElementsByTagName('center').length > 0
  203. && window.protocol_regexp.test( td_arr[i].getElementsByTagName('center')[0].innerHTML ) ) {
  204. return td_arr[i];
  205. }
  206. }
  207. }
  208.  
  209. function create_listeners(elem){
  210. addClickEvent('HWM_transfer_search_checkbox_label', check_search_box);
  211. addClickEvent('TSearchByNick', function() { search( id, elem, 'Nick' ); });
  212. addClickEvent('TSearchByFine', function() { search( id, elem, 'Fine' ); });
  213. addClickEvent('TSearchByArt', function() { search( id, elem, 'Art' ); });
  214. addClickEvent('TSearchAny', function() { search( id, elem, 'Any' ); });
  215. addClickEvent('TSearch_but_regexp', function() { search( id, elem, 'Regexp' ); });
  216. addClickEvent('TSearch_but_id', function() { search( id, elem, 'ID' ); });
  217. }
  218.  
  219. function rep( str ) {
  220. str = str.replace( /\\/g, '\\\\' ).replace( /\[/g, '\\[' ).replace( /\]/g, '\\]' ).replace( /\(/g, '\\(' )
  221. .replace( /\)/g, '\\)' ).replace( /\./g, '\\.' ).replace( /\+/g, '\\+' ).replace( /\*/g, '\\*' )
  222. .replace( /\?/g, '\\?' ).replace( /\$/g, '\\$' ).replace( /\|/g, '\\|' );
  223. return str;
  224. }
  225.  
  226. function check_search_box() {
  227. this.className = (this.className.indexOf('checked') != -1 ? '' : 'checked');
  228. }
  229.  
  230. function create_div(){
  231. var iDiv = document.createElement('div');
  232. iDiv.style.display = debug ? 'block' : 'none';
  233. iDiv.id = 'hwm_trasfer_search';
  234. document.body.appendChild(iDiv);
  235. return iDiv;
  236. }
  237.  
  238. function create_header(elem){
  239. var search_text = 'Поиск';
  240. var text = document.createElement( 'text' );
  241. text.id = 'TSearch';
  242. text.innerHTML = '&nbsp;(<a id="show_transfer_block" href="javascript: void(0);">Поиск по протоколу</a>)';
  243. elem.getElementsByTagName('center')[0].appendChild( text );
  244. addClickEvent('show_transfer_block', show_transfer_block);
  245.  
  246. var div = document.createElement( 'div' );
  247. div.id = 'transferSearchDiv';
  248. div.style.display = 'none';
  249.  
  250. div.innerHTML =
  251. '<table>'+
  252. '<tr><td>Поиск по нику:</td><td><input type="text" id="TSearchNick" form="form_nick" /></td>'+
  253. '<td><form action="" style="padding:0;margin:0;border:0;" id="form_nick" onSubmit="return false;">'+
  254. '<input type="submit" id="TSearchByNick" value="Поиск" />'+
  255. '</form></td></tr>'+
  256.  
  257. '<tr><td>Поиск штрафов:</td><td title="В том числе искать блокировки/разблокировки"><div id="HWM_transfer_search_checkbox_label">Блоки / Разблоки</div></td>'+
  258. '<td><input type="submit" id="TSearchByFine" value="Поиск" /></td></tr>'+
  259.  
  260. '<tr><td>Поиск по артефакту:</td><td><input type="text" id="TSearchArt" form="form_art" /></td>'+
  261. '<td><form action="" style="padding:0;margin:0;border:0;" id="form_art" onSubmit="return false;">'+
  262. '<input type="submit" id="TSearchByArt" value="Поиск" />'+
  263. '</form></td></tr>'+
  264.  
  265. '<tr><td>Общий Поиск:</td><td><input type="text" id="TSearchAll" form="form_any" /></td>'+
  266. '<td><form action="" style="padding:0;margin:0;border:0;" id="form_any" onSubmit="return false;">'+
  267. '<input type="submit" id="TSearchAny" value="Поиск" />'+
  268. '</form></td></tr>'+
  269.  
  270. '<tr><td>По рег. выражению:</td><td><input type="text" id="TSearch_inp_regexp" form="form_regexp" /></td>'+
  271. '<td><form action="" style="padding:0;margin:0;border:0;" id="form_regexp" onSubmit="return false;">'+
  272. '<input type="submit" id="TSearch_but_regexp" value="Поиск" />'+
  273. '</form></td></tr>'+
  274.  
  275. '<tr><td>По ID:</td><td><input type="text" id="TSearch_inp_id" form="form_id" /></td>'+
  276. '<td><form action="" style="padding:0;margin:0;border:0;" id="form_id" onSubmit="return false;">'+
  277. '<input type="submit" id="TSearch_but_id" value="Поиск" />'+
  278. '</form></td></tr>'+
  279.  
  280. '<tr><td>со страницы</td><td title="Начать поиск с указанной страницы"><input type="text" id="TSearch_inp_page" value="1"/></td>'+
  281. '<td>&nbsp;</td></tr>'+
  282. '</table>';
  283.  
  284. elem.getElementsByTagName('center')[0].appendChild( div );
  285. }
  286.  
  287. function show_transfer_block() {
  288. $('transferSearchDiv').style.display = ( $('transferSearchDiv').style.display == 'none' ? 'block' : 'none' );
  289. }
  290.  
  291. function GM_addStyle(css){
  292. var head = document.getElementsByTagName('head')[0];
  293. if (!head)
  294. return;
  295. var style = document.createElement('style');
  296. style.type = 'text/css';
  297. style.innerHTML = css;
  298. head.appendChild(style);
  299. }
  300.  
  301. function init_style(){
  302. GM_addStyle( '#HWM_transfer_search_checkbox_label {background-image:url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAsCAYAAACOu+GLAAABrElEQVR42u3bsWrCQByA8RhdXBzEJY8gcXZz9Ek6BkIhSxBck1foG3QogpPg5uguklG6iIPU4qCT+ZcLGDiibY03ZPiGD4yaLPcTyV3O+nh/E6JnStNULPXi1X8xlunrUbX7/vrUIakDE5m+HlU7IBGQCEgEJCARkAhIBCQCEpAISAQkAhKQgAQkAhIBiYAEJAISAYmqC0kdmMr09aj6ZZD4VZGJLHZBELtIiF0kxF0bkMg8pOVyKd1uF0hAem7gfd8Xy7KABKTyA+95XoYISEAqDSkIghwRkIBUgLRarf48OQxDDVGz2QQSkPSB7/f7st1u7544Go00RI1GQxaLBZCApA98rVYTx3HkeDxqJ1wuFxmPxxoi9d0kSbj9B9JtSApJu92W/X6fvx9FUf7Ztc1mwzwSkG5DqtfrOZRer5f9zcVxrAFSzedzJiTpPqThcKiB6XQ6BUSTyYSZbfod0m63E9d1C3iuzWYzlkjof/NI5/NZWq1WAdF6vWatjR6bkDydTtkamgJk23a2psaiLZWa2T4cDjIYDGQ6nbL6TzxGQkAidpEQu0iIHuwH8Zq0OtRsnH4AAAAASUVORK5CYII%3D\');background-position:top;display:block;width:120px;height:18px;padding:2px;padding-left:24px;line-height:18px;-moz-user-select:none;cursor:default;}' +
  303. '#HWM_transfer_search_checkbox_label.checked {background-position:bottom;}' +
  304. '.HWM_transfer_search_checkbox_checkbox {display:none;}' );
  305. }
  306.  
  307. function addClickEvent(id, func){
  308. var elem = $(id);
  309. if(elem && func)
  310. addEvent(elem, "click", func);
  311. }
  312.  
  313. function addChangeEvent(id, func){
  314. var elem = $(id);
  315. if(elem && func)
  316. addEvent(elem, "change", func);
  317. }
  318.  
  319. function addEvent(elem, evType, fn) {
  320. if(elem){
  321. if (elem.addEventListener)
  322. elem.addEventListener(evType, fn, false);
  323. else if (elem.attachEvent)
  324. elem.attachEvent("on" + evType, fn);
  325. else
  326. elem["on" + evType] = fn;
  327. }
  328. }
  329.  
  330. function getId() {
  331. var id = location.href.match( /\?(?:.*=.*&)*id=([0-9]*)(?:&.*=.*)*/ );
  332. return id[1];
  333. }
  334.  
  335. function $(id) { return document.getElementById(id); }
  336.  
  337. function getI(xpath,elem){return document.evaluate(xpath,(elem?elem:document),null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);}
  338.  
  339. function getNumberField(key, def){
  340. var val = $(key);
  341. return val ? getNum(val.value) : (def ? def : 0);
  342. }
  343. function getNum(src){
  344. var val=Number(src);
  345. val = isNaN(val) ? 0 : val;
  346. return val < 0 ? 0 : val;
  347. }
  348.  
  349. function createXMLHttpReq(){
  350. var objXMLHttpReq;
  351.  
  352. if (window.XMLHttpRequest){
  353. objXMLHttpReq = new XMLHttpRequest();
  354. } else if (window.ActiveXObject) {
  355. // IE
  356. objXMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  357. } else {
  358. alert('Can\'t create XMLHttpRequest!');
  359. }
  360. return objXMLHttpReq;
  361. }
  362.  
  363. function setXMLHttpReqHeaders(objXMLHttpReq){
  364. //objXMLHttpReq.setRequestHeader('Referer', 'http://www.heroeswm.ru/inventory.php');
  365. objXMLHttpReq.setRequestHeader('Content-type', 'text/html; charset=windows-1251');
  366. if(objXMLHttpReq.overrideMimeType)
  367. objXMLHttpReq.overrideMimeType('text/html; charset=windows-1251');
  368. }
  369. }());