您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
-------
// ==UserScript== // @name Torn War Helper // @namespace Jebster.Torn.WarHelper // @author Jeggy // @description ------- // @include *.torn.com/factions.php?step=your // @version 0.0.1 // ==/UserScript== // debugger; const $DATA = {}; let $FILTER = { level: { min: 20, max: 55, }, statuses: ['Okay'], }; const $FACTIONS = []; let $MAIN = null; (function() { 'use strict'; waitUntilLoaded(); })(); function waitUntilLoaded(found) { if(found){isLoaded(); return;} setTimeout(() => waitUntilLoaded($('.faction-respect-wars-wp').length > 0), 2); } function isLoaded() { $MAIN = $('.faction-respect-wars-wp'); $MAIN.find('.f-war-list > li.not-member').each((index, item) => { $FACTIONS.push(generateFactionObject(item)); $(item).hide(); }); generateView(); } function clearView() { $MAIN.find('li.inactive').each((index, item) => item.remove()); $MAIN.find('.f-war-list > .descriptions').hide(); $MAIN.find('.j-view').remove(); } function generateView() { clearView(); $MAIN.append('<div class="j-view"><ul class="f-war-list war-old j-list"></ul></div>'); prependHeader(); // Add factions to view $FACTIONS.forEach(faction => { $MAIN.find('.j-list').append('<div class="viewport"><div class="overview"><ul class="j-f-'+faction.id+' member-list bottom-round t-blue-cont h"></ul></div></div>'); $MAIN.find('.j-f-'+faction.id).append(faction.header); // Add filtered members to view filter(faction.members).forEach(member => { $MAIN.find('.j-f-'+faction.id).append(member.element); }); }); } function prependHeader() { $MAIN.find('.j-view').prepend(` <div> Min level: <input id="j-filter-min" type="number" min=0 max=100 value=${$FILTER.level.min} /> Max level: <input id="j-filter-max" type="number" min=0 max=100 value=${$FILTER.level.max} /> <br /> Status: Okay <input id="j-filter-ok" type="checkbox" ${$FILTER.statuses.indexOf('Okay') > -1 ? 'checked' : ''} /> Hospital <input id="j-filter-hosp" type="checkbox" ${$FILTER.statuses.indexOf('Hospital') > -1 ? 'checked' : ''} /> Traveling <input id="j-filter-travel" type="checkbox" ${$FILTER.statuses.indexOf('Traveling') > -1 ? 'checked' : ''} /> <br /> <button id="j-save-filter">Save filter</button> </div> `); $(document).find('#j-save-filter').unbind().on('click', () => { const ignores = []; if ($('#j-filter-ok').is(':checked')) ignores.push('Okay'); if ($('#j-filter-hosp').is(':checked')) ignores.push('Hospital'); if ($('#j-filter-travel').is(':checked')) ignores.push('Traveling'); $FILTER = { level: { min: $('#j-filter-min').val(), max: $('#j-filter-max').val(), }, statuses: ignores, }; generateView(); }); prependLoadButton(); } function prependLoadButton() { let loaded = 0; $FACTIONS.forEach(f => loaded += f.loaded ? 1 : 0); if (loaded === $FACTIONS.length) return; const loadButton = '<button id="j-load-btn">'+loaded+' out of '+$FACTIONS.length+' are loaded</button>'; $MAIN.find('.j-view').prepend(loadButton); $(document).find('#j-load-btn').unbind().on('click', () => { $MAIN.find('.j-view > #j-load-btn').prop('disabled', true); for(var i = 0; i < $FACTIONS.length; i++){ const faction = $FACTIONS[i]; if(faction.loaded) continue; faction.load(faction); break; } }); } function test(a){ console.log('test: '+a); } function filter(members) { const filtered = []; members.forEach(member => { if($FILTER.level.min > member.level) return; if($FILTER.level.max < member.level) return; if(!$FILTER.statuses.some(ignore => ignore === member.status)) return; filtered.push(member); }); return filtered; } // TODO: use class instead function generateFactionObject(item) { /** Properties **/ const element = $(item).find('.status-wrap'); const name = $(element).find('.info > .name > a').text(); const url = $(element).find('.info > .name > a').attr('href'); const id = url.substr(url.indexOf('ID=')+3); const progress = $(element).find('.info > .status > .wai').text().split('(')[1].slice(0, -2); const respect = $(element).find('.info > .status > .t-red').text(); const members = []; /** Functions **/ const load = (faction) => { $(faction.element).find('.status-wrap').click(); const loaded = (members) => { $(members).each((index, item) => { faction.members.push(generateMemberObject(item)); }); faction.header = $MAIN.find('.descriptions > .status-desc').clone(); faction.loaded = true; generateView(); }; const wait = () => { setTimeout(() => { const check = $MAIN.find('.f-war-list > li.descriptions > .viewport > .overview > ul.member-list > li'); _ = check.length > 0 ? loaded(check) : wait(); }, 5); }; wait(); }; return { element: item, id, name, url, progress, respect, members, load, loaded: false, }; } function generateMemberObject(element) { const level = $(element).find('.lvl').contents().text().trim().substr(10).trim(); const status = $(element).find('.status > span').text(); /** functions **/ const attack = (member) => window.location = $(member.element).find('.act-cont > a').attr('href'); return { element, level, status, attack, }; }