// ==UserScript==
// @name Steam Account Switcher
// @version 0.3
// @description Switch multiple account on Steam and community
// @author lzt
// @match *://store.steampowered.com/*
// @match *://*.steamcommunity.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_cookie
// @grant unsafeWindow
// @grant window
// @namespace steam_account_switcher
// ==/UserScript==
(function() {
'use strict';
// Your code here...
let account = document.evaluate("//a[contains(@href, 'javascript:Logout()')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
if(account.snapshotLength != 1) {
console.log("account error");
unsafeWindow.account = null;
}else{
unsafeWindow.account = account.snapshotItem(0).children[0].innerText;
};
init();
let top = document.getElementById("global_action_menu");
let total = document.createElement("div");
let enter = document.createElement("span");
let menu = document.createElement("div");;
total.id = "switcher_total";
total.style.display = "inline-block";
enter.id = "switcher_pulldown";
enter.className = "pulldown global_action_link";
enter.innerText = "切换账号";
enter.addEventListener("click", function(e){e.stopPropagation();reloadmenu()});
total.appendChild(enter);
top.insertBefore(total, top.firstElementChild);
document.addEventListener("click", function(e){
if (!menu.contains(e.target)) menu.style.display = "none";
});
function init() {
//add label
if (!GM_getValue("community")) {
GM_setValue("community", "{}");
}
if (!GM_getValue("store")) {
GM_setValue("store", "{}");
}
//upgrade old data from v0.2 to v0.3
let list = GM_listValues();
let data = JSON.parse(GM_getValue("store"));
for (let i = 0; i < list.length; i++) {
if (list[i] != "community" && list[i] != "store") {
data[list[i]] = JSON.parse(GM_getValue(list[i]));
console.log("add ", list[i], " from old data of v0.2");
GM_deleteValue(list[i]);
}
}
GM_setValue("store", JSON.stringify(data));
}
function fillmenu() {
menu = menu ? document.createElement("div") : menu;
menu.className = "popup_block_new account_switcher";
menu.id = "sw_popup";
menu.style.visibility = "visible";
menu.style.display = "block";
menu.style.top = enter.getBoundingClientRect().bottom;
menu.style.left = enter.getBoundingClientRect().left;
let list, loginURL;
if (window.location.href.search("steamcommunity.com") > -1) {
list = JSON.parse(GM_getValue("community"));
loginURL = "https://steamcommunity.com/login/";
} else if (window.location.href.search("steampowered.com") > -1) {
list = JSON.parse(GM_getValue("store"));
loginURL = "https://store.steampowered.com/login/";
}
var context = document.createElement("div");
context.className = "popup_body popup_menu account_switcher";
if (unsafeWindow.account != null & list[unsafeWindow.account] === undefined) {
let add = document.createElement("a");
add.className = "popup_menu_item account_switcher";
add.innerText = "添加 " + unsafeWindow.account;
add.setAttribute("href", "#");
add.addEventListener("click", function(e){e.stopPropagation();addaccount()});
context.appendChild(add);
};
for (let id in list) {
let entity = document.createElement("div");
entity.className = "popup_menu_item account_switcher";
let sw = document.createElement("a");
sw.setAttribute("href", "#");
sw.style.margin = "0px 10px 0px 0px"
if (unsafeWindow.account == id) {
sw.innerText = "更新 " + id;
sw.addEventListener("click", function (e) { e.stopPropagation(); addaccount(); });
} else {
sw.innerText = "转到 " + id;
sw.addEventListener("click", function (e) { e.stopPropagation(); swaccount(id) });
};
let del = document.createElement("a");
del.innerText = "删除";
del.setAttribute("href", "#");
del.addEventListener("click", function (e) { e.stopPropagation(); delaccount(id) });
entity.appendChild(sw);
entity.appendChild(del);
context.appendChild(entity);
}
let login = document.createElement("a");
login.className = "popup_menu_item account_switcher";
login.innerText = "添加新账号";
login.setAttribute("href", "#");
login.addEventListener("click", function(e){
e.stopPropagation();
let lock = 0;
GM_cookie("list", { path: "/" }, function(cookies) {
if (cookies) {
for(let i = 0; i < cookies.length; i++){
GM_cookie("delete", {name: cookies[i]["name"]}, function(error) {
console.log(error || "del " + cookies[i]["name"]);
lock++;
if (lock >= cookies.length) window.location.href = loginURL;
});
}
} else {
window.location.href = loginURL;
}
});
});
context.appendChild(login);
menu.appendChild(context);
total.appendChild(menu);
};
function reloadmenu() {
let l = document.getElementsByClassName("account_switcher")
for(let i = l.length - 1; i >= 0; i--){
l[i].remove()
}
fillmenu()
};
function addaccount() {
console.log("add " + unsafeWindow.account);
GM_cookie("list", { path: "/" }, function(cookies) {
let c = []
for(let i = 0; i < cookies.length; i++){
if (cookies[i]["name"] == "browserid") c.push(cookies[i]);
if (cookies[i]["name"] == "sessionid") c.push(cookies[i]);
if (cookies[i]["name"] == "steamLoginSecure") c.push(cookies[i]);
if (cookies[i]["name"] == "steamRememberLogin") c.push(cookies[i]);
if (cookies[i]["name"] == "bGameHighlightAutoplayDisabled") c.push(cookies[i]);
if (cookies[i]["name"] == "lastagecheckage") c.push(cookies[i]);
if (cookies[i]["name"] == "mature_content") c.push(cookies[i]);
if (cookies[i]["name"] == "wants_mature_content") c.push(cookies[i]);
if (cookies[i]["name"] == "birthtime") c.push(cookies[i]);
if (cookies[i]["name"].search("steamMachineAuth") != -1) c.push(cookies[i]);
}
let list;
if (window.location.href.search("steamcommunity.com") > -1) {
list = JSON.parse(GM_getValue("community"));
list[unsafeWindow.account] = c;
GM_setValue("community", JSON.stringify(list));
} else if (window.location.href.search("steampowered.com") > -1) {
list = JSON.parse(GM_getValue("store"));
list[unsafeWindow.account] = c;
GM_setValue("store", JSON.stringify(list));
}
reloadmenu();
});
};
function delaccount(id) {
console.log("delete " + id);
let list;
if (window.location.href.search("steamcommunity.com") > -1) {
list = JSON.parse(GM_getValue("community"));
delete list[id];
GM_setValue("community", JSON.stringify(list));
} else if (window.location.href.search("steampowered.com") > -1) {
list = JSON.parse(GM_getValue("store"));
delete list[id];
GM_setValue("store", JSON.stringify(list));
}
reloadmenu()
};
function swaccount(id) {
console.log("switch to " + id);
let cookies, list;
if (window.location.href.search("steamcommunity.com") > -1) {
list = JSON.parse(GM_getValue("community"));
cookies = list[id];
} else if (window.location.href.search("steampowered.com") > -1) {
list = JSON.parse(GM_getValue("store"));
cookies = list[id];
}
let delock = 0;
GM_cookie("list", { path: "/" }, function(c) {
for(let i = 0; i < c.length; i++){
GM_cookie("delete", {name: c[i]["name"]}, function(error) {
console.log(error || "del " + c[i]["name"]);
delock++;
if (delock >= c.length) {
console.log("del complete")
let addlock = 0;
for(let i = 0; i < cookies.length; i++){
GM_cookie("set", {
name: cookies[i]['name'],
value: cookies[i]['value'],
domain: cookies[i]['domain'],
path: cookies[i]['path'],
secure: cookies[i]['secure'],
httpOnly: cookies[i]['httpOnly'],
sameSite: cookies[i]['sameSite'],
expirationDate: cookies[i]['expirationDate'],
hostOnly: cookies[i]['hostOnly']
}, function(error) {
console.log(error || "add " + cookies[i]["name"]);
addlock++;
if (addlock >= cookies.length) {
let url = window.location.href;
if (url.search("store.steampowered.com/wishlist") != -1) {
window.location.href = "https://store.steampowered.com/wishlist"
}else{
window.location.reload()
}
};
});
}
};
});
}
});
};
})();