Greasy Fork is available in English.
Show your own revive chance in hospital
// ==UserScript==
// @name TornReviveChance
// @namespace http://tampermonkey.net/
// @version 0.3
// @description Show your own revive chance in hospital
// @author Resh
// @match https://www.torn.com/hospitalview.php*
// @icon https://www.google.com/s2/favicons?sz=64&domain=torn.com
// @grant none
// @license MIT
// ==/UserScript==
// Step 1:
// Generate API Key using this link:
// https://www.torn.com/preferences.php#tab=api?step=addNewKey&title=Revive%20Chance&user=revivesfull,timestamp,basic
// Step 2:
// paste API Key below inside the ''
const API_KEY = '';
// Step 3 (optional):
// Set the minimum value for colors. By default, the number will be green when chance>70, orange on 40-70 and red when <40
// If you instead want only green and red, simply set both GREEN_MIN and ORANGE_MIN values to the same value.
const GREEN_MIN = 70;
const ORANGE_MIN = 40;
// Step 4 (optional):
// Change this value from false to true if you want to also see the minimum revive chance, from a skill 1 reviver
const SHOW_MINIMUM = false;
function displayError(error) {
console.log(error);
$('#reviveChanceDisplay').html("API ERROR").css('color', 'red');
}
function displayReviveChances(data) {
let truePenalty = calculatePenalty(data);
let revChanceMax = 100 - truePenalty/2;
if (revChanceMax < 1) {
revChanceMax = 1;
}
$('#revChanceMax').html(revChanceMax.toFixed(2)+'%');
if (revChanceMax >= GREEN_MIN) {
$('#revChanceMax').css('color', 'var(--revive-availability-btn-everyone-green)');
} else if (revChanceMax >= ORANGE_MIN) {
$('#revChanceMax').css('color', 'var(--revive-availability-btn-everyone-orange)');
} else {
$('#revChanceMax').css('color', 'var(--revive-availability-btn-everyone-red)');
}
if (SHOW_MINIMUM) {
let revChanceMin = 90 - truePenalty;
if (revChanceMin < 1) {
revChanceMin = 1;
}
$('#revChanceMin').html(revChanceMin.toFixed()+"%");
}
}
function calculatePenalty(data) {
const UNIX_DAY = 86400;
const REV_PENALTY = 8;
let currentPenalty = 0;
let currentTs = data["timestamp"];
let playerId = data["player_id"];
for (const [key, singleRevive] of Object.entries(data["revives"])) {
// only count incoming revives, not outgoing!
if (singleRevive["target_id"] == playerId && singleRevive["result"] == "success") {
let timeDif = currentTs - singleRevive["timestamp"];
if (timeDif < UNIX_DAY) {
currentPenalty += (1 - (timeDif/UNIX_DAY))*REV_PENALTY;
}
}
}
return currentPenalty;
}
(function() {
'use strict';
// Your code here...
if ($('div.content-title > h4').size() > 0 && $('#reviveChanceDisplay').size() < 1) {
const revDisplay = `<span id="reviveChanceDisplay" style="font-size: 20px;">
<span id="revChanceMax" style="font-weight: bold">-</span>
</span>`;
$('div.content-title > h4').append(revDisplay);
if (SHOW_MINIMUM) {
const revDisplayMin = `<span style="font-size: 15px; font-weight: 400;">
(min: <span id="revChanceMin">-</span>)
</span>`;
$('#reviveChanceDisplay').append(revDisplayMin);
}
fetch("https://api.torn.com/user/?selections=revivesfull,timestamp,basic&key="+API_KEY+"&comment=RevChance")
.then(response => {
// indicates whether the response is successful (status code 200-299) or not
if (!response.ok) {
throw new Error(`Response Status: ${reponse.status}`);
}
return response.json();
})
.then(data => {
if("error" in data) {
displayError(data.error.error);
} else {
displayReviveChances(data);
}
})
.catch(error => displayError(error))
}
})();