คุณต้องเข้าสู่ระบบหรือลงทะเบียนก่อนดำเนินการต่อ
reusable functions
Этот скрипт недоступен для установки пользователем. Он является библиотекой, которая подключается к другим скриптам мета-ключом // @require https://update.greasyfork.org/scripts/469546/1211525/Library%20of%20TORN%20helper.js
function commaSeparateNumber(val){ while (/(\d+)(\d{3})/.test(val.toString())){ val = val.toString().replace(/(\d+)(\d{3})/, '$1'+','+'$2'); } return val; } function isNull(v) { return v != null ? v : 0; } function checkAPIusage(num) { var apiUsage = JSON.parse(localStorage.apiUsage || '[]'); var currentTime = moment().unix(); for(var i = 0; i < apiUsage.length; i++) { if((currentTime - apiUsage[0]) > 60) apiUsage.splice(0,1); else break; } localStorage.apiUsage = JSON.stringify(apiUsage); if((num + apiUsage.length) <= 60) return true; else { console.warn("cooldown API usage to avoid temporary API banned"); alert("Hold down, your api request is almost reach the limit (100 request per minute). Please try again in a few seconds.") return false; } } function addAPIusage() { var apiUsage = JSON.parse(localStorage.apiUsage || '[]'); var currentTime = moment().unix(); apiUsage.push(currentTime); localStorage.apiUsage = JSON.stringify(apiUsage); } function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } function getParameterByName(name, url) { if (!url) url = window.location.href; name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), r###lts = regex.exec(url); if (!r###lts) return null; if (!r###lts[2]) return ''; return decodeURIComponent(r###lts[2].replace(/\+/g, " ")); } function unique(list) { var r###lt = []; $.each(list, function(i, e) { if ($.inArray(e, r###lt) == -1) r###lt.push(e); }); return r###lt; } function requireAPI(callback) { if (localStorage.getItem("_apiKey") === null && !$("#scbox").length) { $('div.content-title').after(` <div id='scbox' class="m-top10"> <div class="title-gray top-round" role="heading" aria-level="5"> <i class="issue-attention-icon"></i> <span id="title">API Key required</span> </div> <div class="bottom-round cont-gray p10" id="msg"> <fieldset class="submit-wrap"> <p>You are currently using <strong>${GM.info.script.name}</strong> script that require API key. Please fill your correct API key to use it.</p><br/> <div class="cont-quantity left"> <div class="input-money-group"><span title="Fill with your correct API key" class="input-money-symbol">KEY</span><input id="quantity-price" class="quantity price input-money" type="text" value=""></div> </div> <div class="cont-button left" id="apiSignIn" style="margin-left: 10px;"> <span class="btn-wrap silver"> <span class="btn c-pointer bold" style="padding: 0 15px 0 10px;"><span>SIGN IN</span></span> </span> </div> <div class="clear"></div> </fieldset> </div> <!--div class="clear"></div--> <hr class="page-head-delimiter m-top10"> </div>`); $("div#scbox #apiSignIn").click(function() { var apikey = $("div#scbox input").val(); if(!checkAPIusage(1)) return 0; $.getJSON('https://api.torn.com/user/?selections=basic&key='+apikey, function(data) { if(data.error != undefined) { alert(data.error.error); $("div#scbox .input-money-group").addClass("error"); } else { localStorage._apiKey = apikey; addAPIusage(); $("div#scbox #msg").text("Hi " + data.name +", you have successfully signed in your API key. Thank you."); setTimeout(() => { location.reload(); }, 3000); } }); }); } else { var apikey = localStorage.getItem("_apiKey"); if(!checkAPIusage(1)) return 0; $.getJSON('https://api.torn.com/user/?selections=profile,discord&key='+apikey, function(data) { if(data.error != undefined) { localStorage.removeItem("_apiKey"); } else { addAPIusage(); callback(data); } }); } } function fetching(url, callback) { const noop = () => {} const custom_fetch = (fetch, { onrequest = noop, onresponse = noop, onr###lt = noop, onbody = [], }) => async (input, init) => { onrequest(input, init) const response = await fetch(input, init) onresponse(response) for (const handler of onbody) { if (handler.match(response)) { Promise.resolve(handler.execute(response.clone())) .then((r###lt) => onr###lt(r###lt)) } } return response } const intercept_fetch = (options) => (unsafeWindow.fetch = custom_fetch(fetch, options)) intercept_fetch({ // onrequest: (input, init) => console.log('FETCH CALL', input, init), // onresponse: (response) => console.log('FETCH RESPONSE', response), onbody: [{ match: (response) => response.url.startsWith('https://www.torn.com/' + url), execute: (response) => response.json().then((json) => callback(json, response.url)), }], }) } function xhr(url, data, method, callback) { $( document ).ajaxComplete(function( event, xhr, settings ) { settings.data = settings.type == 'POST' ? settings.data : ''; console.log(settings.url.indexOf(url) != -1, settings.data.indexOf(data) != -1); if(settings.type == method && settings.url.indexOf(url) != -1 && settings.data.indexOf(data) != -1) { callback(xhr.responseText); } }); } function xhr2(urlParam, respParam, callback) { let oldXHROpen = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) { this.addEventListener('load', function() { if(url.indexOf(urlParam) != -1 && this.responseText.indexOf(respParam) != -1) { callback(this.responseText); } }); return oldXHROpen.apply(this, arguments); } } function observe(selector, callback) { var observer = new MutationObserver(function(mutations) { callback(); }); var observerTarget = $(selector)[0]; var observerConfig = { attributes: false, childList: true, characterData: false, subtree: true }; observer.observe(observerTarget, observerConfig); } function timeHumanize(seconds) { var time = moment.duration(seconds * 1000); var text = ''; months = time.months(); days = time.days(); hours = time.hours(); minutes = time.minutes(); seconds = time.seconds(); text += (months > 0) ? (months + " months ") : ""; text += (days > 0) ? (days + " days ") : ""; text += (hours > 0) ? (hours + " hours ") : ""; text += (minutes > 0) ? (minutes + " minutes ") : ""; text += (seconds > 0) ? (seconds + " seconds ") : ""; return text; } var livetime = function(time, elementID, format) { duration = moment.duration(Math.abs(moment.unix(time).diff(moment()))); // Long if(format === 'L') { duration = duration.days() + ' days ' + duration.hours() + ' hours ' + duration.minutes() + ' minutes ' + duration.seconds() + ' seconds '; } // Short if(format === 'S') { duration = duration.days() + 'D ' + duration.hours() + 'H ' + duration.minutes() + 'M ' + duration.seconds() + 'S '; } // Time if(format === 'T') { duration = duration.days() + ':' + duration.hours() + ':' + duration.minutes() + ':' + duration.seconds(); } $("#" + elementID).text(duration); }; function notify(title, msg, icon, url) { if (Notification.permission !== "granted") Notification.requestPermission(); else { var notification = new Notification(title, { icon: icon, body: msg, }); notification.onclick = function () { window.open(url); }; } }