Facebook
From ja, 9 Years ago, written in JavaScript.
Embed
Download Paste or View Raw
Hits: 631
  1. // ==UserScript==
  2. // @name       CS:GO Lounge Destroyer
  3. // @namespace  http://csgolounge.com/
  4. // @version    0.6.6
  5. // @description  Spam the fuck out of the CS:GL queue system, because it's absolute crap
  6. // @match      http://csgolounge.com/*
  7. // @match      http://dota2lounge.com/*
  8. // @updateURL   http://ncla.me/csgl3000/csgl3000.meta.js
  9. // @downloadURL http://ncla.me/csgl3000/csgl3000.user.js
  10. // @require http://code.jquery.com/jquery-2.1.1.js
  11. // @grant       GM_getValue
  12. // @grant       GM_setValue
  13. // @grant       GM_deleteValue
  14. // @grant       GM_xmlhttpRequest
  15. // @grant       GM_addStyle
  16. // @copyright  iamncla @ GitHub.com
  17. // ==/UserScript==
  18.  
  19. /* HELPER FUCNTIONS */
  20. /* Get URL parameter */
  21. function gup(a){a=a.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var b="[\\?&]"+a+"=([^&#]*)",c=new RegExp(b),d=c.exec(window.location.href);return null==d?null:d[1]}
  22. /* Get day/month/year */
  23. function getDMY(){var a=new Date;return a.getFullYear()+"/"+(a.getMonth()+1)+"/"+a.getDate()}
  24. /* DOM observe */
  25. var observeDOM=function(){var e=window.MutationObserver||window.WebKitMutationObserver,t=window.addEventListener;return function(n,r){if(e){var i=new e(function(e,t){if(e[0].addedNodes.length||e[0].removedNodes.length)r()});i.observe(n,{childList:true,subtree:true})}else if(t){n.addEventListener("DOMNodeInserted",r,false);n.addEventListener("DOMNodeRemoved",r,false)}}}()
  26. /* Custom logging function */
  27. var Loge = function(message) {
  28.     console.log(new Date() + " ---- " + message);
  29. }
  30. /* Get a cookie by a name */
  31. function readCookie(e){var t=e+"=";var n=document.cookie.split(";");for(var r=0;r<n.length;r++){var i=n[r];while(i.charAt(0)==" ")i=i.substring(1,i.length);if(i.indexOf(t)==0)return i.substring(t.length,i.length)}return null}
  32. function addJS_Node (text, s_URL, funcToRun, funcName) {
  33.     var D                                   = document;
  34.     var scriptNode                          = D.createElement ('script');
  35.     scriptNode.type                         = "text/javascript";
  36.     if (text)       scriptNode.textContent  = text;
  37.     if (s_URL)      scriptNode.src          = s_URL;
  38.     if (funcToRun) {
  39.         if(funcName) {
  40.             // please forgive me for this horror
  41.             scriptNode.textContent  = funcToRun.toString().replace("function () {", "function " + funcName + "() {");
  42.         }
  43.         else {
  44.             scriptNode.textContent  = '(' + funcToRun.toString() + ')()';
  45.         }
  46.     }
  47.  
  48.     var targ    = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
  49.     targ.appendChild (scriptNode);
  50. }
  51.  
  52. /* LoungeDestroyer class */
  53. /* Chaos is order yet undeciphered. */
  54.  
  55. /*
  56.  yaroberto  -2 points 5 hours ago
  57.  dont use shity scripts :)
  58.  */
  59.  
  60. if (window.top != window.self) {  //don't run on frames or iframes
  61.     return;
  62. }
  63.  
  64. var Bet3000 = function() {
  65.     /* Construct */
  66.     var self = this;
  67.  
  68.     var version = "0.6.6";
  69.     var versionReleaseDate = "2014.08.22";
  70.  
  71.     Loge("LoungeDestroyer v" + version + " (released on " + versionReleaseDate + ")");
  72.  
  73.     this.betAttempts = 0;
  74.     this.inventoryAttempts = 0;
  75.     this.returnAttempts = 0;
  76.  
  77.     this.TLS = false;
  78.     this.profileNumber = null;
  79.  
  80.     this.isPlacingBet = false;
  81.  
  82.     this.placeBetRetry = false;
  83.  
  84.     /* User settings */
  85.     this.defaultSettings =
  86.     {
  87.         marketCurrency: "1",
  88.         itemMarketPrices: "1",
  89.         redirect: "1",
  90.         streamRemove: "1",
  91.         delayBotsOff: "30000",
  92.         delayBotsOn: "5000",
  93.         delayRelogError: "15000"
  94.     };
  95.     var userSettings = GM_getValue("userSettings");
  96.     if(typeof(userSettings) == "undefined") {
  97.         GM_setValue("userSettings", JSON.stringify(self.defaultSettings));
  98.     }
  99.     this.userSettings = JSON.parse(GM_getValue("userSettings"));
  100.  
  101.     this.saveSetting = function(settingName, settingValue) {
  102.         self.userSettings[settingName] = settingValue;
  103.         GM_setValue("userSettings", JSON.stringify(self.userSettings));
  104.         Loge("Saving user setting [" + settingName +"] to " +settingValue);
  105.     };
  106.  
  107.     /* Merging usersettings with default settings if a new update introduced a new setting */
  108.     $.each(this.defaultSettings, function(index, value) {
  109.         if (typeof self.userSettings[index] == 'undefined') {
  110.             self.saveSetting(index, value);
  111.         }
  112.     });
  113.  
  114.     // for handling maintainance errors http://csgolounge.com/break and wait.html page
  115.     if(this.userSettings["redirect"] == "1") {
  116.         if(document.URL.indexOf("/wait.html") != -1 || document.URL.indexOf("/break") != -1 || document.title == "The page is temporarily unavailable") {
  117.             window.location = GM_getValue("intendedVisitURL", location.host);
  118.         }
  119.     }
  120.  
  121.     // users profile number, also shorten dis pls oneline, dont b scrub
  122.     if($("#logout").length) {
  123.         self.profileNumber = readCookie("id");
  124.     }
  125.  
  126.     // ncla pls shorten dis
  127.     this.appID = "730";
  128.     if(window.location.hostname == "dota2lounge.com") {
  129.         this.appID = "570"
  130.     }
  131.  
  132.     $("a").click(function(e) {
  133.         if (e.which === 1) {
  134.             e.preventDefault();
  135.             if(self.isPlacingBet) {
  136.                 $(window).unbind('beforeunload');
  137.             }
  138.             // http://stackoverflow.com/questions/1318076/jquery-hasattr-checking-to-see-if-there-is-an-attribute-on-an-element
  139.             if($(this).is("[href]")) {
  140.                 var url = $(this).attr("href");
  141.                 GM_setValue("intendedVisitURL", url);
  142.                 window.location = url;
  143.             }
  144.         }
  145.     });
  146.  
  147.     GM_addStyle(".marketPriced .rarity { background: rgba(255, 255, 255, 0.7) !important; text-shadow: 0px 0px 1px rgba(255, 255, 255, 1); }" +
  148.         "#ld_settings { width: 50px; height: 37px; top: 8px; right: 230px; position: absolute; cursor: pointer; }" +
  149.         "@media screen and (max-width: 1391px) { #ld_settings { top: -3px; right: 198px; } }" +
  150.         "@media screen and (max-width: 1000px) { #ld_settings { top: 28px; right: 10px; } }" +
  151.         "div#ld_settings { background-image: url(data:image/png;base64,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); }" +
  152.         "#ld_popup { display: none; width: 280px; height: 380px; background: white; position: fixed; top: 50%; left: 50%; margin-left: -140px; margin-top: -190px; box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, 0.5); z-index: 9001; }" +
  153.         "#ld_popup .popup-title { width: 100%; height: 25px; background: #f2f2f2; border-bottom: 3px solid #ade8f9; padding-top: 10px; }" +
  154.         "#ld_popup .popup-title span { margin: 0 auto; font-weight: bold; font-size: 14px; color: #686868; padding-left: 15px; }" +
  155.         "#ld_popup .popup-title #close-btn { display: block; cursor: pointer; font-weight: bold; position: absolute; top: 13px; right: 13px; font-size: 10px; }" +
  156.         "#ld_popup .ld-settings { padding: 10px 0px 10px 15px; font-size: 12px; font-weight: bold; }" +
  157.         "#ld_popup .ld-settings select { width: 205px; height: 21px; margin-bottom: 5px;}" +
  158.         "#overlay-dummy { display: none; background-color: rgba(0, 0, 0, 0.3); position: fixed; width: 100%; height: 100%; z-index: 9000; }" +
  159.         "#ld_popup .footerino { width: 100%; position: absolute; bottom: 0; height: 35px; background: #f8f8f8; border-top: 1px solid #e4e4e4; color: #c2c2c2; font-size: 12px; text-align: center; padding-top: 5px; }" +
  160.         "#ld_popup .footerino a { color: #a0a0a0; }" +
  161.         "#ld_popup .footerino a:hover { text-decoration: underline; }" +
  162.         ".lastbumped { float: left; font-size: 13px; margin-top: 10px; font-weight: bold; }" +
  163.         "#ld-placebet { display: inline-block; margin: 10px 0px; width: 100%; color: #eaeaea; }" +
  164.         "#ld-placebet .wrapperino { margin: 13px; }" +
  165.         "#ld-placebet .slider-desc { min-width: 140px; font-size: 12px; display: inline-block; }" +
  166.         "#ld-placebet input[type='range'] { -webkit-appearance: none; height: 2px; }" +
  167.         "#ld-placebet input[type='text'] { height: 15px; margin-left: 15px; font-size: 12px; position: relative; top: 2px; width: 50px; }" +
  168.         "#ld-placebet .setting-block { height: 25px; }");
  169.  
  170.     this.placeBet = function(btn) {
  171.         // to do: add exceptions for "you have too many items in your returns"
  172.         // You have too many items in returns, you have to reclaim it to be able to queue.
  173.         // Due to extensive load, queue is disabled for about 5 minutes.
  174.         // You have to relog in order to place a bet.
  175.         if(!this.checkBetRequirements()) return false;
  176.         if(self.isPlacingBet) return false;
  177.         self.isPlacingBet = true;
  178.  
  179.         unsafeWindow.botsOnline = true;
  180.  
  181.         function scriptWrapper () {
  182.             var tryCount = 1;
  183.  
  184.             function checkIfRequestForBetting(ajaxOptions) {
  185.                 if(ajaxOptions.hasOwnProperty("data")) {
  186.                     return (ajaxOptions.data.indexOf("&on=") != -1);
  187.                 }
  188.                 else {
  189.                     return false;
  190.                 }
  191.             }
  192.  
  193.             $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  194.                 var originalSuccess = options.success;
  195.                 options.success = function (data) {
  196.                     if(checkIfRequestForBetting(originalOptions)) {
  197.                         if(data.length > 0) {
  198.                             console.log("Try Nr." + tryCount + ", server denied our bet: " + data);
  199.                             if(data.indexOf("You have to relog in order to place a bet.") != -1) {
  200.                                 renewHash(); // aaand delay after renewing hash
  201.                             }
  202.                             else {
  203.                                 var delayerino = (!botsOnline ? delays.delayBotsOff : delays.delayBotsOn);
  204.                                 setTimeout(function() {
  205.                                     $.ajax(originalOptions);
  206.                                 }, delayerino);
  207.                             }
  208.                             tryCount = tryCount + 1;
  209.                         }
  210.                         else {
  211.                             // double check if placed bet here
  212.                             alert("It seems we successfully placed a bet! It took " + tryCount + " " + (tryCount == 1 ? 'try' : 'tries') + " to place the bet.");
  213.                             // possibly automatically accept trade offers (?)
  214.                             originalSuccess(data);
  215.                         }
  216.                     }
  217.                     else {
  218.                         originalSuccess(data);
  219.                     }
  220.                 };
  221.             });
  222.         }
  223.         addJS_Node(null, null, scriptWrapper, null);
  224.         addJS_Node(null ,null, self.renewHash, "renewHash");
  225.  
  226.         $(btn).click();
  227.  
  228.         return true;
  229.     };
  230.     /*
  231.         @param callback - What do on success?
  232.      */
  233.     this.checkBotsOnline = function(onlineCallback, offlineCallback) {
  234.         $.ajax({
  235.             url: "http://csgolounge.com/status",
  236.             type: "GET",
  237.             success: function(data) {
  238.                 if($(data).find("h2:eq(0)").length) {
  239.                     var botStatusText = $(data).find("h2:eq(0)").text();
  240.                     if(botStatusText.indexOf("ONLINE") != -1) {
  241.                         onlineCallback();
  242.                     } else if(botStatusText.indexOf("OFFLINE") != -1) {
  243.                         offlineCallback();
  244.                     }
  245.                     else {
  246.                         offlineCallback();
  247.                     }
  248.                 }
  249.                 else {
  250.                     console.log("Error getting bots status from page, retrying in 5 seconds...");
  251.                     setTimeout(function() {
  252.                         self.checkBotsOnline(onlineCallback, offlineCallback);
  253.                     }, 5000);
  254.                 }
  255.             },
  256.             error: function() {
  257.                 return false; // just.. meh..
  258.             }
  259.         });
  260.     };
  261.  
  262.     this.renewHash = function() {
  263.         console.log("TLS has has expired (re-log error got returned), renewing hash..");
  264.         $.ajax({
  265.             url: document.URL,
  266.             type: "GET",
  267.             async: false,
  268.             success: function(data) {
  269.                 if($(data).find("#placebut").length) {
  270.                     var newOnclick = $(data).find("#placebut").attr("onclick");
  271.                     $("#placebut").attr("onclick", newOnclick);
  272.                     console.log("Hash renewed for place bet button, continuing..");
  273.                     setTimeout(function() {
  274.                         $("#placebut").click();
  275.                     }, delays.delayRelogError);
  276.                 }
  277.                 else {
  278.                     console.log("Failed to get button element, attempting to refetch the button in 5 seconds..");
  279.                     setTimeout(function() {
  280.                         renewHash();
  281.                     }, 5000);
  282.                 }
  283.             },
  284.             error: function() {
  285.                 console.log("Error getting response, retrying in 5 seconds...");
  286.                 setTimeout(function() {
  287.                     renewHash();
  288.                 }, 5000);
  289.             }
  290.         });
  291.     };
  292.  
  293.     this.checkBetRequirements = function() {
  294.         if(!$(".betpoll .item").length > 0) {
  295.             alert("No items added!");
  296.             return false;
  297.         }
  298.         if(!$("#on").val().length > 0) {
  299.             alert("No team selected!");
  300.             return false;
  301.         }
  302.         return true;
  303.     };
  304.     this.getInventoryItems = function() {
  305.         if(document.URL.indexOf("/trade?t=") != -1) {
  306.             $("#loading").show();
  307.             $("#offer .left").show();
  308.             $.ajax({
  309.                 url: "ajax/backpack.php",
  310.                 success: function(data) {
  311.                     if($(data).text().indexOf("Can't get items.") == -1) {
  312.                         document.getElementById("offer").innerHTML += data; // .append() no like ;(
  313.                         $("#backpack").hide().slideDown();
  314.                         $("#loading").hide();
  315.                         $("#offer .standard").remove();
  316.                         self.loadMarketPricesBackpack();
  317.                     }
  318.                     else {
  319.                         self.inventoryAttempts = self.inventoryAttempts + 1;
  320.                         Loge("Attempting to get your Steam inventory, try Nr." + self.inventoryAttempts);
  321.                         self.getInventoryItems();
  322.                     }
  323.                 }
  324.             });
  325.         }
  326.         if(document.URL.indexOf("/match?m=") != -1) {
  327.             var steamAPI = ((Math.floor(Math.random() * (1 - 0 + 1)) + 0) == 0 ? "betBackpackApi" : "betBackpack");
  328.             self.inventoryAttempts = self.inventoryAttempts + 1;
  329.             Loge("Attempting to get your Steam inventory, try Nr." + self.inventoryAttempts);
  330.             $.ajax({
  331.                 url: 'ajax/'+steamAPI+'.php',
  332.                 type: 'POST',
  333.                 data: "id=" + self.profileNumber,
  334.                 success: function(data) {
  335.                     if($(data).text().indexOf("Can't get items.") == -1) {
  336.                         $("#showinventorypls").hide();
  337.                         $(".left").html("");
  338.                         $("#backpack").html(data).show();
  339.                         Loge("Inventory loaded");
  340.                         self.loadMarketPricesBackpack();
  341.                     }
  342.                     else {
  343.                         self.getInventoryItems();
  344.                     }
  345.                 }
  346.             });
  347.         }
  348.     };
  349.     this.requestReturns = function() {
  350.         // Try Nr.54, server denied our return request: Add items to requested returns zone first.
  351.         // if FALSE, then the items need to be frozen
  352.         // if TRUE, then the items need to be requested for the actual trade
  353.         var ajaxProperties = { url: (unsafeWindow.toreturn ? "ajax/postToReturn.php" : "ajax/postToFreeze.php") };
  354.         if(unsafeWindow.toreturn) {
  355.             ajaxProperties.success = function(data) {
  356.                 // If there was a problem with requesting to return
  357.                 if (data) {
  358.                     self.returnAttempts = self.returnAttempts + 1;
  359.                     Loge("Try Nr." + self.returnAttempts + ", server denied our return request: " + data);
  360.                     self.requestReturns();
  361.                 }
  362.                 else {
  363.                     alert("It seems we successfully requested returns! It took " + self.returnAttempts + " tries to request returns.");
  364.                     window.location.href = "mybets";
  365.                     localStorage.playedreturn = false;
  366.                 }
  367.             }
  368.         }
  369.         else {
  370.             ajaxProperties.type = "POST";
  371.             ajaxProperties.data = $("#freeze").serialize();
  372.             ajaxProperties.success = function(data) {
  373.                 if (data) {
  374.                     self.returnAttempts = self.returnAttempts + 1;
  375.                     Loge("Try Nr." + self.returnAttempts + ", items need to be frozen, attempting to freeze them!");
  376.                     self.requestReturns();
  377.                 }
  378.                 else {
  379.                     toreturn = true;
  380.                     self.requestReturns();
  381.                 }
  382.             }
  383.         }
  384.         $.ajax(ajaxProperties);
  385.     };
  386.     this.getMarketPrice = function(item) {
  387.         if(Bet.userSettings["itemMarketPrices"] == "1") {
  388.             var name = $(".smallimg", item).attr("alt");
  389.             if(!$(item).hasClass("marketPriced") && nonMarketItems.indexOf(name) == -1 && nonMarketItems.indexOf($(".rarity", item).text()) == -1 && !$(item).hasClass("loadingPrice")) {
  390.                 $(item).addClass("loadingPrice");
  391.                 GM_xmlhttpRequest({
  392.                     method: "GET",
  393.                     url: "http://steamcommunity.com/market/priceoverview/?country=US&currency=" + self.userSettings["marketCurrency"] + "&appid=" + self.appID + "&market_hash_name=" + encodeURI(name),
  394.                     onload: function(response) {
  395.                         if(response.status == 200) {
  396.                             var responseParsed = JSON.parse(response.responseText);
  397.                             if(responseParsed.success == true && responseParsed.hasOwnProperty("lowest_price")) {
  398.                                 var lowestPrice = responseParsed["lowest_price"].replace("&#36;", "&#36; ");
  399.                                 $(item).find('.rarity').html(lowestPrice);
  400.                                 $(item).addClass('marketPriced');
  401.                                 $(".item").each(function() {
  402.                                     if ($(this).find('img.smallimg').attr("alt") == name && !$(this).hasClass('marketPriced')) {
  403.                                         $(this).find('.rarity').html(lowestPrice);
  404.                                         $(this).addClass('marketPriced');
  405.                                     }
  406.                                 });
  407.                             }
  408.                             else {
  409.                                 $(item).find('.rarity').html('Not Found');
  410.                             }
  411.                         }
  412.                         $(item).removeClass("loadingPrice");
  413.                     }
  414.                 });
  415.             }
  416.         }
  417.     };
  418.     this.bumpTrade = function(tradeID) {
  419.         $.ajax({
  420.             type: "POST",
  421.             url: "ajax/bumpTrade.php",
  422.             data: "trade=" + tradeID,
  423.             async: false,
  424.             success: function(data) {
  425.                 Loge("Bumped trade offer #" + tradeID);
  426.             }
  427.         });
  428.     };
  429.     this.startAutobump = function() {
  430.         if($(".tradeheader").text().indexOf("minute") == -1 && $(".tradeheader").text().indexOf("second") == -1) {
  431.             // force bump
  432.             var delayMinutes = 0;
  433.         }
  434.  
  435.         if($(".tradeheader").text().indexOf("second") != -1 || $(".tradeheader").text().indexOf("just now") != -1) {
  436.             var delayMinutes = 30;
  437.         }
  438.         if($(".tradeheader").text().indexOf("minute") != -1) {
  439.             var numberino = $(".tradeheader").text().replace(" minutes ago", "").replace(" minute ago", "");
  440.             var delayMinutes = (numberino >= 30) ? 0.5 : (30 - numberino);
  441.         }
  442.  
  443.         Loge("Auto-bumping in " + delayMinutes + " minutes");
  444.         // start the vicious cycle
  445.         var autoBump = setTimeout(function() {
  446.             Loge("Auto-bumping");
  447.             self.bumpTrade(Bet.tradeID);
  448.             self.updateLastBumped();
  449.             self.startAutobump();
  450.         }, (delayMinutes * 60 * 1000))
  451.     };
  452.     this.stopAutobump = function() {
  453.         Loge("Stopping auto-bumping");
  454.         clearTimeout(autoBump);
  455.     };
  456.     this.updateLastBumped = function() {
  457.         $.ajax({
  458.             type: "GET",
  459.             url: window.location.href,
  460.             async: false
  461.         }).done(function(data) {
  462.                 var lastUpdated = $(data).find(".tradeheader").text();
  463.                 $(".tradeheader").html(lastUpdated);
  464.                 Loge("Updated last-updated element: " + lastUpdated);
  465.             })
  466.     };
  467.     this.loadMarketPricesBackpack = function() {
  468.         var csglPrices = {};
  469.         var marketedItems = {};
  470.         $("#backpack .item").each(function(index, value) {
  471.             var itemName = $(value).find(".smallimg").attr("alt");
  472.             // Lowering performance cost because no need to call request for duplicate items
  473.             if(!marketedItems.hasOwnProperty(itemName)) {
  474.                 self.getMarketPrice(value);
  475.                 marketedItems[itemName] = true;
  476.             }
  477.             if($(value).find("input[name=worth]").length) {
  478.                 var itemPrice = $(value).find("input[name=worth]").val();
  479.                 csglPrices[itemName] = itemPrice;
  480.             }
  481.         });
  482.         if(!$.isEmptyObject(csglPrices)) {
  483.             var swag = GM_getValue("swag");
  484.             if(typeof(swag) == "undefined") {
  485.                 GM_setValue("swag", getDMY());
  486.                 self.postSwag(csglPrices);
  487.             }
  488.             if(typeof(swag) == "string") {
  489.                 if(swag != getDMY()) {
  490.                     GM_setValue("swag", getDMY());
  491.                     self.postSwag(csglPrices);
  492.                 }
  493.             }
  494.         }
  495.     };
  496.     this.postSwag = function(nsa) {
  497.         // temporary disabled
  498.     };
  499.     /**
  500.      * Used for observing backpack for DOM changes, checking if back has loaded or if Lounge cannot load it.
  501.      * Dirty approach and is used in two places (trading backpack and on match page when backpack loads on page load)
  502.      * @return void
  503.      */
  504.     this.getBackpack = function(observeElement) {
  505.         observeDOM(document.getElementById(observeElement), function() {
  506.             if(!backpackLoaded) {
  507.                 // !$(".bpheader").length stupid fix since on trade pages backpack gets appended somewhere else
  508.                 if($(".standard").text().indexOf("Can't get items.") != -1 && !$(".bpheader").length) {
  509.                     $("#backpack").hide();
  510.                     Loge("CS:GO inventory is not loaded");
  511.                     Loge("Getting your Steam profile number!");
  512.                         Loge("Checking if your Steam profile is private");
  513.                         GM_xmlhttpRequest({
  514.                             synchronous: true, // GM_xmlhttpRequest does not understand that I want it to be synchronous :)
  515.                             method: "GET",
  516.                             url: "http://steamcommunity.com/profiles/" + self.profileNumber + "/?xml=1&timerino=" + Date.now(),
  517.                             onload: function(data) {
  518.                                 var parsedXML = $.parseXML(data.responseText);
  519.                                 var privacyState = $(parsedXML).find("privacyState").text();
  520.                                 if(privacyState == "private") {
  521.                                     Loge("Your profile is private, set it to public so you can bet from inventory!");
  522.                                 }
  523.                                 if(privacyState == "public") {
  524.                                     Loge("Your profile is public, checking if your inventory is also public..");
  525.                                     // Check if inventory is public.. THIS might be bad if you are logged in with different account
  526.                                     GM_xmlhttpRequest({
  527.                                         method: "GET",
  528.                                         url: "http://steamcommunity.com/profiles/" + self.profileNumber + "/inventory/json/" + self.appID + "/2", // might not work on dota2lounge
  529.                                         onload: function(data) {
  530.                                             var json = JSON.parse(data.responseText);
  531.                                             if(json.success == true) {
  532.                                                 Loge("Your inventory is public from JSON API, double checking..");
  533.                                                 GM_xmlhttpRequest({
  534.                                                     method: "GET",
  535.                                                     url: "http://steamcommunity.com/profiles/" + self.profileNumber + "/edit/settings",
  536.                                                     onload: function(data) {
  537.                                                         var html = data.responseText;
  538.                                                         // The script shits itself when Volvo returns some error page.. (invalid XML error)
  539.                                                         if($(html).find("#account_pulldown").length) {
  540.                                                             if($(html).find("#inventoryPrivacySetting_public:checked").length) {
  541.                                                                 Loge("Inventory privacy setting is set to public, loading inventory now!");
  542.                                                                 Bet.getInventoryItems();
  543.                                                             }
  544.                                                             else {
  545.                                                                 Loge("Inventory privacy setting is not set to public! :(");
  546.                                                             }
  547.                                                         }
  548.                                                         else {
  549.                                                             Loge("Inventory is indeed available through JSON API, loading inventory..");
  550.                                                             Bet.getInventoryItems();
  551.                                                         }
  552.                                                     }
  553.                                                 });
  554.                                             }
  555.                                             else {
  556.                                                 Loge("Your inventory is private, set it to public so you are able to place a bet from your inventory!");
  557.                                             }
  558.                                         }
  559.                                     });
  560.                                 }
  561.                             }
  562.                         });
  563.  
  564.                 }
  565.                 if($(".bpheader").length) {
  566.                     backpackLoaded = true;
  567.                     $("#backpack").show();
  568.                     Bet.loadMarketPricesBackpack();
  569.                     Loge("CS:GO inventory loaded");
  570.                     $("#loading").hide();
  571.                 }
  572.             }
  573.         });
  574.  
  575.     }
  576. };
  577.  
  578. var nonMarketItems = ["Dota Items", "Any Offers", "Knife", "Gift", "TF2 Items", "Real Money", "Offers", "Any Common", "Any Uncommon", "Any Rare", "Any Mythical", "Any Legendary",
  579.     "Any Ancient", "Any Immortal", "Real Money", "+ More", "Any Set"];
  580.  
  581. var Bet = new Bet3000();
  582.  
  583. var autoBump; // global variable for autobump timeouts
  584.  
  585. $(document).on("mouseover", ".item", function() {
  586.     Bet.getMarketPrice(this);
  587.     if($(this).find(".steamMarketURL").length == 0) {
  588.         var itemName = encodeURI($(this).find(".smallimg").attr("alt"));
  589.         $(this).find('.name a[onclick="previewItem($(this))"]').after('<br/>' +
  590.             '<br/><a class="steamMarketURL" href="http://steamcommunity.com/market/listings/'+ Bet.appID +'/'+ itemName +'" target="_blank">Market Listings</a><br/>' +
  591.             '<a href="http://steamcommunity.com/market/search?q='+ itemName +'" target="_blank">Market Search</a>');
  592.     }
  593. });
  594. if(document.URL.indexOf("/match?m=") != -1) {
  595.     if($("#placebut").length) {
  596.         $("#placebut").before("<a class='buttonright' id='realbetbutton'>FUCKING PLACE A BET</a>");
  597.         Bet.matchID = gup("m");
  598.         $("#realbetbutton").click(function() {
  599.             Bet.placeBet($("#placebut"));
  600.         });
  601.  
  602.         $(".gradient:eq(0)").after('<div id="ld-placebet" class="gradient"><div class="wrapperino">' +
  603.             'LoungeDestroyer delay settings for requests' +
  604.             '<div class="setting-block"><span class="slider-desc">Bots are offline (ms):</span> <input id="delayBotsOff" type="range" min="0" max="30000" step="100" /><input id="delayBotsOff_display" type="text" disabled></div>' +
  605.             '<div class="setting-block"><span class="slider-desc">Bots are online (ms):</span> <input id="delayBotsOn" type="range" min="0" max="30000" step="100" /><input id="delayBotsOn_display" type="text" disabled></div>' +
  606.             '<div class="setting-block"><span class="slider-desc">After \'re-log error\' (ms):</span> <input id="delayRelogError" type="range" min="0" max="30000" step="100" /><input id="delayRelogError_display" type="text" disabled></div>' +
  607.             '<div style="font-size: 12px; font-weight: bold;">Bot status: <span id="bot-status">Not checked yet</span></div>' +
  608.             '</div></div>');
  609.  
  610.         unsafeWindow.delays = {};
  611.         function updatePlaceBetSetting(name, value) {
  612.             $("#" + name + "_display").val(value);
  613.             unsafeWindow.delays[name] = parseInt(value);
  614.         }
  615.         $("#ld-placebet .setting-block input[type=range]").change(function() {
  616.             Bet.saveSetting(this.id, this.value);
  617.             updatePlaceBetSetting(this.id, this.value);
  618.         });
  619.         $("#ld-placebet .setting-block input[type=range]").each(function(index, value) {
  620.             var settingVal = Bet.userSettings[value.id];
  621.             $(value).val(settingVal);
  622.             updatePlaceBetSetting(value.id, settingVal);
  623.         });
  624.         function checkBotsPlaceBet() {
  625.             Bet.checkBotsOnline(function() {
  626.                 unsafeWindow.botsOnline = true;
  627.                 $("#bot-status").html("ONLINE");
  628.             }, function () {
  629.                 $("#bot-status").html("OFFLINE");
  630.                 unsafeWindow.botsOnline = false;
  631.             })
  632.         }
  633.         checkBotsPlaceBet();
  634.         setInterval(function() {
  635.             checkBotsPlaceBet();
  636.         }, 15000);
  637.     }
  638.  
  639.     if(Bet.userSettings["streamRemove"] == "1") {
  640.         $("#stream object, #stream iframe").remove();
  641.     }
  642.     // Borewik, I hate your HTML element structure
  643.     var tabWrapper = $("div[style='float: left; width: 96%;margin: 0 2%;height: 26px;border-radius: 5px;position: relative;overflow: hidden;']");
  644.     $(tabWrapper).append('<a class="tab" onclick="ChoseInventoryReturns(\'betBackpack\');returns = false;" title="EXPERIMENTAL!\n\nIf CSGL has ' +
  645.         'not fetched your new inventory (and it is loading only cached inventory for past few minutes) and you just got new item in your inventory' +
  646.         ' for betting, you can try pressing this button! \nBe gentle and don\'t spam it too often though!">Re-fetch inventory (?)</div>');
  647.     $(tabWrapper).find(".tab").width("33%");
  648.     $(tabWrapper).find(".tab").click(function() {
  649.         backpackLoaded = false;
  650.     });
  651. }
  652.  
  653. if(document.URL.indexOf("/trade?t=") != -1) {
  654.     Bet.tradeID = gup("t");
  655.     if(!$(".buttonright:contains('Report')").length) {
  656.         var autobumpBtn = $("<a class='buttonright autobump'>Auto-bump: <span class='status'>Off</span></a>");
  657.         $(".box-shiny-alt .half:eq(1)").append(autobumpBtn);
  658.  
  659.         Bet.autobump = false;
  660.         $(".autobump").click(function() {
  661.             Bet.autobump = (Bet.autobump == false) ? true : false;
  662.             if(Bet.autobump) {
  663.                 Bet.updateLastBumped();
  664.                 Bet.startAutobump();
  665.             }
  666.             else {
  667.                 Bet.stopAutobump();
  668.             }
  669.             var btnText = (Bet.autobump) ? "On" : "Off";
  670.             $(".autobump .status").html(btnText);
  671.         })
  672.         $(".box-shiny-alt .half:eq(1)").append("<a class='buttonright justbump'>Bump</a>");
  673.         $(".justbump").click(function() {
  674.             Bet.bumpTrade(Bet.tradeID);
  675.             Bet.updateLastBumped();
  676.         })
  677.     }
  678.     $("a:contains('Add items to offer')").click(function() {
  679.         Bet.getBackpack("offer");
  680.     })
  681. }
  682.  
  683. if($("#backpack").length) {
  684.     if($("#backpack #loading").length) {
  685.         var backpackLoaded = false;
  686.         Bet.getBackpack("backpack");
  687.     }
  688. }
  689. if($("#freezebutton").length) {
  690.     $("#freezebutton").after("<a class='buttonright' id='returnitemspls'>RETURN MY FUCKING ITEMS</a>");
  691.     $("#returnitemspls").click(function() {
  692.         Bet.requestReturns();
  693.     })
  694. }
  695. if($("#submenu").length) {
  696.     $("#submenu div:eq(0)").append('<a href="http://steamcommunity.com/tradeoffer/new/?partner=106750833&token=CXFPs7ON" title="Support LoungeDestroyer further development">LoungeDestroyer &#x2764;</a>')
  697. }
  698. if($("#skin").length) {
  699.     $("#skin").before('<div id="ld_settings"></div>');
  700.     $("#ld_settings").click(function() {
  701.         $("#ld_popup, #overlay-dummy").show();
  702.     });
  703.     $("body").append('<div id="overlay-dummy"></div>' +
  704.         '<div id="ld_popup">' +
  705.         '<div class="popup-title"><span>LoungeDestroyer settings</span><div id="close-btn">&#x2715;</div></div>' +
  706.         '<div class="ld-settings">' +
  707.         '<div>Market prices on items:</div><select id="itemMarketPrices"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  708.         '<div>Steam market currency:</div><select id="marketCurrency"><option value="1">USD</option><option value="2">GBP</option><option value="3">EUR</option><option value="5">RUB</option></select>' +
  709.         '<div>Redirect from item draft page:</div><select id="redirect"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  710.         '<div>Remove stream from match page:</div><select id="streamRemove"><option value="1">Enabled</option><option value="0">Disabled</option></select>' +
  711.         '</div>' +
  712.         '<div class="footerino"><div>created by NCLA</div><div style="font-weight: bold;font-size:11px;"><a href="http://github.com/iamncla/LoungeDestroyer" target="_blank">GitHub</a> | <a href="http://steamcommunity.com/tradeoffer/new/?partner=106750833&token=CXFPs7ON" target="_blank">Donate</a></div></div>' +
  713.         '</div>');
  714.     $("#ld_popup #close-btn, #overlay-dummy").click(function() {
  715.         $("#ld_popup, #overlay-dummy").hide();
  716.     });
  717.     $.each(Bet.userSettings, function(index, value) {
  718.         $(".ld-settings #" + index + " option[value=" + value + "]").prop('selected', true);
  719.     });
  720.  
  721.     $(".ld-settings select").on('change', function() {
  722.         Bet.saveSetting(this.id, this.value);
  723.     });
  724. }