您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds extra information to different pages all around Torn.
当前为
// ==UserScript== // @name Torn Helper // @namespace Jebster.Torn // @author Jeggy // @description Adds extra information to different pages all around Torn. // @include *.torn.com/profiles.php?XID=* // @version 0.3.2 // @require http://code.jquery.com/jquery-2.2.4.min.js // @require http://code.jquery.com/ui/1.12.1/jquery-ui.min.js // @resource jquery-ui http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/black-tie/jquery-ui.min.css // @resource jquery-base http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css // @grant GM_addStyle // @grant GM_getResourceText // ==/UserScript== // debugger; GM_addStyle(GM_getResourceText('jquery-base')); GM_addStyle(GM_getResourceText('jquery-ui')); String.prototype.format = function() { var formatted = this; for (var i = 0; i < arguments.length; i++) { var regexp = new RegExp('\\{'+i+'\\}', 'gi'); formatted = formatted.replace(regexp, arguments[i]); } return formatted; }; var data = {}; (function() { 'use strict'; $( 'head' ).append( '<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">' ); var site = window.location.pathname; loadData(); saveOwnData(); loadAttackLog(); if(site.indexOf('profiles.php') > 0) profileView(); })(); function loadAttackLog(){ var selections = ''; var now = new Date().getTime(); if('attackLogLoad' in data){ if(data.attackLogLoad < now - (12*60*60*1000)) // More than 12 hours ago selections = 'attacksfull'; else if(data.attackLogLoad < now - (2*60*1000)) // More than 2 minutes ago selection = 'attacks'; }else // First time selections = 'attacksfull'; var url = 'https://api.torn.com/user/'+data.me.id+'?selections='+selections+'&key='+data.apikey; if(selections !== ''){ data.attackLogLoad = now; apiCall(url, function(d) { if(d.error) getApiKey(); else{ for(var p in d.attacks){ if (d.attacks.hasOwnProperty(p)) { var attack = d.attacks[p]; var defender_id = attack.defender_id; if(!(defender_id in data)) data[defender_id] = {}; if(attack.attacker_id == data.me.id){ // My attack if(!('attacks' in data[defender_id])) data[defender_id].attacks = {}; data[defender_id].attacks[p] = attack; }else if('attacker_id' in attack && attack.attacker_id in data){ // I'm being attacked if(!('defends' in data[attack.attacker_id])) data[attack.attacker_id].defends = {}; data[attack.attacker_id].defends[p] = attack; } } } save(); } }); } } function profileView(){ var userid = getParameterByName('XID'); var userData = data[userid]; var content = ''; content += profileViewSelectionPopUp(); content += '<div id="compareStats">'; content += 'Loading...'; content += '<br />'; content += '</div>'; var acrdHtml = accordion('Torn Helper', content); var afterWait = function () { $(acrdHtml).insertAfter($('.profile-wrapper + .m-top10')[0]); var compareFunc = function(){ $('#compareStats').replaceWith(compareTemplate(userid, data.me.userid)); }; apiUserStats(userid, compareFunc); apiUserStats(data.me.userid, compareFunc); }; var wait = function () { var loaded = $('.profile-wrapper + .medals-wrapper + .m-top10').length > 0; if (loaded) afterWait(); else setTimeout(wait, 5); }; wait(); } // Only supports one accordion on the page at the moment. function accordion(title, block){ var css = '<style>'+ 'button.Jaccordion {'+ 'cursor: pointer;'+ 'padding: 18px;'+ 'width: 100%;'+ 'text-align: left;'+ 'transition: 0.4s;'+ '}'+ 'div.Jpanel {'+ 'position:relative;'+ 'max-height: 0;'+ 'overflow: hidden;'+ 'transition: 0.8s ease-in-out;'+ 'opacity: 0;'+ '}'+ 'div.Jshow {'+ 'opacity: 1;'+ 'max-height: 1000px;'+ 'width: auto;'+ '}'+ 'div.JAccordionIconShow {'+ 'opacity: 1;'+ 'max-height: 30px;'+ 'width: auto;'+ '}'+ '.JProfileViewAccordion{'+ 'width: 0;'+ 'float: right;'+ 'max-height: 0;'+ 'overflow: hidden;'+ 'opacity: 0;'+ 'padding-right: 7px;'+ '}'+ '.JAccordionIcon{'+ 'padding: 6px 5px 6px 25px;'+ 'cursor: pointer;'+ '}'+ '</style>'; var script = '<script>$(".JAccordionIcon").click(function() {'+ '$(".Jpanel").toggleClass("Jshow");'+ '$(".JProfileViewAccordion").toggleClass("JshJAccordionIconShowow");'+ '$(".JProfileViewAccordion").toggleClass("JAccordionIconShow");'+ '});</script>'; var show = data.profileview.show; var html = '<div class="Jaccordion profile-wrapper medals-wrapper m-top10">'+ '<div class="menu-header">'+title+ '<div class="JProfileViewAccordion '+(show ? '' : 'JAccordionIconShow')+'"><i class="fa fa-plus-square JAccordionIcon" aria-hidden="true" /></div>'+ '<div class="JProfileViewAccordion '+(show ? 'JAccordionIconShow' : '')+'"><i class="fa fa-minus-square JAccordionIcon" aria-hidden="true" /></div>'+ '</div>'+ '<div class="Jpanel '+(show ? 'Jshow' : '')+'">'+ block+ '</div>'+ '</div>'; $(document).on('click','.JAccordionIcon', function(){ data.profileview.show = !data.profileview.show; save(); }); return css+script+html; } function profileViewSelectionPopUp(){ var possibilities = possibleStats(); var settings = allSettings(); var popupHtml = '<div>'; var categories = {}; for(var p in possibilities){ var o = possibilities[p]; var checked = inArray(p, data.profileview.display) ? 'checked' : ''; if(o.category){ if(!categories[o.category]) categories[o.category] = {display: o.category, html: ''}; }else{ if(!categories.others) categories.others = {display: 'Others', html: ''}; } var cat = o.category ? o.category : 'others'; var html = '<div style="'; // TODO: Extract this css into a css rule html += 'border-radius: 2px; border: 1px solid gray; background-color: lightgray; margin: 3px;'; html += 'padding: 3px 10px 3px 5px; display: inline-block; cursor: pointer;'; html += '">'; html += '<input type="checkbox" name="view'+p+'" id="view'+p+'" '+checked+'>'; html += '<label id="JC'+p+'" for="view'+p+'">'+o.display+'</label>'; html += '</div>'; categories[cat].html += html; } popupHtml += '<fieldset style="border:1px solid black; padding: 10px; margin: 10px 0;">'; popupHtml += '<legend><b>Settings</b></legend>'; for(var setting in settings){ if(!settings.hasOwnProperty(setting)) continue; popupHtml += '<label for="setting'+setting+'">'+settings[setting].display+'</label>: '; switch(settings[setting].type){ case 'checkbox': popupHtml += '<input type="'+settings[setting].type+'" name="setting'+setting+'" id="setting'+setting+'" '+(data.settings && data.settings.versusMine ? 'checked' : '')+'>'; break; default: // TODO: Implement text!!!! } popupHtml += '<br>'; } popupHtml += '</fieldset>'; for(var category in categories){ if (categories.hasOwnProperty(category)) { popupHtml += '<fieldset style="border:1px solid black; padding: 10px; margin: 10px 0;">'; popupHtml += '<legend onclick=\'document.getElementById("JC'+category+'").style.display = document.getElementById("JC'+category+'").style.display == "none" ? "block" : "none";\''; popupHtml += '><b>'+categories[category].display+'</b></legend>'; popupHtml += categories[category].html; popupHtml += '</fieldset>'; } } popupHtml += '</div>'; var popup = popupWindow( { element: '#editProfileView', title: 'Edit Profile view', width: 640 }, popupHtml, [ { 'display': 'Close', 'close': true }, { 'display': 'Save', 'callback': function(){ var selected = []; for(var p in possibleStats()){ var checked = $("#view"+p).is(':checked'); if(checked) selected.push(p); } var settings = {}; var all = allSettings(); for(var setting in all){ switch(all[setting].type){ case 'checkbox': settings[setting] = $('#setting'+setting).is(':checked'); break; default: settings[setting] = $('#setting'+setting).val(); } } data.profileview.display = selected; data.settings = settings; save(); location.reload(); } } ] ); var button = '<div style="float:right;right:0;position:absolute;">' + '<button id="editProfileView" style="'; button += 'background-color: #282828;'; button += 'border: none;'; button += 'border-radius: 5px;'; button += 'color: white;'; button += 'padding: 5px 5px 5px 7px;'; button += 'text-align: center;'; button += 'text-decoration: none;'; button += 'display: inline-block;'; button += 'font-size: 16px;'; button += 'margin: 4px 2px;'; button += 'cursor: pointer;'; button += '"><i class="fa fa-pencil-square-o" aria-hidden="true" /></button></div>'; return button+popup; } /** * Example usage: * popupWindow( * { 'element': '#myDialogButton', 'title': 'Hello World' }, * '<h3>Something</h3><input type="text" id="myfield" />', * [{'display': 'Save', * 'close': false, // default: true * callback: function(){var something = $("#myfield").val();} * }]); */ function popupWindow(e, content, buttons){ var script = '<script>$("'+e.element+'").click(function(){$("#dialog-message").dialog({'+ 'modal: true,'+ 'draggable: true,'+ 'create: function(){$(this).css("maxHeight", $(window).height()-240);},'+ 'resizable: true,'+ 'position: [\'center\'],'+ 'show: \'blind\','+ 'hide: \'blind\','+ 'width: '+(e.width ? e.width : 400)+','+ 'buttons: ['; var test = ''; for(var i = 0; i < buttons.length; i++){ script += '{'; script += 'text: \''+buttons[i].display+'\','; script += 'id: \'dialogButton'+i+'\''; script += '},'; // this only supports up to 10 buttons. $(document).on('click','#dialogButton'+i, function(){ var pressed = this.id.substr(this.id.length -1); if(buttons[pressed].callback) buttons[pressed].callback(); if(buttons[pressed].close) $("a.ui-dialog-titlebar-close")[0].click(); }); } script = script.slice(0, -1); script += ']}'; script += ');});'+test; script += '</script>'; var html = '<div id="dialog-message" title="'+e.title+'" style="display: none; max-height: 80%;">'; html += content; html += '</div>'; return script+html; } function inArray(c, a){ // Somehow $.inArray is not working? ? for(var i = 0; i < a.length; i++){ if(c == a[i]) return true; } return false; } function getUserValue(userid, property){ var user = data[userid]; if(user){ if($.isArray(property)){ for(var i = 0; i < property.length; i++){ user = user[property[i]]; } return user; }else{ var userData = user[property]; if(userData){ return userData; } } } return -1; } function setUserValue(userid, property, value){ if(data[userid] === undefined) data[userid] = {}; data[userid][property] = value; } function save(){ localStorage.setItem('jebster.torn', JSON.stringify(data)); } function saveOwnData(){ if(!('me' in data) || !('id' in data.me) || data.me.id < 1){ var url = 'https://api.torn.com/user/'+data.me.id+'?selections=basic&key='+data.apikey; apiCall(url, function(d) { id = d.player_id; data.me = {'id': id}; save(); }); } } function loadData(){ data = localStorage.getItem('jebster.torn'); if(data === undefined || data === null){ // Default settings data = { profileview:{ show: true, display: ['xantaken','logins','refills','useractivity'] } }; }else{ data = JSON.parse(data); } if(data.apikey === undefined || data.apikey === ''){ getApiKey(); } } var asked = false; function getApiKey(){ if(asked) return; asked = true; var button = '<button id="JApiKeyBtn" style="'; button += 'background-color: #282828;'; button += 'border: none;'; button += 'border-radius: 0 8px 8px 0;'; button += 'color: white;'; button += 'padding: 5px 5px 5px 6px;'; button += 'text-align: center;'; button += 'text-decoration: none;'; button += 'display: inline-block;'; button += 'font-size: 16px;'; button += 'margin: 4px 0px;'; button += 'cursor: pointer;'; button += '"><i class="fa fa-floppy-o" aria-hidden="true"></i></button>'; var input = '<input type="text" id="JApiKeyInput" style="'; input += 'border-radius: 8px 0 0 8px;'; input += 'margin: 4px 0px;'; input += 'padding: 5px;'; input += 'font-size: 16px;'; input += '" placeholder="ApiKey"></input>'; var block = '<div class="profile-wrapper medals-wrapper m-top10">'; block += '<div class="menu-header">Torn Helper</div>'; block += '<div class="profile-container"><div class="profile-container-description">'; block += 'In order to use this script you need to enter your Torn Api Key, which you can '+ 'get on your <a href="http://www.torn.com/preferences.php">preferences page</a> and under the \'API Key\' tab.<br />'; block += input; block += button; block += '</div></div></div>'; $(block).insertAfter('.content-title'); $('#JApiKeyBtn').click(function(){ var key = $("#JApiKeyInput").val(); if(!('me' in data)) data.me = {}; data.apikey = key; save(); location.reload(); }); } function apiUserStats(userid, cb){ var lastRequest = getUserValue(userid, 'lastRequest'); var now = new Date(); if(lastRequest === 0 || lastRequest < now.getTime() - (2*60*60*1000)){ // Every 2hours var selections = 'personalstats,basic,crimes'; var url = 'https://api.torn.com/user/'+userid+'?selections='+selections+'&key='+data.apikey; apiCall(url, function(data) { if(data.error) getApiKey(); else{ setUserValue(userid, 'stats', data.personalstats); setUserValue(userid, 'lastRequest', now.getTime()); setUserValue(userid, 'username', data.name); setUserValue(userid, 'gender', data.gender); setUserValue(userid, 'crimes', data.criminalrecord); save(); cb(data); } }); }else{ cb(data[userid].stats); } } function compareTemplate(user1Id, user2Id){ var versusMe = data.settings && data.settings.versusMine; var css = '<style>'+ '.tornHelper{' + 'min-width:200px;' + '}' + '</style>'; var html = css+'<div class="profile-container basic-info"><ul class="basic-list">'; html += '<li>'; html += '<div class="user-information-section left"><span class="bold"></span></div>'; html += '<div class="'+(versusMe ? 'user-information-section left' : '')+' tornHelper"><span class="bold">'+getUserValue(user1Id, 'username')+'</span></div>'; html += versusMe ? '<div class="tornHelper"><span class="bold">'+getUserValue(user2Id, 'username')+' (You)</span></div>' : ''; html += '</li>'; var stats = possibleStats(); for(var i = 0; i < data.profileview.display.length; i++){ var display = stats[data.profileview.display[i]]; if(stats[data.profileview.display[i]]){ var user1Value = 0, user2Value = 0; if(display.apiname){ user1Value = getUserValue(user1Id, display.apiname); user2Value = getUserValue(user2Id, display.apiname); }else if(display.total){ for(var j = 0; j < display.total.length; j++){ user1Value += getUserValue(user1Id, display.total[j]); user2Value += getUserValue(user2Id, display.total[j]); } }else if(display.custom){ user1Value = display.custom(user1Id); user2Value = display.custom(user2Id); } user1Value = user1Value ? user1Value : 0; user2Value = user2Value ? user2Value : 0; if(display.format){ user1Value = display.format(user1Value); user2Value = display.format(user2Value); }else{ user1Value = formatNumber(user1Value); user2Value = formatNumber(user2Value); } html += '<li>'; html += '<div class="user-information-section left"><span class="bold">'; html += display.display; if(display.tooltip){ html += ' <i class="fa fa-question-circle" aria-hidden="true" title="'+display.tooltip+'" style="cursor: pointer;" />'; } html += '</span></div>'; html += '<div class="'+(versusMe ? 'user-information-section left' : '')+' tornHelper">'; html += user1Value +'</div>'; html += versusMe ? '<div class="tornHelper">'+user2Value+'</div>' : ''; html += '</li>'; } } html += '</ul><hr />'; var f = function(type, id){ var attacks = {hosp: {display: 'Hosped', times: 0, other: 0}, mug: {display: 'Mugged', times: 0}, left: {display: 'Left', times: 0}, lost: {display: 'Lost', times: 0}}; if(type in data[id]){ for(var p in data[id][type]){ var attack = data[id][type][p]; switch(attack.result){ case 'Mug': attacks.mug.times++; break; case 'Hospitalize': attacks.hosp.times++; break; case 'Leave': attacks.left.times++; break; case 'Lose': attacks.lost.times++; break; } } } return attacks; }; var attacks = f('attacks', user1Id); var defends = f('defends', user1Id); var ahtml = '<ul class="basic-list">'; var lis = ''; var anyAttacks = false; for(var type in attacks){ if(attacks[type].times > 0 || (defends[type].times > 0 && versusMe)){ lis += '<li>'; lis += '<div class="user-information-section left width112"><span class="bold">'+attacks[type].display+'</span></div>'; lis += versusMe ? '<div class="user-information-section left tornHelper">'+defends[type].times+'</div>' : ''; lis += '<div class="tornHelper">'+attacks[type].times+'</div>'; lis += '</li>'; anyAttacks = true; } } if(anyAttacks){ var g = getUserValue(user1Id, 'gender'); var gender = g == 'Male' ? 'him' : g == 'Female' ? 'her' : 'them'; ahtml += '<li>'; ahtml += '<div class="user-information-section left"><span class="bold">Attacks</span></div>'; ahtml += versusMe ? '<div class="user-information-section left tornHelper"><span class="bold">Towards you</span></div>' : ''; ahtml += '<div class="tornHelper"><span class="bold">'+(versusMe ? 'Towards '+gender : 'You made') +'</span></div>'; ahtml += '</li>'; } ahtml += lis; ahtml += '</ul></div>'; html += !anyAttacks ? 'You haven\'t attacked '+getUserValue(user1Id, 'username')+' before.' : ''; html += ahtml; return html; } function possibleStats(){ return { attackswon:{apiname:['stats','attackswon'], display: 'Attacks won', category: 'Attacking'}, attackslost:{apiname:['stats','attackslost'], display: 'Attacks lost', category: 'Attacking'}, attacksdraw:{apiname:['stats','attacksdraw'], display: 'Attacks Draw', category: 'Attacking'}, attacksassisted:{apiname:['stats','attacksassisted'], display: 'Attacks assisted', category: 'Attacking'}, totalattacks:{total:[['stats','attackswon'],['stats','attackslost'],['stats','attacksdraw'],['stats','attacksassisted'],['stats','yourunaway']], display: 'Total attacks', category: 'Attacking', format:formatNumber}, defendswon:{apiname:['stats','defendswon'], display: 'Defends won', category: 'Attacking'}, defendslost:{apiname:['stats','defendslost'], display: 'Defends lost', category: 'Attacking'}, defendsstalemated:{apiname:['stats','defendsstalemated'], display: 'Defends stalemated', category: 'Attacking'}, yourunaway:{apiname:['stats','yourunaway'], display: 'Run Aways', category: 'Attacking'}, theyrunaway:{apiname:['stats','theyrunaway'], display: 'Other Ran Away', category: 'Attacking'}, bestkillstreak:{apiname:['stats','bestkillstreak'], display: 'Best Kill Streak', category: 'Attacking'}, attackcriticalhits:{apiname:['stats','attackcriticalhits'], display: 'Attack Critical Hits', category: 'Attacking'}, attackhits:{apiname:['stats','attackhits'], display: 'Attack Hits', category: 'Attacking'}, attackmisses:{apiname:['stats','attackmisses'], display: 'Attack Misses', category: 'Attacking'}, roundsfired:{apiname:['stats','roundsfired'], display: 'Rounds Fired', category: 'Attacking'}, attacksstealthed:{apiname:['stats','attacksstealthed'], display: 'Attacks Stealthed', category: 'Attacking'}, moneymugged:{apiname:['stats','moneymugged'], display: 'Money Mugged', category: 'Attacking', format: formatMoney}, largestmug:{apiname:['stats','largestmug'], display: 'Largest Mug', category: 'Attacking', format: formatMoney}, highestbeaten:{apiname:['stats','highestbeaten'], display: 'Highest Level Beaten', category: 'Attacking'}, respectforfaction:{apiname:['stats','respectforfaction'], display: 'Respect For Faction', category: 'Attacking'}, itemsbought:{apiname:['stats','itemsbought'], display: 'Items Bought', category: 'Trading'}, auctionswon:{apiname:['stats','auctionswon'], display: 'Auctions Won', category: 'Trading'}, auctionsells:{apiname:['stats','auctionsells'], display: 'Auction Sells', category: 'Trading'}, itemssent:{apiname:['stats','itemssent'], display: 'Items Sent', category: 'Trading'}, trades:{apiname:['stats','trades'], display: 'Trades', category: 'Trading'}, weaponsbought:{apiname:['stats','weaponsbought'], display: 'Weapons Bought', category: 'Trading'}, pointssold:{apiname:['stats','pointssold'], display: 'Points Sold', category: 'Trading'}, pointsbought:{apiname:['stats','pointsbought'], display: 'Points Bought', category: 'Trading'}, bazaarcustomers:{apiname:['stats','bazaarcustomers'], display: 'Bazaar Customers', category: 'Trading'}, bazaarsales:{apiname:['stats','bazaarsales'], display: 'Bazaar Sales', category: 'Trading'}, bazaarprofit:{apiname:['stats','bazaarprofit'], display: 'Bazaar Profit', category: 'Trading', format: formatMoney}, jailed:{apiname:['stats','jailed'], display: 'Jailed', category: 'Jail'}, peoplebusted:{apiname:['stats','peoplebusted'], display: 'People Busted', category: 'Jail'}, failedbusts:{apiname:['stats','failedbusts'], display: 'Failed Busts', category: 'Jail'}, peoplebought:{apiname:['stats','peoplebought'], display: 'People Bought out of Jail', category: 'Jail'}, peopleboughtspent:{apiname:['stats','peopleboughtspent'], display: 'Money Spent on buying people out of jail', category: 'Jail', format: formatMoney}, // TODO: Some shorter display text hospital:{apiname:['stats','hospital'], display: 'Hospital', category: 'Hospital'}, // TODO: medicalitemsused:{apiname:['stats','medicalitemsused'], display: 'Medical Items Used', category: 'Hospital'}, bloodwithdrawn:{apiname:['stats','bloodwithdrawn'], display: 'Blood Withdrawn', category: 'Hospital'}, revives:{apiname:['stats','revives'], display: 'Revives', category: 'Hospital'}, revivesreceived:{apiname:['stats','revivesreceived'], display: 'Revives Received', category: 'Hospital'}, medstolen:{apiname:['stats','medstolen'], display: 'Medical Items Stolen', category: 'Hospital'}, heahits:{apiname:['stats','heahits'], display: 'Heavy artillery', category: 'Finishing Hits'}, machits:{apiname:['stats','machits'], display: 'Machine guns', category: 'Finishing Hits'}, rifhits:{apiname:['stats','rifhits'], display: 'Rifles', category: 'Finishing Hits'}, smghits:{apiname:['stats','smghits'], display: 'Sub machine guns', category: 'Finishing Hits'}, shohits:{apiname:['stats','shohits'], display: 'Shotguns', category: 'Finishing Hits'}, pishits:{apiname:['stats','pishits'], display: 'Pistols', category: 'Finishing Hits'}, grehits:{apiname:['stats','grehits'], display: 'Temporary weapons', category: 'Finishing Hits'}, piehits:{apiname:['stats','piehits'], display: 'Piercing weapons', category: 'Finishing Hits'}, slahits:{apiname:['stats','slahits'], display: 'Slashing weapons', category: 'Finishing Hits'}, axehits:{apiname:['stats','axehits'], display: 'Clubbed weapons', category: 'Finishing Hits'}, chahits:{apiname:['stats','chahits'], display: 'Mechanical weapons', category: 'Finishing Hits'}, mailssent:{apiname:['stats','mailssent'], display: 'Mail Sent', category: 'Communication'}, friendmailssent:{apiname:['stats','friendmailssent'], display: 'Friend Mail Sent', category: 'Communication'}, factionmailssent:{apiname:['stats','factionmailssent'], display: 'Faction Mail Sent', category: 'Communication'}, companymailssent:{apiname:['stats','companymailssent'], display: 'Company Mail Sent', category: 'Communication'}, spousemailssent:{apiname:['stats','spousemailssent'], display: 'Spouse Mail Sent', category: 'Communication'}, classifiedadsplaced:{apiname:['stats','classifiedadsplaced'], display: 'Classified Newspaper Ads Placed', category: 'Communication'}, personalsplaced:{apiname:['stats','personalsplaced'], display: 'Personal Placed', category: 'Communication'}, bountiesplaced:{apiname:['stats','bountiesplaced'], display: 'Bounties Placed', category: 'Bounties'}, totalbountyspent:{apiname:['stats','totalbountyspent'], display: 'Total Bounty Money Spent', category: 'Bounties', format: formatMoney}, bountiescollected:{apiname:['stats','bountiescollected'], display: 'Bounties Collected', category: 'Bounties'}, totalbountyreward:{apiname:['stats','totalbountyreward'], display: 'Total Bounty Money Gained', category: 'Bounties', format: formatMoney}, bountiesreceived:{apiname:['stats','bountiesreceived'], display: 'Bounties Received', category: 'Bounties'}, cityfinds:{apiname:['stats','cityfinds'], display: 'City Finds', category: 'Items'}, itemsdumped:{apiname:['stats','itemsdumped'], display: 'Items Dumped', category: 'Items'}, dumpsearches:{apiname:['stats','dumpsearches'], display: 'Dump Searches', category: 'Items'}, dumpfinds:{apiname:['stats','dumpfinds'], display: 'Dump Finds', category: 'Items'}, traveltimes:{apiname:['stats','traveltimes'], display: 'Travel Times', category: 'Travel'}, itemsboughtabroad:{apiname:['stats','itemsboughtabroad'], display: 'Items Bought Abroad', category: 'Travel'}, argtravel:{apiname:['stats','argtravel'], display: 'Argentina Traveled', category: 'Travel'}, mextravel:{apiname:['stats','mextravel'], display: 'Mexico Traveled', category: 'Travel'}, dubtravel:{apiname:['stats','dubtravel'], display: 'Dubai Traveled', category: 'Travel'}, hawtravel:{apiname:['stats','hawtravel'], display: 'Hawaii Traveled', category: 'Travel'}, japtravel:{apiname:['stats','japtravel'], display: 'Japan Traveled', category: 'Travel'}, lontravel:{apiname:['stats','lontravel'], display: 'London Traveled', category: 'Travel'}, soutravel:{apiname:['stats','soutravel'], display: 'South Africa Traveled', category: 'Travel'}, switravel:{apiname:['stats','switravel'], display: 'Switzerland Traveled', category: 'Travel'}, chitravel:{apiname:['stats','chitravel'], display: 'China Traveled', category: 'Travel'}, cantravel:{apiname:['stats','cantravel'], display: 'Canada Traveled', category: 'Travel'}, caytravel:{apiname:['stats','caytravel'], display: 'Cayman Islands Traveled', category: 'Travel'}, drugsused:{apiname:['stats','drugsused'], display: 'Drug Used', category: 'Drugs'}, overdosed:{apiname:['stats','overdosed'], display: 'Drug Overses', category: 'Drugs'}, cantaken:{apiname:['stats','cantaken'], display: 'Canabis Taken', category: 'Drugs'}, exttaken:{apiname:['stats','exttaken'], display: 'Ecstasy Taken', category: 'Drugs'}, kettaken:{apiname:['stats','kettaken'], display: 'Ketamine Taken', category: 'Drugs'}, lsdtaken:{apiname:['stats','lsdtaken'], display: 'LSD Taken', category: 'Drugs'}, opitaken:{apiname:['stats','opitaken'], display: 'Opium Taken', category: 'Drugs'}, shrtaken:{apiname:['stats','shrtaken'], display: 'Shrooms Taken', category: 'Drugs'}, spetaken:{apiname:['stats','spetaken'], display: 'Speed Taken', category: 'Drugs'}, pcptaken:{apiname:['stats','pcptaken'], display: 'PCP Taken', category: 'Drugs'}, xantaken:{apiname:['stats','xantaken'], display: 'Xanax Taken', category: 'Drugs'}, victaken:{apiname:['stats','victaken'], display: 'Vicodin Taken', category: 'Drugs'}, networth:{apiname:['stats','networth'], display: 'Networth', format: formatMoney}, logins:{apiname:['stats','logins'], display: 'Logins'}, useractivity:{apiname:['stats','useractivity'], display: 'Time Played', format: formatSeconds}, meritsbought:{apiname:['stats','meritsbought'], display: 'Merits Bought'}, refills:{apiname:['stats','refills'], display: 'Refills'}, trainsreceived:{apiname:['stats','trainsreceived'], display: 'Trains Received'}, spydone:{apiname:['stats','spydone'], display: 'Spies Done'}, statenhancersused:{apiname:['stats','statenhancersused'], display: 'Stat Enhancers Used'}, virusescoded:{apiname:['stats','virusescoded'], display: 'Viruses Coded'}, daysbeendonator:{apiname:['stats','daysbeendonator'], display: 'Days Been Donator'}, missionscompleted:{apiname:['stats','missionscompleted'], display: 'Missions Completed', category: 'Missions'}, contractscompleted:{apiname:['stats','contractscompleted'], display: 'Contracts Completed', category: 'Missions'}, dukecontractscompleted:{apiname:['stats','dukecontractscompleted'], display: 'Duke Contracts Completed', category: 'Missions'}, missioncreditsearned:{apiname:['stats','missioncreditsearned'], display: 'Mission Credits Earned', category: 'Missions'}, sellingillegalproducts:{apiname:['crimes','selling_illegal_products'], display: 'Illegal Products Sold', category: 'Crimes'}, theft:{apiname:['crimes','theft'], display: 'Theft', category: 'Crimes'}, auto_theft:{apiname:['crimes','auto_theft'], display: 'Auto Theft', category: 'Crimes'}, drug_deals:{apiname:['crimes','drug_deals'], display: 'Drug Deals', category: 'Crimes'}, computer_crimes:{apiname:['crimes','computer_crimes'], display: 'Computer Crimes', category: 'Crimes'}, murder:{apiname:['crimes','murder'], display: 'Murder', category: 'Crimes'}, fraud_crimes:{apiname:['crimes','fraud_crimes'], display: 'Fraud Crimes', category: 'Crimes'}, other:{apiname:['crimes','other'], display: 'Other Crimes', category: 'Crimes'}, total:{apiname:['crimes','total'], display: 'Total Crimes', category: 'Crimes'}, awards:{display: 'Awards', custom: function(id){return getAwards(id);}, tooltip: 'Your award count only updates when you visit your own profile.'}, point:{display:'Point', custom: function(id){ var x = getUserValue(id, ['stats', 'attackswon'])+getUserValue(id,['stats','attackslost']); x += getUserValue(id,['stats','attacksdraw'])+getUserValue(id,['stats','yourunaway']); var y = getUserValue(id, ['stats','xantaken']); return (y*250) - (x*25); }, category: 'Requests'}, }; } function allSettings(){ return { versusMine: {display: 'Show my stats', type:'checkbox'} }; } function apiCall(url, cb){ console.log('Torn helper: making request \''+url+'\''); $.ajax({ url: url, type: 'GET', success: function(data) { cb(data); } }); } function getAwards(id){ var element = $(".profile-container.basic-info.bottom-round ul:nth-child(2) li:nth-child(8)"); var content = element.first().contents().filter(function(){ return this.nodeType == 3; }); var value = parseInt(content.text().trim()); if(!id){ if(data.me.awards) return data.me.awards; return -1; } if(id == data.me.id){ data.me.awards = value; save(); } return value; } function removeFirstAndLastLine(text){ var lines = text.split('\n'); lines.splice(0,1); lines.splice(-1,1); var newtext = lines.join('\n'); } function formatSeconds(s){ var minutes = Math.floor(s/60)%60; var hours = Math.floor(s/(60*60))%24; var days = Math.floor(s/(60*60*24)); var seconds = s%60; return '{0}d {1}h {2}m {3}s'.format(days, hours, minutes, seconds); } function formatNumber(n){ return n.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"); } function formatMoney(m){ return '$'+formatNumber(m); } // Taken from: http://stackoverflow.com/a/15724300/1832471 function getCookieValue(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length); } return null; } // Taken from: http://stackoverflow.com/a/901144/1832471 function getParameterByName(name, url) { if (!url) { url = window.location.href; } name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址