您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
stats
当前为
// ==UserScript== // @name battle_protocol_analyze // @namespace http://tampermonkey.net/ // @version 0.1 // @description stats // @author Salmon // @license MIT // @include /^https{0,1}:\/\/((www|my)\.(heroeswm|lordswm)\.(ru|com)|178\.248\.235\.15)\/(pl_warlog).php*/ // @icon https://www.google.com/s2/favicons?sz=64&domain=lordswm.com // @grant none // ==/UserScript== (function() { 'use strict'; //Constants const create_el = (el, style, innerText, className, placeholder) => { let element = document.createElement(el); if (style) element.style = style; if (innerText) element.innerText = innerText; if (className) element.className = className; if (placeholder) element.placeholder = placeholder; return element; } const convert_date = (date) => { let t = new Date(date); let seconds = t.getSeconds() < 10 ? `0${t.getSeconds()}` : t.getSeconds(); let minutes = t.getMinutes() < 10 ? `0${t.getMinutes()}` : t.getMinutes(); let hours = t.getHours() < 10 ? `0${t.getHours()}` : t.getHours(); let day = t.getDate() < 10 ? `0${t.getDate()}` : t.getDate(); let month = t.getMonth() + 1 < 10 ? `0${t.getMonth() + 1}` : t.getMonth() + 1; let year = t.getFullYear(); return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}` } const links = ['https://my.lordswm.com', 'https://heroeswm.ru']; const char_id = location.href.match(/id=\d+/gi)[0].match(/\d+/gi)[0]; const link = location.href.slice(0, 22) === 'https://my.lordswm.com' ? links[0] : links[1]; const common_btn_style = 'border: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #592c08; font-family: verdana,geneva,arial cyr; position: relative; text-align: center; font-weight: 700; background: url(../i/homeico/art_btn_bg_gold.png) #dab761; background-size: 100% 100%; border-radius: 5px; box-shadow: inset 0 0 0 1px #fce6b0,inset 0 0 0 2px #a78750,0 0 0 1px rgba(0,0,0,.13); line-height: 25px; cursor: pointer; transition: -webkit-filter .15s;transition: filter .15s;' //variable let db; let my_data; let parsed_to_end; let stop_page = 0; let current_page = 0 let all_pages_amount = 0; let parsed_pages_amount = 0; let records_visibility = false; let container_visibility = false; //async get const fetch_xml = (page, callback) => { const xhr = new XMLHttpRequest(); xhr.open('get', `${link}/pl_warlog.php?id=${char_id}&page=${page}`); xhr.setRequestHeader('Content-type', 'text/html; charset=windows-1251'); if (xhr.overrideMimeType) { xhr.overrideMimeType('text/html; charset=windows-1251'); } xhr.addEventListener('load', () => { var parser = new DOMParser(); var doc = parser.parseFromString(xhr.responseText, "text/html"); var global_elem = doc.getElementsByClassName('global_a_hover')[1]; var list = global_elem.innerHTML.split('\n '); list.shift(); callback(list, xhr, page) }) xhr.send(); } //Local Storage data const parsing_toogle = JSON.parse(localStorage.getItem('parsing_toogle')); if (parsing_toogle === null) localStorage.setItem('parsing_toogle', JSON.stringify(false)); let start_stop = parsing_toogle; //UI const game_container = document.getElementsByClassName('hwm_pagination')[0].parentElement; const container = create_el('div', 'border: 1px solid black; min-width: 300px; display: none'); const menu = create_el('div'); const info_block = create_el('div'); const no_info_block = create_el('div', 'display: none;', 'Can`t find any data. Try to parse!'); const save_data_btn = create_el('div', `${common_btn_style} width: 250px; display: none`, 'SAVE DATA'); const start_search_btn = create_el('div',`${common_btn_style} width: 150px;`, `${start_stop ? 'Stop parsing' : 'Start parsing'}`); const combat_types_btns_block = create_el('div'); const stats_block = create_el('div'); const container_visibility_btn = create_el('div', `${common_btn_style} width: 250px;`, 'Search menu'); container_visibility_btn.addEventListener('click', () => { container_visibility = !container_visibility; container.style.display = `${container_visibility ? 'block' : 'none'}` }) const pages_amount_block = create_el('div', 'font-weight: bold'); const parsed_pages_amount_block = create_el('div', 'font-weight: bold'); const current_page_amount_block = create_el('div', 'font-weight: bold', `${current_page}`); menu.appendChild(start_search_btn); menu.appendChild(combat_types_btns_block); container.appendChild(menu); container.appendChild(no_info_block); container.appendChild(info_block); container.appendChild(save_data_btn); game_container.appendChild(container_visibility_btn); game_container.appendChild(container); const check_all_pages_count = async (id) => { let res = await fetch(`${link}/pl_warlog.php?id=${id}&page=10005000`); let data = await res.text(); let last_page = Number(data.match(/href="#">\d+/gi)[0].match(/\d+/gi)[0]); pages_amount_block.innerText = `/${last_page}`; all_pages_amount = last_page; open_db(); } check_all_pages_count(char_id); const filter_protocol = (data, filter) => { return data.filter(el => el.includes(filter)).join(''); } const show_data = (data) => { const t = new Date(data.time); const time = create_el('div', 'font-weight: bold', `Last parsing: ${convert_date(t)}`); const char_id_block = create_el('div', 'font-weight: bold', `ID of account: ${data.id}`); const pages_info_block = create_el('div', 'display: flex; justify-content: center; font-weight: bold', `Parsed pages: `); const records_block = create_el('div', 'text-align: left; padding: 5px; display: none','', 'global_a_hover'); const stats_block = create_el('div') //const filter_input = create_el('div', '', '', 'filter'); const types = ['all', 'ω', 'τ']; const stats = { kbo: {wins: 0, loses: 0}, tac: {wins: 0, loses: 0}, }; data.data.flat().forEach(battle => { if (battle.includes('ω')) { if (battle.includes(`<b><a class="pi" href="pl_info.php?id=${char_id}"`)) { stats.kbo.wins +=1; } else {stats.kbo.loses +=1;} } if (battle.includes('τ')) { if (battle.includes(`<b><a class="pi" href="pl_info.php?id=${char_id}"`)) { stats.tac.wins +=1; } else {stats.tac.loses +=1;} } }) stats_block.innerText = `total battles: ${stats.kbo.loses + stats.kbo.wins} kbo winrate: ${Math.round(((stats.kbo.wins * 100) / (stats.kbo.loses + stats.kbo.wins)))}%` stats_block.innerText += `\n total battles: ${stats.tac.loses + stats.tac.wins} tactic guild winrate: ${Math.round(((stats.tac.wins * 100) / (stats.tac.loses + stats.tac.wins)))}%` stop_page = data.parsed_to_end ? all_pages_amount - my_data.parsed_pages_amount : all_pages_amount; parsed_pages_amount = data.parsed_pages_amount; if (data.parsed_to_end === true) { start_search_btn.innerText = 'Update protocol'; let update_pages_amount = all_pages_amount - data.parsed_pages_amount; stop_page = update_pages_amount + 1; current_page = 0; } else { current_page = data.parsed_pages_amount; } for (let i = 0; i < types.length; i++) { const btn = create_el('div', '', `${types[i]}`); types[0] = ''; btn.addEventListener('click', () => { records_block.innerHTML = filter_protocol(data.data.flat(Infinity), types[i]); }) combat_types_btns_block.appendChild(btn); } parsed_pages_amount_block.innerText = data.parsed_pages_amount; const records_block_visibility_btn = create_el('div',`${common_btn_style} width: 250px;`, 'Records'); records_block_visibility_btn.addEventListener('click', () => { records_visibility = !records_visibility; records_block.style.display = `${records_visibility ? 'block' : 'none'}` }); pages_info_block.append(parsed_pages_amount_block); pages_info_block.append(pages_amount_block); info_block.appendChild(time); info_block.appendChild(pages_info_block); info_block.appendChild(char_id_block); info_block.appendChild(stats_block); container.appendChild(records_block_visibility_btn); container.appendChild(records_block); } //Database functions const open_db = () => { let request = indexedDB.open('myDatabase', 1); let object_store_create; request.onupgradeneeded = async (event) => { db = event.target.result; object_store_create = db.createObjectStore('battleProtocol', { keyPath: 'id' }); }; request.onerror = function(event) {}; request.onsuccess = function(event) { db = event.target.result; get_data_from_DB(char_id); }; } const get_data_from_DB = (id) => { let transaction = db.transaction(['battleProtocol'], 'readwrite'); let objectStore = transaction.objectStore('battleProtocol'); let request = objectStore.get(id); request.onsuccess = function(event) { let data = event.target.result; if (!data) { no_info_block.style.display = 'block'; let block = create_el('div', 'display: flex; justify-content: center', 'Parsed pages:'); block.append(current_page_amount_block); block.append(pages_amount_block); no_info_block.append(block); stop_page = all_pages_amount; parsed_to_end = false; } else { my_data = data; parsed_to_end = my_data.parsed_to_end; show_data(my_data); } }; } const add_data_to_db = (pages) => { let transaction = db.transaction(['battleProtocol'], 'readwrite'); let object_store = transaction.objectStore('battleProtocol'); let parsed_to_end = current_page == all_pages_amount ? true : false; let my_data = { id: char_id, parsed_pages_amount: parsed_pages_amount, parsed_to_end, data: pages, time: Date.now()}; let request = object_store.add(my_data); request.onsuccess = function(event) { location.reload(); }; request.onerror = function(event) {}; } const update_db = (pages) => { var transaction = db.transaction(['battleProtocol'], 'readwrite'); var objectStore = transaction.objectStore('battleProtocol'); let obj; if (my_data.parsed_to_end) { for (let i = 0; i < pages.length; i++) { my_data.data[i] = [...pages[i],...my_data.data[i], ]; my_data.data[i] = [...new Set(my_data.data[i])]; } if (my_data.parsed_pages_amount === all_pages_amount) parsed_pages_amount = my_data.parsed_pages_amount; obj = {id: char_id, parsed_pages_amount: parsed_pages_amount, parsed_to_end, data: [...my_data.data], time: Date.now()} } else { let parsed_to_end = current_page == all_pages_amount ? true : false; obj = {id: char_id, parsed_pages_amount: parsed_pages_amount, parsed_to_end, data: [...my_data.data,...pages], time: Date.now()} } var request = objectStore.put(obj); request.onsuccess = function(event) { location.reload(); }; request.onerror = function(event) {}; } let parsed_pages = []; const page_parser = (list, xhr) => { parsed_pages = [...parsed_pages, list]; current_page_amount_block.innerText = `${current_page}`; parsed_pages_amount_block.innerText = `${parsed_to_end ? my_data.parsed_pages_amount : current_page}`; current_page = current_page + 1; parsed_pages_amount = parsed_pages_amount + 1; if (xhr.status === 200 && start_stop && current_page === stop_page) { if (my_data) { update_db(parsed_pages); } else { add_data_to_db(parsed_pages) } current_page_amount_block.innerText = `${current_page}`; current_page = 0; start_stop = !start_stop; localStorage.setItem('parsingToogle', start_stop); } else if (xhr.status === 200 && start_stop && current_page < stop_page) { fetch_xml(current_page, page_parser); } } save_data_btn.addEventListener('click', () => { if (my_data) { update_db(parsed_pages) } else { add_data_to_db(parsed_pages) } }) start_search_btn.addEventListener('click', () => { start_stop = !start_stop; localStorage.setItem('parsingToogle', start_stop); save_data_btn.style.display = 'block'; start_search_btn.innerText = `${start_stop ? 'Stop parsing' : 'Start parsing'}`; if (start_stop) fetch_xml(current_page, page_parser); }) })();