Enhance twitch

Auto click claim bonus (channel points and moments), Show images/video in chat, always source quality, hide offline channels and more

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Enhance twitch
// @namespace    http://tampermonkey.net/
// @version      3.1.9
// @description   Auto click claim bonus (channel points and moments), Show images/video in chat, always source quality, hide offline channels and more
// @author       Bum
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// @match        https://www.twitch.tv/*
// @match https://clips.twitch.tv/*
// @grant        none
// ==/UserScript==

var displayImages = "true";
var displayVideos = "true";
var autoPlayClips = "false";
var hideHypeTrain = "false";
var hideBitGiftLeaderBoard = "false";
var hideUnfollowButton = "false";
var ultraWide = "true";
var hideOfflineChannels = "true";
var hideRecommendedChannels = "true";
var hideTags = "false";
var hideSubscribeText = "false";
var alwaysSourceQuality = "true";
var hideFriendsList = "false";
var hideTheseThots = "false";
var hideExtensions = "true";
var hide7Tvtooltip = "true";
var bigger7tvPanel = "true";
var changeKekheim = "true";
var changePogBones = "true";
var testFix7tv = "false";

if (localStorage.getItem("changePogBones") != null) {
    changePogBones = localStorage.getItem("changePogBones");
}
if (localStorage.getItem("changeKekheim") != null) {
    changeKekheim = localStorage.getItem("changeKekheim");
}
if (localStorage.getItem("hide7Tvtooltip") != null) {
    hide7Tvtooltip = localStorage.getItem("hide7Tvtooltip");
}
if (localStorage.getItem("bigger7tvPanel") != null) {
    bigger7tvPanel = localStorage.getItem("bigger7tvPanel");
}
if (localStorage.getItem("hideSubscribeText") != null) {
    hideSubscribeText = localStorage.getItem("hideSubscribeText");
}
if (localStorage.getItem("hideTheseThots") != null) {
    hideTheseThots = localStorage.getItem("hideTheseThots");
}
if (localStorage.getItem("alwaysSourceQuality") != null) {
    alwaysSourceQuality = localStorage.getItem("alwaysSourceQuality");
}
if (localStorage.getItem("hideRecommendedChannels") != null) {
    hideRecommendedChannels = localStorage.getItem("hideRecommendedChannels");
}
if (localStorage.getItem("hideFriendsList") != null) {
    hideFriendsList = localStorage.getItem("hideFriendsList");
}
if (localStorage.getItem("hideTags") != null) {
    hideTags = localStorage.getItem("hideTags");
}

if (localStorage.getItem("displayImages") != null) {
    displayImages = localStorage.getItem("displayImages");
}
if (localStorage.getItem("hideOfflineChannels") != null) {
    hideOfflineChannels = localStorage.getItem("hideOfflineChannels");
}
if (localStorage.getItem("displayVideos") != null) {
    displayVideos = localStorage.getItem("displayVideos");
}
if (localStorage.getItem("autoPlayClips") != null) {
    autoPlayClips = localStorage.getItem("autoPlayClips");
}
if (localStorage.getItem("hideHypeTrain") != null) {
    hideHypeTrain = localStorage.getItem("hideHypeTrain");
}
if (localStorage.getItem("hideBitGiftLeaderBoard") != null) {
    hideBitGiftLeaderBoard = localStorage.getItem("hideBitGiftLeaderBoard");
}
if (localStorage.getItem("hideUnfollowButton") != null) {
    hideUnfollowButton = localStorage.getItem("hideUnfollowButton");
}

if (localStorage.getItem("ultraWide") != null) {
    ultraWide = localStorage.getItem("ultraWide");
}
 GM_addStyle(".seventv-emote{cursor: pointer !important;}");


function hide7Tvtooltipplease(){
    //seventv-emote-tooltip-wrapper
    if (hide7Tvtooltip == "false" ||hide7Tvtooltip == false  )
        RemoveCssRule(".seventv-emote-tooltip-wrapper");
    else
        GM_addStyle(".seventv-emote-tooltip-wrapper{display: none !important;}");
}

function bigger7tvPanelplease(){
    if (bigger7tvPanel == "false" ||bigger7tvPanel == false  )
    {
        RemoveCssRule(".seventv-emote-menu");
        RemoveCssRule(".seventv-emote-menu-header, .seventv-emote-menu-scrollable");
    }
    else
    {
        GM_addStyle(".seventv-emote-menu-header, .seventv-emote-menu-scrollable{width: 600px !important;}");
        GM_addStyle(".seventv-emote-menu{left: auto !important;right: 0 !important; margin-right:10px !important;}");
    }
}

if (localStorage.getItem("hide7Tvtooltip") != null) {
    hide7Tvtooltipplease();
}
if (localStorage.getItem("bigger7tvPanel") != null) {
    bigger7tvPanelplease();
}


hideExtensions = localStorage.getItem("hideExtensions");
if (hideExtensions == "false")
    RemoveCssRule(".extensions-dock__layout, .extensions-video-overlay-size-container");
else
    GM_addStyle(".extensions-dock__layout, .extensions-video-overlay-size-container{display: none !important;}");

if (ultraWide == "true"){

    GM_addStyle(".common-centered-column{    max-width: 100%;}");
}

GM_addStyle('.oHwVV::after {    content: "";    display: block;    position: absolute;    top: 0.2rem;    bottom: 0.2rem;    left: 0.2rem;    width: 1.2rem;    height: 1.2rem;    transition-property: left;    transition-timing-function: ease;    transition-duration: var(--timing-short);    border-radius: var(--border-radius-rounded);    background-color: var(--color-background-toggle-handle);}');

GM_addStyle('.ScToggleInput-sc-796zbf-1:checked + .oHwVV::after {    content: "";    left: calc((100% - 1.2rem) - 0.2rem);    background-color: var(--color-background-toggle-checked);}');
GM_addStyle('.ScToggleInput-sc-796zbf-1:checked + .oHwVV::before {    border-width: 0px 0px 2px 2px;    border-style: solid;    border-color: var(--color-text-toggle-checked-icon);    display: block;    position: absolute;    top: 0.7rem;    left: 0.8rem;    width: 0.7rem;    height: 0.3rem;    transform: translate3d(-50%, -50%, 0px) rotate(-45deg);    content: "";}');

GM_addStyle('.oHwVV {    display: inline-block;    position: relative;    order: 0;    width: 3.5rem;    height: 2rem;    content: "";    cursor: pointer;    vertical-align: bottom;    border-width: 2px;    border-style: solid;    border-radius: 1rem;    transition-property: background-color;    transition-timing-function: ease;    transition-duration: var(--timing-short);    border-color: var(--color-border-toggle);    background-color: var(--color-background-toggle);}');

GM_addStyle('.ScToggleInput-sc-796zbf-1:checked + .oHwVV {    border-color: var(--color-border-toggle-checked);}');


GM_addStyle('.xAfNg {    display: flex !important;    -webkit-box-align: center !important;    align-items: center !important;}');
GM_addStyle('.fjMXDc {    -webkit-box-flex: 1 !important;    flex-grow: 1 !important;    margin-right: 2rem !important;}');
GM_addStyle('.kCtfmS {    display: flex;    position: relative;    flex-direction: column;    line-height: 2rem;}');
GM_addStyle('.doVmsZ {    position: absolute;    opacity: 0;}');

GM_addStyle(`.Layout-sc-nxg1ff-0.chat-line__status {
    display: none;
}
`);

function GM_addStyle(css) {
    const style = document.getElementById("GM_addStyle") || (function() {
        const style = document.createElement('style');
        style.type = 'text/css';
        style.id = "GM_addStyle";
        document.head.appendChild(style);
        return style;
    })();
    const sheet = style.sheet;
    sheet.insertRule(css, (sheet.rules || sheet.cssRules || []).length);
}

function hideSubButton(){

    let btnSub = $('button[data-a-target="subscribe-button"]');
    if (btnSub.length ==0)
        btnSub = $('button[data-a-target="subscribed-button"]');
    var isReady = btnSub.length > 0;
    if (!isReady) {
        setTimeout(hideSubButton, 300);
        return;
    }

    btnSub.find(".tw-mg-l-05").attr("style","display: none !important");
    btnSub.find('div[data-a-target="tw-core-button-label-text"]').attr("style","display: none !important");
}
$( window ).on( "load", function() {
    if (hideTags == "true")
        $(".tw-tag").attr("style","display:none !important");
    if(hideSubscribeText == "true"){
        hideSubButton();
    }
    AlwaysSourceQuality();
});

function AlwaysSourceQuality(){
    var hidden, state, visibilityChange;
    if (typeof document.hidden !== "undefined") {
        hidden = "hidden";
        visibilityChange = "visibilitychange";
        state = "visibilityState";
    } else if (typeof document.mozHidden !== "undefined") {
        hidden = "mozHidden";
        visibilityChange = "mozvisibilitychange";
        state = "mozVisibilityState";
    } else if (typeof document.msHidden !== "undefined") {
        hidden = "msHidden";
        visibilityChange = "msvisibilitychange";
        state = "msVisibilityState";
    } else if (typeof document.webkitHidden !== "undefined") {
        hidden = "webkitHidden";
        visibilityChange = "webkitvisibilitychange";
        state = "webkitVisibilityState";
    }
    if (alwaysSourceQuality == "true")
    {
        Object.defineProperty(document, hidden, {value: false, writable: false});
        Object.defineProperty(document, state, {value: 'visible', writable: false});
        document.addEventListener(visibilityChange, function(e) {
            window.localStorage.setItem('s-qs-ts', Math.floor(Date.now()));
            window.localStorage.setItem('video-quality', '{"default":"chunked"}');
            e.stopImmediatePropagation();
        }, false);
    }
    else{
        delete document[hidden];
        delete document[state];
    }
}
function changeKekheimPlease(){
    /*$('textarea[data-a-target="chat-input"]').on('change keyup paste', function() {
        $(this).val($(this).val().replace("KEKHeim", "KEKW"));
    });*/
}
function changePogBonesPlease(){
    /*$('textarea[data-a-target="chat-input"]').on('change keyup paste', function() {
        $(this).val($(this).val().replace("PogBones", "PogChamp"));
    });*/
}

jQuery(function($) {

  var _oldShow = $.fn.show;

  $.fn.show = function(speed, oldCallback) {
    return $(this).each(function() {
      var obj         = $(this),
          newCallback = function() {
            if ($.isFunction(oldCallback)) {
              oldCallback.apply(obj);
            }
            obj.trigger('afterShow');
          };


      // now use the old function to show the element passing the new callback
      _oldShow.apply(obj, [speed, newCallback]);
    });
  }
});

function RemoveCssRule(css) {
    const style = document.getElementById("GM_addStyle") || (function() {
        const style = document.createElement('style');
        style.type = 'text/css';
        style.id = "GM_addStyle";
        document.head.appendChild(style);
        return style;
    })();
    const sheet = style.sheet;
    for (var i=0; i<sheet.cssRules.length; i++) {
        if (sheet.cssRules[i].selectorText == css) {
            sheet.deleteRule (i);
        }
    }
}

function LoadTwitchEnhance(){
    AddTheMenu();
    $('body').click(function(evt){
        $(".fixMenuAppended").removeClass("fixMenuAppended");
    });
    var config = { attributes: false, childList: true, subtree: true };


    var SupportedImageFormats = [".jpg", ".jpeg", ".png", ".webp", ".gif"];
    var SupportedVideoFormats = [".mp4",".webm"];

    var maxHeight = "240";
    var maxWidth = "300";

    GM_addStyle("iframe[class^='imgur-embed']{max-width: "+maxWidth+"px !important;}");
    GM_addStyle("svg[class*='logotwitchwordmark']{display: none !important;}");
    if (hideHypeTrain == "true")
        GM_addStyle(".community-highlight-stack__scroll-area--disable{display: none !important;}");
    if (hideBitGiftLeaderBoard == "true")
        GM_addStyle(".hsXgFK:has(.channel-leaderboard-header-rotating__users){display: none !important;}");
    GM_addStyle(".btnRefreshEnhance button{height: 15px; width: 100%}");
    GM_addStyle(".chat-settings{    max-height: 500px !important;    overflow: hidden !important;}");

    function isSupportedImage(url) {
        var length = SupportedImageFormats.length;
        while(length--) {
            if (url.indexOf(SupportedImageFormats[length])!=-1) {
                return true;
            }
        }
        return false;
    }
    function isSupportedVideo(url) {
        var length = SupportedVideoFormats.length;
        while(length--) {
            if (url.indexOf(SupportedVideoFormats[length])!=-1) {
                return true;
            }
        }
        return false;
    }

    function alterNode(node) {
        var thisUrl = $(node).text();
        if ((displayImages == "true" || displayImages == true) && isSupportedImage(thisUrl)){
            $(node).html("<br><img src='" + thisUrl + "' width='" + maxWidth +"px'/>");
            $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
        }
        else if ((displayVideos == "true" || displayVideos == true ) && thisUrl.indexOf("www.youtube") > 0 ){
            if (thisUrl.indexOf("watch") > 0){
                var videoId  = thisUrl.match('v=([^&]*)')[1];
                $(node).html('<br><iframe width="'+ maxWidth +'" height="'+ maxHeight +'" src="https://www.youtube.com/embed/' + videoId+'"></iframe>');
                $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
            }
        }
        else if ((displayVideos == "true" || displayVideos == true ) && isSupportedVideo(thisUrl)){
            $(node).html('<br><video width="'+ maxWidth +'" height="'+ maxHeight +'" controls autoplay muted><source src="'+thisUrl +'" type="video/mp4"></video>');
            $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
        }
        else if ((displayImages == "true" || displayImages == true) && thisUrl.indexOf("https://gyazo.com") > -1 ){
            $(node).html("<br><img src='" + thisUrl.replace("https://gyazo.com", "https://i.gyazo.com") +".png' width='" + maxWidth +"px'/>");
            $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');

        }
        else if ((displayImages == "true" || displayImages == true) && thisUrl.indexOf("imgur") > -1){
            var imgurId = "";
            if (thisUrl.indexOf("gallery") > -1){
                imgurId = thisUrl.match('gallery\/([^#]*)')[1];
                try{
                    $(node).html('<div style="width:200"><blockquote class="imgur-embed-pub" lang="en" data-id="a/'+ imgurId +'"><a href="//imgur.com/'+ imgurId +'" ></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script></div>');
                    $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
                }
                catch(err){
                }
            }
            else{
                imgurId = thisUrl.match('a\/([^#]*)')[1];
                try{
                    $(node).html('<div style="width:200"><blockquote class="imgur-embed-pub" lang="en" data-id="a/'+ imgurId +'"><a href="//imgur.com/'+ imgurId +'" ></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script></div>');
                    $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
                }
                catch(err){
                }
            }
            parentToScroll.animate({scrollTop:parentToScroll.scrollTop() + 500}, 'slow');
        }
        else if ((displayVideos == "true" || displayVideos == true ) && thisUrl.indexOf("clips.twitch.tv") > -1){
            var clipId = thisUrl.match('.tv\/(.*)')[1];
            $(node).html('<iframe src="https://clips.twitch.tv/embed?clip='+clipId+'&autoplay='+autoPlayClips+'&muted=true&parent=twitch.tv" frameborder="0"   allowfullscreen="true" height="'+maxHeight+'" width="'+maxWidth+'"></iframe>');
            $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
        }
        else if ((displayVideos == "true" || displayVideos == true ) && thisUrl.indexOf("twitch") > -1 && thisUrl.indexOf("clip") > -1){
            var clipId1 = thisUrl.match('clip\/([^?]*)')[1];
            $(node).html('<iframe src="https://clips.twitch.tv/embed?clip='+clipId1+'&autoplay='+autoPlayClips+'&muted=true&parent=twitch.tv" frameborder="0"   allowfullscreen="true" height="'+maxHeight+'" width="'+maxWidth+'"></iframe>');
            $(".enhanceAppended").find('.simplebar-scroll-content').animate({scrollTop:$(".enhanceAppended").find('.simplebar-scroll-content').scrollTop() + 1000}, 'fast');
        }
    }
    // Callback function to execute when mutations are observed
    var callback = function(mutationsList, observer) {
        for(var mutation of mutationsList)  {
            mutation.addedNodes.forEach(function(node) {
                if (node.classList != undefined && node.classList.contains('link-fragment')) {
                    alterNode(node);
                }
                if (node.classList != undefined && node.classList.contains('seventv-message-context')) {

                    alterNode($(node).find("a"));
                }
                if (node.querySelectorAll){
                    node.querySelectorAll('.link-fragment').forEach(function(node) {
                        alterNode(node);
                    })
                    node.querySelectorAll('.text-fragment').forEach(function(node) {
                        alterNode(node);
                    })
                    node.querySelectorAll('.seventv-message-context').forEach(function(node) {
                        alterNode(node);
                    })
                }
            });
        }
    };

    var callbackClaim = function(mutationsList, observer) {
        for(var mutation of mutationsList) {
            $(".claimable-bonus__icon").click();
        }
    };


    // Create an observer instance linked to the callback function
    var observer = new MutationObserver(callback);
    function _appendObserver() {
        let isReady = $("div.chat-list--default").length > 0;
        if (!isReady) {
            setTimeout(_appendObserver, 500);
            return;
        }
        if (!$("div.chat-list--default").hasClass("enhanceAppended")){
            $("div.chat-list--default").addClass("enhanceAppended");
            var targetNode = $("div.chat-list--default").get(0);
            var targetNode2 = $(".chat-room").get(0);
            // Start observing the target node for configured mutations

            if(targetNode !=undefined){
                observer.observe(targetNode, config);
            }
            if (changeKekheim == "true" || changeKekheim == true){
                changeKekheimPlease();
            }
            if (changePogBones == "true" || changePogBones == true){
                changePogBonesPlease();
            }
        }
    }
    _appendObserver();

    var targetNodeRoot = document.getElementById('root');
    var configRoot = { attributes: false, childList: true, subtree: true };

    var callbackRoot = function(mutationsList, observer) {
        var base_url = window.location.origin+"/";
        if ((window.location.href.indexOf("directory") > -1) || (window.location.href.indexOf("directory/category") > -1) || (window.location.href == base_url) ){
            return;
        }
        $(".claimable-bonus__icon").click();
        $(".chat-private-callout__header-segment").find('div:contains("Claim")').click();
        $("#video-player__overlay").find('div:contains("Reload")').click();
        _appendObserver();
        if (hideTags == "true")
            $(".tw-tag").attr("style","display:none !important");
        if (hideOfflineChannels == "true"){
            for(var mutation of mutationsList){
                mutation.addedNodes.forEach(function(node) {
                    //side-nav-card__avatar

                    var a7tvGarbageImgHandlefml = $(node).find("img.chat-line__message--emote");

                    if (testFix7tv == "true" || testFix7tv == true) {
                        if (a7tvGarbageImgHandlefml.length > 0){
                            if (a7tvGarbageImgHandlefml.attr("src").includes("static-cdn.jtvnw.net/emoticons/v2")){
                                var srcOfThisGarbage = a7tvGarbageImgHandlefml.attr("src");
                                console.log("trying to fix now " + srcOfThisGarbage);

                                srcOfThisGarbage = srcOfThisGarbage.replace("static-cdn.jtvnw.net/emoticons/v2", "cdn.7tv.app/emote");
                                srcOfThisGarbage = srcOfThisGarbage.replace("default/dark/1.0", "1x");

                                $.ajax({
                                    url:srcOfThisGarbage, //be sure to check the right attribute
                                    success: function () { //pass an anonymous callback function
                                        // nothing to do
                                        console.log("is 7tv emote");
                                        a7tvGarbageImgHandlefml.attr("src",srcOfThisGarbage);
                                    },
                                    error: function (jqXHR, status, er) {
                                        //only set the error on 404
                                        console.log("trying to fix now with frankerface");
                                        srcOfThisGarbage = srcOfThisGarbage.replace("static-cdn.jtvnw.net/emoticons/v2","cdn.betterttv.net/frankerfacez_emote");
                                        srcOfThisGarbage = srcOfThisGarbage.replace("default/dark/1.0","1");
                                        $.ajax({
                                            url:srcOfThisGarbage, //be sure to check the right attribute
                                            success: function () { //pass an anonymous callback function
                                                // nothing to do
                                                console.log("is frankerface emote");
                                                a7tvGarbageImgHandlefml.attr("src",srcOfThisGarbage);
                                            },
                                            error: function (jqXHR, status, er) {
                                                //only set the error on 404
                                                console.log("trying to fix now with frankerface");
                                                srcOfThisGarbage = srcOfThisGarbage.replace("static-cdn.jtvnw.net/emoticons/v2","cdn.betterttv.net/emote");
                                                srcOfThisGarbage = srcOfThisGarbage.replace("default/dark/1.0","1x");
                                                a7tvGarbageImgHandlefml.attr("src",srcOfThisGarbage);
                                                //you could perform additional checking with different classes
                                                //for other 400 and 500 level HTTP status codes.
                                            }
                                        });
                                        //you could perform additional checking with different classes
                                        //for other 400 and 500 level HTTP status codes.
                                    }
                                });
                            }
                        }

                    }
                    var channelStatus = $(node).find(".side-nav-card__avatar");
                    var offlineChannels = $(node).find(".side-nav-card__avatar--offline");
                    if (offlineChannels.length > 0){
                        var parentStatus = offlineChannels.parent();
                        parentStatus.attr("style","display:none !important;");
                    }
                    if (channelStatus.length > 0){
                        var elemToObserve = channelStatus.get(0);
                        var observer = new MutationObserver(function(mutations) {
                            mutations.forEach(function(mutation) {
                                var channelIsOffline = mutation.target.classList.contains('side-nav-card__avatar--offline');
                                var parentStatus = $($(mutation)[0].target).parent();
                                if(channelIsOffline){
                                    parentStatus.attr("style", "display:none !important;");
                                }
                                else{
                                    parentStatus.attr("style","display:inherit !important;");
                                    $('button[data-test-selector="ShowMore"]').click();
                                }
                            });
                        });
                        observer.observe(elemToObserve, {attributes: true});
                    }
                });
            }
        }

        if (window.location.href == "https://www.twitch.tv/"){
            var videoMainPage = $(".featured-content-carousel:not(.fixVideoPausedOnce)").find("video");
            if (videoMainPage.length > 0){
                videoMainPage.get(0).pause();
                videoMainPage.parent().click(function(){
                    $(".featured-content-carousel").addClass('fixVideoPausedOnce');
                });
            }
        }

        var linkArg = $(".about-section__panel--content").find(".tw-title").text().replace("About ","");
        if ($(".about-section__panel--content:not(.fixLinksAppended)").length > 0 || $(".about-section__panel--content").attr("id") != "fix" + linkArg){
            var appendable = $(".about-section__panel--content").find('.tw-title').parent();
            if (appendable.length>0) {
                $("#fixVideosLinks").remove();
                $("#fixClipsLinks").remove();
                $("#fixSpanLinks").remove();
                appendable.parent().append('<a target="_blank" id ="fixVideosLinks" href="/'+linkArg+'/videos"><span>Videos</span></a><span id = "fixSpanLinks"> / </span>');
                appendable.parent().append('<a target="_blank" id ="fixClipsLinks" href="/'+linkArg+'/clips?filter=clips&range=7d"><span>Clips</span></a>');
                $(".about-section__panel--content").addClass("fixLinksAppended");
                $(".about-section__panel--content").attr("id","fix"+linkArg);
                if (hideTags == "true")
                    $(".tw-tag").attr("style","display:none !important");
                if(hideSubscribeText == "true"){
                    hideSubButton();
                }
                if (hideUnfollowButton == "true")
                    GM_addStyle('button[data-a-target="unfollow-button"] div:first-child{width: 0 !important;}');
            }
        }
    };

    // Create an observer instance linked to the callback function
    var observerroot = new MutationObserver(callbackRoot);

    // Start observing the target node for configured mutations
    observerroot.observe(targetNodeRoot, config);

    var callbackQuality = function(mutationsList, observer) {
        localStorage.setItem('video-quality', '{"default":"chunked"}');
    };

    function _appendQualityObserver() {
        var isReady = $('div[data-a-target="player-controls"]').length > 0;
        if (!isReady) {
            setTimeout(_appendQualityObserver, 500);
            return;
        }
        var targetNodeQuality = $('div[data-a-target="player-controls"]').get(0);
        var observerQuality = new MutationObserver(callbackQuality);
        observerQuality.observe(targetNodeQuality, config);
    }
}

function hideRecommendedChannelsPlease(hide){
    if (hide)
    {
        GM_addStyle('div[aria-label="Live Channels"]{    display:none !important;}');
        GM_addStyle('div[aria-label*="Also Watch"]{    display:none !important;}');
    }
    else{
        RemoveCssRule('div[aria-label="Live Channels"]');
        RemoveCssRule('div[aria-label*="Also Watch"]');
    }
}

function hideFriends(){
    GM_addStyle('div[data-a-target="online-friends-list"]{    display:none !important;}');
}

if (hideRecommendedChannels == "true"){
    hideRecommendedChannelsPlease(true);
}
if (hideFriendsList == "true"){
    hideFriends();
}

function getMenuItem(id, display, checked){

    var res = "";
    if (checked == "true" || checked == true)
        res ='<input type="checkbox" checked class="enhancCheck" id="fix'+id+'" name="'+id+'" value="'+display+'">  <label for="fix'+id+'">'+display+'</label> ';
    else
        res ='<input type="checkbox" class="enhancCheck" id="fix'+id+'" name="'+id+'" value="'+display+'">  <label for="fix'+id+'">'+display+'</label> ';
    return res;
}

function AddTheMenu(){
    var menuButton = `
    <div class="Layout-sc-nxg1ff-0 jA-dUUY"><div class="Layout-sc-nxg1ff-0 dDnLci">
    <div class="Layout-sc-nxg1ff-0 bYXYej">
    <div class="InjectLayout-sc-588ddc-0 iETGeJ">
    <button class="ScCoreButton-sc-1qn4ixc-0 enhanceButton jGqsfG ScButtonIcon-sc-o7ndmn-0 fNzXyu"  style="
    background: url(https://i.imgur.com/kWu713g.png);
    background-size: 22px;
    background-repeat: no-repeat;
    background-position: center; width: 25px;
    height: 25px;" ></button>
  </div>
  </div>
  <div aria-label="Whispers" role="button" data-click-out-id="threads-box" data-a-target="threads-box-closed" class="Layout-sc-nxg1ff-0 emWtQg InjectLayout-sc-588ddc-0 kgrtoC whispers-threads-box__container"></div></div></div>

    `;

    var enhanceSettings = `
    <div class="enhancecontainer" style="display:none;">

    </div>
    `;




    $("body").append(enhanceSettings);
      $(".enhancecontainer").append('<div class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1 customEnhanceMenu"" ></div><div class="tw-mg-y-05 tw-pd-x-05" style="width: 100%;"><p class="tw-c-text-alt-2 tw-font-size-6 tw-strong tw-upcase" style="color: var(--color-text-alt-2)!important;    font-size: var(--font-size-6)!important;    font-weight: 600!important;    text-transform: uppercase!important;">Enhance Twitch</p></div>');


    $(".enhancecontainer").append(getMenuItem('displayImages','Display Images', displayImages));
    $("#fixdisplayImages").on('change', function() {
        localStorage.setItem("displayImages", $(this).prop('checked'));
        displayImages = $(this).prop('checked');
    });

    $(".enhancecontainer").append(getMenuItem('hideUnfollowButton','Hide unfollow button',hideUnfollowButton));
    $("#fixhideUnfollowButton").change(function() {
        localStorage.setItem("hideUnfollowButton", this.checked);
        hideUnfollowButton = localStorage.getItem("hideUnfollowButton");
        if (hideUnfollowButton == "false")
            RemoveCssRule('button[data-a-target="unfollow-button"] div:first-child');
        else
            GM_addStyle('button[data-a-target="unfollow-button"] div:first-child{width: 0 !important;}');
    });

    $(".enhancecontainer").append(getMenuItem('hideSubscribeText','Hide (re)subscribe text',hideSubscribeText));
    $("#fixhideSubscribeText").change(function() {
        localStorage.setItem("hideSubscribeText", this.checked);
        hideSubscribeText = localStorage.getItem("hideSubscribeText");
        if (hideSubscribeText == "false"){
            let btnSub = $('button[data-a-target="subscribe-button"]');
            if (btnSub.length ==0)
                btnSub = $('button[data-a-target="subscribed-button"]');
            btnSub.find(".tw-mg-l-05").attr("style","display: block !important");
            btnSub.find('div[data-a-target="tw-core-button-label-text"]').attr("style","display: block !important");
        }
        else{
            hideSubButton();
        }
    });

    //alwaysSourceQuality
     $(".enhancecontainer").append(getMenuItem('alwaysSourceQuality','Always source quality', alwaysSourceQuality));
    $(document).on('change', "#fixalwaysSourceQuality", function() {
        localStorage.setItem("alwaysSourceQuality", $(this).prop('checked'));
        alwaysSourceQuality = $(this).prop('checked');
        AlwaysSourceQuality();
    });

     $(".enhancecontainer").append(getMenuItem('displayVideos','Display Videos',displayVideos));
    $(document).on('change', "#fixdisplayVideos", function() {
        localStorage.setItem("displayVideos", $(this).prop('checked'));
        displayVideos = $(this).prop('checked');
    });


     $(".enhancecontainer").append(getMenuItem('autoPlayClips','Auto play clips',autoPlayClips));

    $(document).on('change', "#fixautoPlayClips", function() {
        localStorage.setItem("autoPlayClips", $(this).prop('checked'));
        autoPlayClips = $(this).prop('checked');
    });

    //hideOfflineChannels

     $(".enhancecontainer").append(getMenuItem('hideOfflineChannels','Hide offline channels*',hideOfflineChannels));
    $(document).on('change', "#fixhideOfflineChannels", function() {
        localStorage.setItem("hideOfflineChannels", $(this).prop('checked'));
        hideOfflineChannels = $(this).prop('checked');
    });


    //hideRecommendedChannels
     $(".enhancecontainer").append(getMenuItem('hideRecommendedChannels','Hide live/also watch channels',hideRecommendedChannels));
    $("#fixhideRecommendedChannels").change(function() {
        localStorage.setItem("hideRecommendedChannels", this.checked);
        hideRecommendedChannels = localStorage.getItem("hideRecommendedChannels");
        if (hideRecommendedChannels == "true")
            hideRecommendedChannelsPlease(true);
        else{
            hideRecommendedChannelsPlease(false);
        }
    });

     $(".enhancecontainer").append(getMenuItem('hide7Tvtooltip','Hide 7tv emote tooltip',hide7Tvtooltip));
    $("#fixhide7Tvtooltip").change(function() {
        localStorage.setItem("hide7Tvtooltip", $(this).prop('checked'));
        hide7Tvtooltip =$(this).prop('checked');
        hide7Tvtooltipplease();
    });

     $(".enhancecontainer").append(getMenuItem('bigger7tvPanel','Bigger 7tv emote panel',bigger7tvPanel));
    $("#fixbigger7tvPanel").change(function() {
        localStorage.setItem("bigger7tvPanel", $(this).prop('checked'));
        bigger7tvPanel =$(this).prop('checked');
        bigger7tvPanelplease();
    });

     $(".enhancecontainer").append(getMenuItem('hideExtensions','Hide Extensions',hideExtensions));
    $("#fixhideExtensions").change(function() {
        localStorage.setItem("hideExtensions", this.checked);
        hideExtensions = localStorage.getItem("hideExtensions");
        if (hideExtensions == "false")
            RemoveCssRule(".extensions-dock__layout, .extensions-video-overlay-size-container");
        else
            GM_addStyle(".extensions-dock__layout, .extensions-video-overlay-size-container{display: none !important;}");
    });

     $(".enhancecontainer").append(getMenuItem('hideHypeTrain','Hide hype train',hideHypeTrain));
    $("#fixhideHypeTrain").change(function() {
        localStorage.setItem("hideHypeTrain", this.checked);
        hideHypeTrain = localStorage.getItem("hideHypeTrain");
        if (hideHypeTrain == "false")
            RemoveCssRule(".community-highlight-stack__scroll-area--disable");
        else
            GM_addStyle(".community-highlight-stack__scroll-area--disable{display: none !important;}");
    });

     $(".enhancecontainer").append(getMenuItem('hideBitGiftLeaderBoard','Hide gift/bit leaderboard',hideBitGiftLeaderBoard));
    $("#fixhideBitGiftLeaderBoard").change(function() {
        localStorage.setItem("hideBitGiftLeaderBoard", this.checked);
        hideBitGiftLeaderBoard = localStorage.getItem("hideBitGiftLeaderBoard");
        if (hideBitGiftLeaderBoard == "false")
            RemoveCssRule(".hsXgFK:has(.channel-leaderboard-header-rotating__users)");
        else
            GM_addStyle(".hsXgFK:has(.channel-leaderboard-header-rotating__users){display: none !important;}");
    });

        $(".enhancecontainer").append(getMenuItem('hideTags','Hide tags',hideTags));
    $("#fixhideTags").change(function() {
        localStorage.setItem("hideTags", this.checked);
        hideTags = localStorage.getItem("hideTags");
        if (hideTags == "false")
            $(".tw-tag").attr("style","display:flex !important");
        else
            $(".tw-tag").attr("style","display:none !important");
    });

    /*$(".enhancecontainer").append(getMenuItem('changePogBones','Swap PogBones by PogChamp*',changePogBones));
    $("#fixchangePogBones").change(function() {
        localStorage.setItem("changePogBones", this.checked);
        changePogBones = localStorage.getItem("changePogBones");
        if (changePogBones == "true" || changePogBones == true)
            changePogBonesPlease();
    });


     $(".enhancecontainer").append(getMenuItem('changeKekheim','Swap KekHeim by KEKW*',changeKekheim));
    $("#fixchangeKekheim").change(function() {
        localStorage.setItem("changeKekheim", this.checked);
        changeKekheim = localStorage.getItem("changeKekheim");
        if (changeKekheim == "true" || changeKekheim == true)
            changeKekheimPlease();
    });*/


        $(".enhancecontainer").append(`<div class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1 customEnhanceMenu" style="margin-left: 0rem !important;margin-right: 0rem !important;" ></div><div class="tw-mg-y-05 tw-pd-x-05" style="width: 100%;"><p class="tw-c-text-alt-2 tw-font-size-6 tw-strong tw-upcase"

style="color: var(--color-text-alt-2)!important;
    font-size: smaller;
    margin-top: 6px;">Options marked with * need a refresh after disabling.</p></div>`);


    $(".top-nav__prime").parent().children().eq(2).after(menuButton);

    $(".enhanceButton").click(function(){
        $(".enhancecontainer").toggle();
    });

    //rgba(25, 25, 25, 0.75);




    document.addEventListener('keydown', (event) => {


        if (event.altKey && event.key == 's') {
            $(".enhancecontainer").toggle();
        }
    });
}

    GM_addStyle('.enhanceButton:hover{    background-color:var(--color-background-button-text-hover) !important;}');
    GM_addStyle(`
    .enhancecontainer {
display: flex;
    flex-wrap: wrap;
    justify-content: center;
    background: var(--color-background-base);
    padding: 10px;
    width: 200px;
    position: absolute;
    right: 100px;
    z-index: 100;
    margin-top: 66px;
    width: 500px;
    height: auto;
}
    `);

    GM_addStyle(`
    input.enhancCheck[type=checkbox] + label {
  display: block;
    cursor: pointer;
    height: fit-content;
    flex: 1 0 35%;
    margin-top: 5px;
}
`);
    GM_addStyle(`
    input.enhancCheck[type=checkbox] {
  display: none;
}`);
    GM_addStyle(` input.enhancCheck[type=checkbox] + label:before {
  content: "\\2714";
  border: 0.1em solid #fff;
  border-radius: 0.2em;
  display: inline-block;
  width: 1em;
  height: 1em;
  padding-left: 0.2em;
  padding-bottom: 0.3em;
  margin-right: 0.2em;
  vertical-align: bottom;
  color: transparent;
}`);
    GM_addStyle(`input.enhancCheck[type=checkbox]:checked + label:before {
  background-color: #ED820A;
  border-color:white;
  color: #fff;
}`);

(function() {
    'use strict';
    LoadTwitchEnhance();
})();