// ==UserScript==
// @name TagPro AutoStatsSetting (TP-ASS)
// @version 0.3
// @description When less than 2 of the 3 last games are won: turn off stats. When the last 3 games are won: turn on stats
// @author Ko
// @supportURL https://www.reddit.com/message/compose/?to=Wilcooo
// @website https://www.reddit.com/r/TagPro/comments/6wlsfa/userscript_tagpro_autostatsetting_tpass/
// @include http://tagpro-*.koalabeast.com:*
// @include http://tagpro-*.koalabeast.com/game
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @connect koalabeast.com
// @namespace https://greasyfork.org/users/152992
// ==/UserScript==
console.log('START: ' + GM_info.script.name + ' (v' + GM_info.script.version + ' by ' + GM_info.script.author + ')');
////////////////////////////////////////////////////////////////////////////////////////////
// ### --- OPTIONS --- ### //
//////////////////////////////////////////////////////////////////////////////////////// //
// //
// Please type your reserved name between the quotes. // //
// DO NOT FORGET to change this when you change your reserved name in the future, // //
// or it will be set back to what you typed here!! // //
var reservedName = ""; // //
// //
// How many wins in a row should turn stats back on? (Max. 3 at the moment) // //
var wins_in_a_row = 3; // //
// //
// What is the mininum acceptable amount of games to win out of 3? // //
// If you win less than that, stats are turned off. // //
var minimum_wins = 2; // //
// //
// Note: With the default options, winning 2 of the last 3 games keeps the stat // //
// setting unchanged // //
// //
// Start a new session after how many minutes of not playing? // //
var reset_time = 30; // //
// //
// Do you want to be alerted when the stat setting is changed? true/false // //
var show_alert = true; // //
// Currently not working, and I've no idea why. Help appreciated :) // //
// //
// Do you want to be alerted after every game, with the last three results? // //
var show_results = true; // //
// //
// What color should the alerts have (You'll get those in your chat-box) // //
// This tool may come in handy: https://www.w3schools.com/colors/colors_picker.asp // //
var alert_color = "#ffccff"; // //
// //
// Do you want to see some debug-messages in the console // //
// (don't worry if you've no idea what this is) // //
var debug = false; // //
// //
//////////////////////////////////////////////////////////////////////////////////////// //
// ### --- END OF OPTIONS --- ### //
////////////////////////////////////////////////////////////////////////////////////////////
/*
UPDATE LOG:
0.2:
Two new options; you can now specify at what number of wins stats should be turned on and off
Idea for a future update (I don't plan on updating this soon, but if you want you can fork/pull request):
Whether or not Stats will be turned off/on won't be based on that simple rule.
Instead the win% of the last session will be compared to your R300 win%.
Only when you are positively influencing your R300 win%, stats will be turned on
I plan on leaving the approach in this version as an option too.
*/
//////////////////////////////////////
// SCROLL FURTHER AT YOUR OWN RISK! //
//////////////////////////////////////
function chat_alert(message) { // This function shows info in your chat.
tagpro.socket.emit("local:chat", { to:"all", from:"TP-ASS", message:message, c:alert_color});
}
tagpro.ready(function () {
if (wins_in_a_row < minimum_wins) { // If this is true, stats will be turned on and off simultaneously in some cases
chat_alert("You messed up the options, wins_in_a_row cannot be smaller than minimum_wins!! This script is terminating.");
return;
}
tagpro.socket.on('end',function(data) { // This script only runs at the end of a game.
if(debug)console.log('TP-ASS: Game has ended, starting the script');
if (tagpro.spectator) return; // Spectated game results should NOT affect this script!
var player = tagpro.players[tagpro.playerId]; // Your own ball's object
var teamNames = [null,"red","blue"]; // Because tagpro.players[n].team returns a number, and I need to compare it to a string
var team = teamNames [ player.team ] ; // convert number to corresponding teamName string
var winner = data.winner; // Returns "red", "blue", or "tie" (even when custom names are set)
var won = (team == winner); // Determine if this game is won or not
if(debug)console.log('TP-ASS: And the winner is: ',winner);
if(debug)console.log('TP-ASS: You are part of that team: ',won);
var now = new Date().getTime(); // Get the current time
if ( GM_getValue("last_played") < now - reset_time*60000 || !GM_getValue("last_played") ) { // If you haven't played (using this script) during the last x minutes
GM_setValue("result1",false); // 2 games earlier is set to Lost
GM_setValue("result2",true); // 1 game earlier is set to Win
GM_setValue("result3",won); // Last games result is stored
// Note: The results of those 2 games are chosen this way because it will give the following effect.
// - When loosing the first game of a new session: stats are immediately turned OFF
// - You need to win the first 2 games for stats to be turned ON (if they weren't already)
if(debug)console.log('TP-ASS: A new session has started');
} else { // Else (if still in the same session)
GM_setValue("result1",GM_getValue("result2")); // Move all results one place back in the 'past'
GM_setValue("result2",GM_getValue("result3"));
GM_setValue("result3",won); // Store the latest result (of the game that just ended)
if(debug)console.log('TP-ASS: This result is stored');
}
GM_setValue("last_played",now); // Update the last_played time
function setStats(to) { // Defines how to turn stats on or off
if ( tagpro.settings.stats == to ) return; // If the current Stat setting is different from what you want it to be:
if(debug)console.log('TP-ASS: Trying to change the STAT setting to '+to);
// This is where the magic starts!! (changing the Stat Setting)
var settings = tagpro.settings.ui; // We copy your current settings, because we need a fully filled form to send to the server
// What is still missing in tagpro.settings.ui is your displayName and reservedName
settings.displayedName = player.name; // We simply get your display name from your ball
// Getting the reserved name isn't that easy:
if(player.auth) settings.reservedName = player.name; // if you have a green checkmark, the script immediately knows your reserved name
else if (reservedName !== "") settings.reservedName = reservedName; // if you're playing unauthenticated, the name from the options (top of this script) will be used instead
else { // if you haven't set that as well, you will be prompted at the end of the game. (only the first time)
storedName = GM_getValue("storedName");
if (typeof storedName != 'undefined') settings.reservedName = storedName; // If you are prompted before, use that value.
else { // If not, prompt and store the input.
input = "";
while (input === "") input = prompt('What is your reserved name? Be sure to get it correct! The TP-ASS script needs this to work.\n\nIf you change your reserved name in the future, don\'t forget to update it in the TP-ASS script too or it will be set back to the name you type here!!');
// In case you immediately press 'enter' at the end of the game (f.e. to chat 'gg'), the prompt will just show again.
settings.reservedName = input;
GM_setValue("storedName",input);
}
}
if(debug)console.log('TP-ASS: Using this reserved name: '+settings.reservedName);
settings.stats = to; // The only thing we change in the settings is the stats, to whatever this functions argument is
if(debug)console.log('TP-ASS: Got the required settings, sending a POST request now...');
// Now that we have all settings, we can 'post' it to the server. (This is what happens when you click 'save settings' on the TagPro profile page)
GM_xmlhttpRequest ( {
method: "POST",
url: 'http://'+document.location.hostname+'/profile/update', // Settings should be send to the same server, so you'll be logged in for sure.
data: jQuery.param(settings), // jQuery.param makes it a string: "stats=false&reservedName=Ko&..."
headers: {"Content-Type": "application/x-www-form-urlencoded"}, // No idea why this is needed, but it doesn't work without it.
onload: function(r){
// 'r' is the response that we get back from the TP server, lets do some error handling with it:
if(r.response.error) chat_alert('Your Stat setting could not be saved due to the following error:\n'+e.error); // Alert it when something is wrong
if(r.response.success && show_alert) {
var textify = {true: "on", false: "off" }; // Translation from Boolean to the words on/off
chat_alert("Stats have been turned " + textify[to] + " for next game!"); // Alert when succeeded!
} if(debug)console.log('TP-ASS: Response of the POST request: ', r);
}});
// We did the magic!!
}
var number_of_wins = GM_getValue("result1") + GM_getValue("result2") + GM_getValue("result3"); // Count the number of wins of those last 3 results
if (number_of_wins < minimum_wins) setStats(false); // Set stats off when <2 wins
var wins_streak = ( GM_getValue("result1") * GM_getValue("result2") + GM_getValue("result2") ) * GM_getValue("result3") + GM_getValue("result3"); // Do some fancy math to get your current win streak
if (wins_streak >= wins_in_a_row) setStats(true); // Stats on when enough wins
// Note: if 2 of the last 3 games are won: the stat setting isn't changed. (With the default options)
if (show_results) {
var iconify = {true: "☀ ", false: "· " }; // Translation from Boolean to these icons
var results = iconify[GM_getValue("result1")] + iconify[GM_getValue("result2")] + iconify[GM_getValue("result3")];
chat_alert("Results from the last 3 games: " + results);
// Alerts you when the stat setting was updated.
}
if(debug)console.log('TP-ASS: Done! And hopefully succeeded xD');
});
});