Greasy Fork is available in English.

Webcamdarts Lobby [plus]

New design for Lobby. More Space, color for active player, Friend List & Black List. View more player in lobby and some addditonal feature. Clickable players nicks in chat window.

Instalar este script¿?
Script recomendado por el autor

Puede que también te guste Webcamdarts Game 50/50 [plus].

Instalar este script
// ==UserScript==
// @name         Webcamdarts Lobby [plus]
// @version      1.52
// @description  New design for Lobby. More Space, color for active player, Friend List & Black List. View more player in lobby and some addditonal feature. Clickable players nicks in chat window. 
// @description:pl Nowy projekt Lobby. Więcej miejsca, kolor dla aktywnego gracza, lista znajomych i czarna lista. Zobacz więcej graczy w lobby i kilka dodatkowych funkcji. Klikalne nicki graczy w oknie czatu.
// @author       Edmund Kawalec
// @match        https://*.webcamdarts.com/GameOn/Lobby*
// @match        https://*.webcamdarts.com/wda-games/tournaments/*
// @match        https://*.webcamdarts.com/GameOn/Game/MemberStats/*
// @match        https://*.webcamdarts.com/GameOn/Game/MatchResult/*
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @require      https://greasyfork.org/scripts/395037-monkeyconfig-modern/code/MonkeyConfig%20Modern.js?version=764968
// @namespace    https://greasyfork.org/pl/users/1081222-edmund-kawalec
// @license GIT
// ==/UserScript==


const UNREAD_MESSAGES_TIMEOUT = 1000;
const TABS_CHECK_INTERVAL = 7000;

var speaking = 1;
var speech_voices;
var languages = {
    'Polski' : 15,
    'English' : 3,
    'Deutsch' : 2
};

var vCommands = {
    'chatWith' : {
        15: 'Czat z',
        3 : 'Chat with',
        2 : 'Chatten Sie mit'
    },
    'settingsSaved' : {
        15: 'Ustawienia zostały zapisane',
        3 : 'Settings have been saved',
        2 : 'Die Einstellungen wurden gespeichert'
    },
    'newMessage' : {
        15: 'Nowa wiadomość od ',
        3 : 'New message from ',
        2 : 'neue Nachricht von '
    },
    'welcome' : {
        15: 'Witaj ',
        3: 'Welcome ',
        2: 'Hallo ',
    },
    'statuses' : {
        'Available' : {
            15: 'gotowy do gry',
            3: 'ready to play ',
            2: 'fertig zu spielen',
        },
        'Busy' : {
            15: 'zajęty',
            3: 'busy',
            2: 'beschäftigt'
        }
    }


};

if ('speechSynthesis' in window) {
    speech_voices = window.speechSynthesis.getVoices();
    window.speechSynthesis.onvoiceschanged = function () {
        speech_voices = window.speechSynthesis.getVoices();
    };
}

function getLang() {
    let _lng = voiceCfg.get('voiceLanguage');
    return languages[_lng];
}
function getVolume() {
    let _v = parseInt(voiceCfg.get('voiceVolume'));
    return _v > 100 ? 1 : (_v < 1 ? 0 : (_v/100)) ;
}


function say(m) { // language 3 en
    if (voiceCfg.get('voiceEnable')) {
        speechSynthesis.cancel();
        var msg = new SpeechSynthesisUtterance();
        var voices = window.speechSynthesis.getVoices();
        consoleLog(voices);
        var lang = getLang();
        msg.voice = voices[lang];
        msg.voiceURI = voices[lang].voiceURI;
        msg.volume = getVolume();
        msg.rate = 1;
        msg.pitch = 1;
        msg.text = m;
        msg.lang = voices[lang].lang;
        consoleLog(msg);
        msg.onerror = function(e) {
            speechSynthesis.cancel();
        };

        msg.onpause = function(e) {
            consoleLog('onpause in ' + e.elapsedTime + ' seconds.');
        }

        msg.onend = function(e) {
            consoleLog('onend in ' + e.elapsedTime + ' seconds.');
            speechSynthesis.cancel();
        };

        speechSynthesis.onerror = function(e) {
            consoleLog('speechSynthesis onerror in ' + e.elapsedTime + ' seconds.');
            speechSynthesis.cancel();
        };
        speechSynthesis.speak(msg);
    }
}


$.fn.classChange = function(cb) {
    return $(this).each((_, el) => {
        new MutationObserver(mutations => {
            mutations.forEach(mutation => cb && cb(mutation.target, $(mutation.target).prop(mutation.attributeName)));
        }).observe(el, {
            attributes: true,
            attributeFilter: ['class'] // only listen for class attribute changes
        });
    });
}

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}


var voiceCfg = new MonkeyConfig({
    title: 'Assistant voice settings',
    menuCommand: true,
    params: {
        voiceEnable: {
            'label': 'Voice nEnabled',
            type: 'checkbox',
            default: true
        },
        voiceLanguage: {
            'label': 'Language',
            type: 'select',
            choices: [ 'Polski', 'English', 'Deutsch' ],
            default: 'English'
        },
        voiceVolume: {
            'label': 'Volume [0-100]',
            type: 'number',
            'default': 50
        },
    },
    onSave: function (values) {
        say(vCommands.settingsSaved[getLang()]);
    }
});

var urlParams = new URLSearchParams(window.location.search);
var urlPath = window.location.pathname;
function debugMode() {
    if (urlParams.has('debug') === true) {
        localStorage.setItem('debug', urlParams.get('debug'));
    } else {
        localStorage.setItem('debug', 0);
    }
}
function consoleLog(data) {
    if (localStorage.getItem('debug') == 1) {
        console.log(data);
    }
}
debugMode();



// mods for Lobby
if (urlPath.startsWith('/GameOn/Lobby')) {

    // INIT
    (function() {
        'use strict';
        $('#current-user').append('<a class="Camtesting" href="https://game.webcamdarts.com/CamTest" target="_blank">Camtest</a>');
        $( "<a class='deco' href='javascript:doLogout()'>Logout</a>" ).appendTo( ".logout" );


        // CSS refactor
        addGlobalStyle('@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"');
        addGlobalStyle('.rMenu.userli.avaiable{order:1;}');
        addGlobalStyle('.rMenu.userli.busy{order:2;}');
        addGlobalStyle('.container{max-width: 750px;}');
        addGlobalStyle('.Camtesting{position: absolute;right:40px;bottom:22px;float:right;}');
        addGlobalStyle('#current-user > div.currenuser-info > div.userinfo {position: relative;left:57px;bottom: 12px;height:100%;width:fit-content }');
        addGlobalStyle('#current-user > div.currenuser-info > div.userinfo > p:nth-child(1) {font-size: 14px;}');
        addGlobalStyle('#current-user > div.currenuser-info > div.userinfo > p:nth-child(2) {font-size: 12px; color: #8F8F8F}');
        addGlobalStyle('#current-user > div.currenuser-info > div.userimage,#current-user > div.currenuser-info > div.userimage > img {position: absolute;top: 0px;width:54px;height:53px;  }');
        addGlobalStyle(' .info-message a {padding-right:5px;}');
        addGlobalStyle(' .info-message {font-weight: bold;background-color:#302E2E;font-size:14px;width: 65%;overflow-x: auto;overflow-y: hidden;white-space: nowrap;display: inline-block; }');
        addGlobalStyle('k-widget {background-color:transparent;}');
        addGlobalStyle(' #currenuser-info {z-index:4000; }');
        addGlobalStyle(' #current-user.available, .userli.available {cursor: pointer; background-color: #4b560d60; }');
        addGlobalStyle('.cusermenu {top: 77px;position: absolute;opacity:0.7;}');
        addGlobalStyle('#current-user.busy{ background-color: #572525; }');
        addGlobalStyle('.motdcont {display: none; width: 50% !important;}');
        addGlobalStyle('#info-profil {position:absolute;display:block;width:100%;color:white;}');
        addGlobalStyle('.logout {position: relative;top: 37px;text-align:right;}');
        addGlobalStyle('#current-user a, .logout a {text-decoration: none}');
        //TEST avec search bar//
        addGlobalStyle(' .info-message {font-weight: bold;background-color:#302E2E;font-size:14px;width: 100%;overflow-x: auto;overflow-y: hidden;white-space: nowrap;display: inline-block; }');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter > div.chat-users.k-pane.k-scrollable > div:nth-child(1){font-size:13px;height:31px;position: fixed;top:61px;left: calc(70vw);background-color:#302E2E;}');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter{min-height: 100%;position: fixed;}');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter {min-height: 82.5%;}');
        addGlobalStyle('.bighonkinglogoutbutton{display:none; }');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter > div.chat-users.k-pane.k-scrollable > div.bighonkinglogoutbutton > a {display:none;}');
        //TEST//
        addGlobalStyle('.messages-container {height: 45px; position: sticky; min-width: 100%; width: 100%; top: -4px; background-color: #302E2E;');
        addGlobalStyle('#nav,.band.navigation{max-width: 750px;position:absolute;z-index:10; }');
        addGlobalStyle('#nav{display:inline;border-bottom: 0px;}');
        addGlobalStyle('#current-user {height: auto;border: none;padding-top: 0px;padding-left: 0px;border-radius: 0px;padding-top: 0px;margin-right: 0px;}');
        addGlobalStyle('div.chat-window-container.k-pane.k-scrollable{padding:0px; }');
        addGlobalStyle('.chat-messagebar{margin-left:0px;}');
        addGlobalStyle('#textMessage{width:calc(50vw - 250px) !important; margin-left: 20px !important; margin-top: 0px !important; margin-bottom: 0px; float:left; height: 37px !important}');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.chat-messagebar.k-pane{margin-top:-120px;margin-left:0px;}');
        addGlobalStyle('.k-state-default{border-color: #2b2b2b00; }');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div:nth-child(4) {display: none; }');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter{min-height:100%;}');
        addGlobalStyle('#lobby, .lobby {min-height:100%;}');
        addGlobalStyle('#users {height:fit-content; min-height: 90%; zoom: 100% !important;}');
        addGlobalStyle('#users {padding-top:0px; margin-top:25px; position:fixed; right: 0px; min-width: max-content; box-sizing: border-box; height:200px; background-color: #8cffa0;}');
        addGlobalStyle('#users {display: flex; flex-wrap: wrap; place-content: flex-start; min-width: 50%; max-width: 50%; }');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter{min-height:100%;}');
        addGlobalStyle('.cusermenu{position:absolute; top:0px;}');
        addGlobalStyle('div#current-user {position: fixed;top:2px;width: 285px;right: 2px;height: 55px;padding-right: 4px;;z-index:9999992;}');
        addGlobalStyle('#current-user > div > div.optionContainer > div {width:0px;display:none;position:fixedvisibility:hidden;}');
        addGlobalStyle('.optionContainer {position: fixed;width: 150px;top: 25px;right: 340px;visibility: visible;;}');
        addGlobalStyle('#current-user > div > div.optionContainer > div > div:nth-child(1) {position: fixed;right: 275px;height: 25px;width: fit-content;top: 24px;width: -moz-fit-content;}');
        addGlobalStyle('#current-user > div > div.optionContainer > div > div:nth-child(2) {position: fixed;right: 275px;top: 0px;height: 25px;width: 111px;width: -moz-fit-content;}');
        addGlobalStyle('.useropt .label {float: left;padding: 6px;padding-top:0px;width: fit-content; }');
        addGlobalStyle('.stausicon.available, .stausicon.busy {height: 20px;width: 20px;padding: 10px;margin-left: 10px;margin-top: 2px;}');
        addGlobalStyle('#current-user > div > div.user-camnotapproved,#current-user > div > div.user-camapproved {    margin-top: 0px;margin-left: 0px;float: right;margin-top: 0px;margin-right: 5px; }');
        addGlobalStyle('#current-user .user-camnotapproved,#current-user .user-camapproved {width: 16px;height: 16px;background-size: 16px 16px;margin-left: 0px;left: 0px;}');
        addGlobalStyle('.userimage {float: left;height: 50px;width: 50px;}');
        //EFFACER MESSAGE
        addGlobalStyle('div.chat-window-container.k-pane.k-scrollable { padding: 0px;min-width: 50%;max-width: 50%;overflow:visible;max-height:unset;min-height:unset;}');
        addGlobalStyle('#chatWindow {height: calc(100vh - 170px); padding: 20px 30px !important; margin: 0px !important; overflow-y: auto;}');

        addGlobalStyle('#nav > div{display:block;max-width:50%;}');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter > div.lobby-game-info.k-pane {z-index:15;}');
        addGlobalStyle('.maincont{margin-top:23px;width:100%;margin-left:0px;}');
        addGlobalStyle('#tray{position:absolute;max-width:40%;}');
        addGlobalStyle('#mc-l{width: fit-content;}');
        addGlobalStyle('#nav {position: fixed; font: initial;  font-family: "Open Sans", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; }');
        addGlobalStyle('#tray {padding: 0 0 0 0; }');
        addGlobalStyle('.social_menu { display: none; }');
        addGlobalStyle('.motds a { font-size: 12px; }');
        addGlobalStyle('#nav { top: 0px; }');
        addGlobalStyle('.mt35 {margin-top:6px!important;min-width: 100%;min-height: 100%;position: fixed;top: 0px; }');
        addGlobalStyle('.tabs-content {height: 100%;width: 100%;position: absolute;');
        addGlobalStyle('nav.primary ul li a {font-size: 12px;line-height: 12px; padding: 0 7px; }');
        addGlobalStyle('.username {display: none; }');
        addGlobalStyle('.mc-l { width:100%; }');
        addGlobalStyle('#current-user .userinfo p {margin-top: 0px;}');
        addGlobalStyle('.rMenu.userli .userinfo  {max-width: 150px; position: relative;}');
        addGlobalStyle('.rMenu.userli .userinfo p {font-size: 1.25em !important;}');
        addGlobalStyle('.rMenu.userli .userinfo p:first-child {text-indent: 17px;}');
        addGlobalStyle('.rMenu.userli .userinfo p.fn {font-size: 1.15em !important; padding-top: 3px;}');
        addGlobalStyle('.summary .inplay.title .THmo{    width: auto;})');

        addGlobalStyle('.game-result{margin-left:0px;padding:2px;min-width:540px;max-width:100%;padding-bottom: 5px;opacity:1;}');
        addGlobalStyle('.gr table{text-align:center;}');
        addGlobalStyle('.gr table tbody td{color: #7D7D7D;border-left: 1px solid #7D7D7D;font-size: 0.9em;}');
        addGlobalStyle('.gr table td{padding: 3px 3px;}');
        addGlobalStyle('.full-game-result tr:nth-child(even){background: #525252})');
        addGlobalStyle('.full-game-result tr:nth-child(odd){background: #302E2E})');
        addGlobalStyle('.full-game-result td {text-transform: uppercase;})');
        addGlobalStyle('.full-game-result tr td {color: unset;text-align: right; font-weight:bold})');
        addGlobalStyle('.full-game-result tr td + td { color: white;font-weight:unset})');
        addGlobalStyle('.info-handle {position: absolute; height: 0px;opacity: 0.7;top:unset;bottom:unset;width:0px; margin-bottom: unset;margin-left: unset;line-height: 20px;padding-top: 25%;transform: rotate(0turn);padding-bottom: unset;background: content-box;border: none;text-transform: uppercase;padding-left: unset;}');
        addGlobalStyle('#lobby > div > div:nth-child(16) > div.chat-container.k-widget.k-splitter > div.split-view.k-pane.k-scrollable.k-widget.k-splitter > div.lobby-game-info.k-pane{ z-index: 2;})');

        // chat window: click on USER NICKNAME opens privChat - logged user click themseve opens profile stats
        addGlobalStyle('.mc-u strong:hover{cursor:pointer;text-decoration:underline;} #chatWindow .THmo:hover{text-decoration:underline;cursor:pointer;}');
        addGlobalStyle('.dropdown {position: relative;  display: inline-block;} ');
        addGlobalStyle('.dropdown-content {display: inline-flex;  position: relative;  background-color: #f1f1f1;  min-width: 70px;  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);  z-index: 1; margin-left: 10px; margin-right: 10px; border-radius: 6px 6px 6px 6px; }');
        addGlobalStyle('.dropdown-content a { font-size: 11px; color: black;  padding: 6px 8px;  text-decoration: none;  display: inline-block; font-weight: 700;}');
        addGlobalStyle('.dropdown-content a:hover {color: #572525; text-decoration: none}');
        addGlobalStyle('.dropdown-content .playerAvg { font-size: 11px; color: black;  padding: 6px 8px;  text-decoration: none;  display: inline-block; font-weight: 700; border-right: 1px solid #333; margin-right: 5px;}');
        addGlobalStyle('.dropdown-content .hideMe { font-size: 10px; color: black;  padding: 6px 8px;  text-decoration: none;  display: inline-block; font-weight: 700; border-left: 1px solid #333; margin-left: 5px; cursor: pointer;}');
        addGlobalStyle('.dropdown-content a.chatWithUser:hover {color: #3857FA; text-decoration: none}');
        addGlobalStyle('.dropdown-content a.userProfile:hover {color: #D614EC; text-decoration: none}');

        addGlobalStyle('.ui-icon.ui-icon-close{-webkit-filter: grayscale(100%);filter: grayscale(100%);}');
        addGlobalStyle('.chat-users.k-pane{width: calc(50vw) !important; left: calc(50vw) !important;}');
        addGlobalStyle('.lobby-game-info.k-pane {top: 20px !important; left: calc(50vw - 220px) !important;}');
        addGlobalStyle(' @media screen and (max-width: 767px) {  .userli {    min-width: 100%; } }');
        addGlobalStyle(' @media screen and (min-width: 768px) and (max-width: 1024px) {  .userli {    min-width: 45%; } }');
        addGlobalStyle(' @media screen and (min-width: 1025px) and (max-width: 1199px) {  .userli {    min-width: 47%; } }');
        addGlobalStyle(' @media screen and (min-width: 1200px) and (max-width: 1350px) {  .userli {    min-width: 30%; } }');
        addGlobalStyle(' @media screen and (min-width: 1351px) {  .userli {    min-width: 23%; } }');
        addGlobalStyle('.info-handle {left: calc(50vw + 5px) !important; line-height: 30px;}');
        addGlobalStyle('#users .userli .userinfo .user-camapproved, #users .userli .userinfo .user-camnotapproved {position: absolute; top: 15px; left: 45px; } ');
        addGlobalStyle('.chat-container .chat-messagebar #SendMessage  {width: 100px; display: block; float: left; max-width: 100px; } ');
        addGlobalStyle('.ml-5 {margin-left: 5px}');
        addGlobalStyle('.mr-5 {margin-right: 5px}');
        addGlobalStyle('#current-user.available, .userli.available {border: solid 1px #079119; } ');
        addGlobalStyle('#current-user.busy, .userli.busy {border: solid 1px #f22121; } ');
        addGlobalStyle('.userinfo {min-width: 150px;} ');

        addGlobalStyle('#chatWindow .mc-m strong.player {cursor: pointer } ');




        // chat window manage
        $(document).on('click', '#chatWindow .mc-u strong, #chatWindow .mc-m strong,  #chatWindow .THmo, .personal-message .chat-history .mc-u strong', function(e) {
            // szukac w #users .rMenu.userli po value = e.target i pobierac data-uid
            var _username = $(e.target).text();
            $('.dropdown-content').detach();
            var _player = $('#users').find(".rMenu.userli[value='"+_username+"']");
            var listView = $("#users").data("kendoListView");
            var dataItem = listView.dataSource.getByUid(_player.data("uid"));
            var _playerAvg = _player.find('p.fn').text();

            let _forbidden = [
                'Game on!',
                'WDA'
            ];


            if (_username != $('.currenuser-info').attr('value') && !_forbidden.includes(_username)) {
                $(e.target).removeClass('dropdown').addClass('dropdown');
                var _profileLink = '<a class="userProfile" href="https://www.webcamdarts.com/GameOn/Game/MemberStats/'+_username+'" target="_blank"><i class="fa-regular fa-user"></i> Profile</a>';
                var _chatLink = '';
                if (dataItem != undefined) {
                    _playerAvg = '<span class="playerAvg">'+_playerAvg+'</span>';
                    _chatLink = '<a href="#" class="chatWithUser" data-username="'+_username+'"><i class="fa-regular fa-comment"></i> Chat</a>';
                } else {
                    _playerAvg = '<span class="playerAvg">offline</span>';
                }
                var _closeLink = '<span class="hideMe"><i class="fa-regular fa-circle-xmark"></i></span>' ;
                $(e.target).after('<div class="dropdown-content">' + _playerAvg + _chatLink + _profileLink + _closeLink + '</div>');
            }
        });

        $(document).on('click', '#chatWindow .chatWithUser', function(e) {
            var _username = $(e.target).data('username');
            var _player = $('#users').find(".rMenu.userli[value='"+_username+"']");
            var listView = $("#users").data("kendoListView");
            var dataItem = listView.dataSource.getByUid(_player.data("uid"));
            if(dataItem!=undefined)
            {
                var gmw = GetGameMessageWindow(dataItem.Name);
                gmw.ShowTab(true);
                say(vCommands.chatWith[getLang()] +" "+ _username);

            }
        });

        $(document).on('click', '.hideMe', function(e) {
            $(this).parent('.dropdown-content').hide('fast').remove();
        });




        var lastUnreadCounter = 0;
        var unreadMessagesCounter = 0;
        const intervalID = setInterval(chatTabsCheck, TABS_CHECK_INTERVAL); //setInterval(chatTabsCheck, 500, "Parameter 1", "Parameter 2");

        function chatTabsCheck() {
            let lis = $('.maincont ul.tabs').children("li");
            let _c = lis.length;
            let _unreadMessagesCounter = 0;
            let _senders = [];
            lis.each(function(index, value) {
                let _a = $(this).find('a');
                let _closeButton = $(this).find('.ui-icon.ui-icon-close');
                if (_closeButton.length && !_a.hasClass('active') && _a.css('background-color') != 'rgb(245, 245, 245)') {
                    _unreadMessagesCounter++;
                    _senders.push(_a.text());
                }
            });
            consoleLog('_unreadMessagesCounter: ' + _unreadMessagesCounter);
            if (_unreadMessagesCounter == 0) {
                lastUnreadCounter = _unreadMessagesCounter;
            }
            if (_unreadMessagesCounter > 0 && _unreadMessagesCounter != lastUnreadCounter) {
                lastUnreadCounter = _unreadMessagesCounter;
                $.each(_senders, function(index, value) {
                    setTimeout(function() {
                        say(vCommands.newMessage[getLang()] + value);
                    }, UNREAD_MESSAGES_TIMEOUT);
                });
            }

        }



        //current user tile mod
        $('#current-user').hide();

        setTimeout(function() {
            $('#current-user .logout').children('a').eq(0).attr('title', 'Profile').addClass('mr-5').html('<small><i class="fa-regular fa-user"></i> profile</small>');
            $('#current-user .logout').children('a').eq(1).attr('title', 'Stats').addClass('ml-5').addClass('mr-5').html('<small><i class="fa-solid fa-chart-line"></i> stats</small>');
            let _msg = $('#current-user .logout').children('a').eq(2).text().replace('Messages ', '<i class="fa-regular fa-message"></i> dms ');
            $('#current-user .logout').children('a').eq(2).attr('title', 'Messages').addClass('ml-5').addClass('mr-5').html('<small>'+_msg+'</small>');
            $('#current-user .logout').children('a').eq(3).attr('title', 'Logout').addClass('ml-5').addClass('mr-5').html('<small><i class="fa-regular fa-circle-xmark"></i> logout</small>');
            $('#current-user a.Camtesting').attr('title', 'Camera Test').html('<i class="fa-solid fa-camera"></i>');

            addGlobalStyle('.useroptions .useropt  {width: 120px !important; } ');
            addGlobalStyle('.useroptions .useropt .available  {padding: 0px; margin-left: 10px; margin-top: 2px; margin-right: 0px; background-image: none } ');
            addGlobalStyle('.useroptions .useropt .busy  {padding: 0px; margin-left: 10px; margin-top: 2px; margin-right: 0px; background-image: none } ');
            addGlobalStyle('.useroptions .useropt .label { padding: 1px 6px; } ');
            addGlobalStyle('.useroptions .useropt .label strong  {font-size: 0.8em; } ');

            $('.useroptions .useropt .available').html('<i class="fa-sharp fa-solid fa-circle-check" style="color: #079119;"></i>');
            $('.useroptions .useropt .busy').html('<i class="fa-sharp fa-solid fa-circle-xmark" style="color: #f22121;"></i>');

            addGlobalStyle('.mc-l .available, .mc-l .busy {background-image: none; padding: 0px; margin-top: 0px; margin-left: 10px; margin-right: 5px;} ');
            addGlobalStyle('.mc-l .available::before, .mc-l .busy::before {inline-block;  vertical-align: middle; font-weight: 900; font-family: "Font Awesome 6 Free";} ');
            addGlobalStyle('.mc-l .available::before {color: #079119; content: "\\f058"; } ');
            addGlobalStyle('.mc-l .busy::before {color: #f22121; content: "\\f057"; } ');
            $('#current-user').show('fast');

            addGlobalStyle('.info-handle {width: auto; } ');
            $('.info-handle').html('<i class="fa-solid fa-chart-line"></i> STATS');

            addGlobalStyle('.useropt.k-link.k-header {padding: 3px 0px; } ');

        }, 3000);


        // fast player search
        addGlobalStyle('#users-name-filter {display: inline-block; width: 200px; margin: 4px 30px 2px 0px; padding: 2px 5px; } ');
        addGlobalStyle('label#label-users-available-filter {display: inline-block; } ');

        $.expr[':'].icontains = $.expr.createPseudo(function(text) {
            return function(e) {
                return $(e).text().toUpperCase().indexOf(text.toUpperCase()) >= 0;
            };
        });

        $('#users-available-filter').parent('div').html('<label id="label-users-available-filter" for="users-available-filter"><input id="users-available-filter" type="checkbox" name="available" /> Available only</label>');
        $('#users-available-filter').parent('label').before('<input id="users-name-filter" type="text" placeholder="... search player">');
        $('#users-name-filter').on('change, keyup', function() {
            var _self = $(this);
            var search = _self.val();
            if (search.length > 1 ) {
                $('#users .rMenu.userli').hide();
                $('#label-users-available-filter').hide();
                $('#users-available-filter').hide();
                $("#users .userinfo p:first-child:icontains('"+search+"')").parents('.rMenu.userli').show();
            } else {
                $('#users .rMenu.userli').show();
                $('#label-users-available-filter').show();
                $('#users-available-filter').show();
            }
        });


        // update chat playernames for clicks
        var ChatObserver = (window.MutationObserver) ? window.MutationObserver : window.WebKitMutationObserver;
        if (ChatObserver){
            var ChatObserverMonitor = new ChatObserver(function(mutationSet){
                mutationSet.forEach(function(mutation){
                    for (var i=0; i<mutation.addedNodes.length; i++){
                        if (mutation.addedNodes[i].nodeType == 1){
                            updatePlayerOnChat(mutation.addedNodes[i]);
                        }
                    }
                });
            });
            // attach chgMon to document.body
            var chatObserverOptions = {childList: true, subtree: true};
            ChatObserverMonitor.observe(document.getElementById("chatWindow"), chatObserverOptions);
        }

        function updatePlayerOnChat(el) {
            var patterns = [
                ' joined the Lobby',
                ' is available for games'
            ];
            var node = $(el).find('.mc-m');
            patterns.some(function(v) {
                let text = node.text();
                let test = text.indexOf(v) >= 0;
                if (test === true) {
                    setTimeout(function() {
                        let _username = text.replace(v, '');
                        let _color = '';
                        let _class = 'player';
                        let _player = $('#users').find(".rMenu.userli[value='"+_username+"']").find('.userinfo');
                        _color = _player.css('color');
                        node.hide().html('<strong style="color: '+_color+'" class="player" title="">' + _username + '</strong> ' + v).fadeIn('fast');
                        consoleLog(v + ' found in: ' + node.text() + ', recognized nick:' + _username);
                    }, 1000);
                }
                return test;
            })
        };




        // footer
        setTimeout(function() {

            //var recbutton = document.createElement("div");
            //recbutton.innerHTML = '<div id="recbutton" style="width:100%;height:25px; position:fixed; bottom:0px;font-size:smaller;margin-left:2px;white-space: nowrap;display: block; padding-top: 8px; padding-left: 18px; " ><a href="https://chrome.google.com/webstore/detail/recordrtc/ndcljioonkecdnaaihodjgiliohngojp" target="_blank">Record your match (save & upload youtube) with RecordRTC</a> or <a href="https://chrome.google.com/webstore/detail/webrtc-desktop-sharing/nkemblooioekjnpfekmjhpgkackcajhg" target="_blank">Stream your match (max 10 friends) with WebRTC Sharing</a> Extension for Google Chrome</div>';
            //var referenceNode1 = document.querySelector('#SendMessage');
            //referenceNode1.after(recbutton);
            $(".motds").detach().appendTo(".messages-container");

        }, 3000);

        setTimeout(function() {
            $('#current-user .optionContainer .useropt').click(function() {
                let status = $(this).find('.label').text();
                say('status ' + vCommands.statuses[status][getLang()]);
            });
        }, 5000);
    })();


}




// mods for MemberStats
if (urlPath.startsWith('/GameOn/Game/MemberStats/')) {


    (function() {
        'use strict';

        // after Results_read XHR call
        var StatsObserver = (window.MutationObserver) ? window.MutationObserver : window.WebKitMutationObserver;
        if (StatsObserver){
            var StatsObserverMonitor = new StatsObserver(function(mutationSet){
                mutationSet.forEach(function(mutation){
                    for (var i=0; i<mutation.addedNodes.length; i++){
                        if (mutation.addedNodes[i].nodeType == 1){
                            updateStatsData(mutation.addedNodes[i]);
                        }
                    }
                });
            });
            // attach chgMon to document.body
            var StatsObserverOptions = {childList: true, subtree: true};
            if (document.getElementById("resultsGrid")) {
                StatsObserverMonitor.observe(document.getElementById("resultsGrid"), StatsObserverOptions);
            }
        }

        function updateStatsData(el) {

            let node = $(el).find('td')[0];
            let game_id = $(node).text();
            $(node).html('<a href="https://www.webcamdarts.com/GameOn/Game/MatchResult/'+game_id+'" target="_blank" class="game">'+game_id+'</a>');

            node = $(el).find('td')[1];
            if ($(node).text() == 'Equalizer') {
                $(node).addClass('game-equalizer');
            }

            node = $(el).find('td')[2];
            let player = $(node).text();
            $(node).html('<a href="https://www.webcamdarts.com/GameOn/Game/MemberStats/'+player+'" target="_blank" class="playerName">'+player+'</a>');

            node = $(el).find('td')[4];
            if ($(node).text() == 'WIN') {
                $(node).addClass('win');
            } else {
                $(node).addClass('lost');
            }

        };


        // CSS
        addGlobalStyle('#panelBarStats table.full-game-result tbody tr:first-child td {font-size: 1.4em; color: #04d81d; }');
        addGlobalStyle('a.game {text-decoration: none; color: #efefef; } a.game:hover {text-decoration: underline; }');
        addGlobalStyle('a.playerName {text-decoration: none; color: #02ede9; } a.playerName:hover {text-decoration: underline; }');
        addGlobalStyle('td.game-equalizer {text-decoration: none; color: #b7ade7; }');
        addGlobalStyle('td.win {text-decoration: none; color: #04d81d; }');
        addGlobalStyle('td.lost {text-decoration: none; color: #ea6969; }');



    })();


}



// mods for MatchResult
if (urlPath.startsWith('/GameOn/Game/MatchResult/')) {

    (function() {
        'use strict';

        let node = $('table.full-game-result thead tr').find('th')[1];
        let player = $(node).text();
        $(node).html('<a href="https://www.webcamdarts.com/GameOn/Game/MemberStats/'+player+'" target="_blank" class="playerName">'+player+'</a>');

        node = $('table.full-game-result thead tr').find('th')[2];
        player = $(node).text();
        $(node).html('<a href="https://www.webcamdarts.com/GameOn/Game/MemberStats/'+player+'" target="_blank" class="playerName">'+player+'</a>');

        addGlobalStyle('a.playerName {text-decoration: none; color: #02ede9; } a.playerName:hover {text-decoration: underline; }');

    })();

}




// common mods - players highlights
(function() {


    /* --------- Friends ---------*/
    if (window.self !== window.top) { return; } // end execution if in a frame
    var friendsCfg = new MonkeyConfig({
        title: 'Friends list',
        menuCommand: true,
        params: {
            keywordsFriends: {
                'label': 'Friends names<br>comma separated:<br>nick 1, nick2 ,...',
                type: 'text',
                default: ''
            },
            highlightStyleFriends: {
                'label': 'Set Highlight Style<br>(proper CSS)',
                type: 'text',
                default: 'color: #000; background-color: #38d60c; border-radius: 6px 6px 6px 6px; padding: 1px 2px;'
            },
        },
        onSave: function (values) {
            say(vCommands.settingsSaved[getLang()]);
            if(!document.body.querySelector(".THmo")) {
                THmo_doHighlight(document.body, friendsCfg, 'keywordsFriends', 'highlightStyleFriends');
            }
            else {
                location.reload();
            }
        }
    });


    // Add MutationObserver to catch content added dynamically
    var THmo_MutOb = (window.MutationObserver) ? window.MutationObserver : window.WebKitMutationObserver;
    if (THmo_MutOb){
        var THmo_chgMon = new THmo_MutOb(function(mutationSet){
            mutationSet.forEach(function(mutation){
                for (var i=0; i<mutation.addedNodes.length; i++){
                    if (mutation.addedNodes[i].nodeType == 1){
                        THmo_doHighlight(mutation.addedNodes[i], friendsCfg, 'keywordsFriends', 'highlightStyleFriends');
                    }
                }
            });
        });
        // attach chgMon to document.body
        var opts = {childList: true, subtree: true};
        THmo_chgMon.observe(document.body, opts);
    }

    // Main workhorse routine
    function THmo_doHighlight(el, config, keywords, highlight){

        var keywordsfriends = config.get(keywords);
        if(!keywordsfriends)  { return; }  // end execution if not found
        let sep = ',';
        var pat1 = new RegExp('\\s*' + sep + '+\\s*', 'g'); // trim space/s around separator & trim repeated separator
        var pat2 = new RegExp('(?:^' + sep + '+|' + sep + '+$)', 'g'); // trim starting & trailing separator
        keywordsfriends = keywordsfriends.replace(pat1, sep).replace(pat2, '');
        keywordsfriends = keywordsfriends.replace(/\s{2,}/g, ' ').trim();


        var highlightStyleFriends = config.get(highlight);

        var rQuantifiers = /[-\/\\^$*+?.()|[\]{}]/g;
        keywordsfriends = "\\b" + keywordsfriends.replace(/\,/g, "\\b|\\b", '\\$&').split(',').join('|') + "\\b";
        var pat = new RegExp('(' + keywordsfriends + ')', 'gi');
        var span = document.createElement('span');
        // getting all text nodes with a few exceptions
        var snapElements = document.evaluate(
            './/text()[normalize-space() != "" ' +
            'and not(ancestor::style) ' +
            'and not(ancestor::script) ' +
            'and not(ancestor::textarea) ' +
            'and not(ancestor::code) ' +
            'and not(ancestor::pre)]',
            el, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

        if (!snapElements.snapshotItem(0)) { return; }  // end execution if not found

        for (var i = 0, len = snapElements.snapshotLength; i < len; i++) {
            var node = snapElements.snapshotItem(i);
            // check if it contains the keywords
            if (pat.test(node.nodeValue)) {
                // check that it isn't already highlighted
                if (node.className != "THmo" && node.parentNode.className != "THmo"){
                    // create an element, replace the text node with an element
                    var sp = span.cloneNode(true);
                    sp.innerHTML = node.nodeValue.replace(pat, '<span style="' + highlightStyleFriends + '" class="THmo">$1</span>');
                    node.parentNode.replaceChild(sp, node);
                }
            }
        }
    }


    /* --------- BLACK LIST ---------*/
    // first run
    THmo_doHighlight(document.body, friendsCfg, 'keywordsFriends', 'highlightStyleFriends');


    var blackListCfg = new MonkeyConfig({
        title: 'Blacklist',
        menuCommand: true,
        params: {
            keywordsBlack: {
                'label': 'Black List names<br>comma separated:<br>nick 1, nick2 ,...',
                type: 'text',
                default: ''
            },
            highlightStyleBlack: {
                'label': 'Set Highlight Style<br>(proper CSS)',
                type: 'text',
                default: 'color: #FFF; background-color: #000; border-radius: 6px 6px 6px 6px; padding: 1px 2px;'
            },
        },
        onSave: function (values) {
            say(vCommands.settingsSaved[getLang()]);
            if(!document.body.querySelector(".THmo")) {
                THmo_doHighlight(document.body, blackListCfg, 'keywordsBlack', 'highlightStyleBlack');
            }
            else {
                location.reload();
            }
        }
    });


    // Add MutationObserver to catch content added dynamically
    var THmo_MutOb2 = (window.MutationObserver) ? window.MutationObserver : window.WebKitMutationObserver;
    if (THmo_MutOb2){
        var THmo_chgMon2 = new THmo_MutOb2(function(mutationSet){
            mutationSet.forEach(function(mutation){
                for (var i=0; i<mutation.addedNodes.length; i++){
                    if (mutation.addedNodes[i].nodeType == 1){
                        THmo_doHighlight(mutation.addedNodes[i], blackListCfg, 'keywordsBlack', 'highlightStyleBlack');
                    }
                }
            });
        });
        // attach chgMon to document.body
        var opts2 = {childList: true, subtree: true};
        THmo_chgMon2.observe(document.body, opts2);
    }


    // first run
    THmo_doHighlight(document.body, blackListCfg, 'keywordsBlack', 'highlightStyleBlack');


    var personalCfg = new MonkeyConfig({
        title: 'Custom list',
        menuCommand: true,
        params: {
            keywordsPersonal: {
                'label': 'Players names<br>comma separated:<br>nick 1, nick2 ,...',
                type: 'text',
                default: ''
            },
            highlightStylePersonal: {
                'label': 'Set Highlight Style<br>(proper CSS)',
                type: 'text',
                default: 'color:#f01466; font-weight:bold; background-color: #dedede; border-radius: 6px 6px 6px 6px; padding: 1px 2px;'
            },
        },
        onSave: function (values) {
            say(vCommands.settingsSaved[getLang()]);
            if(!document.body.querySelector(".THmo")) {
                THmo_doHighlight(document.body, personalCfg, 'keywordsPersonal', 'highlightStylePersonal');
            }
            else {
                location.reload();
            }
        }
    });

    // Add MutationObserver to catch content added dynamically
    var THmo_MutOb3 = (window.MutationObserver) ? window.MutationObserver : window.WebKitMutationObserver;
    if (THmo_MutOb3){
        var THmo_chgMon3 = new THmo_MutOb3(function(mutationSet){
            mutationSet.forEach(function(mutation){
                for (var i=0; i<mutation.addedNodes.length; i++){
                    if (mutation.addedNodes[i].nodeType == 1){
                        THmo_doHighlight(mutation.addedNodes[i], personalCfg, 'keywordsPersonal', 'highlightStylePersonal');
                    }
                }
            });
        });
        // attach chgMon to document.body
        var opts3 = {childList: true, subtree: true};
        THmo_chgMon3.observe(document.body, opts3);
    }

    THmo_doHighlight(document.body, personalCfg, 'keywordsPersonal', 'highlightStylePersonal');




})();