您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
View individual Xanax usage on Faction page.
- // ==UserScript==
- // @name Torn Xanax Usage Viewer
- // @namespace http://tampermonkey.net/
- // @version 0.1
- // @description View individual Xanax usage on Faction page.
- // @author Microbes
- // @match https://www.torn.com/profiles.php?XID=*
- // @match https://www.torn.com/factions.php*
- // @match https://www.torn.com/preferences.php
- // @icon https://www.google.com/s2/favicons?sz=64&domain=torn.com
- // @grant none
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- // Get current setting if exist
- let apiKey = localStorage.getItem(`xanaxviewer_apikey`) || '';
- let autoLimit = localStorage.getItem(`xanaxviewer_autoLimit`) || '0';
- let showRelative = localStorage.getItem(`xanaxviewer_relative_values`) === 'true' || false;
- // Fetech our own stats
- let myInfo;
- $.get(`https://api.torn.com/user/?selections=basic,personalstats&key=${apiKey}&comment=xanaxviewer`, (data, status) => {
- if ("error" in data) {
- $(".content-title").first().append(`<p style="color: red;">XanaxViewerError: ${data["error"]["error"]}.</p>`);
- } else {
- XanaxViewerMain(data, apiKey, autoLimit, showRelative);
- }
- });
- // Perferences Page
- if (GetPageName() == "preferences.php") {
- $(".preferences-container").after(`
- <div class="xanaxviewer_container " data-feature="connect">
- <div class="xanaxviewer_head">
- <span class="xanaxviewer_title">Xanax Viewer Settings</span>
- </div>
- <div class="xanaxviewer_content">
- <br/>
- <p>API Key (Public Only): <input id="xanaxviewer_api" type="text" maxlength="16" required="" autocomplete="off" value="${apiKey}" style="color: rgb(0, 0, 0); border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); border-image: initial; width: 20em;"></p>
- <br/><br/>
- <p>Automatically fetch <span id="xanaxviewer_autolimit">${autoLimit}</span> users (cloesest level) when I visit a faction page.</p>
- <div class="slidecontainer">
- <input type="range" min="0" max="100" value="${autoLimit}" class="slider" id="xanaxviewer_autolimit_slider">
- </div>
- <br/>
- <p>Show Relative Value: <input id="xanaxviewer_relative_checkbox" type="checkbox" /></p>
- <br/><br/>
- <p><span id="xanaxviewer_storage_counter">250</span> Profiles saved. <a id="xanaxviewer_deleteall_btn">Delete all</a>?</p>
- <br/>
- <a id="xanaxviewer_update_btn" class="torn-btn btn-big update">Update</a>
- <span id="updateText">Updated successfully!</span>
- </div>
- </div>
- `);
- document.getElementById("xanaxviewer_autolimit_slider").oninput = function() {
- $("#xanaxviewer_autolimit").text(this.value);
- };
- $('#xanaxviewer_relative_checkbox').prop('checked', showRelative);
- let cache = GetXanaxViewerCache();
- $("#xanaxviewer_storage_counter").text(Object.keys(cache).length);
- $("#xanaxviewer_deleteall_btn").click(() => {
- localStorage.removeItem("xanaxviewer_cache");
- $("#xanaxviewer_storage_counter").text(0);
- });
- $("#xanaxviewer_update_btn").click(() => {
- localStorage.setItem(`xanaxviewer_apikey`, $("#xanaxviewer_api").val());
- localStorage.setItem(`xanaxviewer_autoLimit`, $("#xanaxviewer_autolimit_slider").val());
- localStorage.setItem(`xanaxviewer_relative_values`, $("#xanaxviewer_relative_checkbox").is(":checked"));
- $("#updateText").fadeIn();
- });
- $("#updateText").hide();
- }
- function XanaxViewerMain(myInfo, apiKey, autoLimit, showRelative) {
- if (GetPageName() == "profiles.php" && apiKey != '') {
- var uid = window.location.href.split("=").slice(-1);
- var selector = $("#profileroot .profile-buttons .title-black")
- GetUserStats(uid).then((stats) => {
- selector.append(`<span class="xanaxviewer-profile">${showRelative ? stats["xantaken"] - myInfo.personalstats.xantaken : stats["xantaken"]} Xanax</span>`);
- selector.append(`<span class="xanaxviewer-profile">${stats["refills"]} Refills</span>`);
- });
- } else if (GetPageName() == "factions.php" && apiKey != '') {
- let profiles = {};
- waitForElementToExist('.members-list .positionCol___Lk6E4').then((elm) => {
- delay(250).then(() => {
- $('.faction-info-wrap .table-header').append(`<li tabindex="0" class="table-cell xanaxviewer_header torn-divider divider-vertical c-pointer">Xanax<div class="sortIcon___ALgdi asc___bb84w"></div></li>`);
- // Add cached result or refresh button
- $('.faction-info-wrap .table-body').find(".table-row").each(function() {
- var uid = $(this).find("a").eq(1);
- uid = uid.attr('href').split("=").slice(-1);
- let info = GetXanaxViewerCache()[uid];
- if (info) {
- let xantaken = showRelative ? info["xantaken"] - myInfo.personalstats.xantaken : info["xantaken"];
- $(this).append(`<div class="table-cell xanaxviewer_header"><a class="xanaxviewer_refresh">${xantaken}</a></div>`);
- } else {
- $(this).append(`<div class="table-cell xanaxviewer_header"><a class="xanaxviewer_refresh">⟳</a></div>`);
- }
- // Add level into profiles, to auto refresh.
- var level = $(this).find(".lvl").first().text();
- if (level in profiles) {
- profiles[level].push(this);
- } else {
- profiles[level] = [this];
- }
- // XanaxViewerLog(level + ": " + profiles[level].length);
- });
- // On Refresh Clicked
- $(".xanaxviewer_refresh").click(function() {
- UpdateViewer(this, myInfo);
- });
- // Refresh autoLimit amonunt of Xanax field
- let memberCount = $(".members-list .c-pointer span").first();
- memberCount = memberCount.html().split("/")[0].replace(/ /g, '');
- if (autoLimit > memberCount) {
- autoLimit = memberCount;
- }
- if (autoLimit > 0) {
- let toBeRefreshed = [];
- let refreshed = 0;
- let level = myInfo.level;
- let cursorLevel = level;
- let generation = 0;
- let nextMinus = true;
- // XanaxViewerLog(Object.keys(profiles));
- while (refreshed < autoLimit) {
- if (nextMinus == true) {
- cursorLevel = level + generation;
- generation++;
- } else {
- cursorLevel = level - generation;
- }
- nextMinus = !nextMinus;
- if (cursorLevel in profiles) {
- profiles[cursorLevel].every(function(profile) {
- toBeRefreshed.push(profile);
- $(profile).find(".xanaxviewer_header").html(`<a class="xanaxviewer_refresh">L</a></div>`);
- refreshed++;
- if (refreshed >= autoLimit) {
- return false;
- }
- return true;
- });
- }
- }
- // XanaxViewerLog(toBeRefreshed.length);
- // Start refreshing
- StartRefreshing(toBeRefreshed, 0, myInfo);
- }
- });
- });
- }
- }
- function StartRefreshing(toBeRefreshed, counter, myInfo) {
- // XanaxViewerLog("updating " + counter);
- if (!counter in toBeRefreshed) return;
- let item = toBeRefreshed[counter];
- UpdateViewer($(item).find(".xanaxviewer_refresh"), myInfo).then(() => {
- if (counter < toBeRefreshed.length - 1) {
- StartRefreshing(toBeRefreshed, counter + 1, myInfo);
- }
- });
- }
- function XanaxViewerLog(data) {
- console.log("XanaxViewer: " + data);
- }
- function GetUserStats(uid) {
- let apiKey = localStorage.getItem(`xanaxviewer_apikey`) || '';
- if (apiKey == '') return;
- return new Promise(resolve => {
- $.get(`https://api.torn.com/user/${uid}?selections=personalstats&key=${apiKey}&comment=xanaxviewer`, function(data, status) {
- // XanaxViewerLog("Xanax Usage: " + data["personalstats"]["xantaken"]);
- let cache = GetXanaxViewerCache();
- cache[uid] = {
- "xantaken": data["personalstats"]["xantaken"],
- "cantaken": data["personalstats"]["xantaken"],
- "lsdtaken": data["personalstats"]["lsdtaken"],
- "refills": data["personalstats"]["refills"],
- "updated": Date.now()
- }
- localStorage.setItem(`xanaxviewer_cache`, JSON.stringify(cache));
- return resolve(data["personalstats"]);
- });
- });
- }
- function GetXanaxViewerCache() {
- let cache = localStorage.getItem(`xanaxviewer_cache`);
- if (cache) {
- cache = JSON.parse(cache);
- } else {
- cache = {};
- }
- return cache;
- }
- function UpdateViewer(element, myInfo) {
- var uid = $(element).parent().parent().find("a").eq(1);
- uid = uid.attr('href').split("=").slice(-1);
- XanaxViewerLog(myInfo.personalstats.xantaken);
- return new Promise(resolve => {
- GetUserStats(uid).then((stats) => {
- let xantaken = showRelative ? stats.xantaken - myInfo.personalstats.xantaken : stats.xantaken;
- $(element).html(`${xantaken}`);
- return resolve();
- });
- });
- }
- /* HELPERS */
- function GetPageName() {
- var path = window.location.pathname;
- var page = path.split("/").pop();
- return page;
- }
- function waitForElementToExist(selector) {
- return new Promise(resolve => {
- if (document.querySelector(selector)) {
- return resolve(document.querySelector(selector));
- }
- const observer = new MutationObserver(() => {
- if (document.querySelector(selector)) {
- resolve(document.querySelector(selector));
- observer.disconnect();
- }
- });
- observer.observe(document.body, {
- subtree: true,
- childList: true,
- });
- });
- }
- // Style
- function delay(time) {
- return new Promise(resolve => setTimeout(resolve, time));
- }
- function GM_addStyle(css) {
- const style = document.getElementById("GM_addStyleBy8626") || (function() {
- const style = document.createElement('style');
- style.type = 'text/css';
- style.id = "GM_addStyleBy8626";
- document.head.appendChild(style);
- return style;
- })();
- const sheet = style.sheet;
- sheet.insertRule(css, (sheet.rules || sheet.cssRules || []).length);
- }
- GM_addStyle(".xanaxviewer_header { width:6%; }");
- GM_addStyle(".xanaxviewer-profile { float: right; padding-right: 10px; color: red; }");
- GM_addStyle("#xanaxviewer_autolimit_slider { width: 20em; }");
- GM_addStyle(".member-icons { width: 25% !important; }");
- GM_addStyle(".xanaxviewer_container { margin-top: 10px; display: flex; flex-direction: column; box-sizing: border-box; }");
- GM_addStyle(".xanaxviewer_head { background: black; padding: 2px; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; border-bottom: none; }");
- GM_addStyle(".xanaxviewer_title { color: var(--re-title-color); text-shadow: rgba(0, 0, 0, 0.65) 1px 1px 2px; }");
- GM_addStyle(".xanaxviewer_content { background-color: grey; padding: 1em 2em; color: white; }");
- GM_addStyle("#xanaxviewer_storage_counter, #xanaxviewer_deleteall_btn { color: yellow; }");
- GM_addStyle("#xanaxviewer_deleteall_btn:hover { text-decoration: underline; }");
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址