// ==UserScript==
// @name Steam Wishlist Checker
// @namespace https://coding.net/u/sffxzzp
// @version 0.05
// @description Check specified users that add the game to wishlist.
// @author sffxzzp
// @match *://steamcommunity.com/*/friendsthatplay/*
// @icon https://store.steampowered.com/favicon.ico
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @connect store.steampowered.com
// ==/UserScript==
(function() {
var util = (function () {
function util() {}
util.xhr = function (xhrData) {
return new Promise(function(resolve, reject) {
if (!xhrData.xhr) {
GM_xmlhttpRequest({
method: xhrData.method || "get",
url: xhrData.url,
responseType: xhrData.type || "",
timeout: 3e4,
onload: function onload(res) {
return resolve({ response: res, body: res.response });
},
onerror: reject,
ontimeout: reject
});
} else {
var xhr = new XMLHttpRequest();
xhr.open(
xhrData.method || "get",
xhrData.url,
true
);
if (xhrData.method === "POST") {
xhr.setRequestHeader(
"content-type",
"application/x-www-form-urlencoded; charset=utf-8"
);
}
if (xhrData.cookie) xhr.withCredentials = true;
xhr.responseType = xhrData.responseType || "";
xhr.timeout = 3e4;
xhr.onload = function(ev) {
var evt = ev.target;
resolve({ response: evt, body: evt.response });
};
xhr.onerror = reject;
xhr.ontimeout = reject;
xhr.send(xhrData.data);
}
});
};
util.wrun = function (data) {
setTimeout(data.run||null, data.ms);
};
util.createElement = function (data) {
var node;
if (data.node) {
node = document.createElement(data.node);
if (data.content) {
this.setElement({node: node, content: data.content});
}
if (data.html) {
node.innerHTML = data.html;
}
}
return node;
};
util.setElement = function (data) {
if (data.node) {
for (let name in data.content) {
data.node.setAttribute(name, data.content[name]);
}
if (data.html!=undefined) {
data.node.innerHTML = data.html;
}
}
};
util.getElement = function (data) {};
return util;
})();
var swc = (function () {
function swc() {};
swc.prototype.getUsers = function () {
var sAccounts = GM_getValue("swcAccounts");
if (sAccounts) {
sAccounts = JSON.parse(sAccounts);
}
else {
sAccounts = [];
}
return sAccounts;
};
swc.prototype.get32id = function (steam64id) {
var tmp = [], root = ["76561","197960","265728"];
tmp[0] = steam64id.substr(0,5);
tmp[1] = steam64id.substr(5,6);
tmp[2] = steam64id.substr(11,6);
return (tmp[0]-root[0])*1000000000000+(tmp[1]-root[1])*1000000+(tmp[2]-root[2]);
};
swc.prototype.getAppid = function () {
return parseInt(/friendsthatplay\/(\d*)/ig.exec(location.href)[1]);
};
swc.prototype.inArray = function (array, item) {
if (array.indexOf(item)>-1) {
return true;
}
else {
return false;
}
};
swc.prototype.getXmlNode = function (xml, nodeName) {
return xml.getElementsByTagName(nodeName)[0].textContent;
};
swc.prototype.addToPage = function (user) {
var _this = this;
util.xhr({
url: "https://steamcommunity.com/profiles/"+user+"?xml=1",
type: "xml"
}).then(function (result) {
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(result.body, "text/xml");
let avatarMedium = _this.getXmlNode(xmlDoc, "avatarMedium");
let steamID = _this.getXmlNode(xmlDoc, "steamID");
let onlineState = _this.getXmlNode(xmlDoc, "onlineState");
let userblock = util.createElement({node: "div", content: {class: "friendBlock persona "+onlineState, "data-miniprofile": _this.get32id(user)}, html: '<a class="friendBlockLinkOverlay" href="https://steamcommunity.com/profiles/'+user+'"></a><div class="playerAvatar '+onlineState+'"><img src="'+avatarMedium+'"></div><div class="friendBlockContent">'+steamID+'<br><span class="friendSmallText"><br><a class="whiteLink friendBlockInnerLink" href="https://steamcommunity.com/profiles/'+user+'/wishlist">查看愿望单</a></span></div>'});
document.getElementById("swcbody").appendChild(userblock);
});
};
swc.prototype.addView = function () {
var mList = document.getElementById("memberList");
let header = document.getElementsByClassName("mainSectionHeader");
header = header[header.length-1].cloneNode(true);
header.innerHTML += ' ** ';
let settings = util.createElement({node: "a", content: {href: "javascript:void(0);"}, html:"设置"});
settings.onclick = function () {
var sAccounts = GM_getValue("swcAccounts");
if (sAccounts) {
sAccounts = JSON.parse(sAccounts).join(',');
}
else {
sAccounts = "";
}
console.log(sAccounts);
var input = prompt("请输入要检查的Steam 64位ID\n按英文逗号分割", sAccounts);
if (input) {
var accounts = input.split(',');
GM_setValue("swcAccounts", JSON.stringify(accounts));
}
}
header.appendChild(settings);
let clear = util.createElement({node: "a", content: {style: "padding-left: 20px;", href: "javascript:void(0);"}, html: "清空"});
clear.onclick = function () {
if (confirm("确定要清空么?")) {
GM_deleteValue("swcAccounts");
alert("清空完毕!");
}
};
header.appendChild(clear);
mList.appendChild(header);
let body = util.createElement({node: "div", content: {id: "swcbody", class: "profile_friends responsive_friendblocks"}});
mList.appendChild(body);
};
swc.prototype.run = function () {
var _this = this;
_this.addView();
let users = _this.getUsers();
let appid = _this.getAppid();
for (let i=0;i<users.length;i++) {
util.xhr({
url: "https://store.steampowered.com/wishlist/profiles/"+users[i]
}).then(function (result) {
let userWishlist = result;
let wishlistData = /g_rgWishlistData = (.*?);/ig.exec(result.body)[1];
wishlistData = JSON.parse(wishlistData);
for (let j=0;j<wishlistData.length;j++) {
if (wishlistData[j].appid == appid) {
_this.addToPage(users[i]);
break;
}
}
});
}
};
return swc;
})();
var program = new swc();
program.run();
})();