function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
// ==UserScript==
// @name Steam Bundle Sites Extension
// @homepage https://github.com/clancy-chao/Steam-Bundle-Sites-Extension
// @namespace http://tampermonkey.net/
// @version 2.14.2
// @description A steam bundle sites' tool kits.
// @icon http://store.steampowered.com/favicon.ico
// @author Bisumaruko, Cloud
// @include http*://store.steampowered.com/*
// @include https://www.indiegala.com/gift*
// @include https://www.indiegala.com/profile*
// @include https://www.indiegala.com/game*
// @include https://www.fanatical.com/*
// @include https://www.humblebundle.com/*
// @include http*://*dailyindiegame.com/*
// @include http*://www.ccyyshop.com/order/*
// @include https://groupees.com/purchases
// @include https://groupees.com/profile/purchases/*
// @include http*://*agiso.com/*
// @include https://steamdb.steamcn.com/tooltip*
// @include https://yuplay.ru/orders/*/
// @include https://yuplay.ru/product/*/
// @include http*://gama-gama.ru/personal/settings/*
// @include http*://*plati.ru/seller/*
// @include http*://*plati.market/seller/*
// @include http*://*plati.ru/cat/*
// @include http*://*plati.market/cat/*
// @exclude http*://store.steampowered.com/widget/*
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/7.18.0/sweetalert2.min.js
// @resource sweetalert2CSS https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/7.18.0/sweetalert2.min.css
// @resource currencyFlags https://cdnjs.cloudflare.com/ajax/libs/currency-flags/1.5.0/currency-flags.min.css
// @resource flagIcon https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.1.0/css/flag-icon.min.css
// @connect store.steampowered.com
// @connect www.google.com
// @connect www.google.com.tw
// @connect www.google.com.au
// @connect www.google.co.jp
// @connect www.google.co.nz
// @connect www.google.co.uk
// @connect www.google.ca
// @connect www.google.de
// @connect www.google.it
// @connect www.google.fr
// @connect www.ecb.europa.eu
// @connect steamdb.steamcn.com
// @connect steamdb.info
// @connect steamspy.com
// @connect github.com
// @connect localhost
// @connect 127.0.0.1
// @connect *
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant unsafeWindow
// @run-at document-start
// @downloadURL none
// ==/UserScript==
/* global swal */
// inject external css styles
GM_addStyle(GM_getResourceText('sweetalert2CSS'));
GM_addStyle(GM_getResourceText('currencyFlags'));
GM_addStyle(GM_getResourceText('flagIcon').replace(/\.\.\//g, 'https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.1.0/')); // inject script css styles
GM_addStyle(`
pre.SBSE-errorMsg { height: 200px; text-align: left; white-space: pre-wrap; }
a.SBSE-link-steam_store, a.SBSE-link-steam_db { text-decoration: none; font-size: smaller; }
a.SBSE-link-steam_store:hover, a.SBSE-link-steam_db:hover { text-decoration: none; }
/* switch */
.SBSE-switch { position: relative; display: inline-block; width: 60px; height: 30px; }
.SBSE-switch input { display: none; }
.SBSE-switch__slider {
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
background-color: #CCC;
transition: 0.4s;
cursor: pointer;
}
.SBSE-switch__slider:before {
width: 26px; height: 26px;
position: absolute;
bottom: 2px; left: 2px;
background-color: white;
transition: 0.4s;
content: "";
}
.SBSE-switch input:checked + .SBSE-switch__slider { background-color: #2196F3; }
.SBSE-switch input:focus + .SBSE-switch__slider { box-shadow: 0 0 1px #2196F3; }
.SBSE-switch input:checked + .SBSE-switch__slider:before { transform: translateX(30px); }
.SBSE-switch--small { width: 40px; height: 20px; }
.SBSE-switch--small .SBSE-switch__slider:before { width: 16px; height: 16px; }
.SBSE-switch--small input:checked + .SBSE-switch__slider:before { transform: translateX(20px); }
/* dropdown */
.SBSE-dropdown { display: inline-block; position: relative; }
.SBSE-dropdown__list {
width: calc(100% - 10px);
max-height: 0;
display: inline-block;
position: absolute;
top: 35px; left: 0;
padding: 0;
transition: max-height 0.5s ease;
overflow: hidden;
list-style-type: none;
background-color: #EEE;
}
.SBSE-dropdown__list > li { width: 100%; display: block; padding: 3px 0; text-align: center; }
.SBSE-dropdown:hover > .SBSE-dropdown__list { max-height: 500px; }
/* settings */
.SBSE-container__content__model[data-feature="setting"] .name { text-align: right; vertical-align: top; }
.SBSE-container__content__model[data-feature="setting"] .value { text-align: left; }
.SBSE-container__content__model[data-feature="setting"] .value > * { height: 30px; margin: 0 20px 10px; }
.SBSE-container__content__model[data-feature="setting"] > span { display: inline-block; color: white; cursor: pointer; }
/* container */
.SBSE-container { width: 100%; }
.SBSE-container__nav > ul { display: flex; margin: 0; padding: 0; list-style: none; }
.SBSE-container__nav__item {
flex: 1 1 auto;
text-align: center;
cursor: pointer;
}
.SBSE-container__nav__item--show {
border-bottom: 1px solid #29B6F6;
color: #29B6F6;
}
.SBSE-container__nav__item > span { display: block; padding: 10px; }
.SBSE-container__content__model {
width: 100%; height: 200px;
display: flex;
margin-top: 10px;
flex-direction: column;
box-sizing: border-box;
}
.SBSE-container__content__model { display: none; }
.SBSE-container__content__model[data-feature="setting"] { height: 100%; display: block; }
.SBSE-container__content__model--show { display: block; }
.SBSE-container__content__model > textarea {
width: 100%; height: 150px;
padding: 5px;
border: none;
box-sizing: border-box;
resize: none;
outline: none;
}
.SBSE-container__content__model > div { width: 100%; padding-top: 5px; box-sizing: border-box; }
.SBSE-button {
width: 120px;
position: relative;
margin-right: 10px;
line-height: 28px;
transition: all 0.5s;
box-sizing: border-box;
outline: none;
cursor: pointer;
}
.SBSE-select { max-width:120px; height: 30px; }
.SBSE-container label { margin-right: 10px; }
.SBSE-dropdown__list-export a { text-decoration: none; color: #333; transition: color 0.3s ease; }
.SBSE-dropdown__list-export a:hover { text-decoration: none; color: #787878; }
.SBSE-button-setting {
width: 20px; height: 20px;
float: right;
margin-top: 3px; margin-right: 0; margin-left: 10px;
background-color: transparent;
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iMzJweCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzIgMzI7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMiAzMiIgd2lkdGg9IjMycHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIGlkPSJMYXllcl8xIi8+PGcgaWQ9ImNvZyI+PHBhdGggZD0iTTMyLDE3Ljk2OXYtNGwtNC43ODEtMS45OTJjLTAuMTMzLTAuMzc1LTAuMjczLTAuNzM4LTAuNDQ1LTEuMDk0bDEuOTMtNC44MDVMMjUuODc1LDMuMjUgICBsLTQuNzYyLDEuOTYxYy0wLjM2My0wLjE3Ni0wLjczNC0wLjMyNC0xLjExNy0wLjQ2MUwxNy45NjksMGgtNGwtMS45NzcsNC43MzRjLTAuMzk4LDAuMTQxLTAuNzgxLDAuMjg5LTEuMTYsMC40NjlsLTQuNzU0LTEuOTEgICBMMy4yNSw2LjEyMWwxLjkzOCw0LjcxMUM1LDExLjIxOSw0Ljg0OCwxMS42MTMsNC43MDMsMTIuMDJMMCwxNC4wMzF2NGw0LjcwNywxLjk2MWMwLjE0NSwwLjQwNiwwLjMwMSwwLjgwMSwwLjQ4OCwxLjE4OCAgIGwtMS45MDIsNC43NDJsMi44MjgsMi44MjhsNC43MjMtMS45NDVjMC4zNzksMC4xOCwwLjc2NiwwLjMyNCwxLjE2NCwwLjQ2MUwxNC4wMzEsMzJoNGwxLjk4LTQuNzU4ICAgYzAuMzc5LTAuMTQxLDAuNzU0LTAuMjg5LDEuMTEzLTAuNDYxbDQuNzk3LDEuOTIybDIuODI4LTIuODI4bC0xLjk2OS00Ljc3M2MwLjE2OC0wLjM1OSwwLjMwNS0wLjcyMywwLjQzOC0xLjA5NEwzMiwxNy45Njl6ICAgIE0xNS45NjksMjJjLTMuMzEyLDAtNi0yLjY4OC02LTZzMi42ODgtNiw2LTZzNiwyLjY4OCw2LDZTMTkuMjgxLDIyLDE1Ljk2OSwyMnoiIHN0eWxlPSJmaWxsOiM0RTRFNTA7Ii8+PC9nPjwvc3ZnPg==);
background-size: contain;
background-repeat: no-repeat;
background-origin: border-box;
border: none;
vertical-align: top;
cursor: pointer;
}
/* terminal */
.SBSE-terminal {
height: 150px;
display: none;
margin: 0;
padding: 0;
background-color: #000;
}
.SBSE-terminal--show { display: block; }
.SBSE-terminal > div {
max-height: 100%;
display: flex;
flex-direction: column;
overflow: auto;
background-color: transparent;
}
.SBSE-terminal > div > span {
display: inline-block;
padding-left: 20px;
color: #FFF;
text-indent: -20px;
}
.SBSE-terminal > div > span:before {
content: '>';
width: 20px;
display: inline-block;
text-align: center;
text-indent: 0;
}
.SBSE-terminal__message {}
.SBSE-terminal__input {
width: 100%;
position: relative;
order: 9999;
box-sizing: border-box;
}
.SBSE-terminal__input > input {
width: inherit;
max-width: calc(100% - 30px);
position: absolute;
top: 0; right: 0; bottom: 0; left: 20px;
padding: 0;
border: none;
outline: none;
background-color: transparent;
color: #FFF;
}
.SBSE-terminal__input > input:first-child { z-index: 9; }
.SBSE-terminal__input > input:last-child {
z-index: 3;
color: gray;
}
/* spinner button affect */
.SBSE-button:before {
width: 20px; height: 20px;
content: '';
position: absolute;
margin-top: 5px;
right: 10px;
border: 3px solid;
border-left-color: transparent;
border-radius: 50%;
box-sizing: border-box;
opacity: 0;
transition: opacity 0.5s;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-name: rotate;
animation-timing-function: linear;
}
.SBSE-button.SBSE-button--narrow.SBSE-button--working {
width: 100px;
padding-right: 40px;
transition: all 0.5s;
}
.SBSE-button.SBSE-button--working:before {
transition-delay: 0.5s;
transition-duration: 1s;
opacity: 1;
}
@keyframes rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* types */
.SBSE-type {
height: 20px;
display: none;
margin-right: 5px;
justify-content: center;
}
.SBSE-type:before, .SBSE-type:after {
content: '';
box-sizing: border-box;
pointer-events: none;
}
.SBSE-type:after { padding: 0 2px; }
.SBSE-item--game .SBSE-type { background-color: rgba(97,100,101,0.3); }
.SBSE-item--game .SBSE-type:after { content: 'Game'; }
.SBSE-item--DLC .SBSE-type { background-color: rgba(165,84,177,0.8); }
.SBSE-item--DLC .SBSE-type:before {
content: 'ꜜ';
width: 14px; height: 14px;
margin: 3px 0 0 2px;
border-radius: 50%;
background-color: #000;
color: rgba(165,84,177,0.8);
text-align: center;
font-size: 28px;
line-height: 28px;
}
.SBSE-item--DLC .SBSE-type:after { content: 'DLC'; }
.SBSE-item--package .SBSE-type { background-color: rgba(47,137,188,0.8); }
.SBSE-item--package .SBSE-type:after { content: 'Package'; }
.SBSE-item--steam .SBSE-type { display: flex; }
/* icons */
.SBSE-icon {
width: 20px; height: 20px;
display: none;
margin-left: 5px;
border-radius: 50%;
background-color: #E87A90;
transform: rotate(45deg);
}
.SBSE-icon:before, .SBSE-icon:after {
content: '';
width: 3px; height: 14px;
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
background-color: white;
border-radius: 5px;
pointer-events: none;
}
.SBSE-icon:after { transform: translate(-50%, -50%) rotate(-90deg); }
.SBSE-item--owned .SBSE-icon { background-color: #9CCC65; }
.SBSE-item--owned .SBSE-icon:before, .SBSE-item--owned .SBSE-icon:after { transform: none; }
.SBSE-item--owned .SBSE-icon:before {
width: 3px; height: 11px;
top: 4px; left: 10px;
border-radius: 5px 5px 5px 0;
}
.SBSE-item--owned .SBSE-icon:after {
width: 5px; height: 3px;
top: 12px; left: 6px;
border-radius: 5px 0 0 5px;
}
.SBSE-item--wished .SBSE-icon { transform: rotate(0); background-color: #29B6F6; }
.SBSE-item--wished .SBSE-icon:before, .SBSE-item--wished .SBSE-icon:after {
width: 6px; height: 10px;
top: 5px; left: 10px;
border-radius: 6px 6px 0 0;
transform: rotate(-45deg);
transform-origin: 0 100%;
}
.SBSE-item--wished .SBSE-icon:after {
left: 4px;
transform: rotate(45deg);
transform-origin :100% 100%;
}
.SBSE-item--ignored .SBSE-icon { background-color: rgb(135, 173, 189); }
.SBSE-item--notApplicable .SBSE-icon { transform: rotate(0); background-color: rgb(248, 187, 134); }
.SBSE-item--notApplicable .SBSE-icon:before {
content: '?';
width: 0; height: 10px;
top: 5px; left: 7px;
color: white;
font-size: 16px; font-weight: 900;
}
.SBSE-item--notApplicable .SBSE-icon:after { display: none; }
.SBSE-item--fetching .SBSE-icon { transform: rotate(0); background-color: transparent; }
.SBSE-item--fetching .SBSE-icon:before {
width: 20px; height: 20px;
top: 0; left: 0;
border: 3px solid grey;
border-left-color: transparent;
border-radius: 50%;
box-sizing: border-box;
transition: opacity 0.5s;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-name: rotate;
animation-timing-function: linear;
}
.SBSE-item--fetching .SBSE-icon:after { display: none; }
.SBSE-item--notFetched .SBSE-icon { background-color: transparent; }
.SBSE-item--notFetched .SBSE-icon:before, .SBSE-item--notFetched .SBSE-icon:after { display: none; }
.SBSE-item--failed .SBSE-icon { transform: rotate(0); }
.SBSE-item--failed .SBSE-icon:before {
content: '!';
width: 0; height: 10px;
top: 5px; left: 8.5px;
color: white;
font-size: 16px; font-weight: 900;
}
.SBSE-item--failed .SBSE-icon:after { display: none; }
.SBSE-item--steam .SBSE-icon { display: inline-block; }
/* Steam Tooltip */
.SBSE-tooltip {
width: 308px;
display: none;
position: fixed;
overflow: hidden;
background: url(https://steamstore-a.akamaihd.net/public/images/v6/blue_body_darker_repeat.jpg) -700px center repeat-y scroll rgb(0, 0, 0);
border: 0;
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
transition: all 0.5s;
z-index: 999;
}
.SBSE-tooltip--show{ display: block; }
/* Tooltip */
[tooltip]::before, [tooltip]::after {
position: absolute;
opacity: 0;
transition: all 0.15s ease;
}
[tooltip]::before {
width: max-content;
content: attr(tooltip);
top: calc(100% + 10px); left: 0;
padding: 10px;
color: #4a4c45;
background-color: white;
border-radius: 3px;
box-shadow: 1px 2px 3px rgba(0,0,0,0.45);
}
[tooltip]::after {
content: "";
top: calc(100% + 5px); left: 10px;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-bottom: 5px solid white;
}
[tooltip]:hover::before, [tooltip]:hover::after { opacity: 1; }
[tooltip]:not([tooltip-persistent])::before, [tooltip]:not([tooltip-persistent])::after { pointer-events: none; }
`); // load up
const regURL = /(https?:\/\/)?([.\w]*steam[-.\w]*){1}\/.*?(apps?|subs?){1}\/(\d+){1}(\/.*\/?)?/m;
const regKey = /(?:(?:([A-Z0-9])(?!\1{4})){5}-){2,5}[A-Z0-9]{5}/g;
const eol = "\n";
const tab = "\t";
const has = Object.prototype.hasOwnProperty;
const forEachAsync = (array, callback, lastIterationCallback) => {
if (!Array.isArray(array)) throw Error('Not an array');
if (typeof callback !== 'function') throw Error('Not an function');
const iterators = [...array.keys()];
const processor = taskStartTime => {
let taskFinishTime;
do {
const iterator = iterators.shift();
if (iterator in array) callback(array[iterator], iterator, array);
taskFinishTime = window.performance.now();
} while (taskFinishTime - taskStartTime < 1000 / 60);
if (iterators.length > 0) requestAnimationFrame(processor); // finished iterating array
else if (typeof lastIterationCallback === 'function') lastIterationCallback();
};
requestAnimationFrame(processor);
};
const unique = a => [...new Set(a)];
const isArray = value => Array.isArray(value);
const isObject = value => Object(value) === value;
const request = options => new Promise((resolve, reject) => {
options.onerror = reject;
options.ontimeout = reject;
options.onload = resolve;
GM_xmlhttpRequest(options);
}); // setup jQuery
const $ = jQuery.noConflict(true);
$.fn.pop = [].pop;
$.fn.shift = [].shift;
$.fn.eachAsync = function eachAsync(callback, lastIterationCallback) {
forEachAsync(this.get(), callback, lastIterationCallback);
};
const config = {
data: JSON.parse(GM_getValue('SBSE_config', '{}')),
set(key, value, callback) {
this.data[key] = value;
GM_setValue('SBSE_config', JSON.stringify(this.data));
if (typeof callback === 'function') callback();
},
get(key) {
return has.call(this.data, key) ? this.data[key] : null;
},
init() {
if (!has.call(this.data, 'autoUpdateSessionID')) this.data.autoUpdateSessionID = true;
if (!has.call(this.data, 'autoSyncLibrary')) this.data.autoSyncLibrary = true;
if (!has.call(this.data, 'ASFFormat')) this.data.ASFFormat = false;
if (!has.call(this.data, 'titleComesLast')) this.data.titleComesLast = false;
if (!has.call(this.data, 'activateAllKeys')) this.data.activateAllKeys = false;
if (!has.call(this.data, 'enableTooltips')) this.data.enableTooltips = this.get('language') !== 'english';
if (!has.call(this.data, 'enableASFIPC')) this.data.enableASFIPC = false;
if (!has.call(this.data, 'ASFWSProtocol')) this.data.ASFWSProtocol = 'ws';
if (!has.call(this.data, 'ASFIPCProtocol')) this.data.ASFIPCProtocol = 'http';
if (!has.call(this.data, 'ASFIPCServer')) this.data.ASFIPCServer = '127.0.0.1';
if (!has.call(this.data, 'ASFIPCPort')) this.data.ASFIPCPort = 1242;
if (!has.call(this.data, 'ASFIPCPassword')) this.data.ASFIPCPassword = '';
}
};
const i18n = {
data: {
tchinese: {
name: '繁體中文',
updateSuccessTitle: '更新成功!',
updateSuccess: '成功更新Steam sessionID',
successStatus: '成功',
successTitle: '好極了!',
successDetail: '無資料',
skippedStatus: '跳過',
activatedDetail: '已啟動',
loadingSuccess: '加載完成!',
failStatus: '失敗',
failTitle: '糟糕!',
failDetailUnexpected: '發生未知錯誤,請稍後再試',
failDetailInvalidKey: '序號錯誤',
failDetailUsedKey: '序號已被使用',
failDetailRateLimited: '啟動受限',
failDetailCountryRestricted: '地區限制',
failDetailAlreadyOwned: '產品已擁有',
failDetailMissingBaseGame: '未擁有主程式',
failDetailPS3Required: '需要PS3 啟動',
failDetailGiftWallet: '偵測到禮物卡/錢包序號',
failDetailParsingFailed: '處理資料發生錯誤,請稍後再試',
failDetailRequestFailedNeedUpdate: '請求發生錯誤,請稍後再試
或者嘗試更新SessionID',
noItemDetails: '無產品詳細資料',
notLoggedInTitle: '未登入',
notLoggedInMsg: '請登入Steam 以讓腳本紀錄SessionID',
missingTitle: '未發現SessionID',
missingMsg: '請問要更新SessionID 嗎?',
emptyInput: '未發現Steam 序號',
settingsTitle: '設定',
settingsAutoUpdateSessionID: '自動更新SessionID',
settingsSessionID: '我的SessionID',
settingsAutoSyncLibrary: '自動同步Steam 遊戲庫',
settingsSyncLibrary: '同步遊戲庫',
settingsSyncLibraryButton: '同步',
settingsLanguage: '語言',
settingsASFFormat: '啟用ASF 格式',
settingsTitleComesLast: '遊戲名置後',
settingsActivateAllKeys: '不跳過、啟動所有序號',
settingsEnableTooltips: 'SteamCN 論壇提示框',
settingsEnableASFIPC: '啟用ASF IPC',
settingsASFWSProtocol: 'ASF WS 傳輸協定',
settingsASFIPCProtocol: 'ASF IPC 傳輸協定',
settingsASFIPCServer: 'ASF IPC IP位址',
settingsASFIPCPort: 'ASF IPC 連接埠',
settingsASFIPCPassword: 'ASF IPC 密碼',
HBAlreadyOwned: '遊戲已擁有',
HBRedeemAlreadyOwned: '確定刮開 %title% Steam 序號?',
steamStore: 'Steam 商店',
HBActivationRestrictions: '啟動限制',
HBDisallowedCountries: '限制以下地區啟動',
HBExclusiveCountries: '僅限以下地區啟動',
HBCurrentLocation: '當前位於:',
DIGMenuPurchase: '購買',
DIGMenuSelectAll: '全選',
DIGMenuSelectCancel: '取消',
DIGButtonPurchasing: '購買中',
DIGInsufficientFund: '餘額不足',
DIGFinishedPurchasing: '購買完成',
DIGMarketSearchResult: '目前市集上架中',
DIGRateAllPositive: '全部好評',
DIGClickToHideThisRow: '隱藏此上架遊戲',
DIGCurrentBalance: '當前餘額:',
DIGEditBalance: '更新DIG 錢包餘額',
DIGPoint: 'DIG 點數',
DIGTotalAmount: '購買總額:',
buttonReveal: '刮開',
buttonRetrieve: '提取',
buttonActivate: '啟動',
buttonCopy: '複製',
buttonReset: '清空',
buttonExport: '匯出',
buttonCommands: '指令',
buttonLog: '日誌',
checkboxIncludeGameTitle: '遊戲名',
checkboxJoinKeys: '合併',
checkboxSkipUsed: '跳過已使用',
checkboxMarketListings: '上架於市集',
selectFilterAll: '選取全部',
selectFilterOwned: '選取已擁有',
selectFilterNotOwned: '選取未擁有',
selectConnector: '至',
markAllAsUsed: '標記全部已使用',
syncSuccessTitle: '同步成功',
syncSuccess: '成功同步Steam 遊戲庫資料',
syncFailTitle: '同步失敗',
syncFail: '失敗同步Steam 遊戲庫資料',
visitSteam: '前往Steam',
lastSyncTime: '已於%seconds% 秒前同步收藏庫',
game: '遊戲',
dlc: 'DLC',
package: '合集',
bundle: '組合包',
owned: '已擁有',
wished: '於願望清單',
ignored: '已忽略',
notOwned: '未擁有',
notApplicable: '無資料',
notFetched: '未檢查',
enablePlatiFeature: '啟用腳本',
platiFetchOnStart: '自動檢查',
platiInfiniteScroll: '自動換頁',
platiFetchButton: '檢查',
platiFilterType: '顯示類型',
platiFilterStatus: '顯示狀態'
},
schinese: {
name: '简体中文',
updateSuccessTitle: '更新成功',
updateSuccess: '成功更新Steam sessionID',
successStatus: '成功',
successTitle: '好极了!',
successDetail: '无信息',
activatedDetail: '已激活',
loadingSuccess: '加载完成!',
skippedStatus: '跳过',
failStatus: '失败',
failTitle: '糟糕!',
failDetailUnexpected: '发生未知错误,请稍后再试',
failDetailInvalidKey: '激活码错误',
failDetailUsedKey: '激活码已被使用',
failDetailRateLimited: '激活受限',
failDetailCountryRestricted: '地区限制',
failDetailAlreadyOwned: '产品已拥有',
failDetailMissingBaseGame: '未拥有基础游戏',
failDetailPS3Required: '需要PS3 激活',
failDetailGiftWallet: '侦测到礼物卡/钱包激活码',
failDetailParsingFailed: '处理资料发生错误,请稍后再试',
failDetailRequestFailedNeedUpdate: '请求发生错误,请稍后再试
或者尝试更新SessionID',
noItemDetails: '无产品详细信息',
notLoggedInTitle: '未登入',
notLoggedInMsg: '请登入Steam 以让脚本记录SessionID',
missingTitle: '未发现SessionID',
missingMsg: '请问要更新SessionID 吗?',
emptyInput: '未批配到Steam 激活码',
settingsTitle: '设置',
settingsAutoUpdateSessionID: '自动更新SessionID',
settingsSessionID: '我的SessionID',
settingsAutoSyncLibrary: '自动同步Steam 游戏库',
settingsSyncLibrary: '同步游戏库',
settingsSyncLibraryButton: '同步',
settingsLanguage: '语言',
settingsASFFormat: '启用ASF 格式',
settingsTitleComesLast: '游戏名置后',
settingsActivateAllKeys: '不跳过、激活所有激活码',
settingsEnableTooltips: 'SteamCN 论坛提示窗',
settingsEnableASFIPC: '启用ASF IPC',
settingsASFWSProtocol: 'ASF WS 传输协议',
settingsASFIPCProtocol: 'ASF IPC 传输协议',
settingsASFIPCServer: 'ASF IPC IP地址',
settingsASFIPCPort: 'ASF IPC 端口',
settingsASFIPCPassword: 'ASF IPC 密码',
HBAlreadyOwned: '游戏已拥有',
HBRedeemAlreadyOwned: '确定刮开 %title% Steam 激活码?',
steamStore: 'Steam 商店',
HBActivationRestrictions: '激活限制',
HBDisallowedCountries: '限制以下地区激活',
HBExclusiveCountries: '仅限以下地区激活',
HBCurrentLocation: '当前位于:',
DIGMenuPurchase: '购买',
DIGMenuSelectAll: '全选',
DIGMenuSelectCancel: '取消',
DIGButtonPurchasing: '购买中',
DIGInsufficientFund: '余额不足',
DIGFinishedPurchasing: '购买完成',
DIGMarketSearchResult: '目前市集上架中',
DIGRateAllPositive: '全部好评',
DIGClickToHideThisRow: '隐藏此上架游戏',
DIGCurrentBalance: '当前余额:',
DIGEditBalance: '更新DIG 錢包餘額',
DIGPoint: 'DIG 点数',
DIGTotalAmount: '购买总额:',
buttonReveal: '刮开',
buttonRetrieve: '提取',
buttonActivate: '激活',
buttonCopy: '复制',
buttonReset: '清空',
buttonExport: '导出',
buttonCommands: '指令',
buttonLog: '日志',
checkboxIncludeGameTitle: '游戏名',
checkboxJoinKeys: '合并',
checkboxSkipUsed: '跳过已使用',
checkboxMarketListings: '上架于市集',
selectFilterAll: '选取全部',
selectFilterOwned: '选取已拥有',
selectFilterNotOwned: '选取未拥有',
selectConnector: '至',
markAllAsUsed: '标记全部已使用',
syncSuccessTitle: '同步成功',
syncSuccess: '成功同步Steam 游戏库资料',
syncFailTitle: '同步失败',
syncFail: '失败同步Steam 游戏库资料',
visitSteam: '前往Steam',
lastSyncTime: '已于%seconds% 秒前同步游戏库',
game: '游戏',
dlc: 'DLC',
package: '礼包',
bundle: '捆绑包',
owned: '已拥有',
wished: '于愿望清单',
ignored: '已忽略',
notOwned: '未拥有',
notApplicable: '无资料',
notFetched: '未检查',
enablePlatiFeature: '启用脚本',
platiFetchOnStart: '自动检查',
platiInfiniteScroll: '自动换页',
platiFetchButton: '检查',
platiFilterType: '显示类型',
platiFilterStatus: '显示状态'
},
english: {
name: 'English',
updateSuccessTitle: 'Update Successful!',
updateSuccess: 'Steam sessionID is successfully updated',
successStatus: 'Success',
successTitle: 'Hurray!',
successDetail: 'No Detail',
activatedDetail: 'Activated',
loadingSuccess: 'Loaded',
skippedStatus: 'Skipped',
failStatus: 'Fail',
failTitle: 'Opps!',
failDetailUnexpected: 'Unexpected Error',
failDetailInvalidKey: 'Invalid Key',
failDetailUsedKey: 'Used Key',
failDetailRateLimited: 'Rate Limited',
failDetailCountryRestricted: 'Country Restricted',
failDetailAlreadyOwned: 'Product Already Owned',
failDetailMissingBaseGame: 'Missing Base Game',
failDetailPS3Required: 'PS3 Activation Required',
failDetailGiftWallet: 'Gift Card/Wallet Code Detected',
failDetailParsingFailed: 'Result parse failed',
failDetailRequestFailedNeedUpdate: 'Request failed, please try again
or update sessionID',
noItemDetails: 'No Item Details',
notLoggedInTitle: 'Not Logged-In',
notLoggedInMsg: 'Please login to Steam so sessionID can be saved',
missingTitle: 'Missing SessionID',
missingMsg: 'Do you want to update your Steam sessionID?',
emptyInput: 'Could not find Steam code',
settingsTitle: 'Settings',
settingsAutoUpdateSessionID: 'Auto Update SessionID',
settingsSessionID: 'Your sessionID',
settingsAutoSyncLibrary: 'Auto Sync Library',
settingsSyncLibrary: 'Sync Library',
settingsSyncLibraryButton: 'Sync',
settingsLanguage: 'Language',
settingsASFFormat: 'Enable ASF Format',
settingsTitleComesLast: 'Title Comes Last',
settingsActivateAllKeys: 'No skip & activate all keys',
settingsEnableTooltips: 'Tooltips from SteamCN',
settingsEnableASFIPC: 'Enable ASF IPC',
settingsASFWSProtocol: 'ASF WS Protocol',
settingsASFIPCProtocol: 'ASF IPC Protocol',
settingsASFIPCServer: 'ASF IPC IP Address',
settingsASFIPCPort: 'ASF IPC Port',
settingsASFIPCPassword: 'ASF IPC Password',
HBAlreadyOwned: 'Game Already Owned',
HBRedeemAlreadyOwned: 'Are you sure to redeem %title% Steam Key?',
steamStore: 'Steam Store',
HBActivationRestrictions: 'Activation Restrictions',
HBDisallowedCountries: 'Cannot be activated in the following regions',
HBExclusiveCountries: 'Can only be activated in the following regions',
HBCurrentLocation: 'Current Location: ',
DIGMenuPurchase: 'Purchase',
DIGMenuSelectAll: 'Select All',
DIGMenuSelectCancel: 'Cancel',
DIGButtonPurchasing: 'Purchassing',
DIGInsufficientFund: 'Insufficient fund',
DIGFinishedPurchasing: 'Finished Purchasing',
DIGMarketSearchResult: 'Currently listing in marketplace',
DIGRateAllPositive: 'Mark All Positive',
DIGClickToHideThisRow: 'Hide this game from listings',
DIGCurrentBalance: 'Current Balance: ',
DIGEditBalance: 'Edit DIG balance',
DIGPoint: 'DIG Point',
DIGTotalAmount: 'Total Amount: ',
buttonReveal: 'Reveal',
buttonRetrieve: 'Retrieve',
buttonActivate: 'Activate',
buttonCopy: 'Copy',
buttonReset: 'Reset',
buttonExport: 'Export',
buttonCommands: 'Commands',
buttonLog: 'Log',
checkboxIncludeGameTitle: 'Game Title',
checkboxJoinKeys: 'Join',
checkboxSkipUsed: 'Skip Used',
checkboxMarketListings: 'Market Listings',
selectFilterAll: 'Select All',
selectFilterOwned: 'Select Owned',
selectFilterNotOwned: 'Select Not Owned',
selectConnector: 'to',
markAllAsUsed: 'Mark All as Used',
syncSuccessTitle: 'Sync Successful',
syncSuccess: 'Successfully sync Steam library data',
syncFailTitle: 'Sync failed',
syncFail: 'Failed to sync Steam library data',
visitSteam: 'Visit Steam',
lastSyncTime: 'Library data synced %seconds% seconds ago',
game: 'Game',
dlc: 'DLC',
package: 'Package',
bundle: 'Bundle',
owned: 'Owned',
wished: 'Wishlisted',
ignored: 'Ignored',
notOwned: 'Not Owned',
notApplicable: 'Not Applicable',
notFetched: 'Not Checked',
enablePlatiFeature: 'Enable Script',
platiFetchOnStart: 'Auto Check',
platiInfiniteScroll: 'Infinite Scroll',
platiFetchButton: 'Check',
platiFilterType: 'Show Type',
platiFilterStatus: 'Show Status'
}
},
language: null,
set() {
const selectedLanguage = has.call(this.data, config.get('language')) ? config.get('language') : 'english';
this.language = this.data[selectedLanguage];
},
get(key) {
return has.call(this.language, key) ? this.language[key] : this.data.english[key];
},
init() {
this.set();
}
};
const ISO2 = {
name: {
tchinese: {
AD: '安道爾',
AE: '阿拉伯聯合大公國',
AF: '阿富汗',
AG: '安地卡及巴布達',
AI: '安圭拉',
AL: '阿爾巴尼亞',
AM: '亞美尼亞',
AO: '安哥拉',
AQ: '南極洲',
AR: '阿根廷',
AS: '美屬薩摩亞',
AT: '奧地利',
AU: '澳大利亞',
AW: '阿魯巴',
AX: '奧蘭',
AZ: '亞塞拜然',
BA: '波士尼亞與赫塞哥維納',
BB: '巴貝多',
BD: '孟加拉',
BE: '比利時',
BF: '布吉納法索',
BG: '保加利亞',
BH: '巴林',
BI: '蒲隆地',
BJ: '貝南',
BL: '聖巴泰勒米',
BM: '百慕達',
BN: '汶萊',
BO: '玻利維亞',
BQ: '波奈',
BR: '巴西',
BS: '巴哈馬',
BT: '不丹',
BV: '布威島',
BW: '波札那',
BY: '白俄羅斯',
BZ: '貝里斯',
CA: '加拿大',
CC: '科科斯(基林)群島',
CD: '剛果民主共和國',
CF: '中非共和國',
CG: '剛果共和國',
CH: '瑞士',
CI: '象牙海岸',
CK: '庫克群島',
CL: '智利',
CM: '喀麥隆',
CN: '中國',
CO: '哥倫比亞',
CR: '哥斯大黎加',
CS: '塞爾維亞與蒙特內哥羅',
CU: '古巴',
CV: '維德角',
CW: '古拉索',
CX: '聖誕島',
CY: '賽普勒斯',
CZ: '捷克',
DE: '德國',
DJ: '吉布地',
DK: '丹麥',
DM: '多米尼克',
DO: '多明尼加',
DZ: '阿爾及利亞',
EC: '厄瓜多',
EE: '愛沙尼亞',
EG: '埃及',
EH: '西撒哈拉',
ER: '厄利垂亞',
ES: '西班牙',
ET: '衣索比亞',
FI: '芬蘭',
FJ: '斐濟',
FK: '福克蘭群島',
FM: '密克羅尼西亞聯邦',
FO: '法羅群島',
FR: '法國',
GA: '加彭',
GB: '英國',
GD: '格瑞那達',
GE: '喬治亞',
GF: '法屬圭亞那',
GG: '根西',
GH: '迦納',
GI: '直布羅陀',
GL: '格陵蘭',
GM: '甘比亞',
GN: '幾內亞',
GP: '瓜德羅普',
GQ: '赤道幾內亞',
GR: '希臘',
GS: '南喬治亞與南桑威奇',
GT: '瓜地馬拉',
GU: '關島',
GW: '幾內亞比索',
GY: '蓋亞那',
HK: '香港',
HM: '赫德島和麥克唐納群島',
HN: '宏都拉斯',
HR: '克羅埃西亞',
HT: '海地',
HU: '匈牙利',
ID: '印尼',
IE: '愛爾蘭',
IL: '以色列',
IM: '曼島',
IN: '印度',
IO: '英屬印度洋領地',
IQ: '伊拉克',
IR: '伊朗',
IS: '冰島',
IT: '義大利',
JE: '澤西',
JM: '牙買加',
JO: '約旦',
JP: '日本',
KE: '肯亞',
KG: '吉爾吉斯',
KH: '柬埔寨',
KI: '吉里巴斯',
KM: '葛摩',
KN: '聖克里斯多福及尼維斯',
KP: '北韓',
KR: '南韓',
KW: '科威特',
KY: '開曼群島',
KZ: '哈薩克',
LA: '寮國',
LB: '黎巴嫩',
LC: '聖露西亞',
LI: '列支敦斯登',
LK: '斯里蘭卡',
LR: '賴比瑞亞',
LS: '賴索托',
LT: '立陶宛',
LU: '盧森堡',
LV: '拉脫維亞',
LY: '利比亞',
MA: '摩洛哥',
MC: '摩納哥',
MD: '摩爾多瓦',
ME: '蒙特內哥羅',
MF: '法屬聖馬丁',
MG: '馬達加斯加',
MH: '馬紹爾群島',
MK: '馬其頓共和國',
ML: '馬利',
MM: '緬甸',
MN: '蒙古',
MO: '澳門',
MP: '北馬里亞納群島',
MQ: '馬丁尼克',
MR: '茅利塔尼亞',
MS: '蒙哲臘',
MT: '馬爾他',
MU: '模里西斯',
MV: '馬爾地夫',
MW: '馬拉威',
MX: '墨西哥',
MY: '馬來西亞',
MZ: '莫三比克',
NA: '納米比亞',
NC: '新喀里多尼亞',
NE: '尼日',
NF: '諾福克島',
NG: '奈及利亞',
NI: '尼加拉瓜',
NL: '荷蘭',
NO: '挪威',
NP: '尼泊爾',
NR: '諾魯',
NU: '紐埃',
NZ: '紐西蘭',
OM: '阿曼',
PA: '巴拿馬',
PE: '秘魯',
PF: '法屬玻里尼西亞',
PG: '巴布亞紐幾內亞',
PH: '菲律賓',
PK: '巴基斯坦',
PL: '波瀾',
PM: '聖皮耶與密克隆群島',
PN: '皮特肯群島',
PR: '波多黎各',
PS: '巴勒斯坦',
PT: '葡萄牙',
PW: '帛琉',
PY: '巴拉圭',
QA: '卡達',
RE: '留尼旺',
RO: '羅馬尼亞',
RS: '塞爾維亞',
RU: '俄羅斯',
RW: '盧安達',
SA: '沙烏地阿拉伯',
SB: '索羅門群島',
SC: '塞席爾',
SD: '蘇丹',
SE: '瑞典',
SG: '新加坡',
SH: '聖赫勒拿、亞森欣與垂斯坦昆哈',
SI: '斯洛維尼亞',
SJ: '斯瓦巴和揚馬延',
SK: '斯洛伐克',
SL: '獅子山共和國',
SM: '聖馬利諾',
SN: '塞內加爾',
SO: '索馬利亞',
SR: '蘇利南',
SS: '南蘇丹',
ST: '聖多美普林西比',
SV: '薩爾瓦多',
SX: '荷屬聖馬丁',
SY: '敘利亞',
SZ: '史瓦濟蘭',
TC: '土克凱可群島',
TD: '查德',
TF: '法屬南部和南極領地',
TG: '多哥',
TH: '泰國',
TJ: '塔吉克',
TK: '托克勞',
TL: '東帝汶',
TM: '土庫曼',
TN: '突尼西亞',
TO: '東加',
TR: '土耳其',
TT: '千里達及托巴哥',
TV: '吐瓦魯',
TW: '臺灣',
TZ: '坦尚尼亞',
UA: '烏克蘭',
UG: '烏干達',
UM: '美國本土外小島嶼',
US: '美國',
UY: '烏拉圭',
UZ: '烏茲別克',
VA: '聖座',
VC: '聖文森及格瑞那丁',
VE: '委內瑞拉',
VG: '英屬維京群島',
VI: '美屬維京群島',
VN: '越南',
VU: '萬那杜',
WF: '瓦利斯和富圖納',
WS: '薩摩亞',
XK: '科索沃',
YE: '葉門',
YT: '馬約特',
ZA: '南非',
ZM: '尚比亞',
ZW: '辛巴威'
},
schinese: {
AD: '安道尔',
AE: '阿拉伯联合酋长国',
AF: '阿富汗',
AG: '安提瓜和巴布达',
AI: '安圭拉',
AL: '阿尔巴尼亚',
AM: '亚美尼亚',
AO: '安哥拉',
AQ: '南极洲',
AR: '阿根廷',
AS: '美属萨摩亚',
AT: '奥地利',
AU: '澳大利亚',
AW: '阿鲁巴',
AX: '奥兰群岛',
AZ: '阿塞拜疆',
BA: '波斯尼亚和黑塞哥维那',
BB: '巴巴多斯',
BD: '孟加拉',
BE: '比利时',
BF: '布基纳法索',
BG: '保加利亚',
BH: '巴林',
BI: '布隆迪',
BJ: '贝宁',
BL: '圣巴托洛缪岛',
BM: '百慕大',
BN: '文莱',
BO: '玻利维亚',
BQ: '博奈尔',
BR: '巴西',
BS: '巴哈马',
BT: '不丹',
BV: '布韦岛',
BW: '博兹瓦纳',
BY: '白俄罗斯',
BZ: '伯利兹',
CA: '加拿大',
CC: '科科斯(基林)群岛',
CD: '刚果(金)',
CF: '中非共和国',
CG: '刚果(布)',
CH: '瑞士',
CI: '科特迪瓦',
CK: '库克群岛',
CL: '智利',
CM: '喀麦隆',
CN: '中国',
CO: '哥伦比亚',
CR: '哥斯达黎加',
CS: '塞尔维亚和黑山',
CU: '古巴',
CV: '佛得角',
CW: '库拉索',
CX: '圣诞岛',
CY: '塞浦路斯',
CZ: '捷克',
DE: '德国',
DJ: '吉布提',
DK: '丹麦',
DM: '多米尼克',
DO: '多米尼加',
DZ: '阿尔及利亚',
EC: '厄瓜多尔',
EE: '爱沙尼亚',
EG: '埃及',
EH: '西撒哈拉',
ER: '厄立特里亚',
ES: '西班牙',
ET: '埃塞俄比亚',
FI: '芬兰',
FJ: '斐济',
FK: '福克兰群岛',
FM: '密克罗尼西亚',
FO: '法罗群岛',
FR: '法国',
GA: '加蓬',
GB: '英国',
GD: '格林纳达',
GE: '格鲁吉亚',
GF: '法属圭亚那',
GG: '根西',
GH: '加纳',
GI: '直布罗陀',
GL: '格陵兰',
GM: '冈比亚',
GN: '几内亚',
GP: '瓜德鲁普',
GQ: '赤道几内亚',
GR: '希腊',
GS: '南乔治亚岛和南桑威奇群岛',
GT: '危地马拉',
GU: '关岛',
GW: '几内亚比绍',
GY: '圭亚那',
HK: '香港',
HM: '赫德岛和麦克唐纳群岛',
HN: '洪都拉斯',
HR: '克罗地亚',
HT: '海地',
HU: '匈牙利',
ID: '印尼',
IE: '爱尔兰',
IL: '以色列',
IM: '马恩岛',
IN: '印度',
IO: '英属印度洋领地',
IQ: '伊拉克',
IR: '伊朗',
IS: '冰岛',
IT: '意大利',
JE: '泽西岛',
JM: '牙买加',
JO: '约旦',
JP: '日本',
KE: '肯尼亚',
KG: '吉尔吉斯',
KH: '柬埔寨',
KI: '基里巴斯',
KM: '科摩罗',
KN: '圣基茨和尼维斯',
KP: '朝鲜',
KR: '韩国',
KW: '科威特',
KY: '开曼群岛',
KZ: '哈萨克斯坦',
LA: '老挝',
LB: '黎巴嫩',
LC: '圣卢西亚',
LI: '列支敦士登',
LK: '斯里兰卡',
LR: '利比里亚',
LS: '莱索托',
LT: '立陶宛',
LU: '卢森堡',
LV: '拉脱维亚',
LY: '利比亚',
MA: '摩洛哥',
MC: '摩纳哥',
MD: '摩尔多瓦',
ME: '黑山',
MF: '法属圣马丁',
MG: '马达加斯加',
MH: '马绍尔群岛',
MK: '马其顿',
ML: '马里',
MM: '缅甸',
MN: '蒙古',
MO: '澳门',
MP: '北马里亚纳群岛',
MQ: '马提尼克',
MR: '毛里塔尼亚',
MS: '蒙塞拉特',
MT: '马耳他',
MU: '毛里求斯',
MV: '马尔代夫',
MW: '马拉维',
MX: '墨西哥',
MY: '马来西亚',
MZ: '莫桑比克',
NA: '纳米比亚',
NC: '新喀里多尼亚',
NE: '尼日尔',
NF: '诺福克岛',
NG: '尼日利',
NI: '尼加拉瓜',
NL: '荷兰',
NO: '挪威',
NP: '尼泊尔',
NR: '瑙鲁',
NU: '纽埃',
NZ: '新西兰',
OM: '阿曼',
PA: '巴拿马',
PE: '秘鲁',
PF: '法属波利尼西亚a',
PG: '巴布亚新几内亚',
PH: '菲律宾',
PK: '巴基斯坦',
PL: '波兰',
PM: '圣皮埃尔和密克隆',
PN: '皮特凯恩群岛',
PR: '波多黎各',
PS: '巴勒斯坦',
PT: '葡萄牙',
PW: '帕劳',
PY: '巴拉圭',
QA: '卡塔尔',
RE: '留尼旺島',
RO: '罗马尼亚',
RS: '塞尔维亚',
RU: '俄罗斯',
RW: '卢旺达',
SA: '沙特阿拉伯',
SB: '所罗门群岛',
SC: '塞舌尔',
SD: '苏丹',
SE: '瑞典',
SG: '新加坡',
SH: '圣赫勒拿、阿森松与特斯坦达库尼亚',
SI: '斯洛文尼',
SJ: '斯瓦尔巴群岛和扬马延岛',
SK: '斯洛伐克',
SL: '塞拉利昂',
SM: '圣马力诺',
SN: '塞内加尔',
SO: '索马里',
SR: '苏里南',
SS: '南苏丹',
ST: '圣多美和普林西比',
SV: '萨尔瓦多',
SX: '荷属圣马丁',
SY: '叙利亚',
SZ: '斯威士兰',
TC: '特克斯和凯科斯群岛',
TD: '乍得',
TF: '法属南部领土',
TG: '多哥',
TH: '泰国',
TJ: '塔吉克斯坦',
TK: '托克劳',
TL: '东帝汶',
TM: '土库曼斯坦',
TN: '突尼斯',
TO: '汤加',
TR: '土耳其',
TT: '特立尼达和多巴哥',
TV: '图瓦卢',
TW: '台湾',
TZ: '坦桑尼亚',
UA: '乌克兰',
UG: '乌干达',
UM: '美国本土外小岛屿',
US: '美国',
UY: '乌拉圭',
UZ: '乌兹别克斯坦',
VA: '圣座',
VC: '圣文森特和格林纳丁斯',
VE: '委内瑞拉',
VG: '英属维尔京群岛',
VI: '美属维尔京群岛',
VN: '越南',
VU: '瓦努阿图',
WF: '瓦利斯和富图纳群岛',
WS: '萨摩亚',
XK: '科索沃',
YE: '也门',
YT: '马约特',
ZA: '南非',
ZM: '赞比亚',
ZW: '津巴布韦'
},
english: {
AD: 'Andorra',
AE: 'United Arab Emirates',
AF: 'Afghanistan',
AG: 'Antigua and Barbuda',
AI: 'Anguilla',
AL: 'Albania',
AM: 'Armenia',
AO: 'Angola',
AQ: 'Antarctica',
AR: 'Argentina',
AS: 'American Samoa',
AT: 'Austria',
AU: 'Australia',
AW: 'Aruba',
AX: 'Aland Islands',
AZ: 'Azerbaijan',
BA: 'Bosnia and Herzegovina',
BB: 'Barbados',
BD: 'Bangladesh',
BE: 'Belgium',
BF: 'Burkina Faso',
BG: 'Bulgaria',
BH: 'Bahrain',
BI: 'Burundi',
BJ: 'Benin',
BL: 'Saint Barthélemy',
BM: 'Bermuda',
BN: 'Brunei',
BO: 'Bolivia',
BQ: 'Bonaire',
BR: 'Brazil',
BS: 'Bahamas',
BT: 'Bhutan',
BV: 'Bouvet Island',
BW: 'Botswana',
BY: 'Belarus',
BZ: 'Belize',
CA: 'Canada',
CC: 'Cocos (Keeling) Islands',
CD: 'East Congo',
CF: 'Central African Republic',
CG: 'West Congo',
CH: 'Switzerland',
CI: 'Ivory Coast',
CK: 'Cook Islands',
CL: 'Chile',
CM: 'Cameroon',
CN: 'China',
CO: 'Colombia',
CR: 'Costa Rica',
CS: 'Serbia and Montenegro',
CU: 'Cuba',
CV: 'Cabo Verde',
CW: 'Curaçao',
CX: 'Christmas Island',
CY: 'Cyprus',
CZ: 'Czechia',
DE: 'Germany',
DJ: 'Djibouti',
DK: 'Denmark',
DM: 'Dominica',
DO: 'Dominican Republic',
DZ: 'Algeria',
EC: 'Ecuador',
EE: 'Estonia',
EG: 'Egypt',
EH: 'Western Sahara',
ER: 'Eritrea',
ES: 'Spain',
ET: 'Ethiopia',
FI: 'Finland',
FJ: 'Fiji',
FK: 'Falkland Islands',
FM: 'Micronesia',
FO: 'Faroe Islands',
FR: 'France',
GA: 'Gabon',
GB: 'United Kingdom',
GD: 'Grenada',
GE: 'Georgia',
GF: 'French Guiana',
GG: 'Guernsey',
GH: 'Ghana',
GI: 'Gibraltar',
GL: 'Greenland',
GM: 'Gambia',
GN: 'Guinea',
GP: 'Guadeloupe',
GQ: 'Equatorial Guinea',
GR: 'Greece',
GS: 'South Georgia and the South Sandwich Islands',
GT: 'Guatemala',
GU: 'Guam',
GW: 'Guinea-Bissau',
GY: 'Guyana',
HK: 'Hong Kong',
HM: 'Heard Island and McDonald Islands',
HN: 'Honduras',
HR: 'Croatia',
HT: 'Haiti',
HU: 'Hungary',
ID: 'Indonesia',
IE: 'Ireland',
IL: 'Israel',
IM: 'Isle of Man',
IN: 'India',
IO: 'British Indian Ocean Territory',
IQ: 'Iraq',
IR: 'Iran',
IS: 'Iceland',
IT: 'Italy',
JE: 'Jersey',
JM: 'Jamaica',
JO: 'Jordan',
JP: 'Japan',
KE: 'Kenya',
KG: 'Kyrgyzstan',
KH: 'Cambodia',
KI: 'Kiribati',
KM: 'Comoros',
KN: 'Saint Kitts and Nevis',
KP: 'North Korea',
KR: 'South Korea',
KW: 'Kuwait',
KY: 'Cayman Islands',
KZ: 'Kazakhstan',
LA: 'Lao',
LB: 'Lebanon',
LC: 'Saint Lucia',
LI: 'Liechtenstein',
LK: 'Sri Lanka',
LR: 'Liberia',
LS: 'Lesotho',
LT: 'Lithuania',
LU: 'Luxembourg',
LV: 'Latvia',
LY: 'Libya',
MA: 'Morocco',
MC: 'Monaco',
MD: 'Moldova',
ME: 'Montenegro',
MF: 'Saint Martin (French part)',
MG: 'Madagascar',
MH: 'Marshall Islands',
MK: 'Macedonia',
ML: 'Mali',
MM: 'Myanmar',
MN: 'Mongolia',
MO: 'Macao',
MP: 'Northern Mariana Islands',
MQ: 'Martinique',
MR: 'Mauritania',
MS: 'Montserrat',
MT: 'Malta',
MU: 'Mauritius',
MV: 'Maldives',
MW: 'Malawi',
MX: 'Mexico',
MY: 'Malaysia',
MZ: 'Mozambique',
NA: 'Namibia',
NC: 'New Caledonia',
NE: 'Niger',
NF: 'Norfolk Island',
NG: 'Nigeria',
NI: 'Nicaragua',
NL: 'Netherlands',
NO: 'Norway',
NP: 'Nepal',
NR: 'Nauru',
NU: 'Niue',
NZ: 'New Zealand',
OM: 'Oman',
PA: 'Panama',
PE: 'Peru',
PF: 'French Polynesia',
PG: 'Papua New Guinea',
PH: 'Philippines',
PK: 'Pakistan',
PL: 'Poland',
PM: 'Saint Pierre and Miquelon',
PN: 'Pitcairn',
PR: 'Puerto Rico',
PS: 'Palestine',
PT: 'Portugal',
PW: 'Palau',
PY: 'Paraguay',
QA: 'Qatar',
RE: 'Reunion',
RO: 'Romania',
RS: 'Serbia',
RU: 'Russia',
RW: 'Rwanda',
SA: 'Saudi Arabia',
SB: 'Solomon Islands',
SC: 'Seychelles',
SD: 'Sudan',
SE: 'Sweden',
SG: 'Singapore',
SH: 'Saint Helena, Ascension and Tristan da Cunha',
SI: 'Slovenia',
SJ: 'Svalbard and Jan Mayen',
SK: 'Slovakia',
SL: 'Sierra Leone',
SM: 'San Marino',
SN: 'Senegal',
SO: 'Somalia',
SR: 'Suriname',
SS: 'South Sudan',
ST: 'Sao Tome and Principe',
SV: 'El Salvador',
SX: 'Sint Maarten (Dutch part)',
SY: 'Syria',
SZ: 'Swaziland',
TC: 'Turks and Caicos Islands',
TD: 'Chad',
TF: 'French Southern Territories',
TG: 'Togo',
TH: 'Thailand',
TJ: 'Tajikistan',
TK: 'Tokelau',
TL: 'Timor-Leste',
TM: 'Turkmenistan',
TN: 'Tunisia',
TO: 'Tonga',
TR: 'Turkey',
TT: 'Trinidad and Tobago',
TV: 'Tuvalu',
TW: 'Taiwan',
TZ: 'Tanzania',
UA: 'Ukraine',
UG: 'Uganda',
UM: 'United States Minor Outlying Islands',
US: 'United States',
UY: 'Uruguay',
UZ: 'Uzbekistan',
VA: 'Holy See',
VC: 'Saint Vincent and the Grenadines',
VE: 'Venezuela',
VG: 'Virgin Islands, British',
VI: 'Virgin Islands, U.S.',
VN: 'Viet Nam',
VU: 'Vanuatu',
WF: 'Wallis and Futuna',
WS: 'Samoa',
XK: 'Kosovo',
YE: 'Yemen',
YT: 'Mayotte',
ZA: 'South Africa',
ZM: 'Zambia',
ZW: 'Zimbabwe'
}
},
get(code, language) {
const data = this.name[language || config.get('language') || 'english'];
return has.call(data, code) ? data[code] : code;
}
};
const xe = {
exchangeRate: JSON.parse(GM_getValue('SBSE_xe', '{}')),
currencies: {
AUD: {
english: 'Australian Dollar',
tchinese: '澳幣',
schinese: '澳元',
symbol: 'AU$',
decimal: true
},
CAD: {
english: 'Canadian Dollar',
tchinese: '加幣',
schinese: '加元',
symbol: 'CA$',
decimal: true
},
CNY: {
english: 'Chinese Yuan',
tchinese: '人民幣',
schinese: '人民币',
symbol: 'CN¥',
decimal: true
},
EUR: {
english: 'Euro',
tchinese: '歐元',
schinese: '欧元',
symbol: '€',
decimal: true
},
GBP: {
english: 'Great Britain Pound',
tchinese: '英鎊',
schinese: '英镑',
symbol: '£',
decimal: true
},
HKD: {
english: 'Hong Kong Dollar',
tchinese: '港幣',
schinese: '港元',
symbol: 'HK$',
decimal: false
},
JPY: {
english: 'Japanese Yen',
tchinese: '日圓',
schinese: '日元',
symbol: 'JP¥',
decimal: false
},
KRW: {
english: 'South Korean Won',
tchinese: '韓圓',
schinese: '韩币',
symbol: '₩',
decimal: false
},
MYR: {
english: 'Malaysian Ringgit',
tchinese: '令吉',
schinese: '林吉特',
symbol: 'RM',
decimal: true
},
NTD: {
english: 'New Taiwan Dollar',
tchinese: '台幣',
schinese: '台币',
symbol: 'NT$',
decimal: false
},
NZD: {
english: 'New Zealand Dollar',
tchinese: '紐幣',
schinese: '新西兰元',
symbol: 'NZ$',
decimal: true
},
RUB: {
english: 'Russian Ruble',
tchinese: '盧布',
schinese: '卢布',
symbol: '₽',
decimal: false
},
USD: {
english: 'United States Dollar',
tchinese: '美元',
schinese: '美元',
symbol: 'US$',
decimal: true
}
},
getRate() {
const self = this;
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml',
onload: res => {
if (res.status === 200) {
try {
const exchangeRate = {
lastUpdate: Date.now(),
rates: {}
};
res.response.split(eol).forEach(line => {
if (line.includes('currency=')) {
const currency = line.split('currency=\'').pop().slice(0, 3);
const rate = line.trim().split('rate=\'').pop().slice(0, -3);
exchangeRate.rates[currency] = parseFloat(rate);
}
});
exchangeRate.rates.EUR = 1; // get NTD
GM_xmlhttpRequest({
method: 'GET',
url: 'https://www.google.com/search?q=1+EUR+%3D+NTD',
onload: searchRes => {
const rate = parseFloat(searchRes.response.split('
'); errorMsg.push(`sessionID: ${config.get('sessionID') + eol}`); errorMsg.push(`autoUpdate: ${config.get('autoUpdateSessionID') + eol}`); errorMsg.push(`status: ${res.status + eol}`); errorMsg.push(`response: ${res.response + eol}`); errorMsg.push(''); swal({ title: i18n.get('failTitle'), html: i18n.get('failDetailRequestFailedNeedUpdate') + eol + errorMsg.join(''), type: 'error' }); steam.getSessionID(); if (typeof callback === 'function') callback(); } } }); } } else if (typeof callback === 'function') callback(); }; activateHandler(); } }; // models const settings = { model: null, getModel() { return this.model instanceof $ ? this.model : $(); }, display() { swal({ title: i18n.get('settingsTitle'), onBeforeOpen: dom => { $(dom).find('.swal2-content').append(settings.getModel()); } }); }, init() { const settingDetails = [{ name: i18n.get('settingsAutoUpdateSessionID'), configItem: 'autoUpdateSessionID', type: 'switch' }, { name: i18n.get('settingsSessionID'), configItem: 'sessionID', type: 'text' }, { name: i18n.get('settingsAutoSyncLibrary'), configItem: 'autoSyncLibrary', type: 'switch' }, { name: i18n.get('settingsSyncLibrary'), configItem: 'syncLibrary', type: 'button', textContent: i18n.get('settingsSyncLibraryButton') }, { name: i18n.get('settingsLanguage'), configItem: 'language', type: 'select' }, { name: i18n.get('settingsASFFormat'), configItem: 'ASFFormat', type: 'switch' }, { name: i18n.get('settingsTitleComesLast'), configItem: 'titleComesLast', type: 'switch' }, { name: i18n.get('settingsActivateAllKeys'), configItem: 'activateAllKeys', type: 'switch' }, { name: i18n.get('settingsEnableTooltips'), configItem: 'enableTooltips', type: 'switch' }, { name: i18n.get('settingsEnableASFIPC'), configItem: 'enableASFIPC', type: 'switch' }, { name: i18n.get('settingsASFWSProtocol'), configItem: 'ASFWSProtocol', type: 'select', options: ['ws', 'wss'] }, { name: i18n.get('settingsASFIPCProtocol'), configItem: 'ASFIPCProtocol', type: 'select', options: ['http', 'https'] }, { name: i18n.get('settingsASFIPCServer'), configItem: 'ASFIPCServer', type: 'text' }, { name: i18n.get('settingsASFIPCPort'), configItem: 'ASFIPCPort', type: 'text' }, { name: i18n.get('settingsASFIPCPassword'), configItem: 'ASFIPCPassword', type: 'text' }]; const $model = $('
${i18n.get('HBDisallowedCountries')}
${disallowed.join(separator)}
${i18n.get('HBExclusiveCountries')}
${exclusive.join(separator)}