TagPro AutoStatsSetting (TP-ASS)

When less than 2 of the 3 last games are won: turn off stats. When the last 3 games are won: turn on stats

当前为 2017-09-17 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         TagPro AutoStatsSetting (TP-ASS)
// @version      0.2
// @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:*
// @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');

    });
});