Complete Your Set - Steam Forum Trading Helper

Automatically detects missing cards from a card set, help you auto fill in info New Trading Thread input area

目前為 2018-05-27 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Complete Your Set - Steam Forum Trading Helper
// @icon         https://store.steampowered.com/favicon.ico
// @namespace    https://github.com/tkhquang
// @version      0.4
// @description  Automatically detects missing cards from a card set, help you auto fill in info New Trading Thread input area
// @author       Aleks
// @license      MIT; https://raw.githubusercontent.com/tkhquang/userscripts/master/LICENSE
// @homepage     https://greasyfork.org/en/scripts/368518-complete-your-set-steam-forum-trading-helper/
// @match        *://steamcommunity.com/*/*/gamecards/*
// @match        *://steamcommunity.com/app/*/tradingforum/*
// @match        *://steamcommunity.com/app/*/tradingforum
// @run-at       document-idle
// @grant        none
// ==/UserScript==

var tradeTag = 2;
//1 = #Number of Set in Title
//2 = Card Name in Title
//Default is 2
var tradeMode = 0;
//0 - List both Owned and Unonwed Cards
//1 - Only List Owned Cards
//2 - Only List Unowned Cards
//Default is 0
var badgeMode = 1;
//0 - Don't check for number of cards to full set, this is more like a cards lister
//1 - Only check for game set that you have enough cards to make it full
//2 - Complete your remaining set
//Default is 1
var badgeNumSet = 0;
//0 - Don't set a target number of Card Sets
//Others - Set a target number for Card Sets - This will also set 'badgeMode = 2'
//Default is 0
var customBody = "\n[1:1] Trading";
var customTitle = " [1:1]";
var haveListText = "[H]\n";
var wantListText = "[W]\n";
var haveListTextTitle = "[H] ";
var wantListTextTitle = "[W] ";

//Functions

var owned = [];
function getOwnedCards() {
    let ownedCards = document.querySelectorAll(".badge_card_set_card.owned");
    for (let i=0; i < ownedCards.length; i++) {
        owned[i] = ownedCards[i].innerText;
        owned[i] = owned[i].replace(/ of .*/,"").split(/\n/);
    }
    //console.log(owned);
}

var unowned = [];
function getUnownedCards() {
    let unownedCards = document.querySelectorAll(".badge_card_set_card.unowned");
    for (let i=0; i < unownedCards.length; i++) {
        unowned[i] = unownedCards[i].innerText;
        unowned[i] = unowned[i].replace(/ of .*/,"").split(/\n/);
        unowned[i].splice(0, 0, "(0)");
    }
    //console.log(unowned);
}

var allCards = [];
function getAllCards() {
    allCards = owned.concat(unowned);
    //console.log(allCards);
    getTotal();
}

var totalCards = [];
var total = 0;
function getTotal() {
    for (let i=0; i < allCards.length; i++) {
        let curCard = allCards[i];
        totalCards.push(curCard[0].match(/\d+/));
        total += Number(totalCards[i]);
    }
    //console.log(totalCards);
    console.log("Number of cards you've owned: " + total);
    badgeCheck();
}

var badgeNum;
function badgeCheck() {
    if (badgeNumSet !== 0) {
        badgeMode = 2;
        badgeNum = badgeNumSet;
        console.log("Target Set :"+badgeNumSet);
    }
    else {
        switch(badgeMode) {
            case 0:
                badgeNum = 0;
                break;
            case 1:
                badgeNum = Math.floor(total / allCards.length);
                console.log("Your cards are enough to craft " + badgeNum + " badge(s)");
                break;
            case 2:
                var remainSet = (total / allCards.length !== 1) ? true : false;
                if (remainSet === true) {
                    badgeNum = Math.floor(total / allCards.length + 1);
                    console.log("You need some cards to complete your remaining set\nTotal: "+badgeNum);
                }
                if (remainSet === false) {
                    badgeNum = Math.floor(total / allCards.length);
                }
                break;
        }
    }
    function tradeNeed(value) {
        let tradeCheck = false;
        for (let i=0; i < allCards.length; i++) {
            if (totalCards[i] < badgeNum) {
                tradeCheck = true;
                break;
            }
        }
        return tradeCheck === value;
    }
    if (badgeMode !==0 && tradeNeed(false)) {
        console.log("You don't need to do trading for now");
        return;
    }
    console.log("You can visit trading forum to complete your sets");
    calcTrade();
    getGameId();
    //if (!document.querySelector(".badge_card_to_collect_info")) getGameId();
}

var haveList = [];
var wantList = [];
function calcTrade() {
    let dupCards;
    let needCards;
    for (let i=0; i < allCards.length; i++) {
        if (totalCards[i] > badgeNum) {
            let curCard = allCards[i];
            if (badgeMode !== 0) dupCards = totalCards[i] - badgeNum;
            if (badgeMode === 0) dupCards = Number(totalCards[i]);
            haveList.push([
                dupCards,
                curCard[2],
                curCard[1]
            ]);
        }
        if (totalCards[i] < badgeNum||badgeMode === 0&&totalCards[i]==badgeNum) {
            let curCard = allCards[i];
            if (badgeMode !== 0) needCards = badgeNum - totalCards[i];
            if (badgeMode === 0) needCards = Number(totalCards[i]);
            wantList.push([
                needCards,
                curCard[2],
                curCard[1]
            ]);
        }
    }
    //console.log(haveList); console.log(wantList);
    createText();
}

function createText() {
    for (let i=0; i < haveList.length; i++) {
        if (tradeMode !== 2 && haveList.length > 0) {
            let dup = haveList[i];
            haveListText += dup[1] + " - " + dup[2] + " - x" + dup[0] + "\n";
            haveListTextTitle += dup[tradeTag] + " (x" + dup[0] + "), ";
        }
    }
    for (let i=0; i < wantList.length; i++) {
        if (tradeMode !== 1 && wantList.length > 0) {
            let need = wantList[i];
            wantListText += need[1] + " - " + need[2] + " - x" + need[0] + "\n";
            wantListTextTitle += need[tradeTag] + " (x" + need[0] + "), ";
        }
    }
    haveListTextTitle = haveListTextTitle.replace(/\), $/, ") ");
    wantListTextTitle = wantListTextTitle.replace(/\), $/, ")");
    window.localStorage.cardTrade = JSON.stringify([
        haveListText+"\n"+wantListText,
        haveListTextTitle + wantListTextTitle
    ]);
}

var tradeForum;
function getGameId() {
    let gameId = window.location.pathname.split("/")[4];
    tradeForum = "https://steamcommunity.com/app/" + gameId + "/tradingforum/";
    //console.log("Game ID: " + gameId); console.log(tradeForum);
    createButton();
}

function inTrade() {
    if (document.querySelector(".btn_darkblue_white_innerfade.btn_medium.responsive_OnClickDismissMenu") === null) {
        console.log("CYS - Something is wrong, have you logged in?");
    }
    if (!window.localStorage.cardTrade) return;
    document.querySelector(".btn_darkblue_white_innerfade.btn_medium.responsive_OnClickDismissMenu").click();
    document.querySelector(".forumtopic_reply_textarea").textContent = JSON.parse(localStorage.cardTrade)[0] + customBody;
    document.querySelector(".forum_topic_input").value = JSON.parse(localStorage.cardTrade)[1] + customTitle;
}

function createButton() {
    var a = document.createElement("a");
    a.className = "btn_grey_grey btn_medium";
    a.href = tradeForum;
    a.innerHTML = "<span>Visit Trading Forum</span>";
    document.querySelector(".gamecards_inventorylink").appendChild(a);
}

function configCheck(value) {
    var numChecks = [
        !Number.isInteger(tradeTag),
        !Number.isInteger(tradeMode),
        !Number.isInteger(badgeMode),
        !Number.isInteger(badgeNumSet),
        tradeTag < 1 || tradeTag > 2,
        tradeMode < 0 || tradeMode > 2,
        badgeMode < 0 || badgeMode > 2,
        badgeNumSet < 0];
    return numChecks.some(function(config) {
        return config === value;
    });
}

(function() {
    "use strict";

    if (configCheck(true)) {
        alert("CYS - Invalid Config Settings\nPlease Check Again!");
        return;
    }
    if (/gamecards/.test(window.location.pathname) === true) {
        if (document.querySelector(".gamecards_inventorylink") === null) return;
        if (window.localStorage.cardTrade) {
            window.localStorage.removeItem("cardTrade");
            console.log("CYS - Local Storage Cleared");
        }
        getOwnedCards();
        getUnownedCards();
        setTimeout(getAllCards, 1000);
    }
    if (/gamecards/.test(document.referrer)) {
        setTimeout(inTrade, 2000);
    }
})();