Board Game Arena Games Tab Create Table button

adds a create table button to each game in the game list so you don't have to use the crappy play now section

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Board Game Arena Games Tab Create Table button
// @namespace    https://boardgamearena.com
// @version      0.3
// @description  adds a create table button to each game in the game list so you don't have to use the crappy play now section
// @author       ArmBandito
// @match        https://boardgamearena.com/*
// @match        https://*.boardgamearena.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    // Select the node that will be observed for mutations
    const targetNode = document.getElementById("main-content");
    if(targetNode != null){
        // Options for the observer (which mutations to observe)
        const config = {childList: true,};
        //const config = { attributes: false, childList: true, subtree: false };

        // Create an observer instance linked to the callback function
        const observer = new MutationObserver(pageChange);

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

        //this is for the game info page when we directly load a single game page
        const gametargetNode = document.getElementById("play_game_buttons");
        GameInfoPlay(gametargetNode);
    }
})();

//on page change do our work
function pageChange () {

    //loop throught game rows and increase the height to accomadate for new button
    var gameslistrows = document.querySelectorAll('.gamelist_itemrow');
    for(var gamerow of gameslistrows.values()) {
        gamerow.style.height = "275px";
    }

    //loop through list of games, and create a "create table" button for each
    var gameslist = document.querySelectorAll('.gamelist_item');
    for(var game of gameslist.values()) {
        game.style.height = "240px";
        var btn = document.createElement("button");
        btn.innerHTML = "Create Table";
        btn.classList.add("bgabutton");
        btn.classList.add("bgabutton_blue");
        btn.style.textAlign = "center";
        btn.style.marginLeft = "5%";
        btn.style.marginRight = "5%";
        btn.style.marginTop = "10px";
        btn.style.marginBottom = "10px";
        btn.style.width = "90%";
        btn.addEventListener("click", createGameTable);

        game.appendChild(btn);
    }


    //this is for the game info page when we click on a single game when the page is already loaded
    const info_play_game = document.getElementById("play_game_buttons");
    GameInfoPlay(info_play_game);

}

function GameInfoPlay(element){
    if(element != null){
        var btn = document.createElement("button");
        btn.innerHTML = "Create Table";
        btn.classList.add("bgabutton");
        btn.classList.add("bgabutton_big");
        btn.classList.add("bgabutton_blue");

        btn.addEventListener("click", createGameTable);

        element.appendChild(btn);
    }
}

//when the creat table button for a game is pressed fire off a request for a new table
function createGameTable(){
    //grab game id
    var game_id = this.parentNode.id.split("_");
    //two different sources of game id whether or not there is currently a filter
    if(game_id.length == 4){
        game_id = game_id[3];
    }else{
        game_id = game_id[4];
    }

    if(game_id == null){
        // if game id wasn't found in parent then we're on the single game page
        const single_game_id = document.getElementById("game_id");
        game_id = single_game_id.innerText;
    }

    //send async request for a new table
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
            createTableResponse(JSON.parse(xmlHttp.responseText));
        }
    }
    xmlHttp.open("GET", window.location.origin + "/table/table/createnew.html?game=" + game_id, true);
    xmlHttp.send(null);
}

function createTableResponse(resonse){
    console.log(resonse);
    if(resonse.status == 1){
        window.location = window.location.origin + "/table?table=" + resonse.data.table;
    }
    else{
        alert("Failed to create table: " + resonse.error);
    }
}