text: // ==UserScript==
  // @name         Free Subscription - Base Sets of 10 Buttons
  // @namespace    games.dominion.script
  // @version      0.2
  // @description  This script adds (First Game, Size Distortion, Deck Top, Sleight of Hand, Improvements and Silver & Gold) buttons to table creations
  // @author       barmkin
  // @match        https://dominion.games/*
  // @grant        none
  // @require      https://code.jquery.com/jquery-3.5.1.min.js
  // @license      MIT
  // ==/UserScript==
  
  /* --- Changelog 0.2 ---
    Add multilanguages support
  */
  
  /* ------------------------------------------------------------------------------- */
  /* --- Cards Sets ---------------------------------------------------------------- */
  // You can edit this section, see README
  var cardsSets = [
      {
          'name': 'Base Sets of 10',
          'sets':
          [
              {'First Game': [
                  'Cellar', 'Market', 'Merchant', 'Militia', 'Mine', 'Moat', 'Remodel', 'Smithy', 'Village', 'Workshop'
              ]},
              {'Size Distortion': [
                  'Artisan', 'Bandit', 'Bureaucrat', 'Chapel', 'Festival', 'Gardens', 'Sentry', 'Throne Room', 'Witch', 'Workshop'
              ]},
              {'Deck Top': [
                  'Artisan', 'Bureaucrat', 'Council Room', 'Festival', 'Harbinger', 'Laboratory', 'Moneylender', 'Sentry', 'Vassal', 'Village'
              ]},
              {'Sleight of Hand': [
                  'Cellar', 'Council Room', 'Festival', 'Gardens', 'Library', 'Harbinger', 'Militia', 'Poacher', 'Smithy', 'Throne Room'
              ]},
              {'Improvements': [
                  'Artisan', 'Cellar', 'Market', 'Merchant', 'Mine', 'Moat', 'Moneylender', 'Poacher', 'Remodel', 'Witch'
              ]},
              {'Silver \& Gold': [
                  'Bandit', 'Bureaucrat', 'Chapel', 'Harbinger', 'Laboratory', 'Merchant', 'Mine', 'Moneylender', 'Throne Room', 'Vassal'
              ]}
          ]
      }
  ];
  /* ------------------------------------------------------------------------------- */
  
  // Global variables
  var inLobbyFlag = false;
  var cardNumber = 0;
  
  
  (function() {
      'use strict';
  	waitMatchLobby(2500);
  })();
  
  function waitMatchLobby(checkFrequencyInMs) {
    (function loopSearch() {
      if (document.evaluate(
  			'//button[contains(@class, \'kingdom-selection\') and contains(@ng-click, \'$ctrl.showKingdomSelection()\')]',
  			document.body, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) {
        loadMatchButtons();
        inLobbyFlag = true;
  	  setTimeout(function () {
          loopSearch();
        }, 10000);
      } else {
        inLobbyFlag = false;
        cardNumber = 0;
        setTimeout(function () {
          loopSearch();
        }, 2500);
      }
    })();
  }
  
  function loadMatchButtons() {
      if(inLobbyFlag) return; // Already loaded
  
  	console.log("Loading Sets of 10...");
  
      let rulesEditor = document.querySelector('.rules-editor');
  
      for (let sets = 0; sets < cardsSets.length; sets+=1) {
  
          // Loading Header...
          let lineBreak = document.createElement('br');
          rulesEditor.appendChild(lineBreak);
          let h = document.createElement("h2");
          let t = document.createTextNode(cardsSets[sets].name);
          h.appendChild(t);
          rulesEditor.appendChild(h);
  
          // Loading Buttons
          let button;
          let buttonText;
          for (let i = 0; i < cardsSets[sets].sets.length; i+=1) {
              button = document.createElement('button');
              button.classList.add('lobby-button');
              button.onclick = function(){
                  setTimeout(loadMatch(cardsSets[sets].sets[i]), 1000);
              };
  
              buttonText = document.createTextNode(Object.getOwnPropertyNames(cardsSets[sets].sets[i]).toLocaleString());
              button.appendChild(buttonText);
              rulesEditor.appendChild(button);
          }
      }
  }
  
  function loadMatch(selectedMatch) {
      console.log('Load cards for ' + Object.getOwnPropertyNames(selectedMatch).toLocaleString());
  
      document.evaluate('//button[contains(@class, \'lobby-button\') and contains(@ng-click, \'$ctrl.showKingdomSelection()\')]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();
  
      document.body.style.cursor='progress';
      // Print waiting...
      let selectedCardsDiv = document.querySelector('.kingdom-choices');
      let loadingCardsEl = document.createElement("p");
      loadingCardsEl.style.color = "#FFFFFF";
      let loadingCardsText = document.createTextNode('Loading Cards');
      loadingCardsEl.appendChild(loadingCardsText);
      selectedCardsDiv.insertBefore(loadingCardsEl, selectedCardsDiv.firstChild);
  
      waitCardsLoadThenPickCards(500, selectedMatch, loadingCardsEl);
  }
  
  
  function waitCardsLoadThenPickCards(checkFrequencyInMs, selectedMatch, loadingCardsEl) {
    (function loopSearch() {
      let currentNumber = document.evaluate('//div[contains(@class, \'mini-card\')]', document.body, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength;
  
      if (currentNumber > cardNumber) { // waiting page finish load
          cardNumber = currentNumber;
          setTimeout(function () {
              loopSearch();
          }, checkFrequencyInMs);
      } else if (currentNumber != 0 && currentNumber == cardNumber) { // page load all cards
          document.body.style.cursor='auto';
          pickCards(selectedMatch);
          return;
      } else { // not loading ?
        if (cardNumber <= 5) {
            console.error('Sorry, there is a script error or the page does not load cards...')
            return; // Break loop
        }
        cardNumber -= 1;
        console.info('Waiting page to load...');
        loadingCardsEl.innerText += '.';
        setTimeout(function () {
          loopSearch();
        }, checkFrequencyInMs);
      }
    })();
  }
  
  function pickCards(selectedMatch) {
      console.log('Cards are loaded, pickings....');
      let cards = selectedMatch[Object.getOwnPropertyNames(selectedMatch)];
  
      // Clear previous selected cards
      document.querySelector('.clear-kingdom').click()
  
      // Pick Cards
      for (let c = 0; c < cards.length; c+=1) {
          pickCard(cards[c]);
      }
  
      // Push Done
      document.evaluate('//input[contains(@class, \'lobby-button close\')]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();
  }
  
  function pickCard(cardName) {
      console.log("Picking " + cardName);
      let kebabCaseCardName = cardName.replaceAll(' ','-').replaceAll('\'','').toLowerCase();
  
      if (cardName == 'Random') {
          document.evaluate('//selection-set', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();
      }
  
      let miniCards = document.querySelectorAll('.mini-card');
      for(let i=0; i < miniCards.length; i++) {
          let miniCard = miniCards[i];
          // find mini-card-art
          for (let j=0; j < miniCard.childElementCount; j++) {
              let miniCardImage = miniCard.children[j];
              if (miniCard.children[1].classList.value == "mini-card-art") {
                  if (miniCard.children[1].style.backgroundImage.includes(kebabCaseCardName)) {
                      miniCards[i].click();
                  }
                  break;
              }
          }
      }
  }
  