TM League Match History

Add last match results and link to the matchs in the league table.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        TM League Match History
// @name:pt     TM Histórico de partidas para Liga
// @version     1.1
// @description Add last match results and link to the matchs in the league table.
// @description:pt (WIP) Adiciona os últimos jogos e o link para o jogo na tabela da Liga.
// @author      Irreal Madrid FC. Club ID: 4402745
// @namespace   https://github.com/mayc0njr/trophyManager/
// @include     https://trophymanager.com/league/*
// @license     MIT
// ==/UserScript==

(function () {

    //Custumizable variables, used to render variables on screen, this values can be changed
    /**
     * Wait till the end of the match to show the match on last column.
     * 0: Show the match in history even if it's still running.
     * 1: Show the match but not the color/result.
     * 2: Show the match only after it's end.
     */
    const WAIT_TILL_END = 1;

    const LAST_MATCHES = 5; // number of last matches displayed
    const columnAdjustment = 50; //adjust the size of the middle block of the page (the one that contains the league table)
    
    const ONGOING_SUBTITLE = "Game in Progress";

    const CIRCLE = '\u2b24'; //Character used as coloured ball for each one of the last matches: ⬤
    const WIN_COLOR = '#0fdf0f'; // RGB color for WIN
    const DRAW_COLOR = '#bfbfbf'; // RGB color for DRAW
    const LOSE_COLOR = '#d01f0f'; // RGB color for LOSE
    const ONGOING_COLOR = '#ffbf3f' //RGB color for ONGOING MATCHES #ffff7f

    const LAST_HEADER = "Últimos"; // Last matches column header description
    const FONT_SIZE = "xx-small"; // size of the last matches ball
    const LETTER_SPACING = "2px"; // Space between last matches balls

    //===================================================================
    // Functional variables, used to fetch and process match data.
    const LEAGUE = 1;
    const COUNTRY = 2;
    const DIVISION = 3;
    const GROUP = 4;
    const FIXTURES = '/ajax/fixtures.ajax.php';
    const WIN = 'W';
    const DRAW = 'D';
    const LOSE = 'L';
    const ONGOING = 'O';
    const TIME_REGEX = /\d{2}:\d{2}/;
    const WIN_INDEX = 3;
    const DRAW_INDEX = 4;
    const LOSE_INDEX = 5;
    const SHOW_EVERYTHING = 0;
    const SHOW_MATCH_LINK = 1;
    const SHOW_NOTHING = 2;
    let now = new Date();
    let today = new Date(); today.setUTCHours(0,0,0,0);
    let endOffsetHours = 2;
    
    

    function adjustSize(width) {
        let adjust = $('.column2_a').width() + width;
        $('.column2_a').width(adjust);
        adjust = $('.main_center').width() + width;
        $('.main_center').width(adjust);
    }

    function addTableHeader() {
        let header = $('#overall_table thead tr');
        let streak = document.createElement('TH');
        streak.textContent = LAST_HEADER;
        $(streak).addClass('align_center');
        $(streak).addClass('header');

        header.append(streak);
    }
    function generateMatchsHistory() {
        let url = $('.content_menu .calendar').attr('href').split(`/`).filter(function (el) {
            return el.length > 0
        });
        console.log(url);
        var postobj = {
            'type': url[LEAGUE],
            'var1': url[COUNTRY],
            'var2': url.length > (DIVISION) ? url[DIVISION] : '',
            'var3': url.length > (GROUP) ? url[GROUP] : ''
        };
        console.log(postobj);
        $.post(FIXTURES,{
            'type': url[LEAGUE],
            'var1': url[COUNTRY],
            'var2': url.length > (DIVISION) ? url[DIVISION] : '',
            'var3': url.length > (GROUP) ? url[GROUP] : ''
        },function(data){
            if(data != null)
            {
                applyResults(data);
            }
        },'json');
    }

    function adjustHighlight(row) {
        row.children().last().removeClass('highlight_td_right');
    }
    function adjustBorder(cell) {
        cell.removeClass('highlight_td_right_std');
        cell.addClass('border_right');
    }
    function filterFixtures(data) {
        let months = [];
        let matches = [];
        for (const key in data) {
            if (data.hasOwnProperty(key)) {
                months.push(data[key]);
            }
        }
        for (let index = 0; index < months.length; index++) {
            const thisMonth = months[index];
            matches = matches.concat(thisMonth.matches.filter(function testUnPlayed(match) {
                return match.result != null;
            }));
        }
        return matches;
    }
    function getTeamResults(matches, team) {
        let results = [];
        for(let index = matches.length-1; index >= 0 && results.length < LAST_MATCHES; index--) {
            const match = matches[index];
            let score = match.result.split('-');
            score[0] = parseInt(score[0]);
            score[1] = parseInt(score[1]);
            let result = {};
            let teamScore;
            let advScore;
            result.matchLink = $(match.match_link).attr('href');
            result.date = match.date;
            if(match.hometeam_name == team) {
                teamScore = 0;
                advScore = 1;
            }
            else if(match.awayteam_name == team) {
                teamScore = 1;
                advScore = 0;
            } else
                continue;
            result.finished = alreadyFinished(result.date);
            console.log("date: " + result.date);
            console.log("date: " + result.date);
            result.tooltip = match.hometeam_name + ' ' + match.result + ' ' + match.awayteam_name;
            if(!result.finished)
            {
                if(WAIT_TILL_END == SHOW_NOTHING)
                    continue;
                if(WAIT_TILL_END == SHOW_MATCH_LINK)
                {
                    result.tooltip = match.hometeam_name + ' - ' + match.awayteam_name;
                    result.result = ONGOING;
                }
            }
            else if(score[teamScore] > score[advScore])
                result.result = WIN;
            else if(score[teamScore] < score[advScore])
                result.result = LOSE;
            else
                result.result = DRAW;
            results.splice(0,0,result);
        }
        return results;
    }

    function applyResults(data) {
        let fixtures = filterFixtures(data);
        let teams = $('#overall_table tbody td a');
        teams.each(function(index, team) {
            if(team.text.length == 0)
                return;
            let row = team.parentElement.parentElement;
            adjustBorder($(row).children().last());
            if($(row).children().first().hasClass('highlight_td')) {
                adjustHighlight($(row));
            }
            let streak = row.insertCell(-1);
            let results = getTeamResults(fixtures, team.textContent);
            $(streak).addClass('cell_padding');
            $(streak).addClass('highlight_td_right_std');
            $(streak).css('display', 'flex');
            $(streak).css('justify-content','space-between');
            $(streak).css('font-size', FONT_SIZE);
            $(streak).css('letter-spacing', LETTER_SPACING);
          
            $(streak).css('cursor', 'default');
            $(streak).disableSelection();
            for (const result of results) {
                let res = document.createElement('A');
                res.textContent = CIRCLE;
                $(res).attr('href', result.matchLink);
                $(res).attr('title', result.tooltip);
                console.log(result);
                switch (result.result) {
                    case WIN:
                        $(res).css('color', WIN_COLOR);
                        break;
                    case DRAW:
                        $(res).css('color', DRAW_COLOR);
                        break;
                    case LOSE:
                        $(res).css('color', LOSE_COLOR);
                        break;
                    case ONGOING:
                        $(res).css('color', ONGOING_COLOR);
                        break;
                    default:
                        break;
                }
                streak.appendChild(res);
            }
            if($(row).children().first().hasClass('highlight_td')) {
                $(streak).removeClass('highlight_td_right_std');
                $(streak).addClass('highlight_td_right');
                $(streak).addClass('highlight_td');
            }
        });
        adjustSize(columnAdjustment);
        addTableHeader();
        addTableFooter();
    }
    
    function isToday(matchDay) { //Checks if the game is today or after
        console.log("isToday");
        console.log("matchDay: " + matchDay);
        let date = new Date(matchDay);
        console.log("date: " + date);
        console.log("today: " + today);
        console.log("date >= today: " + (date >= today));
        return date >= today;
    }

    function getEndGameTime() { //calculates the endGameTime (gameStart + offsetHours (default 2 hours))
        startGameTime = TIME_REGEX.exec($("#next_round strong").text())[0].trim().split(":");
        startGameTime[0] = Number(startGameTime[0]) + endOffsetHours;
        startGameTime[1] = Number(startGameTime[1]);
        let endGameTime = new Date();
        endGameTime.setHours(startGameTime[0],
            startGameTime[1],
            0);
        return endGameTime;
    }

    function alreadyFinished(matchDay) {//Checks if the game is already ended
        if(isToday(matchDay) && WAIT_TILL_END) {
            let gameEnd = getEndGameTime();
            let endTime = new Date();
            endTime.setUTCHours(gameEnd.getUTCHours(),
                gameEnd.getUTCMinutes(),
                gameEnd.getUTCSeconds());
            console.log("now: " + now);
            console.log("gameEnd: " + endTime);
            console.log("now: " + now);
            console.log("ja acabou: " + now >= endTime);
            return now >= endTime;
        }
        return true;
    }
    
    function addSpaces(text) {
        return '\t\t' + text + ' ';
    }
    function addTableFooter() {
        let div = document.createElement('div');
        $(div).addClass('align_center');
        $(div).addClass('std');
        let win = document.createElement('span');
        let draw = document.createElement('span');
        let lose = document.createElement('span');
        $(win).css('background-color', WIN_COLOR);
        $(draw).css('background-color', DRAW_COLOR);
        $(lose).css('background-color', LOSE_COLOR);
        $([win, draw, lose]).addClass('table_color');
        $([win, draw, lose]).css('border-radius', '50%');
        let winSubtitle = $($('#overall_table th')[WIN_INDEX]).attr('tooltip');
        let drawSubtitle = $($('#overall_table th')[DRAW_INDEX]).attr('tooltip');
        let loseSubtitle = $($('#overall_table th')[LOSE_INDEX]).attr('tooltip');
        $(div).append(addSpaces(winSubtitle));
        $(div).append(win);
        $(div).append(addSpaces(drawSubtitle));
        $(div).append(draw);
        $(div).append(addSpaces(loseSubtitle));
        $(div).append(lose);
        if(WAIT_TILL_END == 1)
        {
            let ongoing = document.createElement('span');
            $(ongoing).css('background-color', ONGOING_COLOR);
            $(ongoing).addClass('table_color');
            $(ongoing).css('border-radius', '50%');
            $(div).append(addSpaces(ONGOING_SUBTITLE));
            $(div).append(ongoing);
        }
        $('.tab_container').parent().parent().append(div);
    }

    generateMatchsHistory();
})();