SG Game Tags

some tags of the game in Steamgifts.

目前为 2016-07-18 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name SG Game Tags
  3. // @namespace https://steamcommunity.com/id/Ruphine/
  4. // @version 3.1.1
  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. // @grant GM_deleteValue
  13. // @grant GM_getValue
  14. // @grant GM_listValues
  15. // @grant GM_setValue
  16. // @grant GM_xmlhttpRequest
  17. // ==/UserScript==
  18.  
  19. /* CSS */
  20. var myCSS;
  21. myCSS = '<style> \
  22. .tags { \
  23. color: #FFFFFF; \
  24. text-decoration: none; \
  25. border-radius: 4px; \
  26. padding-top: 2px; \
  27. padding-bottom: 2px; \
  28. padding-left: 5px; \
  29. padding-right: 5px; \
  30. font-size: 8pt; \
  31. margin-right: 3px; \
  32. margin-bottom: 3px; \
  33. margin-top: 3px; \
  34. text-shadow: none; \
  35. display: none; \
  36. } \
  37. .tags-card { background-color: #3AA435; } \
  38. .tags-bundle { background-color: #E9202A; } \
  39. .tags-achievement { background-color: #305AC9; } \
  40. .tags-wishlist { background-color: #9335F1; } \
  41. .tags-hidden { background-color: #A0522D; } \
  42. .tags-linux { background-color: #E67300; } \
  43. .tags-mac { background-color: #777777; } \
  44. .tags-early { background-color: #9FA027; } \
  45. .tags.tags-minimalist { \
  46. margin-right: 0; \
  47. margin-left: 5px; \
  48. }\
  49. .my__checkbox { \
  50. cursor:pointer; \
  51. padding:7px 0 \
  52. } \
  53. .my__checkbox i { \
  54. margin-right:7px \
  55. } \
  56. .my__checkbox:not(:last-of-type) { \
  57. border-bottom:1px dotted #d2d6e0 \
  58. } \
  59. .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 { \
  60. display:none \
  61. } \
  62. </style>';
  63.  
  64. $("head").append(myCSS);
  65.  
  66.  
  67. /* Constant Variables */
  68. const linkBundle = "https://www.steamgifts.com/bundle-games/search?q=";
  69. const linkCard = "http://www.steamcardexchange.net/index.php?inventorygame-appid-";
  70. const linkAchievement = "http://steamcommunity.com/stats/"; // 424280/achievements/";
  71. const linkHidden = "https://www.steamgifts.com/account/settings/giveaways/filters/search?q=";
  72. const linkWishlist = "https://www.steamgifts.com/account/steam/wishlist/search?q=";
  73.  
  74. const linkGameAPI = "http://store.steampowered.com/api/appdetails?filters=categories,platforms,genres&appids=";
  75. const linkPackAPI = "http://store.steampowered.com/api/packagedetails?packageids=";
  76. const linkBundleAPI = "http://ruphine.esy.es/steamgifts/GetBundleStatus.php"; //?AppID=325470
  77. const linkUserAPI = "http://store.steampowered.com/dynamicstore/userdata/";
  78.  
  79. const ClassCard = "tags tags-card";
  80. const TitleCard = "This game has trading cards";
  81. const TextCard = "Trading Cards";
  82.  
  83. const ClassBundle = "tags tags-bundle";
  84. const TitleBundle = "Bundled since ";
  85. const TextBundle = "Bundled";
  86.  
  87. const ClassAchievement = "tags tags-achievement";
  88. const TitleAchievement = "This game has steam achievements";
  89. const TextAchievement = "Achievements";
  90.  
  91. const ClassHidden = "tags tags-hidden";
  92. const TitleHidden = "This game is in your filter list";
  93. const TextHidden = "Hidden";
  94.  
  95. const ClassWishlist = "tags tags-wishlist";
  96. const TitleWishlist = "This game is in your Steam wishlist";
  97. const TextWishlist = "Wishlist";
  98.  
  99. const ClassLinux = "tags tags-linux";
  100. const TitleLinux = "Linux supported";
  101. const TextLinux = "Linux";
  102.  
  103. const ClassMac = "tags tags-mac";
  104. const TitleMac = "Mac supported";
  105. const TextMac = "Mac";
  106.  
  107. const ClassEarly = "tags tags-early";
  108. const TitleEarly = "This game is in early access state";
  109. const TextEarly = "Early Access";
  110.  
  111. const THIS_URL = window.location.href;
  112. const TIMEOUT = 1000;
  113.  
  114. var cbCards = GM_getValue("cbCards", true);
  115. var cbAchievement = GM_getValue("cbAchievement", true);
  116. var cbBundled = GM_getValue("cbBundled", true);
  117. var cbHidden = GM_getValue("cbHidden", true);
  118. var cbWishlist = GM_getValue("cbWishlist", true);
  119. var cbLinux = GM_getValue("cbLinux", false);
  120. var cbMac = GM_getValue("cbMac", false);
  121. var cbEarly = GM_getValue("cbEarly", false);
  122.  
  123. var cbTagStyle = GM_getValue("cbTagStyle", 1); //1 = full, 2 = minimalist
  124.  
  125. var BundledGames = GM_getValue("BundledGames", "");
  126. var BundledCache = GM_getValue("BundledCache", new Date("1970-01-01").getTime());
  127. var UserdataAPI = GM_getValue("UserdataAPI", "");
  128. var UserdataCache = GM_getValue("UserdataCache", new Date("1970-01-01").getTime());
  129. var GameData = GM_getValue("GameData", "");
  130. var PackageData = GM_getValue("PackageData", "");
  131. var rgWishlist;
  132.  
  133. if(cbBundled && BundledCache < Date.now() - 6*60*60*1000) //6 hours
  134. {
  135. getBundleList();
  136. }
  137. else if(cbWishlist && UserdataCache < Date.now() - 6*60*60*1000) //6 hours
  138. {
  139. getUserdata();
  140. }
  141. else
  142. main();
  143.  
  144. function main()
  145. {
  146. rgWishlist = JSON.parse(UserdataAPI).rgWishlist;
  147. if(GameData == "")
  148. PrepareJSON();
  149. else
  150. {
  151. GameData = JSON.parse(GameData);
  152. PackageData = JSON.parse(PackageData);
  153. }
  154.  
  155. if(/www.steamgifts.com\/giveaways\/new/.test(THIS_URL)) // process giveaway creation page
  156. $(".js__autocomplete-data").on("DOMNodeInserted", NewGiveawayDivUpdated);
  157. else if(/www.steamgifts.com\/account\/settings\/giveaways$/.test(THIS_URL)) // process giveaway setting page
  158. initSetting();
  159. else if(/www.steamgifts.com\/($|giveaways$|giveaways\/search)/.test(THIS_URL)) // homepage and all search active giveaway
  160. {
  161. ProcessGiveawayListPage($(".giveaway__row-inner-wrap"));
  162. // handles element added later by endless scroll, add timeout to delay this function because it is triggered when ext SG runs
  163. setTimeout(function()
  164. {
  165. $(document).on("DOMNodeInserted", ".widget-container", function(e)
  166. {
  167. ProcessGiveawayListPage($(e.target).find(".giveaway__row-inner-wrap"));
  168. });
  169. }, TIMEOUT);
  170.  
  171. if($(".featured__inner-wrap .global__image-outer-wrap--missing-image").length == 0 && $(".featured__inner-wrap a img").length > 0)
  172. {
  173. var URL = $(".featured__inner-wrap a img")[0].src;
  174. ProcessFeaturedGiveaway(URL);
  175. }
  176. }
  177. // user profile & group page excluding user trade and feedback and excluding group users, stats, and wishlist
  178. 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
  179. {
  180. ProcessGiveawayListPage($(".giveaway__row-inner-wrap"));
  181. // handles element added later by endless scroll
  182. setTimeout(function()
  183. {
  184. $(document).on("DOMNodeInserted", ".widget-container", function(e)
  185. {
  186. ProcessGiveawayListPage($(e.target).find(".giveaway__row-inner-wrap"));
  187. });
  188. }, TIMEOUT);
  189. }
  190. else if(/www.steamgifts.com\/giveaway\//.test(THIS_URL)) // giveaway page https://www.steamgifts.com/giveaway/FGbTw/left-4-dead-2
  191. {
  192. var URL = $(".featured__inner-wrap a")[0].href;
  193. ProcessFeaturedGiveaway(URL);
  194. }
  195. // https://www.steamgifts.com/sales*
  196. // https://www.steamgifts.com/sales/account/steam/games
  197. // https://www.steamgifts.com/sales/account/steam/wishlist
  198. // https://www.steamgifts.com/giveaways/created
  199. // https://www.steamgifts.com/giveaways/entered
  200. // https://www.steamgifts.com/giveaways/won
  201. // https://www.steamgifts.com/giveaways/wishlist
  202. // https://www.steamgifts.com/account/settings/giveaways/filters
  203. 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))
  204. ProcessGameListPage();
  205. }
  206.  
  207. function ProcessFeaturedGiveaway(URL)
  208. {
  209. var Name = $(".featured__heading__medium").text().substring(0,45); //letter after 45th converted to ...
  210. var Target = $(".featured__heading");
  211.  
  212. ProcessTags(Target, URL, Name);
  213. }
  214.  
  215. function ProcessGiveawayListPage(scope) // giveaways list with creator name
  216. {
  217. $(scope).each(function(index, element)
  218. {
  219. var URL = $(element).find("a.giveaway__icon").attr("href");
  220. if(URL != null)
  221. {
  222. var Name = $(element).find(".giveaway__heading__name").contents().filter(
  223. function() //return text without [NEW] and [FREE]
  224. {
  225. return this.nodeType === 3; //Node.TEXT_NODE
  226. }
  227. ).slice(-1)[0].textContent.substring(0,40); //letter after 40th converted to ...
  228. var Target = $(element).find(".giveaway__heading");
  229. ProcessTags(Target, URL, Name);
  230. }
  231. });
  232. }
  233.  
  234. function ProcessGameListPage() // giveaways / games list
  235. {
  236. $(".table__row-inner-wrap").each(function(index, element)
  237. {
  238. var URL;
  239. if(/www.steamgifts.com\/account\/settings\/giveaways\/filters/.test(THIS_URL))
  240. URL = $(element).find("a.table__column__secondary-link").text();
  241. else
  242. URL = $($(element).find(".global__image-inner-wrap")[0]).css('background-image');
  243.  
  244. if(URL != null)
  245. {
  246. URL = URL.replace('url(', '').replace(')', '');
  247. var Name = $(element).find(".table__column__heading").text().substring(0,30);
  248. var Target = $(element).find(".table__column--width-fill > :first-child");
  249.  
  250. 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
  251.  
  252. ProcessTags(Target, URL, Name);
  253. }
  254. });
  255. }
  256.  
  257. function ProcessTags(Target, URL, Name)
  258. {
  259. var ID = getAppIDfromLink(URL);
  260. Name = encodeURIComponent(Name); //encode special characters that may break search params
  261. var linkStore = "";
  262. if(isApp(URL))
  263. linkStore = "http://store.steampowered.com/app/" + ID;
  264. else if(isPackage(URL))
  265. linkStore = "http://store.steampowered.com/sub/" + ID;
  266.  
  267. if(cbTagStyle == 1)
  268. {
  269. var tagCard = createTag(ClassCard, TitleCard, TextCard, linkCard+ID, Target);
  270. var tagAchievement = createTag(ClassAchievement, TitleAchievement, TextAchievement, linkAchievement+ID+"/achievements/", tagCard);
  271. var tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, tagAchievement);
  272. var tagWishlist = createTag(ClassWishlist, TitleWishlist, TextWishlist, linkWishlist+Name, tagBundle);
  273. var tagLinux = createTag(ClassLinux, TitleLinux, TextLinux, linkStore, tagWishlist);
  274. var tagMac = createTag(ClassMac, TitleMac, TextMac, linkStore, tagLinux);
  275. var tagEarly = createTag(ClassEarly, TitleEarly, TextEarly, linkStore, tagMac);
  276. }
  277. else
  278. {
  279. var tagCard = createTag(ClassCard + " tags-minimalist", TitleCard, TextCard.substring(0,1), linkCard+ID, Target);
  280. var tagAchievement = createTag(ClassAchievement + " tags-minimalist", TitleAchievement, TextAchievement.substring(0,1), linkAchievement+ID+"/achievements/", Target);
  281. var tagBundle = createTag(ClassBundle + " tags-minimalist", TitleBundle, TextBundle.substring(0,1), linkBundle+Name, Target);
  282. var tagWishlist = createTag(ClassWishlist + " tags-minimalist", TitleWishlist, TextWishlist.substring(0,1), linkWishlist+Name, Target);
  283. var tagLinux = createTag(ClassLinux + " tags-minimalist", TitleLinux, TextLinux.substring(0,1), linkStore, Target);
  284. var tagMac = createTag(ClassMac + " tags-minimalist", TitleMac, TextMac.substring(0,1), linkStore, Target);
  285. var tagEarly = createTag(ClassEarly + " tags-minimalist", TitleEarly, TextEarly.substring(0,1), linkStore, Target);
  286. }
  287.  
  288. if(/www.steamgifts.com\/giveaway\//.test(THIS_URL)) //only trigger inside giveaway page, no need for homepage
  289. {
  290. if(cbTagStyle == 1)
  291. var tagHidden = createTag(ClassHidden, TitleHidden, TextHidden, linkHidden+Name, tagEarly);
  292. else if(cbTagStyle == 2)
  293. var tagHidden = createTag(ClassHidden + " tags-minimalist", TitleHidden, TextHidden.substring(0,1), linkHidden+Name, Target);
  294.  
  295. getHiddenStatus(ID, Name, tagHidden);
  296. }
  297.  
  298. if(isApp(URL))
  299. getSteamCategories(ID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly);
  300. else if(isPackage(URL))
  301. {
  302. tagCard.setAttribute("href", "");
  303. tagAchievement.setAttribute("href", "");
  304. getSteamCategoriesFromPackage(ID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly);
  305. }
  306.  
  307. var type = isApp(URL) ? 'app' : 'sub';
  308. // getBundleStatus(ID, type, tagBundle);
  309. // getWishlistStatus(ID, tagWishlist);
  310. }
  311.  
  312. function createTag(_class, title, text, href, divTarget)
  313. {
  314. var tag = document.createElement("a");
  315. tag.setAttribute("id", "tags");
  316. tag.setAttribute("target", "_blank");
  317. tag.setAttribute("class", _class);
  318. tag.setAttribute("title", title);
  319. tag.setAttribute("href", href);
  320. tag.innerHTML = text;
  321.  
  322. 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
  323. $(divTarget).after(tag);
  324. else if(cbTagStyle == 2) // minimalist beside game title use append
  325. $(divTarget).append(tag);
  326. return tag;
  327. }
  328.  
  329. function displayElems(elems)
  330. {
  331. $(elems).css("display", "inline-block");
  332. }
  333.  
  334. function getSteamCategories(appID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly, packID = 0)
  335. {
  336. var needRequest = false;
  337. if(GameData[appID] == null)
  338. {
  339. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0};
  340. GameData[appID] = template;
  341. needRequest = true;
  342. }
  343. else
  344. {
  345. var data = GameData[appID];
  346. if(cbCards && data.cards ) displayElems(tagCard);
  347. if(cbAchievement && data.achievement) displayElems(tagAchievement);
  348. if(cbMac && data.mac ) displayElems(tagMac);
  349. if(cbLinux && data.linux ) displayElems(tagLinux);
  350.  
  351. if(data.last_checked < (Date.now() - (24 * 60 * 60 * 1000))) // 24 hours have passed since last checked
  352. {
  353. if((!data.cards && cbCards) || (!data.achievement && cbAchievement) || (!data.mac && cbMac ) || (!data.linux && cbLinux) || (data.early_access && cbEarly))
  354. needRequest = true;
  355. }
  356. else if(data.early_access && cbEarly) displayElems(tagEarly);
  357. }
  358. if(needRequest)
  359. {
  360. GM_xmlhttpRequest({
  361. method: "GET",
  362. timeout: 10000,
  363. url: linkGameAPI+appID,
  364. onload: function(data)
  365. {
  366. var obj = JSON.parse(data.responseText)[appID].data;
  367. if(obj != null) // null = doesn't have store page or doesn't exist
  368. // get steam apps categories : achievement, trading cards, etc
  369. {
  370. var categories = obj.categories;
  371. if(categories != null)
  372. {
  373. var catCards = $.grep(categories, function(e){ return e.id == "29"; });
  374. if(catCards.length > 0)
  375. {
  376. if(cbCards) displayElems(tagCard);
  377. GameData[appID].cards = true;
  378. if(packID != 0) PackageData[packID].cards = true;
  379. }
  380.  
  381. var catAchievement = $.grep(categories, function(e){ return e.id == "22"; });
  382. if(catAchievement.length > 0)
  383. {
  384. if(cbAchievement) displayElems(tagAchievement);
  385. GameData[appID].achievement = true;
  386. if(packID != 0) PackageData[packID].achievement = true;
  387. }
  388. }
  389.  
  390. // get steam apps platforms: linux: boolean, mac: boolean
  391. var platforms = obj.platforms;
  392. if(platforms.linux)
  393. {
  394. if(cbLinux) displayElems(tagLinux);
  395. GameData[appID].linux = true;
  396. if(packID != 0) PackageData[packID].linux = true;
  397. }
  398. if(platforms.mac)
  399. {
  400. if(cbMac) displayElems(tagMac);
  401. GameData[appID].mac = true;
  402. if(packID != 0) PackageData[packID].mac = true;
  403. }
  404.  
  405. // get steam apps genres
  406. var genres = obj.genres;
  407. var genEarly = $.grep(genres, function(e){ return e.id == "70"; });
  408. if(genEarly.length > 0)
  409. {
  410. if(cbEarly) displayElems(tagEarly);
  411. GameData[appID].early_access = true;
  412. if(packID != 0) PackageData[packID].early_access = true;
  413. }
  414. else
  415. {
  416. GameData[appID].early_access = false;
  417. if(packID != 0) PackageData[packID].early_access = false;
  418. }
  419. }
  420. GameData[appID].last_checked = Date.now();
  421. GM_setValue("GameData", JSON.stringify(GameData));
  422.  
  423. if(packID != 0)
  424. {
  425. PackageData[packID].last_checked = Date.now();
  426. GM_setValue("PackageData", JSON.stringify(PackageData));
  427. }
  428. },
  429. ontimeout: function(data)
  430. {
  431. console.log("[SG Game Tags] Request " + linkStore+appID + " Timeout");
  432. }
  433. });
  434. }
  435. }
  436.  
  437. function getBundleStatus(appID, type, tag)
  438. {
  439. if(cbBundled)
  440. {
  441. var obj = JSON.parse(BundledGames);
  442. var Game = $.grep(obj, function(e){ return (e.AppID == appID && e.Type == type); });
  443. if(Game.length > 0) //game found in bundle list
  444. {
  445. displayElems(tag);
  446. tag.setAttribute("title", TitleBundle+Game[0].BundledDate);
  447. }
  448. }
  449. }
  450.  
  451. function getBundleList()
  452. {
  453. GM_xmlhttpRequest({
  454. method: "GET",
  455. timeout: 10000,
  456. url: linkBundleAPI,
  457. onload: function(data)
  458. {
  459. BundledGames = data.responseText;
  460. GM_setValue("BundledGames", BundledGames);
  461.  
  462. BundledCache = Date.now();
  463. GM_setValue("BundledCache", BundledCache);
  464. if(cbWishlist && UserdataCache < Date.now() - 6*60*60*1000) //6 hours
  465. getUserdata();
  466. else
  467. main();
  468. },
  469. ontimeout: function(data)
  470. {
  471. console.log("[SG Game Tags] Request " + linkBundleAPI + " Timeout");
  472. if(cbWishlist && UserdataCache < Date.now() - 6*60*60*1000) //6 hours
  473. getUserdata();
  474. else
  475. main();
  476. }
  477. });
  478. }
  479.  
  480. function getUserdata()
  481. {
  482. GM_xmlhttpRequest({
  483. method: "GET",
  484. timeout: 10000,
  485. url: linkUserAPI,
  486. onload: function(data)
  487. {
  488. UserdataAPI = data.responseText;
  489. GM_setValue("UserdataAPI", UserdataAPI);
  490.  
  491. UserdataCache = Date.now();
  492. GM_setValue("UserdataCache", UserdataCache);
  493.  
  494. main();
  495. },
  496. ontimeout: function(data)
  497. {
  498. console.log("[SG Game Tags] Request " + linkUserAPI + " Timeout");
  499. }
  500. });
  501. }
  502.  
  503. function getHiddenStatus(appID, appName, elems)
  504. {
  505. if(cbHidden)
  506. {
  507. $.get(linkHidden+appName, function(data)
  508. {
  509. var gamesfound = $(data).find("a.table__column__secondary-link");
  510. for(i=0; i<$(gamesfound).length; i++)
  511. {
  512. var url = $(gamesfound)[i].href;
  513. var ID = getAppIDfromLink(url);
  514. if(appID == ID)
  515. {
  516. //TODO : Save appID + true ke local cache
  517. displayElems(elems);
  518. return true; //exit function
  519. }
  520. }
  521. });
  522. }
  523. }
  524.  
  525. function getWishlistStatus(appID, elems)
  526. {
  527. if(cbWishlist)
  528. {
  529. appID = parseInt(appID);
  530. if(rgWishlist.indexOf(appID) >= 0)
  531. displayElems(elems);
  532. }
  533. }
  534.  
  535. function getSteamCategoriesFromPackage(appID, tagCard, tagAchievement, tagLinux, tagMac, tagEarly)
  536. {
  537. var needRequest = false;
  538. if(PackageData[appID] == null)
  539. {
  540. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0};
  541. PackageData[appID] = template;
  542. needRequest = true;
  543. }
  544. else
  545. {
  546. var data = PackageData[appID];
  547. if(cbCards && data.cards ) displayElems(tagCard);
  548. if(cbAchievement && data.achievement) displayElems(tagAchievement);
  549. if(cbMac && data.mac ) displayElems(tagMac);
  550. if(cbLinux && data.linux ) displayElems(tagLinux);
  551.  
  552. if(data.last_checked < (Date.now() - (24 * 60 * 60 * 1000))) // 24 hours have passed since last checked
  553. {
  554. if((!data.cards && cbCards) || (!data.achievement && cbAchievement) || (!data.mac && cbMac ) || (!data.linux && cbLinux) || (data.early_access && cbEarly))
  555. needRequest = true;
  556. }
  557. else if(data.early_access && cbEarly) displayElems(tagEarly);
  558. }
  559. if(needRequest)
  560. {
  561. GM_xmlhttpRequest({
  562. method: "GET",
  563. timeout: 10000,
  564. url: linkPackAPI+appID,
  565. onload: function(data)
  566. {
  567. var IDs = JSON.parse(data.responseText)[appID].data;
  568. if(IDs == null)
  569. {
  570. PackageData[appID].cards = false;
  571. PackageData[appID].achievement = false;
  572. PackageData[appID].mac = false;
  573. PackageData[appID].linux = false;
  574. PackageData[appID].early_access = false;
  575. }
  576. else
  577. {
  578. IDs = IDs.apps;
  579. $.each(IDs, function(index)
  580. {
  581. getSteamCategories(IDs[index].id, tagCard, tagAchievement, tagLinux, tagMac, tagEarly, appID);
  582. });
  583. }
  584. },
  585. ontimeout: function(data)
  586. {
  587. console.log("[SG Game Tags] Request " + linkPackAPI+appID + " Timeout");
  588. }
  589. });
  590. }
  591. }
  592.  
  593. function PrepareJSON()
  594. {
  595. var template = {"cards": false, "achievement": false, "mac": false, "linux": false, "early_access": false, "last_checked": 0};
  596. var a = {"0":template};
  597. var temp = JSON.stringify(a);
  598. GameData = JSON.parse(temp);
  599. PackageData = JSON.parse(temp);
  600. GM_setValue("GameData", JSON.stringify(GameData));
  601. GM_setValue("PackageData", JSON.stringify(PackageData));
  602. }
  603.  
  604. function getAppIDfromLink(link)
  605. {
  606. var url = link.split("/");
  607. return url[url.length-2];
  608. }
  609.  
  610. function isApp(link)
  611. {
  612. var pattern = /\/app|apps\/0-9\//;
  613. return pattern.test(link);
  614. }
  615.  
  616. function isPackage(link)
  617. {
  618. var pattern = /\/sub|subs\/0-9\//;
  619. return pattern.test(link);
  620. }
  621.  
  622. function NewGiveawayDivUpdated(event)
  623. {
  624. if(event.type == "DOMNodeInserted") //show bundle tag for shown game
  625. {
  626. var gamesfound = $(".table__row-inner-wrap");
  627. $(".tags").remove();
  628. $(".table__row-inner-wrap").each(function(index, element)
  629. {
  630. var url = $(element).find("a.table__column__secondary-link").text();
  631. var ID = getAppIDfromLink(url);
  632. var Name = $(element).find(".table__column__heading").text();
  633. var Target = $(element).find(".table__column--width-fill");
  634.  
  635. $(".js__autocomplete-data").off("DOMNodeInserted");
  636. var tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, Target);
  637. $(tagBundle).css("float", "right");
  638.  
  639. var type = isApp(url) ? 'app' : 'sub';
  640. getBundleStatus(ID, type, tagBundle);
  641. });
  642. if(gamesfound.length > 0)
  643. {
  644. $(".js__autocomplete-data").on("DOMNodeRemoved", NewGiveawayDivUpdated);
  645.  
  646. $(".table__row-inner-wrap").on("click", function(event)
  647. {
  648. var url = $(this).find("a.table__column__secondary-link").text();
  649. var ID = getAppIDfromLink(url);
  650. var Name = $(this).find(".table__column__heading").text();
  651. var Target = $(".js__autocomplete-name")[0];
  652. tagBundle = createTag(ClassBundle, TitleBundle, TextBundle, linkBundle+Name, Target);
  653. var type = isApp(url) ? 'app' : 'sub';
  654. getBundleStatus(ID, type, tagBundle);
  655. });
  656. }
  657. }
  658. else if(event.type == "DOMNodeRemoved")//show / remove tag of selected game
  659. {
  660. $(".js__autocomplete-data").off("DOMNodeRemoved");
  661. $(".table__row-inner-wrap").off("click");
  662. $(".js__autocomplete-data").on("DOMNodeInserted", NewGiveawayDivUpdated);
  663. }
  664. }
  665.  
  666. function initSetting()
  667. {
  668. var no = $(".form__heading").length + 1;
  669. initTagOnOffSetting(no);
  670. initTagPositionSetting(no+1);
  671. }
  672.  
  673. function initTagOnOffSetting(no)
  674. {
  675. 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>';
  676. var form__row = document.createElement("div");
  677. form__row.setAttribute("class", "form__row");
  678.  
  679. var form__heading = document.createElement("div");
  680. form__heading.setAttribute("class", "form__heading");
  681.  
  682. var form__heading__number = document.createElement("div");
  683. form__heading__number.setAttribute("class", "form__heading__number");
  684. form__heading__number.innerHTML = no + ".";
  685.  
  686. var form__heading__text = document.createElement("div");
  687. form__heading__text.setAttribute("class", "form__heading__text");
  688. form__heading__text.setAttribute("title", "If you have performance issues, try disable tags you don't need");
  689. form__heading__text.innerHTML = "[SG Game Tags] Which tags do you want to see?";
  690.  
  691. $(form__heading).append(form__heading__number).append(form__heading__text);
  692.  
  693. var form__row__indent = document.createElement("div");
  694. form__row__indent.setAttribute("class", "form__row__indent");
  695.  
  696. var form__checkbox_1 = createCheckBox("my__checkbox", CheckIcon + "Trading Cards", cbCards);
  697. var form__checkbox_2 = createCheckBox("my__checkbox", CheckIcon + "Achievements", cbAchievement);
  698. var form__checkbox_3 = createCheckBox("my__checkbox", CheckIcon + "Bundled", cbBundled);
  699. var form__checkbox_4 = createCheckBox("my__checkbox", CheckIcon + "Hidden", cbHidden);
  700. var form__checkbox_5 = createCheckBox("my__checkbox", CheckIcon + "Wishlist", cbWishlist);
  701. var form__checkbox_6 = createCheckBox("my__checkbox", CheckIcon + "Linux", cbLinux);
  702. var form__checkbox_7 = createCheckBox("my__checkbox", CheckIcon + "Mac", cbMac);
  703. var form__checkbox_8 = createCheckBox("my__checkbox", CheckIcon + "Early Access", cbEarly);
  704.  
  705. $(form__checkbox_1).click(function(){toggleCBTags(form__checkbox_1, "cbCards");});
  706. $(form__checkbox_2).click(function(){toggleCBTags(form__checkbox_2, "cbAchievement");});
  707. $(form__checkbox_3).click(function(){toggleCBTags(form__checkbox_3, "cbBundled");});
  708. $(form__checkbox_4).click(function(){toggleCBTags(form__checkbox_4, "cbHidden");});
  709. $(form__checkbox_5).click(function(){toggleCBTags(form__checkbox_5, "cbWishlist");});
  710. $(form__checkbox_6).click(function(){toggleCBTags(form__checkbox_6, "cbLinux");});
  711. $(form__checkbox_7).click(function(){toggleCBTags(form__checkbox_7, "cbMac");});
  712. $(form__checkbox_8).click(function(){toggleCBTags(form__checkbox_8, "cbEarly");});
  713.  
  714. $(form__row__indent)
  715. .append(form__checkbox_1)
  716. .append(form__checkbox_2)
  717. .append(form__checkbox_3)
  718. .append(form__checkbox_4)
  719. .append(form__checkbox_5)
  720. .append(form__checkbox_6)
  721. .append(form__checkbox_7)
  722. .append(form__checkbox_8);
  723.  
  724. $(form__row).append(form__heading).append(form__row__indent);
  725.  
  726. $(".js__submit-form").before(form__row);
  727.  
  728. var desc = document.createElement("div");
  729. desc.setAttribute("class", "form__input-description");
  730. desc.innerHTML = "No need to press Save Changes button. It is automatically saved when the value changed.";
  731. $(desc).appendTo([form__row__indent]);
  732.  
  733. changeCBColor();
  734. }
  735.  
  736. function initTagPositionSetting(no)
  737. {
  738. 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>';
  739. var form__row = document.createElement("div");
  740. form__row.setAttribute("class", "form__row");
  741.  
  742. var form__heading = document.createElement("div");
  743. form__heading.setAttribute("class", "form__heading");
  744.  
  745. var form__heading__number = document.createElement("div");
  746. form__heading__number.setAttribute("class", "form__heading__number");
  747. form__heading__number.innerHTML = no + ".";
  748.  
  749. var form__heading__text = document.createElement("div");
  750. form__heading__text.setAttribute("class", "form__heading__text");
  751. form__heading__text.setAttribute("title", "This setting doesn't affect performance, only visual change.");
  752. form__heading__text.innerHTML = "[SG Game Tags] Tags Style";
  753.  
  754. $(form__heading).append(form__heading__number).append(form__heading__text);
  755.  
  756. var form__row__indent = document.createElement("div");
  757. form__row__indent.setAttribute("class", "form__row__indent");
  758. var form__checkbox_1 = createCheckBox("form__checkbox", CheckIcon + "(Original) Full Text tags below game title", cbTagStyle == 1);
  759. var form__checkbox_2 = createCheckBox("form__checkbox", CheckIcon + "(Minimalist) One letter tags beside game title", cbTagStyle == 2);
  760.  
  761. form__checkbox_1.setAttribute("title", 'The tags will display "Trading Cards", "Bundled", etc. This option will increase page height.');
  762. form__checkbox_2.setAttribute("title", 'The tags will just display first letter. "Trading Cards" becomes "T", "Bundled" becomes "B", etc.');
  763.  
  764. $(form__checkbox_1).click(
  765. function()
  766. {
  767. $(form__checkbox_2).removeClass("is-selected").addClass("is-disabled");
  768. $(form__checkbox_1).removeClass("is-disabled").addClass("is-selected");
  769. GM_setValue("cbTagStyle", 1);
  770. }
  771. );
  772. $(form__checkbox_2).click(
  773. function()
  774. {
  775. $(form__checkbox_1).removeClass("is-selected").addClass("is-disabled");
  776. $(form__checkbox_2).removeClass("is-disabled").addClass("is-selected");
  777. GM_setValue("cbTagStyle", 2);
  778. }
  779. );
  780.  
  781. $(form__row__indent).append(form__checkbox_1).append(form__checkbox_2);
  782.  
  783. $(form__row).append(form__heading).append(form__row__indent);
  784.  
  785. $(".js__submit-form").before(form__row);
  786.  
  787. var desc = document.createElement("div");
  788. desc.setAttribute("class", "form__input-description");
  789. desc.innerHTML = "No need to press Save Changes button. It is automatically saved when the value changed.";
  790. $(desc).appendTo([form__row__indent]);
  791. }
  792.  
  793. function createCheckBox(_class, _html, cbValue)
  794. {
  795. var cb = document.createElement("div");
  796. cb.setAttribute("class", _class);
  797. cb.innerHTML = _html;
  798. if(cbValue)
  799. $(cb).addClass("is-selected");
  800. else
  801. $(cb).addClass("is-disabled");
  802.  
  803. return cb;
  804. }
  805.  
  806. function toggleCBTags(cbElems, cbName)
  807. {
  808. var cbValue;
  809. if(cbName == "cbCards")
  810. {
  811. cbCards = !cbCards;
  812. cbValue = cbCards;
  813. }
  814. else if(cbName == "cbAchievement")
  815. {
  816. cbAchievement = !cbAchievement;
  817. cbValue = cbAchievement;
  818. }
  819. else if(cbName == "cbBundled")
  820. {
  821. cbBundled = !cbBundled;
  822. cbValue = cbBundled;
  823. }
  824. else if(cbName == "cbHidden")
  825. {
  826. cbHidden = !cbHidden;
  827. cbValue = cbHidden;
  828. }
  829. else if(cbName == "cbWishlist")
  830. {
  831. cbWishlist = !cbWishlist;
  832. cbValue = cbWishlist;
  833. }
  834. else if(cbName == "cbLinux")
  835. {
  836. cbLinux = !cbLinux;
  837. cbValue = cbLinux;
  838. }
  839. else if(cbName == "cbMac")
  840. {
  841. cbMac = !cbMac;
  842. cbValue = cbMac;
  843. }
  844. else if(cbName == "cbEarly")
  845. {
  846. cbEarly = !cbEarly;
  847. cbValue = cbEarly;
  848. }
  849.  
  850. GM_setValue(cbName, cbValue);
  851. if(cbValue)
  852. $(cbElems).removeClass("is-disabled").addClass("is-selected");
  853. else
  854. $(cbElems).removeClass("is-selected").addClass("is-disabled");
  855.  
  856. changeCBColor();
  857. }
  858.  
  859. function changeCBColor()
  860. {
  861. var colorCBDisabled = $(".form__checkbox.is-disabled").css("color");
  862. var colorCBSelected = $(".form__checkbox.is-selected").css("color");
  863.  
  864. $(".my__checkbox.is-disabled").css("color", colorCBDisabled);
  865. $(".my__checkbox.is-selected").css("color", colorCBSelected);
  866. }