Kongvenience

Improves Kongregate game pages: adds a button for reloading game frame, removes anti-ad blockers banner, automatically launches games and hides right part of the page.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

// ==UserScript==
// @name         Kongvenience
// @namespace    https://greasyfork.org/users/4818
// @version      5
// @author       Matrix4348
// @description  Improves Kongregate game pages: adds a button for reloading game frame, removes anti-ad blockers banner, automatically launches games and hides right part of the page.
// @license      MIT
// @match        *://www.kongregate.com/games/*/*
// @match        *://www.kongregate.com/*/games/*/*
// @match        *://www.kongregate.com/games/*/*/embed*
// @match        *://www.kongregate.com/*/games/*/*/embed*
// @run-at       document-start
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        unsafeWindow
// ==/UserScript==

function add_reload_button(){
    var fullscreen_button = document.getElementById("fullscreen_button");
    var button_area = fullscreen_button?.parentElement;
    if( document.readyState == "complete" && button_area !== null ){
        var button = document.createElement("button");
        button.classList.add("hide-if-kfgf"); // The button will be hidden if the Kongregate Flash games fixer user script is also running.
        button_area.insertBefore(button,fullscreen_button.previousElementSibling);
        var a = document.createElement("a");
        a.id="kongvenience-reload-button";
        a.innerHTML="Reload";
        a.addEventListener("click", reload_game);
        button.appendChild(a);
    }
    else{ setTimeout(function(){ add_reload_button(); },1000); }
}

function reload_game(){
    document.getElementById("play-now-overlay").getElementsByTagName("BUTTON")?.[0].click();
    var game = document.getElementById("game");
    if(game.style.display != "none"){
        game.querySelector("iframe").src = game.querySelector("iframe").src;
    }
}

function autoplay(x){
    if( document.readyState == "complete" && document.getElementById("play-now-overlay") !== null ){
        var waiting_time; // For Flash games, we will wait before clicking the "play now" button in case the Kongregate Flash games fixer is running in parallel because it must supersede Kongvenience.
        try{ waiting_time = unsafeWindow[0].active_user.gameType() == "flash" ? 5000 : 100; }
        catch(e){ waiting_time = 100; }
        setTimeout(function(){
            if( document.getElementById("game")?.style?.display == "none" ){
                document.getElementById("play-now-overlay").getElementsByTagName("BUTTON")?.[0].click();
            }
        }, waiting_time);
    }
    else{ setTimeout(function(y){ autoplay(y); }, 1000, x--); }
}

function hide_right_part(){
    var b = document.querySelector('button[aria-label="Theater Mode"]');
    if( b && document.readyState == "complete" ){ b.click(); } // Clicking must be delayed because it does not always produce effects otherwise. Is the onclick function added AFTER b is no longer null?
    else{ setTimeout(function(){ hide_right_part(); },1000); }
}

function remove_banner(node_list){
    var doc = document.getElementsByClassName("game-embed-iframe")?.[0]?.contentDocument || document;
    var nodes = node_list || doc.body.getElementsByTagName("div");
    var l = nodes.length;
    var something_was_removed = false;
    for(let k = 0; k<l; k++){
        var node = nodes[k];
        var c = node?.classList?.[0] || "", i = node?.innerHTML || "";
        var class_condition = c.search(/[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]/)>-1,
            content_conditions = ( i.search("You are seeing this message because ad or script blocking software is interfering with this page")>-1 ||
                                  i.search("Disable any ad or script blocking software")>-1 ||
                                  i.search("https://www.gstatic.com/images/icons/material/system/1x/warning_amber_24dp.png")>-1 ||
                                  ( node?.src || "" ).search("https://www.gstatic.com/images/icons/material/system/1x/warning_amber_24dp.png")>-1 ||
                                  i == "" );
        if( class_condition && content_conditions ){
            node.remove();
            something_was_removed = true;
        }
    }
    // If a node was removed, then recursively clean the page and ensure no node was forgotten (since many empty nodes exist and we have nodes inside nodes inside nodes...)
    if(something_was_removed){
        remove_banner();
    }
}

function add_style(){
    var css = `
#kongvenience-settings {
	display: flex;
	flex-direction: column;
	position: fixed;
	top: 50%;
	left: 50%;
	transform: translateX(-50%) translateY(-50%);
	border: 5px double black;
	background-color: white;
	color: black;
    z-index:1000;
}

#kongvenience-close-button {
	color: black;
	background-color: white;
	padding: 2px 5px;
	border: 1px solid;
	position: absolute;
	right: 5px;
	top: 5px;
}

#kongvenience-settings-header{
    align-self: center;
    font-size: 25px;
}

#kongvenience-settings-tab {
    padding: 10px 30px;
}

.kongvenience-setting {
	margin: 5px 0px;
}

.kongvenience-setting span{
    margin-left: 5px;
}
        `;
    if(document.head){
        var s = document.createElement("style");
        s.innerHTML = css;
        document.head.appendChild(s);
    }
    else{ setTimeout( function(){ add_style(); }, 1000); }
}

function build_settings_window(){
    var w = document.createElement("div");
    w.id = "kongvenience-settings";
    document.body.appendChild(w);

    var h = document.createElement("div");
    h.id = "kongvenience-settings-header";
    h.innerHTML = "Kongvenience settings";
    w.appendChild(h);

    var T = document.createElement("div");
    T.id = "kongvenience-settings-tab";
    w.appendChild(T);

    build_settings_element(T, "Add a button to reload games", "add_reload_button", true);
    build_settings_element(T, "Automatically launch games", "autoplay", true);
    build_settings_element(T, "Hide right part of game pages automatically", "hide_right_part", true);
    build_settings_element(T, "Automatically (try to) remove the banner that asks to disable ad blockers", "auto_remove_banner", true);

    var close = document.createElement("button");
    close.id = "kongvenience-close-button";
    close.innerHTML = "Close";
    close.addEventListener("click", close_settings);
    w.appendChild(close);
}

function close_settings(){
    var s = document.getElementById("kongvenience-settings");
    if(s){ s.remove(); }
}

function build_settings_element(container, text, gm_setting_name, default_value){
    var d = document.createElement("div");
    d.classList.add("kongvenience-setting");
    container.appendChild(d);

    var checkbox = document.createElement("input");
    checkbox.type = "checkbox";
    checkbox.defaultChecked = GM_getValue(gm_setting_name, default_value);
    checkbox.addEventListener("click", function(){ GM_setValue(gm_setting_name, checkbox.checked); } );
    d.appendChild(checkbox);

    var span = document.createElement("span");
    span.innerHTML = text;
    d.appendChild(span);
}

if(document.URL.search("www.kongregate.com(.*?)/games/(.*?)/embed")>-1){

    // Step 1: setting up a mutation observer to remove the banner as soon as it is loaded
    if( GM_getValue("auto_remove_banner", true) ){
        var targetNode = document.getElementsByClassName("game-embed-iframe")?.[0]?.contentDocument || document;
        var config = { childList: true, subtree: true };
        var callback = (mutationList, observer) => { for (let mutation of mutationList) { remove_banner(mutation.addedNodes); } };
        var observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    }

    // Step 2: removing the banner after the page has loaded, in case the script was not executed early enough for step one to suffice
    if( document.readyState=="complete" && GM_getValue("auto_remove_banner", true) ){ remove_banner(); }

    // Step 3: removing the banner with either a right-click (if this feature is available) or from the user script manager's menu, in case of very bad luck and both previous steps failed!
    GM_registerMenuCommand("Remove anti-ad blockers banner", function(){remove_banner();} );

}

else if(top===self){
    add_style();
    GM_registerMenuCommand("Open settings", function(){ build_settings_window(); } );
    if( GM_getValue("add_reload_button", true) ){ add_reload_button(); }
    if( GM_getValue("autoplay", true) ){ autoplay(100); }
    if( GM_getValue("hide_right_part", true) ){ hide_right_part(); }
}