您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add the new number of crimes in the category to the result message
// ==UserScript== // @name Add crime stats to result // @namespace http://tampermonkey.net/ // @version 0.2 // @description Add the new number of crimes in the category to the result message // @author miros // @match https://www.torn.com/crimes.php* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @license MIT // ==/UserScript== // set to true when status is shown, and to false when a crime is triggered // either through the regular [do crime] button or through TornTools quick crimes var status_shown = false; var crime_to_nerve = { searchtrainstation : 2, searchbridge : 2, searchbins : 2, searchfountain : 2, searchdumpster : 2, searchmovie : 2, cdrock : 3, cdheavymetal : 3, cdpop : 3, cdrap : 3, cdreggae : 3, dvdhorror : 3, dvdaction : 3, dvdromance : 3, dvdsci : 3, dvdthriller : 3, sweetshop : 4, marketstall : 4, clothesshop : 4, jewelryshop : 4, hobo : 5, kid : 5, oldwoman : 5, businessman : 5, lawyer : 5, apartment : 6, house : 6, mansion : 6, cartheft : 6, office : 6, swiftrobbery : 7, thoroughrobbery : 7, swiftconvenient : 7, thoroughconvenient : 7, swiftbank : 7, thoroughbank : 7, swiftcar : 7, thoroughcar : 7, cannabis : 8, amphetamines : 8, cocaine : 8, drugscanabis : 8, drugspills : 8, drugscocaine : 8, simplevirus : 9, polymorphicvirus : 9, tunnelingvirus : 9, armoredvirus : 9, stealthvirus : 9, assasination : 10, driveby : 10, carbomb : 10, murdermobboss : 10, home : 11, Carlot : 11, OfficeBuilding : 11, aptbuilding : 11, warehouse : 11, motel : 11, govbuilding : 11, parkedcar : 12, movingcar : 12, carshop : 12, pawnshop : 13, pawnshopcash : 13, makemoney2 : 14, maketokens2 : 14, makecard : 14, napkid : 15, napwomen : 15, napcop : 15, napmayor : 15, trafficbomb : 16, trafficarms : 16, bombfactory : 17, bombbuilding : 17, hackbank : 18, hackfbi : 18, }; var nerve_to_cat = { 2: 'other', 3: 'selling_illegal_products', 4: 'theft', 5: 'theft', 6: 'theft', 7: 'theft', 8: 'drug_deals', 9: 'computer_crimes', 10: 'murder', 11: 'fraud_crimes', 12: 'auto_theft', 13: 'theft', 14: 'fraud_crimes', 15: 'theft', 16: 'selling_illegal_products', 17: 'fraud_crimes', 18 : 'computer_crimes', }; Object.defineProperty(String.prototype, 'capitalize', { value: function() { return this.charAt(0).toUpperCase() + this.slice(1); }, }); Object.defineProperty(String.prototype, 'cat_to_title', { value: function() { return this.split('_').map(element => { return element.capitalize() }).join(' '); } }); Element.prototype.acs_add_handler = function () { console.log('[acs] adding handler'); this.onclick = function() { status_shown = false; console.log('[acs] reset status_shown') }; } NodeList.prototype.acs_add_handler = function () { this.forEach( function (elt) { elt.acs_add_handler(); }); } function api_call (key) { return 'https://api.torn.com/user/' + key + '?selections=crimes&key=' + key + '&comment=crimestats'; } function status_message (status, message) { //alert('status_message. status: [' + status + '] - message: [' + message + ']'); var color = status == 'ok' ? 'green' : 'red'; var title = status.capitalize(); return '<span id="acs_status" class="' + status + '" style="color:' + color + ';">' + title + ': ' + message + '</span>'; } function init_key() { //alert('in init_key'); var div = document.createElement('div'); var input = '<div class="acs_input_key" style="margin: 10px auto;";><input type="text" id="acs_key" name="acs_key" placeholder="API Key" style="line-height:1.5em; padding: 2px;"></input><button id="acs_save_key">Save</button></div>'; div.innerHTML = '<div id="acs_modal" style="position: fixed;z-index: 1;left: 0;top: 0;width: 100%;height: 100%;overflow: auto;"><div id="acs_content" style="background-color: lightblue;margin: 15% auto;padding: 20px;border: 1px solid black;width: 20%;box-shadow:20px 20px 30px 2px gray;border-radius:7px;"><span id="acs_close" style="float: right;font-size:25px;cursor: pointer;color: black;">×</span>'+ input +'<div id="acs_message"></div></div></div>'; document.body.appendChild(div); var modal = document.getElementById("acs_modal"); var close = document.getElementById("acs_close"); var button = document.getElementById("acs_save_key"); close.onclick = function(){modal.style.display = "none";} button.onclick = function() { var key = document.getElementById('acs_key').value; //alert( 'key value should be [' + key + ']'); save_key(key); } } function save_key (key) { fetch(api_call(key)) .then((response) => { if (response.ok) { //alert('response is ok'); return response.json(); } else { //alert('response is NOT ok :' + response.status); return {error: response.status}; } }) .then((data) => { //alert( 'in second promise, data: ' + data); var message = document.getElementById('acs_message'); if (data.hasOwnProperty('criminalrecord')) { //alert('criminalrecord found'); localStorage.setItem('acs_key',key); save_last_data(data); message.innerHTML = status_message('ok', 'API Key Saved'); show_stat(key); status_shown = true; } else { var error = data.hasOwnProperty('error') && data.error.hasOwnProperty('error') ? data.error.error : 'unknown error'; //alert('error found: ' + error); message.innerHTML = status_message('error', error); status_shown = true; } }); } function stat_message (title, stat) { return '<span id="acs_stat" style="display: inline-block; float: right; color:aquamarine;">' + title + ': ' + stat + '</span>'; } function show_stat(key) { //alert( 'in show_stat (key is [' + key + '])'); var intv = setInterval(function() { var message = document.querySelector('div.success-message'); var status = document.getElementById('acs_status'); if(status_shown || status != null || message == null) { return false; } //alert('found message: [' + message.innerHTML + ']'); // I should be able to use nervetake to get the nerve value, but sometimes it's empty // need to be precise with the selector, torntools quick crimes also has a crime input var crime = document.querySelector('form[name="docrime2"] input[name="crime"]').getAttribute('value'); var nerve = crime_to_nerve[crime]; var cat = nerve_to_cat[nerve]; var title = cat.cat_to_title(); var last = JSON.parse(localStorage.getItem('acs_last')); console.log(last); console.log('[acs] nerve is [' + nerve + '], category is [' + cat + ']') ; var delta = Date.now() - last.time; console.log( '[acs] delta is: [' + delta +'], last.time is: [' + last.time + ']'); if (Date.now() - last.time < 3000) { // last call was less than 3s ago, use the cache to compute the result console.log('[acs] using the cache'); last.criminalrecord[cat]++; save_last_data(last); message.innerHTML = message.innerHTML + stat_message(title, last.criminalrecord[cat]); } else { // last call was more than 3s ago, use the API fetch(api_call(key)) .then((response) => response.json()) .then((data) => { console.log('[acs] using the API'); save_last_data(data); message.innerHTML = message.innerHTML + stat_message(title, data.criminalrecord[cat]); return true; }); } status_shown = true; document.querySelectorAll('#do_crimes button, #try_again button, #change_crime button, form.quick-item ul.forced-item ').acs_add_handler(); }, 300); } function save_last_data (data) { localStorage.setItem('acs_last', JSON.stringify({ time: Date.now(), criminalrecord:data.criminalrecord })); } (function() { 'use strict'; //alert('running Add crime stats to result.user'); var key = localStorage.getItem('acs_key'); if (key) { show_stat(key); } else { init_key(); } }());