SG Game Tags

some tags of the game in Steamgifts.

目前为 2016-07-28 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name SG Game Tags
  3. // @namespace https://steamcommunity.com/id/Ruphine/
  4. // @version 3.2.2
  5. // @description some tags of the game in Steamgifts.
  6. // @author Ruphine
  7. // @match *://www.steamgifts.com/*
  8. // @icon https://cdn.steamgifts.com/img/favicon.ico
  9. // @connect steampowered.com
  10. // @connect ruphine.esy.es
  11. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
  12. // @require https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js
  13. // @grant GM_deleteValue
  14. // @grant GM_getValue
  15. // @grant GM_listValues
  16. // @grant GM_setValue
  17. // @grant GM_xmlhttpRequest
  18. // ==/UserScript==
  19.  
  20. /* CSS */
  21. const default_bundle = "#E9202A";
  22. const default_card = "#3AA435";
  23. const default_achievement = "#305AC9";
  24. const default_wishlist = "#9335F1";
  25. const default_linux = "#E67300";
  26. const default_mac = "#777777";
  27. const default_early = "#9FA027";
  28. const default_hidden = "#A0522D";
  29.  
  30. var myCSS = '\
  31. .tags { \
  32. text-decoration: none; \
  33. border-radius: 4px; \
  34. padding: 2px 5px; \
  35. font-size: 8pt; \
  36. margin: 3px 3px 3px 0px; \
  37. text-shadow: none; \
  38. display: none; \
  39. white-space: nowrap; \
  40. } \
  41. .tags.tags-minimalist { \
  42. margin-right: 0; \
  43. margin-left: 5px; \
  44. }\
  45. .my__checkbox { cursor:pointer; padding:7px 0 } \
  46. .my__checkbox i { margin-right:7px } \
  47. .my__checkbox:not(:last-of-type) { border-bottom:1px dotted #d2d6e0 } \
  48. .my__checkbox:not(:hover) .form__checkbox__hover,.my__checkbox.is-selected .form__checkbox__hover,.my__checkbox:not(.is-selected) .form__checkbox__selected,.my__checkbox:hover .form__checkbox__default,.my__checkbox.is-selected .form__checkbox__default { \
  49. display:none \
  50. } \
  51. ';
  52. myCSS += '.tags-bundle { background-color: ' + GM_getValue("bundle-1", default_bundle) + '; color: ' + GM_getValue("bundle-2", "#FFFFFF") + '}';
  53. myCSS += '.tags-card { background-color: ' + GM_getValue("card-1", default_card) + '; color: ' + GM_getValue("card-2", "#FFFFFF") + '}';
  54. myCSS += '.tags-achievement { background-color: ' + GM_getValue("achievement-1", default_achievement) + '; color: ' + GM_getValue("achievement-2", "#FFFFFF") + '}';
  55. myCSS += '.tags-wishlist { background-color: ' + GM_getValue("wishlist-1", default_wishlist) + '; color: ' + GM_getValue("wishlist-2", "#FFFFFF") + '}';
  56. myCSS += '.tags-linux { background-color: ' + GM_getValue("linux-1", default_linux) + '; color: ' + GM_getValue("linux-2", "#FFFFFF") + '}';
  57. myCSS += '.tags-mac { background-color: ' + GM_getValue("mac-1", default_mac) + '; color: ' + GM_getValue("mac-2", "#FFFFFF") + '}';
  58. myCSS += '.tags-early { background-color: ' + GM_getValue("early-1", default_early) + '; color: ' + GM_getValue("early-2", "#FFFFFF") + '}';
  59. myCSS += '.tags-hidden { background-color: ' + GM_getValue("hidden-1", default_hidden) + '; color: ' + GM_getValue("hidden-2", "#FFFFFF") + '}';
  60.  
  61. $("head").append('<style type="text/css">' + myCSS + '</style>');
  62.  
  63. /* Constant Variables */
  64. const linkBundle = "https://www.steamgifts.com/bundle-games/search?q=";
  65. const linkCard = "http://www.steamcardexchange.net/index.php?inventorygame-appid-";
  66. const linkAchievement = "http://steamcommunity.com/stats/"; // 424280/achievements/";
  67. const linkHidden = "https://www.steamgifts.com/account/settings/giveaways/filters/search?q=";
  68. const linkWishlist = "https://www.steamgifts.com/account/steam/wishlist/search?q=";
  69.  
  70. const linkGameAPI = "http://store.steampowered.com/api/appdetails?appids=";//filters=categories,platforms,genres&
  71. const linkPackAPI = "http://store.steampowered.com/api/packagedetails?packageids=";
  72. const linkBundleAPI = "http://ruphine.esy.es/steamgifts/GetBundleStatus.php"; //?AppID=325470
  73. const linkUserAPI = "http://store.steampowered.com/dynamicstore/userdata/";
  74.  
  75. const ClassCard = "tags tags-card";
  76. const TitleCard = "This game has trading cards";
  77. const TextCard = "Trading Cards";
  78.  
  79. const ClassBundle = "tags tags-bundle";
  80. const TitleBundle = "Bundled since ";
  81. const TextBundle = "Bundled";
  82.  
  83. const ClassAchievement = "tags tags-achievement";
  84. const TitleAchievement = "This game has steam achievements";
  85. const TextAchievement = "Achievements";
  86.  
  87. const ClassHidden = "tags tags-hidden";
  88. const TitleHidden = "This game is in your filter list";
  89. const TextHidden = "Hidden";
  90.  
  91. const ClassWishlist = "tags tags-wishlist";
  92. const TitleWishlist = "This game is in your Steam wishlist";
  93. const TextWishlist = "Wishlist";
  94.  
  95. const ClassLinux = "tags tags-linux";
  96. const TitleLinux = "Linux supported";
  97. const TextLinux = "Linux";
  98.  
  99. const ClassMac = "tags tags-mac";
  100. const TitleMac = "Mac supported";
  101. const TextMac = "Mac";
  102.  
  103. const ClassEarly = "tags tags-early";
  104. const TitleEarly = "This game is in early access state";
  105. const TextEarly = "Early Access";
  106.  
  107. const THIS_URL = window.location.href;
  108. const TIMEOUT = 0;
  109. const CACHE_TIME = 6*60*60*1000; //6 hours
  110.  
  111. var cbCards = GM_getValue("cbCards", true);
  112. var cbAchievement = GM_getValue("cbAchievement", true);
  113. var cbBundled = GM_getValue("cbBundled", true);
  114. var cbHidden = GM_getValue("cbHidden", true);
  115. var cbWishlist = GM_getValue("cbWishlist", true);
  116. var cbLinux = GM_getValue("cbLinux", false);
  117. var cbMac = GM_getValue("cbMac", false);
  118. var cbEarly = GM_getValue("cbEarly", false);
  119.  
  120. var cbTagStyle = GM_getValue("cbTagStyle", 1); //1 = full, 2 = minimalist
  121.  
  122. var BundledGames = GM_getValue("BundledGames", "");
  123. var BundledCache = GM_getValue("BundledCache", 0);
  124. var UserdataAPI = GM_getValue("UserdataAPI", "");
  125. var UserdataCache = GM_getValue("UserdataCache", 0);
  126. var GameData = GM_getValue("GameData", "");
  127. var PackageData = GM_getValue("PackageData", "");
  128.  
  129. var rgWishlist;
  130. var arrBundled;
  131.  
  132. if(cbBundled && BundledCache < Date.now() - CACHE_TIME) // Check if need to request bundle list from ruphine API
  133. getBundleList();
  134. else if(cbWishlist && UserdataCache < Date.now() - CACHE_TIME) //6 hours. Check if need to request steam user api
  135. getUserdata();
  136. else
  137. main();
  138.  
  139. function main()
  140. {
  141. try {
  142. arrBundled = JSON.parse(BundledGames);
  143. }
  144. catch (e) {
  145. console.log("[SG Game Tags] Invalid json format for Bundle List");
  146. BundledGames = ""; GM_setValue("BundledGames", "");
  147. BundledCache = 0; GM_setValue("BundledCache", 0);
  148. }
  149.  
  150. try {
  151. rgWishlist = JSON.parse(UserdataAPI).rgWishlist;
  152. }
  153. catch (e) {
  154. console.log("[SG Game Tags] Invalid json format for Wishlist");
  155. UserdataAPI = ""; GM_setValue("UserdataAPI", "");
  156. UserdataCache = 0; GM_setValue("UserdataCache", 0);
  157. }
  158.  
  159. if(GameData == "") PrepareJSON();
  160. else
  161. {
  162. GameData = JSON.parse(GameData);
  163. PackageData = JSON.parse(PackageData);
  164. }
  165.  
  166. if(/www.steamgifts.com\/giveaways\/new/.test(THIS_URL)) // process giveaway creation page
  167. $(".js__autocomplete-data").on("DOMNodeInserted", NewGiveawayDivUpdated);
  168. else if(/www.steamgifts.com\/account\/settings\/giveaways$/.test(THIS_URL)) // process giveaway setting page
  169. initSetting();
  170. else if(/www.steamgifts.com\/($|giveaways$|giveaways\/search)/.test(THIS_URL)) // homepage and all search active giveaway
  171. {
  172. ProcessGiveawayListPage($(".giveaway__row-inner-wrap"));
  173. // handles element added later by endless scroll, add timeout to delay this function because it is triggered when ext SG runs
  174. setTimeout(function()
  175. {
  176. $(document).on("DOMNodeInserted", ".widget-container", function(e)
  177. {
  178. ProcessGiveawayListPage($(e.target).find(".giveaway__row-inner-wrap"));
  179. });
  180. }, TIMEOUT);
  181.  
  182. if($(".featured__inner-wrap .global__image-outer-wrap--missing-image").length == 0 && $(".featured__inner-wrap a img").length > 0)
  183. {
  184. var URL = $(".featured__inner-wrap a img")[0].src;
  185. ProcessFeaturedGiveaway(URL);
  186. }
  187. }
  188. // user profile & group page excluding user trade and feedback and excluding group users, stats, and wishlist
  189. else if(/www.steamgifts.com\/(user|group)\//.test(THIS_URL) && !/user\/\w+\/(feedback|trade)/.test(THIS_URL) && !/group\/\w+\/\w+\/(users|stats|wishlist)/.test(THIS_URL)) // exclude
  190. {
  191. ProcessGiveawayListPage($(".giveaway__row-inner-wrap"));
  192. // handles element added later by endless scroll
  193. setTimeout(function()
  194. {
  195. $(document).on("DOMNodeInserted", ".widget-container", function(e)
  196. {
  197. ProcessGiveawayListPage($(e.target).find(".giveaway__row-inner-wrap"));
  198. });
  199. }, TIMEOUT);
  200. }
  201. else if(/www.steamgifts.com\/giveaway\//.test(THIS_URL)) // giveaway page https://www.steamgifts.com/giveaway/FGbTw/left-4-dead-2
  202. {
  203. var URL = $(".featured__inner-wrap a")[0].href;
  204. ProcessFeaturedGiveaway(URL);
  205. }
  206. // https://www.steamgifts.com/sales*
  207. // https://www.steamgifts.com/sales/account/steam/games
  208. // https://www.steamgifts.com/sales/account/steam/wishlist
  209. // https://www.steamgifts.com/giveaways/created
  210. // https://www.steamgifts.com/giveaways/entered
  211. // https://www.steamgifts.com/giveaways/won
  212. // https://www.steamgifts.com/giveaways/wishlist
  213. // https://www.steamgifts.com/account/settings/giveaways/filters
  214. else if(/www.steamgifts.com\/(sales|account\/steam\/(games|wishlist)|giveaways\/(created|entered|won|wishlist)|account\/settings\/giveaways\/filters|group\/\w+\/\w+\/wishlist)/.test(THIS_URL))
  215. ProcessGameListPage();
  216.  
  217. AddShortcutToSettingPage();
  218. }
  219.  
  220. function ProcessFeaturedGiveaway(URL)
  221. {
  222. if(cbBundled || cbCards || cbAchievement || cbHidden || cbWishlist || cbLinux || cbMac || cbEarly) // check if at least one tag enabled
  223. {
  224. var Name = $(".featured__heading__medium").text().substring(0,45); //letter after 45th converted to ...
  225. var Target = $(".featured__heading");
  226.  
  227. ProcessTags(Target, URL, Name);
  228. }
  229. }
  230.  
  231. function ProcessGiveawayListPage(scope) // giveaways list with creator name
  232. {
  233. if(cbBundled || cbCards || cbAchievement || cbHidden || cbWishlist || cbLinux || cbMac || cbEarly) // check if at least one tag enabled
  234. {
  235. $(scope).each(function(index, element)
  236. {
  237. var URL = $(element).find("a.giveaway__icon").attr("href");
  238. if(URL != undefined)
  239. {
  240. var Name = $(element).find(".giveaway__heading__name").contents().filter(
  241. function() //return text without [NEW] and [FREE]
  242. {
  243. return this.nodeType === 3; //Node.TEXT_NODE
  244. }
  245. ).slice(-1)[0].textContent.substring(0,40); //letter after 40th converted to ...
  246. var Target = $(element).find(".giveaway__heading");
  247. ProcessTags(Target, URL, Name);
  248. }
  249. });
  250. }
  251. }
  252.  
  253. function ProcessGameListPage() // giveaways / games list
  254. {
  255. if(cbBundled || cbCards || cbAchievement || cbHidden || cbWishlist || cbLinux || cbMac || cbEarly) // check if at least one tag enabled
  256. {
  257. $(".table__row-inner-wrap").each(function(index, element)
  258. {
  259. var URL;
  260. if(/www.steamgifts.com\/account\/settings\/giveaways\/filters/.test(THIS_URL))
  261. URL = $(element).find("a.table__column__secondary-link").text();
  262. else
  263. URL = $($(element).find(".global__image-inner-wrap")[0]).css('background-image');
  264.  
  265. if(URL != undefined)
  266. {
  267. URL = URL.replace('url(', '').replace(')', '');
  268. var Name = $(element).find(".table__column__heading").text().substring(0,30);
  269. var Target = $(element).find(".table__column--width-fill > :first-child");
  270.  
  271. if(/www.steamgifts.com\/sales/.test(THIS_URL)) Target.css("display", "block"); //because sales pages don't use <p> thus tags will appears in line with title
  272.  
  273. ProcessTags(Target, URL, Name);
  274. }
  275. });
  276. }
  277. }
  278.  
  279. function ProcessTags(Target, URL, Name)
  280. {
  281. var ID = getAppIDfromLink(URL);
  282. Name = encodeURIComponent(Name); //encode special characters that may break search params
  283. var linkStore = "";
  284. if(isApp(URL))
  285. linkStore = "http://store.steampowered.com/app/" + ID;
  286. else if(isPackage(URL))
  287. linkStore = "http://store.steampowered.com/sub/" + ID;
  288.  
  289. if(cbTagStyle == 1)
  290. {
  291. var tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, Target);
  292. var tagCard = createTag(ClassCard, TitleCard, TextCard, linkCard+ID, tagBundle);
  293. var tagAchievement = createTag(ClassAchievement, TitleAchievement, TextAchievement, linkAchievement+ID+"/achievements/", tagCard);
  294. var tagWishlist = createTag(ClassWishlist, TitleWishlist, TextWishlist, linkWishlist+Name, tagAchievement);
  295. var tagLinux = createTag(ClassLinux, TitleLinux, TextLinux, linkStore, tagWishlist);
  296. var tagMac = createTag(ClassMac, TitleMac, TextMac, linkStore, tagLinux);
  297. var tagEarly = createTag(ClassEarly, TitleEarly, TextEarly, linkStore, tagMac);
  298. }
  299. else
  300. {
  301. var tagBundle = createTag(ClassBundle + " tags-minimalist", TitleBundle, "B", linkBundle+Name, Target);
  302. var tagCard = createTag(ClassCard + " tags-minimalist", TitleCard, "T", linkCard+ID, Target);
  303. var tagAchievement = createTag(ClassAchievement + " tags-minimalist", TitleAchievement, "A", linkAchievement+ID+"/achievements/", Target);
  304. var tagWishlist = createTag(ClassWishlist + " tags-minimalist", TitleWishlist, "W", linkWishlist+Name, Target);
  305. var tagLinux = createTag(ClassLinux + " tags-minimalist", TitleLinux, "L", linkStore, Target);
  306. var tagMac = createTag(ClassMac + " tags-minimalist", TitleMac, "M", linkStore, Target);
  307. var tagEarly = createTag(ClassEarly + " tags-minimalist", TitleEarly, "E", linkStore, Target);
  308. }
  309.  
  310. if(/www.steamgifts.com\/giveaway\//.test(THIS_URL)) //only trigger inside giveaway page, no need for homepage
  311. {
  312. if(cbTagStyle == 1)
  313. var tagHidden = createTag(ClassHidden, TitleHidden, TextHidden, linkHidden+Name, tagEarly);
  314. else if(cbTagStyle == 2)
  315. var tagHidden = createTag(ClassHidden + " tags-minimalist", TitleHidden, "H", linkHidden+Name, Target);
  316.  
  317. getHiddenStatus(ID, Name, tagHidden);
  318. }
  319.  
  320. if(isApp(URL))
  321. getSteamCategories(ID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly);
  322. else if(isPackage(URL))
  323. {
  324. tagCard.setAttribute("href", "");
  325. tagAchievement.setAttribute("href", "");
  326. getSteamCategoriesFromPackage(ID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly);
  327. }
  328.  
  329. var type = isApp(URL) ? 'app' : 'sub';
  330. if(cbBundled && BundledGames != "")
  331. getBundleStatus(ID, type, tagBundle);
  332. if(cbWishlist && UserdataAPI != "" && rgWishlist.length > 0)
  333. getWishlistStatus(ID, tagWishlist);
  334. }
  335.  
  336. function createTag(_class, title, text, href, divTarget)
  337. {
  338. var tag = document.createElement("a");
  339. tag.setAttribute("target", "_blank");
  340. tag.setAttribute("class", _class);
  341. tag.setAttribute("title", title);
  342. tag.setAttribute("href", href);
  343. tag.innerHTML = text;
  344.  
  345. if(cbTagStyle == 1 || /www.steamgifts.com\/giveaways\/new/.test(THIS_URL)) // full text below game title, use after, or bundle tag in giveaway creation page
  346. $(divTarget).after(tag);
  347. else if(cbTagStyle == 2) // minimalist beside game title use append
  348. $(divTarget).append(tag);
  349. return tag;
  350. }
  351.  
  352. function displayElems(elems)
  353. {
  354. $(elems).css("display", "inline-block");
  355. }
  356.  
  357. function getSteamCategories(appID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly, packID = "0")
  358. {
  359. var needRequest = false;
  360. if(GameData[appID] == undefined || GameData[appID].game == undefined)
  361. {
  362. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0, "game": appID+""};
  363. GameData[appID] = template;
  364. needRequest = true;
  365. }
  366. else
  367. {
  368. var data = GameData[appID];
  369. if(cbCards && data.cards)
  370. {
  371. displayElems(tagCard);
  372. if(GameData[appID].game != "0")
  373. tagCard.setAttribute("href", linkCard+GameData[appID].game);
  374. }
  375. if(cbAchievement && data.achievement)
  376. {
  377. displayElems(tagAchievement);
  378. if(GameData[appID].game != "0")
  379. tagAchievement.setAttribute("href", linkAchievement+GameData[appID].game+"/achievements/");
  380. }
  381. if(cbMac && data.mac) displayElems(tagMac);
  382. if(cbLinux && data.linux) displayElems(tagLinux);
  383.  
  384. if(data.last_checked < (Date.now() - (24 * 60 * 60 * 1000))) // 24 hours have passed since last checked
  385. {
  386. if((!data.cards && cbCards) || (!data.achievement && cbAchievement) || (!data.mac && cbMac ) || (!data.linux && cbLinux) || (data.early_access && cbEarly))
  387. needRequest = true;
  388. }
  389. else if(data.early_access && cbEarly) displayElems(tagEarly);
  390. }
  391. if(needRequest)
  392. {
  393. var link = linkGameAPI+appID;
  394. if(GameData[appID].last_checked !== 0) link += "&filters=categories,platforms,genres";
  395. // console.log("[SG Game Tags] requesting " + linkGameAPI+appID);
  396.  
  397. GM_xmlhttpRequest({
  398. method: "GET",
  399. timeout: 10000,
  400. url: link,
  401. onload: function(data)
  402. {
  403. var obj = JSON.parse(data.responseText)[appID].data;
  404. if(obj != undefined) // undefined = doesn't have store page or doesn't exist
  405. // get steam apps categories : achievement, trading cards, etc
  406. {
  407. if(GameData[appID].last_checked === 0)
  408. {
  409. if (obj.type != "game")
  410. {
  411. GameData[appID].game = obj.fullgame.appid;
  412. tagCard.setAttribute("href", linkCard+obj.fullgame.appid);
  413. tagAchievement.setAttribute("href", linkAchievement+obj.fullgame.appid+"/achievements/");
  414. }
  415. else if(packID != "0" && PackageData[packID].games.indexOf(appID) == -1)
  416. PackageData[packID].games.push(appID);
  417. }
  418.  
  419. var categories = obj.categories;
  420. if(categories != undefined)
  421. {
  422. var catCards = $.grep(categories, function(e){ return e.id == "29"; });
  423. if(catCards.length > 0)
  424. {
  425. if(cbCards) displayElems(tagCard);
  426. GameData[appID].cards = true;
  427. if(packID != "0")
  428. {
  429. PackageData[packID].cards = true;
  430. if(PackageData[packID].games.length > 1)
  431. tagCard.setAttribute("href", "http://ruphine.esy.es/steamgifts/TradingCard.php?packageid="+packID);
  432. else
  433. tagCard.setAttribute("href", linkCard+PackageData[packID].games[0]);
  434. }
  435. }
  436.  
  437. var catAchievement = $.grep(categories, function(e){ return e.id == "22"; });
  438. if(catAchievement.length > 0)
  439. {
  440. if(cbAchievement) displayElems(tagAchievement);
  441. GameData[appID].achievement = true;
  442. if(packID != "0")
  443. {
  444. PackageData[packID].achievement = true;
  445. if(PackageData[packID].games.length > 1)
  446. tagAchievement.setAttribute("href", "http://ruphine.esy.es/steamgifts/Achievement.php?packageid="+packID);
  447. else
  448. tagAchievement.setAttribute("href", linkAchievement+PackageData[packID].games[0]+"/achievements/");
  449. }
  450. }
  451. }
  452.  
  453. // get steam apps platforms: linux: boolean, mac: boolean
  454. var platforms = obj.platforms;
  455. if(platforms.linux)
  456. {
  457. if(cbLinux) displayElems(tagLinux);
  458. GameData[appID].linux = true;
  459. if(packID != "0") PackageData[packID].linux = true;
  460. }
  461. if(platforms.mac)
  462. {
  463. if(cbMac) displayElems(tagMac);
  464. GameData[appID].mac = true;
  465. if(packID != "0") PackageData[packID].mac = true;
  466. }
  467.  
  468. // get steam apps genres
  469. if(obj.genres != undefined)
  470. {
  471. var genEarly = $.grep(obj.genres, function(e){ return e.id == "70"; });
  472. if(genEarly.length > 0)
  473. {
  474. if(cbEarly) displayElems(tagEarly);
  475. GameData[appID].early_access = true;
  476. if(packID != "0") PackageData[packID].early_access = true;
  477. }
  478. else
  479. {
  480. GameData[appID].early_access = false;
  481. if(packID != "0") PackageData[packID].early_access = false;
  482. }
  483. }
  484. }
  485. GameData[appID].last_checked = Date.now();
  486. GM_setValue("GameData", JSON.stringify(GameData));
  487.  
  488. if(packID != "0")
  489. {
  490. PackageData[packID].last_checked = Date.now();
  491. GM_setValue("PackageData", JSON.stringify(PackageData));
  492. }
  493. },
  494. ontimeout: function(data)
  495. {
  496. console.log("[SG Game Tags] Request " + linkGameAPI+appID + " Timeout");
  497. }
  498. });
  499. }
  500. }
  501.  
  502. function getBundleStatus(appID, type, tag)
  503. {
  504. var Game = $.grep(arrBundled, function(e){ return (e.AppID == appID && e.Type == type); });
  505. if(Game.length > 0) //game found in bundle list
  506. {
  507. displayElems(tag);
  508. tag.setAttribute("title", TitleBundle+Game[0].BundledDate);
  509. }
  510. }
  511.  
  512. function getBundleList()
  513. {
  514. // console.log("[SG Game Tags] requesting " + linkBundleAPI);
  515. GM_xmlhttpRequest({
  516. method: "GET",
  517. timeout: 10000,
  518. url: linkBundleAPI,
  519. onload: function(data)
  520. {
  521. BundledGames = data.responseText;
  522. GM_setValue("BundledGames", BundledGames);
  523.  
  524. BundledCache = Date.now();
  525. GM_setValue("BundledCache", BundledCache);
  526. if(cbWishlist && UserdataCache < Date.now() - 6*60*60*1000) //6 hours
  527. getUserdata();
  528. else
  529. main();
  530. },
  531. ontimeout: function(data)
  532. {
  533. console.log("[SG Game Tags] Request " + linkBundleAPI + " Timeout");
  534. if(cbWishlist && UserdataCache < Date.now() - 6*60*60*1000) //6 hours
  535. getUserdata();
  536. else
  537. main();
  538. }
  539. });
  540. }
  541.  
  542. function getUserdata()
  543. {
  544. // console.log("[SG Game Tags] requesting " + linkUserAPI);
  545. GM_xmlhttpRequest({
  546. method: "GET",
  547. timeout: 10000,
  548. url: linkUserAPI,
  549. onload: function(data)
  550. {
  551. var result = JSON.parse(data.responseText);
  552. if(result.rgOwnedApps.length !== 0) //check if user logged in
  553. {
  554. UserdataAPI = data.responseText;
  555. GM_setValue("UserdataAPI", UserdataAPI);
  556.  
  557. UserdataCache = Date.now();
  558. GM_setValue("UserdataCache", UserdataCache);
  559. }
  560. else
  561. console.log("[SG Game Tags] Unable to get wishlist data. User is not logged in to steam");
  562.  
  563. main();
  564. },
  565. ontimeout: function(data)
  566. {
  567. console.log("[SG Game Tags] Request " + linkUserAPI + " Timeout");
  568. main();
  569. }
  570. });
  571. }
  572.  
  573. function getHiddenStatus(appID, appName, elems)
  574. {
  575. if(cbHidden)
  576. {
  577. // console.log("[SG Game Tags] requesting " + linkHidden+appName);
  578. $.get(linkHidden+appName, function(data)
  579. {
  580. var gamesfound = $(data).find("a.table__column__secondary-link");
  581. for(i=0; i<$(gamesfound).length; i++)
  582. {
  583. var url = $(gamesfound)[i].href;
  584. var ID = getAppIDfromLink(url);
  585. if(appID == ID)
  586. {
  587. //TODO : Save appID + true ke local cache
  588. displayElems(elems);
  589. return true; //exit function
  590. }
  591. }
  592. });
  593. }
  594. }
  595.  
  596. function getWishlistStatus(appID, elems)
  597. {
  598. appID = parseInt(appID);
  599. if(rgWishlist.indexOf(appID) >= 0)
  600. displayElems(elems);
  601. }
  602.  
  603. function getSteamCategoriesFromPackage(packID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly)
  604. {
  605. var needRequest = false;
  606. if(PackageData[packID] == undefined || PackageData[packID].games == undefined)
  607. {
  608. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0, "games":[]};
  609. PackageData[packID] = template;
  610. needRequest = true;
  611. }
  612. else
  613. {
  614. var data = PackageData[packID];
  615. if(cbCards && data.cards)
  616. {
  617. displayElems(tagCard);
  618. if(data.games.length > 1)
  619. {
  620. tagCard.setAttribute("href", "http://ruphine.esy.es/steamgifts/TradingCard.php?packageid="+packID);
  621. tagCard.setAttribute("title", "There is " + data.games.length + " games in this package, and at least one of them have trading cards");
  622. }
  623. else
  624. tagCard.setAttribute("href", linkCard+data.games[0]);
  625. }
  626. if(cbAchievement && data.achievement)
  627. {
  628. displayElems(tagAchievement);
  629. if(data.games.length > 1)
  630. {
  631. tagAchievement.setAttribute("href", "http://ruphine.esy.es/steamgifts/Achievement.php?packageid="+packID);
  632. tagAchievement.setAttribute("title", "There is " + data.games.length + " games in this package, and at least one of them have achievements");
  633. }
  634. else
  635. tagAchievement.setAttribute("href", linkAchievement+data.games[0]+"/achievements/");
  636. }
  637. if(cbMac && data.mac) displayElems(tagMac);
  638. if(cbLinux && data.linux) displayElems(tagLinux);
  639. if(cbEarly && data.early_access) displayElems(tagEarly);
  640.  
  641. if(data.last_checked < (Date.now() - (24 * 60 * 60 * 1000))) // 24 hours have passed since last checked
  642. {
  643. if((!data.cards && cbCards) || (!data.achievement && cbAchievement) || (!data.mac && cbMac ) || (!data.linux && cbLinux) || (data.early_access && cbEarly))
  644. needRequest = true;
  645. }
  646. }
  647. if(needRequest)
  648. {
  649. // console.log("[SG Game Tags] requesting " + linkPackAPI+packID);
  650. GM_xmlhttpRequest({
  651. method: "GET",
  652. timeout: 10000,
  653. url: linkPackAPI+packID,
  654. onload: function(data)
  655. {
  656. var IDs = JSON.parse(data.responseText)[packID].data;
  657. if(IDs == undefined)
  658. {
  659. PackageData[packID].cards = false;
  660. PackageData[packID].achievement = false;
  661. PackageData[packID].mac = false;
  662. PackageData[packID].linux = false;
  663. PackageData[packID].early_access = false;
  664. PackageData[packID].games = [];
  665. PackageData[packID].last_checked = Date.now();
  666. GM_setValue("PackageData", JSON.stringify(PackageData));
  667. }
  668. else
  669. {
  670. IDs = IDs.apps;
  671. $.each(IDs, function(index)
  672. {
  673. getSteamCategories(IDs[index].id, tagCard, tagAchievement, tagLinux, tagMac, tagEarly, packID);
  674. });
  675. }
  676. },
  677. ontimeout: function(data)
  678. {
  679. console.log("[SG Game Tags] Request " + linkPackAPI+packID + " Timeout");
  680. }
  681. });
  682. }
  683. }
  684.  
  685. function PrepareJSON()
  686. {
  687. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0};
  688. var a = {"0":template};
  689. var temp = JSON.stringify(a);
  690. GameData = JSON.parse(temp);
  691. PackageData = JSON.parse(temp);
  692. GM_setValue("GameData", JSON.stringify(GameData));
  693. GM_setValue("PackageData", JSON.stringify(PackageData));
  694. }
  695.  
  696. function getAppIDfromLink(link)
  697. {
  698. var url = link.split("/");
  699. return url[url.length-2];
  700. }
  701.  
  702. function isApp(link)
  703. {
  704. var pattern = /\/app|apps\/0-9\//;
  705. return pattern.test(link);
  706. }
  707.  
  708. function isPackage(link)
  709. {
  710. var pattern = /\/sub|subs\/0-9\//;
  711. return pattern.test(link);
  712. }
  713.  
  714.  
  715. // ========================================== create new giveaway page ========================================================
  716. function NewGiveawayDivUpdated(event)
  717. {
  718. if(event.type == "DOMNodeInserted") //show bundle tag for shown game
  719. {
  720. var gamesfound = $(".table__row-inner-wrap");
  721. $(".tags").remove();
  722. $(".table__row-inner-wrap").each(function(index, element)
  723. {
  724. var url = $(element).find("a.table__column__secondary-link").text();
  725. var ID = getAppIDfromLink(url);
  726. var Name = $(element).find(".table__column__heading").text();
  727. var Target = $(element).find(".table__column--width-fill");
  728.  
  729. $(".js__autocomplete-data").off("DOMNodeInserted");
  730. var tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, Target);
  731. $(tagBundle).css("float", "right");
  732.  
  733. var type = isApp(url) ? 'app' : 'sub';
  734. getBundleStatus(ID, type, tagBundle);
  735. });
  736. if(gamesfound.length > 0)
  737. {
  738. $(".js__autocomplete-data").on("DOMNodeRemoved", NewGiveawayDivUpdated);
  739.  
  740. $(".table__row-inner-wrap").on("click", function(event)
  741. {
  742. var url = $(this).find("a.table__column__secondary-link").text();
  743. var ID = getAppIDfromLink(url);
  744. var Name = $(this).find(".table__column__heading").text();
  745. var Target = $(".js__autocomplete-name")[0];
  746. tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, Target);
  747. var type = isApp(url) ? 'app' : 'sub';
  748. getBundleStatus(ID, type, tagBundle);
  749. });
  750. }
  751. }
  752. else if(event.type == "DOMNodeRemoved")//show / remove tag of selected game
  753. {
  754. $(".js__autocomplete-data").off("DOMNodeRemoved");
  755. $(".table__row-inner-wrap").off("click");
  756. $(".js__autocomplete-data").on("DOMNodeInserted", NewGiveawayDivUpdated);
  757. }
  758. }
  759.  
  760. // ========================================== setting page ========================================================
  761. function initSetting()
  762. {
  763. var no = $(".form__heading").length + 1;
  764. initTagOnOffSetting(no);
  765. initTagPositionSetting(no+1);
  766. initTagColorSetting(no+2);
  767. }
  768.  
  769. function initTagOnOffSetting(no)
  770. {
  771. var CheckIcon = '<i class="form__checkbox__default fa fa-circle-o"></i><i class="form__checkbox__hover fa fa-circle"></i><i class="form__checkbox__selected fa fa-check-circle"></i>';
  772. var form__row = document.createElement("div");
  773. form__row.setAttribute("class", "form__row");
  774.  
  775. var form__heading = document.createElement("div");
  776. form__heading.setAttribute("class", "form__heading");
  777.  
  778. var form__heading__number = document.createElement("div");
  779. form__heading__number.setAttribute("class", "form__heading__number");
  780. form__heading__number.innerHTML = no + ".";
  781.  
  782. var form__heading__text = document.createElement("div");
  783. form__heading__text.setAttribute("class", "form__heading__text");
  784. form__heading__text.setAttribute("title", "If you have performance issues, try disable tags you don't need");
  785. form__heading__text.innerHTML = "[SG Game Tags] Which tags do you want to see?";
  786.  
  787. $(form__heading).append(form__heading__number).append(form__heading__text);
  788.  
  789. var form__row__indent = document.createElement("div");
  790. form__row__indent.setAttribute("class", "form__row__indent");
  791.  
  792. var form__checkbox_1 = createCheckBox("my__checkbox", CheckIcon + "Trading Cards", cbCards);
  793. var form__checkbox_2 = createCheckBox("my__checkbox", CheckIcon + "Achievements", cbAchievement);
  794. var form__checkbox_3 = createCheckBox("my__checkbox", CheckIcon + "Bundled", cbBundled);
  795. var form__checkbox_4 = createCheckBox("my__checkbox", CheckIcon + "Hidden", cbHidden);
  796. var form__checkbox_5 = createCheckBox("my__checkbox", CheckIcon + "Wishlist", cbWishlist);
  797. var form__checkbox_6 = createCheckBox("my__checkbox", CheckIcon + "Linux", cbLinux);
  798. var form__checkbox_7 = createCheckBox("my__checkbox", CheckIcon + "Mac", cbMac);
  799. var form__checkbox_8 = createCheckBox("my__checkbox", CheckIcon + "Early Access", cbEarly);
  800.  
  801. $(form__checkbox_1).click(function(){toggleCBTags(form__checkbox_1, "cbCards");});
  802. $(form__checkbox_2).click(function(){toggleCBTags(form__checkbox_2, "cbAchievement");});
  803. $(form__checkbox_3).click(function(){toggleCBTags(form__checkbox_3, "cbBundled");});
  804. $(form__checkbox_4).click(function(){toggleCBTags(form__checkbox_4, "cbHidden");});
  805. $(form__checkbox_5).click(function(){toggleCBTags(form__checkbox_5, "cbWishlist");});
  806. $(form__checkbox_6).click(function(){toggleCBTags(form__checkbox_6, "cbLinux");});
  807. $(form__checkbox_7).click(function(){toggleCBTags(form__checkbox_7, "cbMac");});
  808. $(form__checkbox_8).click(function(){toggleCBTags(form__checkbox_8, "cbEarly");});
  809.  
  810. $(form__row__indent)
  811. .append(form__checkbox_1)
  812. .append(form__checkbox_2)
  813. .append(form__checkbox_3)
  814. .append(form__checkbox_4)
  815. .append(form__checkbox_5)
  816. .append(form__checkbox_6)
  817. .append(form__checkbox_7)
  818. .append(form__checkbox_8);
  819.  
  820. $(form__row).append(form__heading).append(form__row__indent).insertBefore(".js__submit-form");
  821.  
  822. var desc = document.createElement("div");
  823. desc.setAttribute("class", "form__input-description");
  824. desc.innerHTML = "No need to press Save Changes button. It is automatically saved when the value changed.";
  825. $(desc).appendTo([form__row__indent]);
  826.  
  827. changeCBColor();
  828. }
  829.  
  830. function initTagPositionSetting(no)
  831. {
  832. var CheckIcon = '<i class="form__checkbox__default fa fa-circle-o"></i><i class="form__checkbox__hover fa fa-circle"></i><i class="form__checkbox__selected fa fa-check-circle"></i>';
  833. var form__row = document.createElement("div");
  834. form__row.setAttribute("class", "form__row");
  835.  
  836. var form__heading = document.createElement("div");
  837. form__heading.setAttribute("class", "form__heading");
  838.  
  839. var form__heading__number = document.createElement("div");
  840. form__heading__number.setAttribute("class", "form__heading__number");
  841. form__heading__number.innerHTML = no + ".";
  842.  
  843. var form__heading__text = document.createElement("div");
  844. form__heading__text.setAttribute("class", "form__heading__text");
  845. form__heading__text.setAttribute("title", "This setting doesn't affect performance, only visual change.");
  846. form__heading__text.innerHTML = "[SG Game Tags] Tags Style";
  847.  
  848. $(form__heading).append(form__heading__number).append(form__heading__text);
  849.  
  850. var form__row__indent = document.createElement("div");
  851. form__row__indent.setAttribute("class", "form__row__indent");
  852. var form__checkbox_1 = createCheckBox("form__checkbox", CheckIcon + "(Original) Full Text tags below game title", cbTagStyle == 1);
  853. var form__checkbox_2 = createCheckBox("form__checkbox", CheckIcon + "(Minimalist) One letter tags beside game title", cbTagStyle == 2);
  854.  
  855. form__checkbox_1.setAttribute("title", 'The tags will display "Trading Cards", "Bundled", etc. This option will increase page height.');
  856. form__checkbox_2.setAttribute("title", 'The tags will just display first letter. "Trading Cards" becomes "T", "Bundled" becomes "B", etc.');
  857.  
  858. $(form__checkbox_1).click(
  859. function()
  860. {
  861. $(form__checkbox_2).removeClass("is-selected").addClass("is-disabled");
  862. $(form__checkbox_1).removeClass("is-disabled").addClass("is-selected");
  863. GM_setValue("cbTagStyle", 1);
  864.  
  865. $(".tags-bundle").text(TextBundle);
  866. $(".tags-card").text(TextCard);
  867. $(".tags-achievement").text(TextAchievement);
  868. $(".tags-wishlist").text(TextWishlist);
  869. $(".tags-linux").text(TextLinux);
  870. $(".tags-mac").text(TextMac);
  871. $(".tags-early").text(TextEarly);
  872. $(".tags-hidden").text(TextHidden);
  873. }
  874. );
  875. $(form__checkbox_2).click(
  876. function()
  877. {
  878. $(form__checkbox_1).removeClass("is-selected").addClass("is-disabled");
  879. $(form__checkbox_2).removeClass("is-disabled").addClass("is-selected");
  880. GM_setValue("cbTagStyle", 2);
  881. $(".row .tags").each(function(index, element)
  882. {
  883. $(element).text($(element).text().substring(0,1));
  884. });
  885. }
  886. );
  887.  
  888. $(form__row__indent).append(form__checkbox_1).append(form__checkbox_2);
  889.  
  890. $(form__row).append(form__heading).append(form__row__indent).insertBefore(".js__submit-form");
  891.  
  892. var desc = document.createElement("div");
  893. desc.setAttribute("class", "form__input-description");
  894. desc.innerHTML = "No need to press Save Changes button. It is automatically saved when the value changed.";
  895. $(desc).appendTo([form__row__indent]);
  896. }
  897.  
  898. function createCheckBox(_class, _html, cbValue)
  899. {
  900. var cb = document.createElement("div");
  901. cb.setAttribute("class", _class);
  902. cb.innerHTML = _html;
  903. if(cbValue)
  904. $(cb).addClass("is-selected");
  905. else
  906. $(cb).addClass("is-disabled");
  907.  
  908. return cb;
  909. }
  910.  
  911. function toggleCBTags(cbElems, cbName)
  912. {
  913. var cbValue;
  914. if(cbName == "cbCards")
  915. {
  916. cbCards = !cbCards;
  917. cbValue = cbCards;
  918. }
  919. else if(cbName == "cbAchievement")
  920. {
  921. cbAchievement = !cbAchievement;
  922. cbValue = cbAchievement;
  923. }
  924. else if(cbName == "cbBundled")
  925. {
  926. cbBundled = !cbBundled;
  927. cbValue = cbBundled;
  928. }
  929. else if(cbName == "cbHidden")
  930. {
  931. cbHidden = !cbHidden;
  932. cbValue = cbHidden;
  933. }
  934. else if(cbName == "cbWishlist")
  935. {
  936. cbWishlist = !cbWishlist;
  937. cbValue = cbWishlist;
  938. }
  939. else if(cbName == "cbLinux")
  940. {
  941. cbLinux = !cbLinux;
  942. cbValue = cbLinux;
  943. }
  944. else if(cbName == "cbMac")
  945. {
  946. cbMac = !cbMac;
  947. cbValue = cbMac;
  948. }
  949. else if(cbName == "cbEarly")
  950. {
  951. cbEarly = !cbEarly;
  952. cbValue = cbEarly;
  953. }
  954.  
  955. GM_setValue(cbName, cbValue);
  956. if(cbValue)
  957. $(cbElems).removeClass("is-disabled").addClass("is-selected");
  958. else
  959. $(cbElems).removeClass("is-selected").addClass("is-disabled");
  960.  
  961. changeCBColor();
  962. }
  963.  
  964. function changeCBColor()
  965. {
  966. var colorCBDisabled = $(".form__checkbox.is-disabled").css("color");
  967. var colorCBSelected = $(".form__checkbox.is-selected").css("color");
  968.  
  969. $(".my__checkbox.is-disabled").css("color", colorCBDisabled);
  970. $(".my__checkbox.is-selected").css("color", colorCBSelected);
  971. }
  972.  
  973. function initTagColorSetting(no)
  974. {
  975. var require = ' \
  976. <style type="text/css"> \
  977. .row div { display: inline-block; } \
  978. .preview-tags { width: 80px; margin-left: 10px; } \
  979. .row .markdown {margin-left: 10px; cursor: pointer; }\
  980. </style> \
  981. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.css" /> \
  982. ';
  983.  
  984. $("head").append(require);
  985.  
  986. var form__row = document.createElement("div");
  987. form__row.setAttribute("class", "form__row");
  988.  
  989. var form__heading = document.createElement("div");
  990. form__heading.setAttribute("class", "form__heading");
  991.  
  992. var form__heading__number = document.createElement("div");
  993. form__heading__number.setAttribute("class", "form__heading__number");
  994. form__heading__number.innerHTML = no + ".";
  995.  
  996. var form__heading__text = document.createElement("div");
  997. form__heading__text.setAttribute("class", "form__heading__text");
  998. form__heading__text.innerHTML = "[SG Game Tags] Customized tags color";
  999.  
  1000. $(form__heading).append(form__heading__number).append(form__heading__text);
  1001.  
  1002. var form__row__indent = document.createElement("div");
  1003. form__row__indent.setAttribute("class", "form__row__indent");
  1004. form__row__indent.innerHTML = ' \
  1005. <div class="row"> \
  1006. <input type="text" class="colorpicker" id="bundle-1"/> \
  1007. <input type="text" class="colorpicker" id="bundle-2"/> \
  1008. <div class="markdown"><a class="default_bundle">Default</a></div> \
  1009. <div class="preview-tags"><a class="tags tags-bundle" style="display: inline-block;">Bundled</a></div> \
  1010. </div> \
  1011. <div class="row"> \
  1012. <input type="text" class="colorpicker" id="card-1"/> \
  1013. <input type="text" class="colorpicker" id="card-2"/> \
  1014. <div class="markdown"><a class="default_card">Default</a></div> \
  1015. <div class="preview-tags"><a class="tags tags-card" style="display: inline-block;">Trading Card</a></div> \
  1016. </div> \
  1017. <div class="row"> \
  1018. <input type="text" class="colorpicker" id="achievement-1"/> \
  1019. <input type="text" class="colorpicker" id="achievement-2"/> \
  1020. <div class="markdown"><a class="default_achievement">Default</a></div> \
  1021. <div class="preview-tags"><a class="tags tags-achievement" style="display: inline-block;">Achievements</a></div> \
  1022. </div> \
  1023. <div class="row"> \
  1024. <input type="text" class="colorpicker" id="wishlist-1"/> \
  1025. <input type="text" class="colorpicker" id="wishlist-2"/> \
  1026. <div class="markdown"><a class="default_wishlist">Default</a></div> \
  1027. <div class="preview-tags"><a class="tags tags-wishlist" style="display: inline-block;">Wishlist</a></div> \
  1028. </div> \
  1029. <div class="row"> \
  1030. <input type="text" class="colorpicker" id="linux-1"/> \
  1031. <input type="text" class="colorpicker" id="linux-2"/> \
  1032. <div class="markdown"><a class="default_linux">Default</a></div> \
  1033. <div class="preview-tags"><a class="tags tags-linux" style="display: inline-block;">Linux</a></div> \
  1034. </div> \
  1035. <div class="row"> \
  1036. <input type="text" class="colorpicker" id="mac-1"/> \
  1037. <input type="text" class="colorpicker" id="mac-2"/> \
  1038. <div class="markdown"><a class="default_mac">Default</a></div> \
  1039. <div class="preview-tags"><a class="tags tags-mac" style="display: inline-block;">Mac</a></div> \
  1040. </div> \
  1041. <div class="row"> \
  1042. <input type="text" class="colorpicker" id="early-1"/> \
  1043. <input type="text" class="colorpicker" id="early-2"/> \
  1044. <div class="markdown"><a class="default_early">Default</a></div> \
  1045. <div class="preview-tags"><a class="tags tags-early" style="display: inline-block;">Early Access</a></div> \
  1046. </div> \
  1047. <div class="row"> \
  1048. <input type="text" class="colorpicker" id="hidden-1"/> \
  1049. <input type="text" class="colorpicker" id="hidden-2"/> \
  1050. <div class="markdown"><a class="default_hidden">Default</a></div> \
  1051. <div class="preview-tags"><a class="tags tags-hidden" style="display: inline-block;">Hidden</a></div> \
  1052. </div> \
  1053. ';
  1054.  
  1055. $(form__row).append(form__heading).append(form__row__indent).insertBefore(".js__submit-form");
  1056.  
  1057. var desc = document.createElement("div");
  1058. desc.setAttribute("class", "form__input-description");
  1059. desc.innerHTML = "No need to press Save Changes button. It is automatically saved when colorpicker closed.";
  1060. $(desc).appendTo([form__row__indent]);
  1061.  
  1062. if(cbTagStyle == 2) // change tags if minimalist selected
  1063. {
  1064. $(".row .tags").each(function(index, element)
  1065. {
  1066. $(element).text($(element).text().substring(0,1));
  1067. });
  1068. }
  1069.  
  1070. initColorpicker("bundle-1", GM_getValue("bundle-1", default_bundle), "tags-bundle", "background-color");
  1071. initColorpicker("bundle-2", GM_getValue("bundle-2", "#FFFFFF"), "tags-bundle", "color");
  1072. initColorpicker("card-1", GM_getValue("card-1", default_card), "tags-card", "background-color");
  1073. initColorpicker("card-2", GM_getValue("card-2", "#FFFFFF"), "tags-card", "color");
  1074. initColorpicker("achievement-1", GM_getValue("achievement-1", default_achievement), "tags-achievement", "background-color");
  1075. initColorpicker("achievement-2", GM_getValue("achievement-2", "#FFFFFF"), "tags-achievement", "color");
  1076. initColorpicker("wishlist-1", GM_getValue("wishlist-1", default_wishlist), "tags-wishlist", "background-color");
  1077. initColorpicker("wishlist-2", GM_getValue("wishlist-2", "#FFFFFF"), "tags-wishlist", "color");
  1078. initColorpicker("linux-1", GM_getValue("linux-1", default_linux), "tags-linux", "background-color");
  1079. initColorpicker("linux-2", GM_getValue("linux-2", "#FFFFFF"), "tags-linux", "color");
  1080. initColorpicker("mac-1", GM_getValue("mac-1", default_mac), "tags-mac", "background-color");
  1081. initColorpicker("mac-2", GM_getValue("mac-2", "#FFFFFF"), "tags-mac", "color");
  1082. initColorpicker("early-1", GM_getValue("early-1", default_early), "tags-early", "background-color");
  1083. initColorpicker("early-2", GM_getValue("early-2", "#FFFFFF"), "tags-early", "color");
  1084. initColorpicker("hidden-1", GM_getValue("hidden-1", default_hidden), "tags-hidden", "background-color");
  1085. initColorpicker("hidden-2", GM_getValue("hidden-2", "#FFFFFF"), "tags-hidden", "color");
  1086.  
  1087. $(".default_bundle").click(function(){clickDefaultColor("bundle", default_bundle);});
  1088. $(".default_card").click(function(){clickDefaultColor("card", default_card);});
  1089. $(".default_achievement").click(function(){clickDefaultColor("achievement", default_achievement);});
  1090. $(".default_wishlist").click(function(){clickDefaultColor("wishlist", default_wishlist);});
  1091. $(".default_linux").click(function(){clickDefaultColor("linux", default_linux);});
  1092. $(".default_mac").click(function(){clickDefaultColor("mac", default_mac);});
  1093. $(".default_early").click(function(){clickDefaultColor("early", default_early);});
  1094. $(".default_hidden").click(function(){clickDefaultColor("hidden", default_hidden);});
  1095. }
  1096.  
  1097. function initColorpicker(id, currentColor, tag, property)
  1098. {
  1099. $("#"+id).spectrum({
  1100. showInput: true, // show color code and lets user input color code
  1101. showInitial: true, //show previous color to compare with new color
  1102. showPalette: true,
  1103. showSelectionPalette: true,
  1104. preferredFormat: "hex", //display hex code
  1105. localStorageKey: "spectrum.sggametags",
  1106. maxSelectionSize: 8,
  1107. palette: [
  1108. [default_bundle, default_card, default_achievement, default_wishlist, default_linux, default_mac, default_early, default_hidden],
  1109. ["#000","#444","#666","#999","#ccc","#eee","#f3f3f3","#fff"],
  1110. ["#f00","#f90","#ff0","#0f0","#0ff","#00f","#90f","#f0f"],
  1111. ["#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#cfe2f3","#d9d2e9","#ead1dc"],
  1112. ["#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#9fc5e8","#b4a7d6","#d5a6bd"],
  1113. ["#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6fa8dc","#8e7cc3","#c27ba0"],
  1114. ["#c00","#e69138","#f1c232","#6aa84f","#45818e","#3d85c6","#674ea7","#a64d79"],
  1115. ["#900","#b45f06","#bf9000","#38761d","#134f5c","#0b5394","#351c75","#741b47"],
  1116. ["#600","#783f04","#7f6000","#274e13","#0c343d","#073763","#20124d","#4c1130"]
  1117. ],
  1118. color:currentColor,
  1119. move: function(color){ $("."+tag).css(property, color.toHexString()); },
  1120. change: function(color){ $("."+tag).css(property, color.toHexString()); },
  1121. hide: function(color){
  1122. GM_setValue(id, color.toHexString());
  1123. }
  1124. });
  1125. }
  1126.  
  1127. function clickDefaultColor(name, defaultvalue)
  1128. {
  1129. console.log("clicked");
  1130. GM_setValue(name+"-1", defaultvalue);
  1131. GM_setValue(name+"-2", "#FFFFFF");
  1132. $(".tags-"+name).css("background-color", defaultvalue).css("color", "#FFFFFF");
  1133. $("#"+name+"-1").spectrum("set", defaultvalue);
  1134. $("#"+name+"-2").spectrum("set", "#FFFFFF");
  1135. }
  1136.  
  1137. // ==================================================================================================
  1138. function AddShortcutToSettingPage()
  1139. {
  1140. var shortcut = '\
  1141. <a class="nav__row sggt_shortcut" href="/account/settings/giveaways"> \
  1142. <i class="icon-yellow fa fa-fw fa-tag"></i> \
  1143. <div class="nav__row__summary"> \
  1144. <p class="nav__row__summary__name">SG Game Tags Setting</p> \
  1145. <p class="nav__row__summary__description">Open SG Game Tags setting page</span>.</p> \
  1146. </div> \
  1147. </a> \
  1148. ';
  1149. var dropdown = $(".nav__right-container .nav__absolute-dropdown .nav__row");
  1150. $(dropdown[2]).before(shortcut); // just before logout button
  1151. }