NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name FUT 21 Autobuyer Menu with TamperMonkey // @namespace http://tampermonkey.net/ // @version 2.1.1 // @updateURL https://raw.githubusercontent.com/chithakumar13/Fifa21-AutoBuyer/master/autobuyer.js // @downloadURL https://raw.githubusercontent.com/chithakumar13/Fifa21-AutoBuyer/master/autobuyer.js // @description FUT Snipping Tool // @author CK Algos // @match https://www.ea.com/*/fifa/ultimate-team/web-app/* // @match https://www.ea.com/fifa/ultimate-team/web-app/* // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @require https://raw.githubusercontent.com/discordjs/discord.js/webpack/discord.11.6.4.min.js // @license MIT // ==/UserScript== (function () { "use strict"; window.controllerInstance = null; window.UTAutoBuyerViewController = function () { UTMarketSearchFiltersViewController.call(this); window.controllerInstance = this; this._jsClassName = "UTAutoBuyerViewController"; }; window.sellList = []; window.autoBuyerActive = false; window.botStartTime = null; window.searchCountBeforePause = 10; window.defaultStopTime = 10; window.currentPage = 1; window.reListEnabled = false; window.currentChemistry = -1; window.purchasedCardCount = 0; window.bidExact = false; window.selectedFilters = []; window.useRandMinBuy = false; window.useRandMinBid = false; window.addDelayAfterBuy = false; window.captchaCloseTab = false; window.isSearchInProgress = false; window.toggleMessageNotification = false; window.botStopped = true; window.userWatchItems = []; window.eachFilterSearch = null; window.discordClient = null; window.autoClearLog = null; var _searchViewModel = null; // DIV names function makeid(length) { var result = ""; var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var charactersLength = characters.length; for (var i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } var nameFilterDropdown = "#elem_" + makeid(15), nameSelectedFilter = "#elem_" + makeid(15), nameAbBuyPrice = "#elem_" + makeid(15), nameAbCardCount = "#elem_" + makeid(15), nameAbMaxBid = "#elem_" + makeid(15), nameAbItemExpiring = "#elem_" + makeid(15), nameAbBidExact = "#elem_" + makeid(15), nameAbSellPrice = "#elem_" + makeid(15), nameAbMinDeleteCount = "#elem_" + makeid(15), nameAbSellToggle = "#elem_" + makeid(15), nameAbWaitTime = "#elem_" + makeid(15), nameAbMaxPurchases = "#elem_" + makeid(15), nameAbCycleAmount = "#elem_" + makeid(15), nameAbPauseFor = "#elem_" + makeid(15), nameAbStopAfter = "#elem_" + makeid(15), nameAbMinRate = "#elem_" + makeid(15), nameAbMaxRate = "#elem_" + makeid(15), nameAbRandMinBidInput = "#elem_" + makeid(15), nameAbRandMinBuyInput = "#elem_" + makeid(15), nameAbRandMinBuyToggle = "#elem_" + makeid(15), nameAbRandMinBidToggle = "#elem_" + makeid(15), nameAbAddBuyDelay = "#elem_" + makeid(15), nameAbAddFilterGK = "#elem_" + makeid(15), nameAbCloseTabToggle = "#elem_" + makeid(15), nameAbMessageNotificationToggle = "#elem_" + makeid(15), nameAbSoundToggle = "#elem_" + makeid(15), nameTelegramBotToken = "#elem_" + makeid(15), nameTelegramChatId = "#elem_" + makeid(15), nameNotificationType = "#elem_" + makeid(15), nameDiscordToken = "#elem_" + makeid(15), nameDiscordChannelId = "#elem_" + makeid(15), nameProgressAutobuyer = "#elem_" + makeid(15), nameAutoBuyerFoundLog = "#elem_" + makeid(15), nameSearchCancelButton = "#elem_" + makeid(15), nameInfoWrapper = "#elem_" + makeid(15), namePreserveChanges = "#elem_" + makeid(15), nameClearLogButton = "#elem_" + makeid(15), nameCalcBinPrice = "#elem_" + makeid(15), nameTestNotification = "#elem_" + makeid(15), nameSelectFilterCount = "#elem_" + makeid(15), nameDeleteFilter = "#elem_" + makeid(15), nameAbSolveCaptcha = "#elem_" + makeid(15), nameSellAfterTax = "#elem_" + makeid(15), nameAbSearchProgress = "#elem_" + makeid(15), nameAbStatisticsProgress = "#elem_" + makeid(15), nameAbRequestCount = "#elem_" + makeid(15), nameAbCoins = "#elem_" + makeid(15), nameAbStatus = "#elem_" + makeid(15), nameAbSoldItems = "#elem_" + makeid(15), nameAbUnsoldItems = "#elem_" + makeid(15), nameAbAvailableItems = "#elem_" + makeid(15), nameAbActiveTransfers = "#elem_" + makeid(15), nameAbNumberFilterSearch = "#elem_" + makeid(15), nameAbStopErrorCode = "#elem_" + makeid(15), nameSearchWrapper = "#elem_" + makeid(15), nameWinMp3 = "#elem_" + makeid(15), nameCapatchaMp3 = "#elem_" + makeid(15), nameProxyAddress = "#elem_" + makeid(15), nameProxyPort = "#elem_" + makeid(15), nameProxyLogin = "#elem_" + makeid(15), nameAntiCaptchKey = "#elem_" + makeid(15), nameProxyPassword = "#elem_" + makeid(15), nameAutoClearLog = "#elem_" + makeid(15); window.loadFilter = function () { var filterName = $("select[name=filters] option").filter(":selected").val(); loadFilterByName(filterName); }; window.deleteFilter = function () { var filterName = $("select[name=filters] option").filter(":selected").val(); if (filterName != "Choose filter to load") { $(nameFilterDropdown + ` option[value="${filterName}"]`).remove(); $(nameSelectedFilter + ` option[value="${filterName}"]`).remove(); jQuery(nameSelectedFilter).find("option").attr("selected", false); window.setFilters(); jQuery(nameFilterDropdown).prop("selectedIndex", 0); window.clearABSettings(); window.controllerInstance._viewmodel.playerData = null; Object.assign( window.controllerInstance._viewmodel.searchCriteria, window.controllerInstance._viewmodel.defaultSearchCriteria ); window.controllerInstance.viewDidAppear(); GM_deleteValue(filterName); window.notify("Changes saved successfully"); } }; window.loadFilterByName = function (filterName) { let settingsJson = GM_getValue(filterName); if (!settingsJson) { return; } window.clearABSettings(); settingsJson = JSON.parse(settingsJson); if (settingsJson.abSettings.buyPrice) { $(nameAbBuyPrice).val(settingsJson.abSettings.buyPrice); } if (settingsJson.abSettings.cardCount) { $(nameAbCardCount).val(settingsJson.abSettings.cardCount); } if (settingsJson.abSettings.maxBid) { $(nameAbMaxBid).val(settingsJson.abSettings.maxBid); } if (settingsJson.abSettings.itemExpiring) { $(nameAbItemExpiring).val(settingsJson.abSettings.itemExpiring); } if (settingsJson.abSettings.bidExact) { window.bidExact = settingsJson.abSettings.bidExact; jQuery(nameAbBidExact).addClass("toggled"); } if (settingsJson.abSettings.sellPrice) { jQuery(nameAbSellPrice).val(settingsJson.abSettings.sellPrice); } if (settingsJson.abSettings.minDeleteCount) { jQuery(nameAbMinDeleteCount).val(settingsJson.abSettings.minDeleteCount); } if (settingsJson.abSettings.reListEnabled) { window.reListEnabled = settingsJson.abSettings.reListEnabled; jQuery(nameAbSellToggle).addClass("toggled"); } if (settingsJson.abSettings.waitTime) { jQuery(nameAbWaitTime).val(settingsJson.abSettings.waitTime); } if (settingsJson.abSettings.maxPurchases) { jQuery(nameAbMaxPurchases).val(settingsJson.abSettings.maxPurchases); } if (settingsJson.abSettings.pauseCycle) { jQuery(nameAbCycleAmount).val(settingsJson.abSettings.pauseCycle); } if (settingsJson.abSettings.pauseFor) { jQuery(nameAbPauseFor).val(settingsJson.abSettings.pauseFor); } if (settingsJson.abSettings.stopAfter) { jQuery(nameAbStopAfter).val(settingsJson.abSettings.stopAfter); } if (settingsJson.abSettings.minRate) { jQuery(nameAbMinRate).val(settingsJson.abSettings.minRate); } if (settingsJson.abSettings.maxRate) { jQuery(nameAbMaxRate).val(settingsJson.abSettings.maxRate); } if (settingsJson.abSettings.randMinBid) { jQuery(nameAbRandMinBidInput).val(settingsJson.abSettings.randMinBid); } if (settingsJson.abSettings.randMinBuy) { jQuery(nameAbRandMinBuyInput).val(settingsJson.abSettings.randMinBuy); } if (settingsJson.abSettings.useRandMinBuy) { window.useRandMinBuy = settingsJson.abSettings.useRandMinBuy; jQuery(nameAbRandMinBuyToggle).addClass("toggled"); } if (settingsJson.abSettings.useRandMinBid) { window.useRandMinBid = settingsJson.abSettings.useRandMinBid; jQuery(nameAbRandMinBidToggle).addClass("toggled"); } if (settingsJson.abSettings.addDelayAfterBuy) { window.addDelayAfterBuy = settingsJson.abSettings.addDelayAfterBuy; jQuery(nameAbAddBuyDelay).addClass("toggled"); } if (settingsJson.abSettings.addFilterGK) { window.addFilterGK = settingsJson.abSettings.addFilterGK; jQuery(nameAbAddFilterGK).addClass("toggled"); } if (settingsJson.abSettings.captchaCloseTab) { window.captchaCloseTab = settingsJson.abSettings.captchaCloseTab; jQuery(nameAbCloseTabToggle).addClass("toggled"); } if (settingsJson.abSettings.notificationEnabled) { window.notificationEnabled = settingsJson.abSettings.notificationEnabled; jQuery(nameAbMessageNotificationToggle).addClass("toggled"); } if (settingsJson.abSettings.soundEnabled) { window.soundEnabled = settingsJson.abSettings.soundEnabled; jQuery(nameAbSoundToggle).addClass("toggled"); } if (settingsJson.abSettings.autoSolveCaptcha) { window.autoSolveCaptcha = settingsJson.abSettings.autoSolveCaptcha; jQuery(nameAbSolveCaptcha).addClass("toggled"); } if (settingsJson.abSettings.proxyAddress) { jQuery(nameProxyAddress).val(settingsJson.abSettings.proxyAddress); } if (settingsJson.abSettings.proxyPort) { jQuery(nameProxyPort).val(settingsJson.abSettings.proxyPort); } if (settingsJson.abSettings.proxyUserName) { jQuery(nameProxyLogin).val(settingsJson.abSettings.proxyUserName); } if (settingsJson.abSettings.proxyUserPassword) { jQuery(nameProxyPassword).val(settingsJson.abSettings.proxyUserPassword); } if (settingsJson.abSettings.antiCaptchKey) { jQuery(nameAntiCaptchKey).val(settingsJson.abSettings.antiCaptchKey); } if (settingsJson.abSettings.telegramBotToken) { jQuery(nameTelegramBotToken).val( settingsJson.abSettings.telegramBotToken ); } if (settingsJson.abSettings.telegramChatID) { jQuery(nameTelegramChatId).val(settingsJson.abSettings.telegramChatID); } if (settingsJson.abSettings.telegramBuy) { jQuery(nameNotificationType).val(settingsJson.abSettings.telegramBuy); } if (settingsJson.abSettings.discordToken) { jQuery(nameDiscordToken).val(settingsJson.abSettings.discordToken); } if (settingsJson.abSettings.discordChannelId) { jQuery(nameDiscordChannelId).val( settingsJson.abSettings.discordChannelId ); } if (settingsJson.abSettings.autoClearLog) { window.autoClearLog = false; window.toggleAutoLogClear(); } let savedCriteria = settingsJson.searchCriteria || {}; window.controllerInstance._viewmodel.playerData = {}; if (!jQuery.isEmptyObject(savedCriteria)) { Object.assign( window.controllerInstance._viewmodel.searchCriteria, savedCriteria.criteria ); Object.assign( window.controllerInstance._viewmodel.playerData, savedCriteria.playerData ); } if (jQuery.isEmptyObject(window.controllerInstance._viewmodel.playerData)) { window.controllerInstance._viewmodel.playerData = null; } window.controllerInstance.viewDidAppear(); }; window.sendPinEvents = function (pageId) { services.PIN.sendData(PINEventType.PAGE_VIEW, { type: PIN_PAGEVIEW_EVT_TYPE, pgid: pageId, }); }; window.sendNotificationToUser = function (message) { if (window.notificationEnabled) { let bot_token = jQuery(nameTelegramBotToken).val(); let bot_chatID = jQuery(nameTelegramChatId).val(); if (bot_token && bot_chatID) { let url = "https://api.telegram.org/bot" + bot_token + "/sendMessage?chat_id=" + bot_chatID + "&parse_mode=Markdown&text=" + message; var xhttp = new XMLHttpRequest(); xhttp.open("GET", url, true); xhttp.send(); } let channelId = jQuery(nameDiscordChannelId).val(); if (channelId) { if (window.discordClient) { window.discordClient.channels.get(channelId).send(message); } else { window.discordClient = window.initializeDiscordClient(function () { setTimeout(function () { if (window.discordClient) window.discordClient.channels.get(channelId).send(message); }, 200); }); } } } }; window.activateAutoBuyer = function (isStart) { if (window.autoBuyerActive) { return; } if (window.botStopped && !isStart) { return; } if (!window.discordClient) window.discordClient = window.initializeDiscordClient(); services.Item.requestWatchedItems().observe(this, function (t, response) { window.botStartTime = new Date(); window.searchCountBeforePause = 10; window.currentChemistry = -1; window.currentPage = 1; if ($(nameAbCycleAmount).val() !== "") { window.searchCountBeforePause = parseInt($(nameAbCycleAmount).val()); } window.defaultStopTime = window.searchCountBeforePause; window.autoBuyerActive = true; window.botStopped = false; if (isStart) { window.purchasedCardCount = 0; window.firstSearch = true; window.userWatchItems = response.data.items .filter((item) => item._auction) .map((item) => item._auction.tradeId) || []; window.isSearchInProgress = false; if (window.userWatchItems.length) { writeToDebugLog( `Found ${window.userWatchItems.length} items in users watch list and ignored from selling` ); } window.notify("Autobuyer Started"); } else { window.notify("Autobuyer Resumed"); } }); }; window.deactivateAutoBuyer = function (isStopped) { if (window.botStopped && !window.autoBuyerActive) { return; } window.autoBuyerActive = false; window.botStartTime = null; window.searchCountBeforePause = 10; window.currentChemistry = -1; window.currentPage = 1; if (isStopped) { window.purchasedCardCount = 0; window.botStopped = true; window.isSearchInProgress = false; } window.defaultStopTime = window.searchCountBeforePause; window.notify(isStopped ? "Autobuyer Stopped" : "Autobuyer Paused"); }; window.play_audio = function (event_type) { if (window.soundEnabled) { var elem = document.getElementById(nameWinMp3.substring(1)); if (event_type == "capatcha") { elem = document.getElementById(nameCapatchaMp3.substring(1)); } elem.currentTime = 0; elem.play(); } }; window.clearLog = function () { var $progressLog = jQuery(nameProgressAutobuyer); var $buyerLog = jQuery(nameAutoBuyerFoundLog); $progressLog.val(""); $buyerLog.val(""); }; JSUtils.inherits( UTAutoBuyerViewController, UTMarketSearchFiltersViewController ); window.UTAutoBuyerViewController.prototype.init = function init() { if (!this.initialized) { //getAppMain().superclass(), this._viewmodel || (this._viewmodel = new viewmodels.BucketedItemSearch()), this._viewmodel.searchCriteria.type === SearchType.ANY && (this._viewmodel.searchCriteria.type = SearchType.PLAYER); _searchViewModel = this._viewmodel; var t = getAppMain() .getConfigRepository() .getConfigObject(EAConfigurationRepository.KEY_ITEMS_PER_PAGE), count = 1 + (JSUtils.isValid(t) ? t[EAConfigurationRepository.KEY_ITEMS_PER_PAGE] : 15); (this._viewmodel.searchCriteria.count = count), (this._viewmodel.searchFeature = enums.ItemSearchFeature.MARKET); var view = this.getView(); view.addTarget( this, this._eResetSelected, UTMarketSearchFiltersView.Event.RESET ), view.addTarget( this, window.activateAutoBuyer, UTMarketSearchFiltersView.Event.SEARCH ), view.addTarget( this, this._eFilterChanged, UTMarketSearchFiltersView.Event.FILTER_CHANGE ), view.addTarget( this, this._eMinBidPriceChanged, UTMarketSearchFiltersView.Event.MIN_BID_PRICE_CHANGE ), view.addTarget( this, this._eMaxBidPriceChanged, UTMarketSearchFiltersView.Event.MAX_BID_PRICE_CHANGE ), view.addTarget( this, this._eMinBuyPriceChanged, UTMarketSearchFiltersView.Event.MIN_BUY_PRICE_CHANGE ), view.addTarget( this, this._eMaxBuyPriceChanged, UTMarketSearchFiltersView.Event.MAX_BUY_PRICE_CHANGE ), this._viewmodel.getCategoryTabVisible() && (view.initTabMenuComponent(), view .getTabMenuComponent() .addTarget(this, this._eSearchCategoryChanged, EventType.TAP)), this._squadContext ? isPhone() || view.addClass("narrow") : view.addClass("floating"), view .getPlayerNameSearch() .addTarget(this, this._ePlayerNameChanged, EventType.CHANGE), !isPhone() && (view.__root.style = "width: 50%; float: left;"); } }; function addTabItem() { if ( services.Localization && jQuery("h1.title").html() === services.Localization.localize("navbar.label.home") ) { getAppMain().getRootViewController().showGameView = function showGameView() { if (this._presentedViewController instanceof UTGameTabBarController) return !1; var t, i = new UTGameTabBarController(), s = new UTGameFlowNavigationController(), o = new UTGameFlowNavigationController(), l = new UTGameFlowNavigationController(), u = new UTGameFlowNavigationController(), h = new UTGameFlowNavigationController(), st = new UTGameFlowNavigationController(), p = new UTTabBarItemView(), _ = new UTTabBarItemView(), g = new UTTabBarItemView(), m = new UTTabBarItemView(), ST = new UTTabBarItemView(), S = new UTTabBarItemView(); if ( (s.initWithRootController(new UTHomeHubViewController()), o.initWithRootController(new UTSquadsHubViewController()), l.initWithRootController(new UTTransfersHubViewController()), u.initWithRootController(new UTStoreViewController()), h.initWithRootController(new UTClubHubViewController()), st.initWithRootController(new UTCustomizeHubViewController()), p.init(), p.setTag(UTGameTabBarController.TabTag.HOME), p.setText(services.Localization.localize("navbar.label.home")), p.addClass("icon-home"), _.init(), _.setTag(UTGameTabBarController.TabTag.SQUADS), _.setText(services.Localization.localize("nav.label.squads")), _.addClass("icon-squad"), g.init(), g.setTag(UTGameTabBarController.TabTag.TRANSFERS), g.setText(services.Localization.localize("nav.label.trading")), g.addClass("icon-transfer"), m.init(), m.setTag(UTGameTabBarController.TabTag.STORE), m.setText(services.Localization.localize("navbar.label.store")), m.addClass("icon-store"), S.init(), S.setTag(UTGameTabBarController.TabTag.CLUB), S.setText(services.Localization.localize("nav.label.club")), S.addClass("icon-club"), ST.init(), ST.setTag(UTGameTabBarController.TabTag.STADIUM), ST.setText( services.Localization.localize("navbar.label.customizeHub") ), ST.addClass("icon-stadium"), (s.tabBarItem = p), (o.tabBarItem = _), (l.tabBarItem = g), (u.tabBarItem = m), (h.tabBarItem = S), (st.tabBarItem = ST), (t = [s, o, l, u, st, h])) ) { var C = new UTGameFlowNavigationController(), T = new UTGameFlowNavigationController(), AB = new UTGameFlowNavigationController(), //added row v = new UTGameFlowNavigationController(); C.initWithRootController(new UTSBCHubViewController()), T.initWithRootController(new UTLeaderboardsHubViewController()), AB.initWithRootController(new UTAutoBuyerViewController()), //added line v.initWithRootController(new UTAppSettingsViewController()); var L = new UTTabBarItemView(); L.init(), L.setTag(UTGameTabBarController.TabTag.SBC), L.setText(services.Localization.localize("nav.label.sbc")), L.addClass("icon-sbc"); var I = new UTTabBarItemView(); I.init(), I.setTag(UTGameTabBarController.TabTag.LEADERBOARDS), I.setText( services.Localization.localize("nav.label.leaderboards") ), I.addClass("icon-leaderboards"); //added section var AutoBuyerTab = new UTTabBarItemView(); AutoBuyerTab.init(), AutoBuyerTab.setTag(8), AutoBuyerTab.setText("AutoBuyer"), AutoBuyerTab.addClass("icon-transfer"); var P = new UTTabBarItemView(); P.init(), P.setTag(UTGameTabBarController.TabTag.SETTINGS), P.setText(services.Localization.localize("button.settings")), P.addClass("icon-settings"), (C.tabBarItem = L), (T.tabBarItem = I), (v.tabBarItem = P), (AB.tabBarItem = AutoBuyerTab), //added line (t = isPhone() ? t.concat([AB]) : t.concat([C, T, v, AB])); //added line } return ( i.initWithViewControllers(t), i.getView().addClass("game-navigation"), this.presentViewController(i, !0, function () { services.URL.hasDeepLinkURL() && services.URL.processDeepLinkURL(); }), !0 ); }; getAppMain().getRootViewController().showGameView(); } else { window.setTimeout(addTabItem, 1000); } } window.findMinBin = async function () { window.notify( "Calculating price, please wait...", enums.UINotificationType.POSITIVE ); jQuery(".ut-click-shield").addClass("showing"); jQuery(".loaderIcon ").css("display", "block"); let minBuy = await window.calcBin(); if (minBuy) { window.notify( "Succesfully computed the price", enums.UINotificationType.POSITIVE ); } else { window.notify( "Unable to calculate price", enums.UINotificationType.NEGATIVE ); } jQuery(nameAbBuyPrice).val(minBuy + ""); jQuery(".ut-click-shield").removeClass("showing"); jQuery(".loaderIcon ").css("display", "none"); }; window.calcBin = async function () { let criteria = getAppMain() .getRootViewController() .getPresentedViewController() .getCurrentViewController() .getCurrentController()._viewmodel.searchCriteria; criteria.maxBuy = null; let allPrices = []; let itemsToConsider = 5; let isMinFound = false; let currentCount = 0; while (!isMinFound) { if (++currentCount === 10) { isMinFound = true; } else { sendPinEvents("Transfer Market Search"); services.Item.clearTransferMarketCache(); let items = await window.getBinSearchResult({ ...criteria }); if (items.length) { allPrices = allPrices.concat( items.map((i) => i._auction.buyNowPrice) ); const currentMin = Math.min( ...items.map((i) => i._auction.buyNowPrice) ); if (items.length < 5) { isMinFound = true; } let currentCalcBin = window.fixRandomPrice( window.getSellBidPrice(currentMin) ); if (currentCalcBin === criteria.maxBuy) { isMinFound = true; } else { criteria.maxBuy = window.fixRandomPrice( window.getSellBidPrice(currentMin) ); } await window.waitAsync(2); } else { isMinFound = true; } } } allPrices = allPrices.sort((a, b) => a - b).slice(0, itemsToConsider); if (allPrices.length) { return window.fixRandomPrice(calcAverage(allPrices)); } return null; }; window.getBinSearchResult = function (criteria) { return new Promise((resolve, reject) => { services.Item.searchTransferMarket(criteria, 1).observe( this, function (sender, response) { if (response.success) { sendPinEvents("Transfer Market Results - List View"); sendPinEvents("Item - Detail View"); resolve(response.data.items); } else { resolve([]); } } ); }); }; window.calcAverage = function (arr) { var sum = 0; for (var i = 0; i < arr.length; i++) { sum += parseInt(arr[i], 10); } return sum / arr.length; }; window.createAutoBuyerInterface = function () { if ( services.Localization && jQuery("h1.title").html() === services.Localization.localize("navbar.label.home") ) { window.hasLoadedAll = true; } if ( window.hasLoadedAll && getAppMain() .getRootViewController() .getPresentedViewController() .getCurrentViewController() .getCurrentController()._jsClassName ) { if (!jQuery(".SearchWrapper").length) { var view = getAppMain() .getRootViewController() .getPresentedViewController() .getCurrentViewController() .getCurrentController()._view; jQuery(view.__root.parentElement).prepend( "<style>" + ".ut-navigation-container-view--content>* { height: calc(100% - 4rem); }" + ".ut-content-container .ut-content { max-height: none !important; }" + "</style>" + '<div id="' + nameInfoWrapper.substring(1) + '" class="ut-navigation-bar-view navbar-style-landscape">' + ' <h1 class="title">AUTOBUYER STATUS: <span id="' + nameAbStatus.substring(1) + '"></span> | REQUEST COUNT: <span id="' + nameAbRequestCount.substring(1) + '">0</span></h1>' + ' <div class="view-navbar-clubinfo">' + ' <div class="view-navbar-clubinfo-data">' + ' <div class="view-navbar-clubinfo-name">' + ' <div style="float: left;">Search:</div>' + ' <div style="float: right; height: 10px; width: 100px; background: #888; margin: 5px 0px 5px 5px;">' + ' <div id="' + nameAbSearchProgress.substring(1) + '" style="background: #000; height: 10px; width: 0%"></div>' + " </div>" + " </div>" + ' <div class="view-navbar-clubinfo-name">' + ' <div style="float: left;">Statistics:</div>' + ' <div style="float: right; height: 10px; width: 100px; background: #888; margin: 5px 0px 5px 5px;">' + ' <div id="' + nameAbStatisticsProgress.substring(1) + '" style="background: #000; height: 10px; width: 0%"></div>' + " </div>" + " </div>" + " </div>" + " </div>" + ' <div class="view-navbar-currency" style="margin-left: 10px;">' + ' <div class="view-navbar-currency-coins" id="' + nameAbCoins.substring(1) + '"></div>' + " </div>" + ' <div class="view-navbar-clubinfo">' + ' <div class="view-navbar-clubinfo-data">' + ' <span class="view-navbar-clubinfo-name">Sold Items: <span id="' + nameAbSoldItems.substring(1) + '"></span></span>' + ' <span class="view-navbar-clubinfo-name">Unsold Items: <span id="' + nameAbUnsoldItems.substring(1) + '"></span></span>' + " </div>" + " </div>" + ' <div class="view-navbar-clubinfo" style="border: none;">' + ' <div class="view-navbar-clubinfo-data">' + ' <span class="view-navbar-clubinfo-name">Available Items: <span id="' + nameAbAvailableItems.substring(1) + '"></span></span>' + ' <span class="view-navbar-clubinfo-name">Active transfers: <span id="' + nameAbActiveTransfers.substring(1) + '"></span></span>' + " </div>" + " </div>" + "</div>" ); jQuery(view.__root.parentElement).append( '<div id="' + nameSearchWrapper.substring(1) + (!isPhone() ? '" style="width: 50%; right: 50%;">"' : '">') + '<textarea readonly id="' + nameProgressAutobuyer.substring(1) + '" style="font-size: 15px; width: 100%;height: 58%;background-color:#141414;color:#e2dde2;"></textarea><label>Search Results:</label><br/><textarea readonly id="' + nameAutoBuyerFoundLog.substring(1) + '" style="font-size: 10px; width: 100%;height: 37%;background-color:#141414;color:#e2dde2;"></textarea></div>' ); var $log = jQuery(nameProgressAutobuyer); if ($log.val() == "") { let time_txt = "[" + new Date().toLocaleTimeString() + "] "; let log_init_text = "Autobuyer Ready\n" + time_txt + "------------------------------------------------------------------------------------------\n" + time_txt + " Index | Item name | price | op | result | comments\n" + time_txt + "------------------------------------------------------------------------------------------\n"; $log.val(log_init_text); } } if (jQuery(".search-prices").first().length) { if (!jQuery(nameAbBuyPrice).length) { jQuery(".ut-item-search-view") .first() .prepend( '<div style="width:100%;display: flex;' + (isPhone() ? 'flex-direction: column;">' : ">") + '<div class="button-container">' + '<select id="' + nameFilterDropdown.substring(1) + '" name="filters" style="width:100%;padding: 10px;font-family: UltimateTeamCondensed,sans-serif;font-size: 1.6em;color: #e2dde2;text-transform: uppercase;background-color: #171826;"></select>' + "</div>" + '<div style="width:' + (!isPhone() ? "50%" : "100%") + ';margin-top: 1%;" class="button-container">' + '<button style="width:50%" class="btn-standard call-to-action" id="' + nameDeleteFilter.substring(1) + '">Delete Filter</button>' + '<button style="width:100%" class="btn-standard call-to-action" id="' + namePreserveChanges.substring(1) + '">Save Filter</button>' + "</div> </div>" ); jQuery(".search-prices") .first() .append( "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Buy/Bid Settings:</h1>' + "</div>" + "<div><br></div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Buy Price:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbBuyPrice.substring(1) + '" placeholder="5000">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">No. of cards to buy:<br/><small>(Works only with Buy price)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbCardCount.substring(1) + '" placeholder="10">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Bid Price:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbMaxBid.substring(1) + '" placeholder="5000">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Bid Exact Price</span>' + ' <div id="' + nameAbBidExact.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Bid items expiring in:<br/><small>(S for seconds, M for Minutes, H for hours)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbItemExpiring.substring(1) + '" placeholder="1H">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + '<div class="button-container">' + ' <button class="btn-standard call-to-action" id="' + nameCalcBinPrice.substring(1) + '">Calculate Buy Price</button>' + "</div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Sell settings:</h1>' + "</div>" + "<div><br></div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Sell Price:</span><br/><small>Receive After Tax: <span id="' + nameSellAfterTax.substring(1) + '">0</span></small>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbSellPrice.substring(1) + '" placeholder="7000">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Clear sold count:<br/><small>(Clear sold items when reach a specified count)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbMinDeleteCount.substring(1) + '" placeholder="10">' + " </div>" + " </div>" + "</div>" + '<div style="padding-top : 20px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Relist Unsold Items</span>' + ' <div id="' + nameAbSellToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Safety settings:</h1>' + "</div>" + "<div><br></div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Wait Time:<br/><small>(Random second range eg. 7-15)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbWaitTime.substring(1) + '" placeholder="7-15">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Max purchases per search request:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbMaxPurchases.substring(1) + '" placeholder="3">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Pause Cycle :<br/><small>(Number of searches performed before triggerring Pause)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbCycleAmount.substring(1) + '" placeholder="10">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Pause For:<br/><small>(S for seconds, M for Minutes, H for hours eg. 0-0S)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbPauseFor.substring(1) + '" placeholder="0-0S">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Stop After:<br/><small>(S for seconds, M for Minutes, H for hours)</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbStopAfter.substring(1) + '" placeholder="1H">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Add Delay After Buy<br/><small>(Adds 1 Sec Delay after trying <br/> to buy / bid a card)</small></span>' + ' <div id="' + nameAbAddBuyDelay.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">SKIP GK<br/><small>(Skip all goalkeepers <br/> to buy / bid a card)</small></span>' + ' <div id="' + nameAbAddFilterGK.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Rating Filtering:</h1>' + "</div>" + "<div><br></div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Min Rating:<br/><small>Minimum Player Rating</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbMinRate.substring(1) + '" placeholder="10" value="10">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Max Rating:<br/><small>Maximum Player Rating</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAbMaxRate.substring(1) + '" placeholder="100" value="100">' + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Search settings:</h1>' + "</div>" + "<div><br></div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Max value of random min bid:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbRandMinBidInput.substring(1) + '" placeholder="300">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Use random min bid</span>' + ' <div id="' + nameAbRandMinBidToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Max value of random min buy:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbRandMinBuyInput.substring(1) + '" placeholder="300">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Use random min buy</span>' + ' <div id="' + nameAbRandMinBuyToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Captcha settings:</h1>' + "</div>" + '<div style="width: 100%;" class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Close Web App on Captcha Trigger</span>' + ' <div id="' + nameAbCloseTabToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div style="width: 100%;" class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Auto Solve Captcha</span>' + ' <div id="' + nameAbSolveCaptcha.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Anti-Captcha Key' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameAntiCaptchKey.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Proxy Address' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameProxyAddress.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Proxy Port' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameProxyPort.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Proxy User Name (Optional)' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameProxyLogin.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Proxy User Password (Optional)' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameProxyPassword.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Notification settings:</h1>' + "</div>" + '<div style="width: 100%;" class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Sound Notification</span>' + ' <div id="' + nameAbSoundToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Telegram Bot Token<br/><small>Token of your own bot</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameTelegramBotToken.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Telegram Chat ID<br/><small>Your Telegram ChatID </small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameTelegramChatId.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Discord Bot Token<br/><small>Your Discord Bot Token</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameDiscordToken.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Discord Channel ID<br/><small>Your Discord Channel ID</small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameDiscordChannelId.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Notification Type<br/><small>Type A for buy/loss notification, B for buy only or L for lost notification only </small>:</span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="text" class="numericInput" id="' + nameNotificationType.substring(1) + '" style="text-transform: none;">' + " </div>" + " </div>" + "</div>" + '<div style="width: 100%;" class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Send Notification</span>' + ' <div id="' + nameAbMessageNotificationToggle.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + "<div><br></div>" + '<div class="button-container">' + ' <button class="btn-standard call-to-action" id="' + nameTestNotification.substring(1) + '">Test Notification</button>' + "</div>" + "<div><br></div>" + '<div class="search-price-header">' + ' <h1 class="secondary">Multi-Filter settings:</h1>' + "</div>" + '<div class="button-container">' + ' <select multiple="multiple" class="multiselect-filter" id="' + nameSelectedFilter.substring(1) + '" name="selectedFilters" style="padding: 10px;width: 100%;font-family: UltimateTeamCondensed,sans-serif;font-size: 1.6em;color: #e2dde2;text-transform: uppercase;background-color: #171826; overflow-y : scroll"></select>' + ' <label style="white-space: nowrap;" id="' + nameSelectFilterCount.substring(1) + '">No Filter Selected</label>' + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Number of search For Filter:<br/><small>Count of searches to be performed before switching to different filter</small></span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbNumberFilterSearch.substring(1) + '" placeholder="1">' + " </div>" + " </div>" + "</div>" + "<div><br></div>" + "<hr>" + '<div class="search-price-header">' + ' <h1 class="secondary">Common settings:</h1>' + "</div>" + '<div class="price-filter">' + ' <div class="info">' + ' <span class="secondary label">Error Codes to stop bot (csv) :<br/><small>(Eg. 412,421,521)</small></span>' + " </div>" + ' <div class="buttonInfo">' + ' <div class="inputBox">' + ' <input type="tel" class="numericInput" id="' + nameAbStopErrorCode.substring(1) + '" placeholder="">' + " </div>" + " </div>" + "</div>" + '<div style="width: 100%;" class="price-filter">' + ' <div style="padding : 22px" class="ut-toggle-cell-view">' + ' <span class="ut-toggle-cell-view--label">Auto Clear Log<br/><small>Automatically clear logs every 2 minutes</small></span>' + ' <div id="' + nameAutoClearLog.substring(1) + '" class="ut-toggle-control">' + ' <div class="ut-toggle-control--track">' + " </div>" + ' <div class= "ut-toggle-control--grip" >' + " </div>" + " </div>" + " </div>" + "</div>" + '<audio id="' + nameWinMp3.substring(1) + '" hidden">\n' + ' <source src="https://notificationsounds.com/storage/sounds/file-sounds-869-coins.ogg" type="audio/ogg">\n' + ' <source src="https://notificationsounds.com/storage/sounds/file-sounds-869-coins.mp3" type="audio/mpeg">\n' + " Your browser does not support the audio element.\n" + "</audio>" + '<audio id="' + nameCapatchaMp3.substring(1) + '" hidden">\n' + ' <source src="https://notificationsounds.com/storage/sounds/file-sounds-897-alarm-frenzy.ogg" type="audio/ogg">\n' + ' <source src="https://notificationsounds.com/storage/sounds/file-sounds-897-alarm-frenzy.mp3" type="audio/mpeg">\n' + " Your browser does not support the audio element.\n" + "</audio>" ); let dropdown = $(nameFilterDropdown); let filterdropdown = $(nameSelectedFilter); dropdown.empty(); filterdropdown.empty(); dropdown.append( '<option selected="true" disabled>Choose filter to load</option>' ); dropdown.prop("selectedIndex", 0); var filterArray = GM_listValues(); //console.log(filterArray); // Populate dropdown with list of filters for (var i = 0; i < filterArray.length; i++) { dropdown.append( $("<option></option>") .attr("value", filterArray[i]) .text(filterArray[i]) ); filterdropdown.append( $("<option></option>") .attr("value", filterArray[i]) .text(filterArray[i]) ); } } } if (!jQuery(nameSearchCancelButton).length) { jQuery(nameInfoWrapper) .next() .find(".button-container button") .last() .after( '<button class="btn-standard" id="' + nameSearchCancelButton.substring(1) + '">Stop</button><button class="btn-standard" id="' + nameClearLogButton.substring(1) + '">Clear Log</button>' ); } } else { window.setTimeout(createAutoBuyerInterface, 1000); } }; window.saveDetails = function () { jQuery(namePreserveChanges).addClass("active"); setTimeout(function () { let settingsJson = {}; settingsJson.searchCriteria = { criteria: _searchViewModel.searchCriteria, playerData: _searchViewModel.playerData, }; settingsJson.abSettings = {}; if (jQuery(nameAbBuyPrice).val() !== "") { settingsJson.abSettings.buyPrice = jQuery(nameAbBuyPrice).val(); } if (jQuery(nameAbCardCount).val() !== "") { settingsJson.abSettings.cardCount = jQuery(nameAbCardCount).val(); } if (jQuery(nameAbMaxBid).val() !== "") { settingsJson.abSettings.maxBid = jQuery(nameAbMaxBid).val(); } if (jQuery(nameAbItemExpiring).val() !== "") { settingsJson.abSettings.itemExpiring = jQuery(nameAbItemExpiring).val(); } if (window.bidExact) { settingsJson.abSettings.bidExact = window.bidExact; } if (jQuery(nameAbSellPrice).val() !== "") { settingsJson.abSettings.sellPrice = jQuery(nameAbSellPrice).val(); } if (jQuery(nameAbMinDeleteCount).val() !== "") { settingsJson.abSettings.minDeleteCount = jQuery(nameAbMinDeleteCount).val(); } if (window.reListEnabled) { settingsJson.abSettings.reListEnabled = window.reListEnabled; } if (jQuery(nameAbWaitTime).val() !== "") { settingsJson.abSettings.waitTime = jQuery(nameAbWaitTime).val(); } if (jQuery(nameAbMaxPurchases).val() !== "") { settingsJson.abSettings.maxPurchases = jQuery(nameAbMaxPurchases).val(); } if (jQuery(nameAbCycleAmount).val() !== "") { settingsJson.abSettings.pauseCycle = jQuery(nameAbCycleAmount).val(); } if (jQuery(nameAbPauseFor).val() !== "") { settingsJson.abSettings.pauseFor = jQuery(nameAbPauseFor).val(); } if (jQuery(nameAbStopAfter).val() !== "") { settingsJson.abSettings.stopAfter = jQuery(nameAbStopAfter).val(); } if (jQuery(nameAbMinRate).val() !== "") { settingsJson.abSettings.minRate = jQuery(nameAbMinRate).val(); } if (jQuery(nameAbMaxRate).val() !== "") { settingsJson.abSettings.maxRate = jQuery(nameAbMaxRate).val(); } if (jQuery(nameAbRandMinBidInput).val() !== "") { settingsJson.abSettings.randMinBid = jQuery( nameAbRandMinBidInput ).val(); } if (jQuery(nameAbRandMinBuyInput).val() !== "") { settingsJson.abSettings.randMinBuy = jQuery( nameAbRandMinBuyInput ).val(); } if (window.useRandMinBuy) { settingsJson.abSettings.useRandMinBuy = window.useRandMinBuy; } if (window.useRandMinBid) { settingsJson.abSettings.useRandMinBid = window.useRandMinBid; } if (window.addDelayAfterBuy) { settingsJson.abSettings.addDelayAfterBuy = window.addDelayAfterBuy; } if (window.addFilterGK) { settingsJson.abSettings.addFilterGK = window.addFilterGK; } if (jQuery(nameTelegramBotToken).val() !== "") { settingsJson.abSettings.telegramBotToken = jQuery(nameTelegramBotToken).val(); } if (jQuery(nameTelegramChatId).val() !== "") { settingsJson.abSettings.telegramChatID = jQuery(nameTelegramChatId).val(); } if (jQuery(nameNotificationType).val() !== "") { settingsJson.abSettings.telegramBuy = jQuery(nameNotificationType).val(); } if (jQuery(nameDiscordToken).val() !== "") { settingsJson.abSettings.discordToken = jQuery(nameDiscordToken).val(); } if (jQuery(nameDiscordChannelId).val() !== "") { settingsJson.abSettings.discordChannelId = jQuery(nameDiscordChannelId).val(); } if (window.notificationEnabled) { settingsJson.abSettings.notificationEnabled = window.notificationEnabled; } if (window.soundEnabled) { settingsJson.abSettings.soundEnabled = window.soundEnabled; } if (window.captchaCloseTab) { settingsJson.abSettings.captchaCloseTab = window.captchaCloseTab; } if (window.autoSolveCaptcha) { settingsJson.abSettings.autoSolveCaptcha = window.autoSolveCaptcha; } if (window.autoClearLog) { settingsJson.abSettings.autoClearLog = window.autoClearLog; } if (jQuery(nameProxyAddress).val() !== "") { settingsJson.abSettings.proxyAddress = jQuery(nameProxyAddress).val(); } if (jQuery(nameProxyPort).val() !== "") { settingsJson.abSettings.proxyPort = jQuery(nameProxyPort).val(); } if (jQuery(nameProxyLogin).val() !== "") { settingsJson.abSettings.proxyUserName = jQuery(nameProxyLogin).val(); } if (jQuery(nameProxyPassword).val() !== "") { settingsJson.abSettings.proxyUserPassword = jQuery(nameProxyPassword).val(); } if (jQuery(nameAntiCaptchKey).val() !== "") { settingsJson.abSettings.antiCaptchKey = jQuery(nameAntiCaptchKey).val(); } var currentFilterName = $("select[name=filters] option") .filter(":selected") .val(); if (currentFilterName === "Choose filter to load") { currentFilterName = undefined; } var filterName = prompt( "Enter a name for this filter", currentFilterName ); if (filterName) { filterName = filterName.toUpperCase(); window.checkAndOption(nameFilterDropdown, filterName); window.checkAndOption(nameSelectedFilter, filterName); $(`select[name=filters] option[value="${filterName}"]`).attr( "selected", true ); GM_setValue(filterName, JSON.stringify(settingsJson)); jQuery(namePreserveChanges).removeClass("active"); window.notify("Changes saved successfully"); } else { jQuery(namePreserveChanges).removeClass("active"); window.notify( "Filter Name Required", enums.UINotificationType.NEGATIVE ); } }, 200); }; window.checkAndOption = function (dropdownSelector, optionName) { let exist = false; $(`${dropdownSelector} option`).each(function () { if (this.value === optionName) { exist = true; return false; } }); if (!exist) { $(dropdownSelector).append( $("<option></option>").attr("value", optionName).text(optionName) ); } }; window.clearABSettings = function (e) { $(nameAbBuyPrice).val(""); $(nameAbCardCount).val(""); $(nameAbMaxBid).val(""); $(nameAbItemExpiring).val(""); window.bidExact = false; jQuery(nameAbBidExact).removeClass("toggled"); jQuery(nameAbSellPrice).val(""); jQuery(nameAbMinDeleteCount).val(""); window.reListEnabled = false; jQuery(nameAbSellToggle).removeClass("toggled"); jQuery(nameAbWaitTime).val(""); jQuery(nameAbMaxPurchases).val(""); jQuery(nameAbCycleAmount).val(""); jQuery(nameAbPauseFor).val(""); jQuery(nameAbStopAfter).val(""); jQuery(nameAbMinRate).val(""); jQuery(nameAbMaxRate).val(""); jQuery(nameAbRandMinBidInput).val(""); jQuery(nameAbRandMinBuyInput).val(""); jQuery(nameTelegramBotToken).val(""); jQuery(nameTelegramChatId).val(""); jQuery(nameNotificationType).val(""); jQuery(nameDiscordToken).val(""); jQuery(nameDiscordChannelId).val(""); window.useRandMinBuy = false; window.useRandMinBid = false; window.addDelayAfterBuy = false; window.addFilterGK = false; jQuery(nameAbRandMinBuyToggle).removeClass("toggled"); window.bidExact = false; jQuery(nameAbRandMinBidToggle).removeClass("toggled"); window.captchaCloseTab = false; jQuery(nameAbCloseTabToggle).removeClass("toggled"); window.notificationEnabled = false; jQuery(nameAbMessageNotificationToggle).removeClass("toggled"); window.soundEnabled = false; jQuery(nameAbSoundToggle).removeClass("toggled"); window.autoClearLog = true; window.toggleAutoLogClear(); window.autoSolveCaptcha = false; jQuery(nameAbSolveCaptcha).removeClass("toggled"); if (e) { jQuery(nameSelectedFilter).find("option").attr("selected", false); window.setFilters(); jQuery(nameFilterDropdown).prop("selectedIndex", 0); } }; jQuery(document).on( "click touchend", nameSearchCancelButton, deactivateAutoBuyer ); jQuery(document).on("click touchend", nameClearLogButton, clearLog); jQuery(document).on( "click touchend", 'button:contains("Reset")', clearABSettings ); jQuery(document).on("click touchend", nameCalcBinPrice, findMinBin); jQuery(document).on( { mouseenter: function () { jQuery(namePreserveChanges).addClass("hover"); }, mouseleave: function () { jQuery(namePreserveChanges).removeClass("hover"); }, click: function () { saveDetails(); }, touchend: function () { saveDetails(); }, }, namePreserveChanges ); jQuery(document).on( { mouseenter: function () { jQuery(nameTestNotification).addClass("hover"); }, mouseleave: function () { jQuery(nameTestNotification).removeClass("hover"); }, click: function () { window.sendNotificationToUser("Test Notification Arrived"); window.notify("Test Notification Sent"); }, touchend: function () { window.sendNotificationToUser("Test Notification Arrived"); window.notify("Test Notification Sent"); }, }, nameTestNotification ); window.setFilters = function () { window.selectedFilters = $("select[name=selectedFilters]").val() || []; if (window.selectedFilters.length) { jQuery(nameSelectFilterCount).text( "(" + window.selectedFilters.length + ") Filter Selected" ); } else { jQuery(nameSelectFilterCount).text("No Filter Selected"); } }; jQuery(document).on( { mouseenter: function () { jQuery(nameDeleteFilter).addClass("hover"); }, mouseleave: function () { jQuery(nameDeleteFilter).removeClass("hover"); }, click: function () { deleteFilter(); }, touchend: function () { deleteFilter(); }, }, nameDeleteFilter ); jQuery(document).on( { change: function () { loadFilter(); }, }, nameFilterDropdown ); jQuery(document).on( { click: function () { setFilters(); }, touchend: function () { setFilters(); }, }, nameSelectedFilter ); window.toggleBidExact = function () { if (window.bidExact) { window.bidExact = false; jQuery(nameAbBidExact).removeClass("toggled"); } else { window.bidExact = true; jQuery(nameAbBidExact).addClass("toggled"); } }; window.toggleUseRandMinBid = function () { if (window.useRandMinBid) { window.useRandMinBid = false; jQuery(nameAbRandMinBidToggle).removeClass("toggled"); } else { window.useRandMinBid = true; jQuery(nameAbRandMinBidToggle).addClass("toggled"); } }; window.toggleAddDelayAfterBuy = function () { if (window.addDelayAfterBuy) { window.addDelayAfterBuy = false; jQuery(nameAbAddBuyDelay).removeClass("toggled"); } else { window.addDelayAfterBuy = true; jQuery(nameAbAddBuyDelay).addClass("toggled"); } }; window.toggleAddFilterGK = function () { if (window.addFilterGK) { window.addFilterGK = false; jQuery(nameAbAddFilterGK).removeClass("toggled"); } else { window.addFilterGK = true; jQuery(nameAbAddFilterGK).addClass("toggled"); } }; window.toggleUseRandMinBuy = function () { if (window.useRandMinBuy) { window.useRandMinBuy = false; jQuery(nameAbRandMinBuyToggle).removeClass("toggled"); } else { window.useRandMinBuy = true; jQuery(nameAbRandMinBuyToggle).addClass("toggled"); } }; window.toggleRelist = function () { if (window.reListEnabled) { window.reListEnabled = false; jQuery(nameAbSellToggle).removeClass("toggled"); } else { alert( "Re-listing will list all the cards in the transfer list not only the card which bought by the tool. " + "Check the transfer list once and move the required cards to your club to avoid losing any required cards." ); window.reListEnabled = true; jQuery(nameAbSellToggle).addClass("toggled"); } }; window.toggleCloseTab = function () { if (window.captchaCloseTab) { window.captchaCloseTab = false; jQuery(nameAbCloseTabToggle).removeClass("toggled"); } else { window.captchaCloseTab = true; jQuery(nameAbCloseTabToggle).addClass("toggled"); } }; window.toggleSolveCaptcha = function () { if (window.autoSolveCaptcha) { window.autoSolveCaptcha = false; jQuery(nameAbSolveCaptcha).removeClass("toggled"); } else { window.autoSolveCaptcha = true; jQuery(nameAbSolveCaptcha).addClass("toggled"); } }; let intervalId; window.toggleAutoLogClear = function () { if (window.autoClearLog) { window.autoClearLog = false; jQuery(nameAutoClearLog).removeClass("toggled"); clearInterval(intervalId); } else { window.autoClearLog = true; jQuery(nameAutoClearLog).addClass("toggled"); intervalId = setInterval(() => { window.clearLog(); }, 120000); } }; window.toggleSound = function () { if (window.soundEnabled) { window.soundEnabled = false; jQuery(nameAbSoundToggle).removeClass("toggled"); } else { window.soundEnabled = true; jQuery(nameAbSoundToggle).addClass("toggled"); } }; window.toggleMessageNotification = function () { if (window.notificationEnabled) { window.notificationEnabled = false; jQuery(nameAbMessageNotificationToggle).removeClass("toggled"); } else { window.notificationEnabled = true; jQuery(nameAbMessageNotificationToggle).addClass("toggled"); } }; jQuery(document).on("click touchend", nameAbBidExact, toggleBidExact); jQuery(document).on("click touchend", nameAbSellToggle, toggleRelist); jQuery(document).on( "click touchend", nameAbRandMinBidToggle, toggleUseRandMinBid ); jQuery(document).on( "click touchend", nameAbAddBuyDelay, toggleAddDelayAfterBuy ); jQuery(document).on("click touchend", nameAbAddFilterGK, toggleAddFilterGK); jQuery(document).on( "click touchend", nameAbRandMinBuyToggle, toggleUseRandMinBuy ); jQuery(document).on("click touchend", nameAbCloseTabToggle, toggleCloseTab); jQuery(document).on("click touchend", nameAbSoundToggle, toggleSound); jQuery(document).on( "click touchend", nameAbMessageNotificationToggle, toggleMessageNotification ); jQuery(document).on("click touchend", nameAbSolveCaptcha, toggleSolveCaptcha); jQuery(document).on("click touchend", nameAutoClearLog, toggleAutoLogClear); jQuery(document).on("keyup", nameAbSellPrice, function () { jQuery(nameSellAfterTax).html( ( jQuery(nameAbSellPrice).val() - (parseInt(jQuery(nameAbSellPrice).val()) / 100) * 5 ).toLocaleString() ); }); window.updateAutoTransferListStat = function () { if (!window.autoBuyerActive) { return; } sendPinEvents("Hub - Transfers"); setTimeout(function () { window.updateTransferList(); }, 300); }; window.writeToLog = function (message) { let time_txt = "[" + new Date().toLocaleTimeString() + "] "; var $log = jQuery(nameProgressAutobuyer); if ($log.val() == "") { let time_txt = "[" + new Date().toLocaleTimeString() + "] "; let log_init_text = "Autobuyer Ready\n" + time_txt + "------------------------------------------------------------------------------------------\n" + time_txt + " Index | Item name | price | op | result | comments\n" + time_txt + "------------------------------------------------------------------------------------------\n"; $log.val(log_init_text); } message = "[" + new Date().toLocaleTimeString() + "] " + message + "\n"; $log.val($log.val() + message); if ($log[0]) $log.scrollTop($log[0].scrollHeight); }; window.writeToDebugLog = function (message) { var $log = jQuery(nameAutoBuyerFoundLog); message = "[" + new Date().toLocaleTimeString() + "] " + message + "\n"; $log.val($log.val() + message); if ($log[0]) $log.scrollTop($log[0].scrollHeight); }; window.notify = function (message, notificationType) { notificationType = notificationType || enums.UINotificationType.POSITIVE; services.Notification.queue([message, notificationType]); }; window.getRandomWait = function () { var addedTime = 0; var wait = [7, 15]; if (jQuery(nameAbWaitTime).val()) { wait = jQuery(nameAbWaitTime) .val() .split("-") .map((a) => parseInt(a)); } window.searchCount++; return Math.round(Math.random() * (wait[1] - wait[0]) + wait[0]) * 1000; }; window.getTimerProgress = function (timer) { var time = new Date().getTime(); return ( (Math.max(0, timer.finish - time) / (timer.finish - timer.start)) * 100 ); }; window.updateStatistics = function () { jQuery(nameAbSearchProgress).css( "width", window.getTimerProgress(window.timers.search) ); jQuery(nameAbStatisticsProgress).css( "width", window.getTimerProgress(window.timers.transferList) ); jQuery(nameAbRequestCount).html(window.searchCount); jQuery(nameAbCoins).html(window.futStatistics.coins); if (window.autoBuyerActive) { jQuery(nameAbStatus).css("color", "#2cbe2d").html("RUNNING"); } else { jQuery(nameAbStatus).css("color", "red").html("IDLE"); } jQuery(nameAbSoldItems).html(window.futStatistics.soldItems); jQuery(nameAbUnsoldItems).html(window.futStatistics.unsoldItems); jQuery(nameAbAvailableItems).html(window.futStatistics.availableItems); jQuery(nameAbActiveTransfers).html(window.futStatistics.activeTransfers); if (window.futStatistics.unsoldItems) { jQuery(nameAbUnsoldItems).css("color", "red"); } else { jQuery(nameAbUnsoldItems).css("color", ""); } if (window.futStatistics.availableItems) { jQuery(nameAbAvailableItems).css("color", "orange"); } else { jQuery(nameAbAvailableItems).css("color", ""); } }; window.hasLoadedAll = false; window.searchCount = 0; createAutoBuyerInterface(); addTabItem(); window.getMaxSearchBid = function (min, max) { return Math.round((Math.random() * (max - min) + min) / 1000) * 1000; }; window.getRandNum = function (min, max) { return Math.round(Math.random() * (max - min) + min); }; window.getItemName = function (itemObj) { return window.format_string(itemObj._staticData.name, 15); }; window.winCount = 0; window.lossCount = 0; window.bidCount = 0; window.searchCount = 0; window.errorCodeLookUp = { 521: "Server Rejected the request", 512: "Server Rejected the request", 429: "Bidding Rejected, too many request received from this user", 426: "Bidding Rejected, other user won the (card / bid)", 461: "Bidding Rejected, other user won the (card / bid)", }; window.errorCodeLookUpShort = { 521: "Rejected", 512: "Rejected", 429: "Too many requests", 426: "Others won card/bid", 461: "Others won card/bid", }; window.format_string = function (str, len) { if (str.length <= len) { str += " ".repeat(len - str.length); } return str; }; window.initStatisics = function () { window.futStatistics = { soldItems: "-", unsoldItems: "-", activeTransfers: "-", availableItems: "-", coins: "-", coinsNumber: 0, }; window.timers = { search: window.createTimeout(0, 0), coins: window.createTimeout(0, 0), transferList: window.createTimeout(0, 0), bidCheck: window.createTimeout(0, 0), }; }; window.bids = []; window.sellBids = []; window.createTimeout = function (time, interval) { return { start: time, finish: time + interval, }; }; window.processor = window.setInterval(function () { if (window.autoBuyerActive) { window.stopIfRequired(); window.pauseIfRequired(); var time = new Date().getTime(); if ( !window.isSearchInProgress && (window.timers.search.finish == 0 || window.timers.search.finish <= time) ) { let searchRequest = 1; while (searchRequest-- > 0) { window.searchFutMarket(null, null, null); } window.timers.search = window.createTimeout( time, window.getRandomWait() ); } if ( window.timers.coins.finish == 0 || window.timers.coins.finish <= time ) { window.futStatistics.coins = services.User.getUser().coins.amount.toLocaleString(); window.futStatistics.coinsNumber = services.User.getUser().coins.amount; window.timers.coins = window.createTimeout(time, 2500); } if ( window.timers.transferList.finish == 0 || window.timers.transferList.finish <= time ) { window.updateTransferList(); window.timers.transferList = window.createTimeout(time, 30000); } if ( !window.selectedFilters.length && (window.timers.bidCheck.finish == 0 || window.timers.bidCheck.finish <= time) ) { window.watchBidItems(); window.timers.bidCheck = window.createTimeout(time, 20000); } } else { window.initStatisics(); } window.updateStatistics(); }, 500); window.stopIfRequired = function () { var stopAfter = "1H"; if ($(nameAbStopAfter).val()) { stopAfter = $(nameAbStopAfter).val(); } let interval = stopAfter[stopAfter.length - 1].toUpperCase(); let time = parseInt(stopAfter.substring(0, stopAfter.length - 1)); let multipler = interval === "M" ? 60 : interval === "H" ? 3600 : 1; if (time) { time = time * multipler; let currentTime = new Date(); let timeElapsed = (currentTime.getTime() - window.botStartTime.getTime()) / 1000; if (timeElapsed >= time) { window.deactivateAutoBuyer(true); } } if ( window.buyCardCount && window.purchasedCardCount >= window.buyCardCount ) { window.deactivateAutoBuyer(true); } }; window.pauseIfRequired = function () { if (window.searchCountBeforePause <= 0) { var pauseFor = "0-0S"; if ($(nameAbPauseFor).val()) { pauseFor = $(nameAbPauseFor).val(); } let interval = pauseFor[pauseFor.length - 1].toUpperCase(); let time = pauseFor.substring(0, pauseFor.length - 1); var waitTime = [0, 0]; if (time) { waitTime = time.split("-").map((a) => parseInt(a)); } time = Math.round( Math.random() * (waitTime[1] - waitTime[0]) + waitTime[0] ); let multipler = interval === "M" ? 60 : interval === "H" ? 3600 : 1; if (time) { time = time * multipler * 1000; window.deactivateAutoBuyer(); setTimeout(() => { window.activateAutoBuyer(false); }, time); } else { window.searchCountBeforePause = window.defaultStopTime; } } }; window.searchFutMarket = function (sender, event, data) { if (!window.autoBuyerActive) { return; } let isSeachEventDone = false; window.isSearchInProgress = true; if ( window.selectedFilters && window.selectedFilters.length && !window.eachFilterSearch ) { let filterName = window.selectedFilters[ window.getRandNum(0, window.selectedFilters.length - 1) ]; window.loadFilterByName(filterName); isSeachEventDone = true; window.currentPage = 1; writeToDebugLog( "--------------------------- Running for filter " + filterName + " ---------------------------------------------" ); } if (!window.eachFilterSearch) { if (jQuery(nameAbNumberFilterSearch).val() !== "") { window.eachFilterSearch = parseInt( jQuery(nameAbNumberFilterSearch).val() ); } else { window.eachFilterSearch = 1; } } window.eachFilterSearch--; var searchCriteria = getAppMain() .getRootViewController() .getPresentedViewController() .getCurrentViewController() .getCurrentController()._viewmodel.searchCriteria; services.Item.clearTransferMarketCache(); var expiresIn = 3600; if ($(nameAbItemExpiring).val() !== "") { var expiresInString = "1H"; if ($(nameAbItemExpiring).val()) { expiresInString = $(nameAbItemExpiring).val(); } let expiresInterval = expiresInString[expiresInString.length - 1].toUpperCase(); let expiresInTime = parseInt( expiresInString.substring(0, expiresInString.length - 1) ); let multipler = expiresInterval === "M" ? 60 : expiresInterval === "H" ? 3600 : 1; if (expiresInTime) { expiresIn = expiresInTime * multipler; } } // Randomize search criteria min bid to clear cache if (window.useRandMinBid) { let user_min_bid_txt = $(nameAbRandMinBidInput).val(); if (user_min_bid_txt == "") { user_min_bid_txt = "300"; } let user_min_bid = Math.round(parseInt(user_min_bid_txt)); searchCriteria.minBid = window.fixRandomPrice( window.getRandNum(0, user_min_bid) ); window.currentPage = 1; } if (window.useRandMinBuy) { let user_min_buy_txt = $(nameAbRandMinBuyInput).val(); if (user_min_buy_txt == "") { user_min_buy_txt = "300"; } let user_min_buy = Math.round(parseInt(user_min_buy_txt)); searchCriteria.minBuy = window.fixRandomPrice( window.getRandNum(0, user_min_buy) ); window.currentPage = 1; } if (!isSeachEventDone && window.currentPage === 1) { sendPinEvents("Transfer Market Search"); } window.mbid = searchCriteria.minBid; window.mBuy = searchCriteria.minBuy; if ($(nameAbCardCount).val() !== "") { window.buyCardCount = parseInt(jQuery(nameAbCardCount).val()); } else { window.buyCardCount = undefined; } services.Item.searchTransferMarket( searchCriteria, window.currentPage ).observe(this, function (sender, response) { if (response.success && window.autoBuyerActive) { window.currentPage === 1 && sendPinEvents("Transfer Market Results - List View"); window.searchCountBeforePause--; let min_rate_txt = jQuery(nameAbMinRate).val(); let max_rate_txt = jQuery(nameAbMaxRate).val(); if (min_rate_txt == "") { min_rate_txt = "10"; } if (max_rate_txt == "") { max_rate_txt = "100"; } let selected_min_rate = parseInt(min_rate_txt); let selected_max_rate = parseInt(max_rate_txt); writeToDebugLog( "= Received " + response.data.items.length + " items - from page (" + window.currentPage + ") => config: (minbid:" + window.mbid + "-minbuy:" + window.mBuy + ") " ); var maxPurchases = 3; if ($(nameAbMaxPurchases).val() !== "") { maxPurchases = Math.max(1, parseInt($(nameAbMaxPurchases).val())); } if (window.currentPage <= 20 && response.data.items.length === 21) { window.currentPage++; } else { window.currentPage = 1; } response.data.items.sort(function (a, b) { var priceDiff = a._auction.buyNowPrice - b._auction.buyNowPrice; if (priceDiff != 0) { return priceDiff; } return a._auction.expires - b._auction.expires; }); if (response.data.items.length > 0) { writeToDebugLog( "----------------------------------------------------------------------------------------------------------------------" ); writeToDebugLog( "| rating | player name | bid | buy | time | action" ); writeToDebugLog( "----------------------------------------------------------------------------------------------------------------------" ); window.currentPage === 1 && sendPinEvents("Item - Detail View"); window.firstSearch = true; } else { window.isSearchInProgress = false; } for (let i = 0; i < response.data.items.length; i++) { let action_txt = "none"; let player = response.data.items[i]; let auction = player._auction; let player_rating = parseInt(player.rating); let expires = services.Localization.localizeAuctionTimeRemaining( auction.expires ); let buyNowPrice = auction.buyNowPrice; let currentBid = auction.currentBid || auction.startingBid; let isBid = auction.currentBid; let bidPrice = parseInt(jQuery(nameAbMaxBid).val()); let priceToBid = window.bidExact ? bidPrice : isBid ? window.getSellBidPrice(bidPrice) : bidPrice; let checkPrice = window.bidExact ? priceToBid : isBid ? window.getBuyBidPrice(currentBid) : currentBid; let userBuyNowPrice = parseInt(jQuery(nameAbBuyPrice).val()); var sellPrice = parseInt(jQuery(nameAbSellPrice).val()); let bid_buy_txt = "(bid: " + window.format_string(currentBid.toString(), 6) + " / buy:" + window.format_string(buyNowPrice.toString(), 7) + ")"; let player_name = window.getItemName(player); let expire_time = window.format_string(expires, 15); let bid_txt = window.format_string(currentBid.toString(), 6); let buy_txt = window.format_string(buyNowPrice.toString(), 6); let rating_ok = false; let rating_ok_txt = "no"; if ( player_rating >= selected_min_rate && player_rating <= selected_max_rate ) { rating_ok = true; rating_ok_txt = "ok"; } let rating_txt = "(" + player_rating + "-" + rating_ok_txt + ") "; // ============================================================================================================ // checking reasons to skip // ============================================================================================================ if (isNaN(userBuyNowPrice) && isNaN(priceToBid)) { action_txt = "skip >>> (No action required)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } if (!rating_ok) { action_txt = "skip >>> (rating does not fit criteria)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } if (maxPurchases < 1) { action_txt = "skip >>> (Exceeded num of buys/bids per search)"; let player_name = window.getItemName(player); writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } // ============================================================================================================ if (player.preferredPosition == 0 && window.addFilterGK == true) { action_txt = "skip >>> (is a Goalkeeper)"; let player_name = window.getItemName(player); writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } if ( rating_ok && window.autoBuyerActive && buyNowPrice <= userBuyNowPrice && buyNowPrice <= window.futStatistics.coinsNumber && !window.bids.includes(auction.tradeId) ) { action_txt = "attempt buy: " + buy_txt; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); buyPlayer(player, buyNowPrice, sellPrice, true); window.addDelayAfterBuy && window.waitSync(1); maxPurchases--; if (!window.bids.includes(auction.tradeId)) { window.bids.push(auction.tradeId); if (window.bids.length > 300) { window.bids.shift(); } } } else if ( rating_ok && window.autoBuyerActive && bidPrice && currentBid <= priceToBid && checkPrice <= window.futStatistics.coinsNumber && !window.bids.includes(auction.tradeId) ) { if (auction.expires > expiresIn) { action_txt = "skip >>> (Waiting for specified expiry time)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } action_txt = "attempt bid: " + bidPrice; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); buyPlayer(player, checkPrice, sellPrice); window.addDelayAfterBuy && window.waitSync(1); maxPurchases--; //setTimeout(function (){}, 1000); if (!window.bids.includes(auction.tradeId)) { window.bids.push(auction.tradeId); if (window.bids.length > 300) { window.bids.shift(); } } } else { if (buyNowPrice > userBuyNowPrice || currentBid > priceToBid) { action_txt = "skip >>> (higher than specified buy/bid price)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } if (buyNowPrice > window.futStatistics.coinsNumber) { action_txt = "skip >>> (Insufficient coins)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); continue; } action_txt = "skip >>> (Cached Item)"; writeToDebugLog( "| " + rating_txt + " | " + player_name + " | " + bid_txt + " | " + buy_txt + " | " + expire_time + " | " + action_txt ); } window.firstSearch = false; } if (response.data.items.length > 0) { writeToDebugLog( "----------------------------------------------------------------------------------------------------------------------" ); window.isSearchInProgress = false; } } else if (!response.success) { if ( response.status === UtasErrorCode.CAPTCHA_REQUIRED || (response.error && response.error.code == UtasErrorCode.CAPTCHA_REQUIRED) ) { if (window.autoSolveCaptcha) { writeToLog( "------------------------------------------------------------------------------------------" ); writeToLog("[!!!] Captcha got triggered, trying to solve it"); writeToLog( "------------------------------------------------------------------------------------------" ); window.solveCaptcha(); } else { window.showCaptchaLogs(); } } else { writeToLog( "------------------------------------------------------------------------------------------" ); writeToLog( "[!!!] Autostopping bot as search failed, please check if you can access transfer market in Web App" ); writeToLog( "------------------------------------------------------------------------------------------" ); } window.play_audio("capatcha"); window.deactivateAutoBuyer(true); window.isSearchInProgress = false; } }); }; window.showCaptchaLogs = function () { window.sendNotificationToUser( "Captcha, please solve the problem so that the bot can work again." ); if (window.captchaCloseTab) { window.location.href = "about:blank"; return; } writeToLog( "------------------------------------------------------------------------------------------" ); writeToLog("[!!!] Autostopping bot since Captcha got triggered"); writeToLog( "------------------------------------------------------------------------------------------" ); }; window.solveCaptcha = function () { var apikey = jQuery(nameAntiCaptchKey).val(); var websiteURL = "https://www.ea.com/fifa/ultimate-team/web-app/"; var websitePublicKey = "A4EECF77-AC87-8C8D-5754-BF882F72063B"; var proxyAddress = jQuery(nameProxyAddress).val(); var proxyPort = jQuery(nameProxyPort).val(); var proxyLogin = jQuery(nameProxyLogin).val(); var proxyPassword = jQuery(nameProxyPassword).val(); if (!proxyAddress || !proxyPort || !apikey) { writeToLog("Proxy info not filled properly"); window.showCaptchaLogs(); return; } function createTask() { accessobjects.Captcha.getCaptchaData().observe( this, function (sender, responseData) { if (responseData.success) { var data = responseData.response.blob; if (!data) { return false; } let payload = { clientKey: apikey, task: { type: "FunCaptchaTask", websiteURL: websiteURL, websitePublicKey: websitePublicKey, funcaptchaApiJSSubdomain: "ea-api.arkoselabs.com", data: responseData.response, proxyType: "http", proxyAddress: proxyAddress, proxyPort: proxyPort, proxyLogin: proxyLogin, proxyPassword: proxyPassword, userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", }, }; var xhr = new XMLHttpRequest(); xhr.open("POST", "https://api.anti-captcha.com/createTask", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var json = JSON.parse(xhr.responseText); if (json.errorId == 0) { getTaskResult(json.taskId); } else { writeToLog( "Got error from Captcha API: " + json.errorCode + ", " + json.errorDescription ); } } }; var data = JSON.stringify(payload); xhr.send(data); return true; } } ); } function getTaskResult(taskId) { let payload = { clientKey: apikey, taskId: taskId, }; var xhr = new XMLHttpRequest(); xhr.open("POST", "https://api.anti-captcha.com/getTaskResult", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var json = JSON.parse(xhr.responseText); if (json.errorId == 0) { //no errors if (json.status == "ready") { let captchaModel = new UTCaptchaViewModel(accessobjects.Captcha); captchaModel .validateToken(json.solution.token) .observe(this, function (sender, response) { if (response.success) { writeToLog("Captcha Solved"); window.activateAutoBuyer(true); } }); } else { setTimeout(() => getTaskResult(taskId), 1000); } } else { writeToLog( "Error occured when checking captcha result : " + json.errorCode + ", " + json.errorDescription ); } } }; var data = JSON.stringify(payload); xhr.send(data); } createTask(); }; window.fixRandomPrice = function (price) { let range = JSUtils.find(UTCurrencyInputControl.PRICE_TIERS, function (e) { return price >= e.min; }); var nearestPrice = Math.round(price / range.inc) * range.inc; return Math.max(Math.min(nearestPrice, 14999000), 0); }; window.watchBidItems = function () { services.Item.clearTransferMarketCache(); services.Item.requestWatchedItems().observe(this, function (t, response) { var bidPrice = parseInt(jQuery(nameAbMaxBid).val()); var sellPrice = parseInt(jQuery(nameAbSellPrice).val()); let activeItems = response.data.items.filter(function (item) { return item._auction && item._auction._tradeState === "active"; }); services.Item.refreshAuctions(activeItems).observe( this, function (t, refreshResponse) { services.Item.requestWatchedItems().observe( this, function (t, watchResponse) { if (window.autoBuyerActive && bidPrice) { let outBidItems = watchResponse.data.items.filter(function ( item ) { return ( item._auction._bidState === "outbid" && item._auction._tradeState === "active" ); }); for (var i = 0; i < outBidItems.length; i++) { let player = outBidItems[i]; let auction = player._auction; let isBid = auction.currentBid; let currentBid = auction.currentBid || auction.startingBid; let priceToBid = window.bidExact ? bidPrice : isBid ? window.getSellBidPrice(bidPrice) : bidPrice; let checkPrice = window.bidExact ? bidPrice : isBid ? window.getBuyBidPrice(currentBid) : currentBid; if ( window.autoBuyerActive && currentBid <= priceToBid && checkPrice <= window.futStatistics.coinsNumber ) { writeToDebugLog( "Bidding on outbidded item -> Bidding Price :" + checkPrice ); buyPlayer(player, checkPrice, sellPrice); window.addDelayAfterBuy && window.waitSync(1); if (!window.bids.includes(auction.tradeId)) { window.bids.push(auction.tradeId); if (window.bids.length > 300) { window.bids.shift(); } } } } } if (window.autoBuyerActive && sellPrice && !isNaN(sellPrice)) { let boughtItems = response.data.items.filter(function (item) { return ( item.getAuctionData().isWon() && !window.userWatchItems.includes(item._auction.tradeId) && !window.sellBids.includes(item._auction.tradeId) ); }); for (var i = 0; i < boughtItems.length; i++) { let player = boughtItems[i]; let auction = player._auction; window.sellBids.push(auction.tradeId); let player_name = window.getItemName(player); writeToLog( " ($$$) " + player_name + "[" + player._auction.tradeId + "] -- Selling for: " + sellPrice ); player.clearAuction(); window.sellRequestTimeout = window.setTimeout(function () { services.Item.list( player, window.getSellBidPrice(sellPrice), sellPrice, 3600 ); }, window.getRandomWait()); } services.Item.clearTransferMarketCache(); } } ); } ); }); }; window.buyPlayer = function (player, price, sellPrice, isBin) { services.Item.bid(player, price).observe(this, function (sender, data) { let price_txt = window.format_string(price.toString(), 6); let player_name = window.getItemName(player); if (data.success) { if (isBin) { window.purchasedCardCount++; window.play_audio("card_won"); } if (isBin && sellPrice !== 0 && !isNaN(sellPrice)) { window.winCount++; let sym = " W:" + window.format_string(window.winCount.toString(), 4); writeToLog( sym + " | " + player_name + " | " + price_txt + (isBin ? " | buy | success | selling for: " + sellPrice : " | bid | success |" + " selling for: " + sellPrice) ); window.sellRequestTimeout = window.setTimeout(function () { services.Item.list( player, window.getSellBidPrice(sellPrice), sellPrice, 3600 ); }, window.getRandomWait()); } else { window.bidCount++; services.Item.move(player, ItemPile.CLUB).observe( this, function (sender, moveResponse) { let sym = " B:" + window.format_string(window.bidCount.toString(), 4); writeToLog( sym + " | " + player_name + " | " + price_txt + (isBin ? " | buy | success | move to club" : " | bid | success | waiting to expire") ); } ); } if ( jQuery(nameNotificationType).val() == "B" || jQuery(nameNotificationType).val() == "A" ) { window.sendNotificationToUser( "| " + player_name.trim() + " | " + price_txt.trim() + " | buy |" ); } } else { window.lossCount++; let sym = " L:" + window.format_string(window.lossCount.toString(), 4); writeToLog( sym + " | " + player_name + " | " + price_txt + (isBin ? " | buy | failure |" : " | bid | failure |") + " ERR: " + data.status + "-" + (errorCodeLookUpShort[data.status] || "") ); if ( jQuery(nameNotificationType).val() == "L" || jQuery(nameNotificationType).val() == "A" ) { window.sendNotificationToUser( "| " + player_name.trim() + " | " + price_txt.trim() + " | failure |" ); } if (jQuery(nameAbStopErrorCode).val()) { var errorCodes = jQuery(nameAbStopErrorCode).val().split(","); if (errorCodes.indexOf(data.status + "") != -1) { writeToLog( "------------------------------------------------------------------------------------------" ); writeToLog( `[!!!] Autostopping bot since error code ${data.status} has occured` ); writeToLog( "------------------------------------------------------------------------------------------" ); window.deactivateAutoBuyer(true); } } } window.isSearchInProgress = false; }); }; window.getSellBidPrice = function (bin) { if (bin <= 1000) { return bin - 50; } if (bin > 1000 && bin <= 10000) { return bin - 100; } if (bin > 10000 && bin <= 50000) { return bin - 250; } if (bin > 50000 && bin <= 100000) { return bin - 500; } return bin - 1000; }; window.getBuyBidPrice = function (bin) { if (bin < 1000) { return bin + 50; } if (bin >= 1000 && bin < 10000) { return bin + 100; } if (bin >= 10000 && bin < 50000) { return bin + 250; } if (bin >= 50000 && bin < 100000) { return bin + 500; } return bin + 1000; }; window.updateTransferList = function () { sendPinEvents("Transfer List - List View"); services.Item.requestTransferItems().observe(this, function (t, response) { let sendEvent = true; let soldItems = response.data.items.filter(function (item) { return item.getAuctionData().isSold(); }); window.futStatistics.soldItems = soldItems.length; if (sendEvent && window.futStatistics.soldItems) { sendPinEvents("Item - Detail View"); sendEvent = false; } window.futStatistics.unsoldItems = response.data.items.filter(function ( item ) { return ( !item.getAuctionData().isSold() && item.getAuctionData().isExpired() ); }).length; if (sendEvent && window.futStatistics.unsoldItems) { sendPinEvents("Item - Detail View"); sendEvent = false; } if (window.futStatistics.unsoldItems && window.reListEnabled) { services.Item.relistExpiredAuctions().observe( this, function (t, response) {} ); } window.futStatistics.activeTransfers = response.data.items.filter( function (item) { return item.getAuctionData().isSelling(); } ).length; if (sendEvent && window.futStatistics.activeTransfers) { sendPinEvents("Item - Detail View"); sendEvent = false; } window.futStatistics.availableItems = response.data.items.filter( function (item) { return item.getAuctionData().isInactive(); } ).length; if (sendEvent && window.futStatistics.availableItems) { sendPinEvents("Item - Detail View"); sendEvent = false; } var minSoldCount = 10; if ($(nameAbMinDeleteCount).val() !== "") { minSoldCount = Math.max(1, parseInt($(nameAbMinDeleteCount).val())); } if (window.futStatistics.soldItems >= minSoldCount) { writeToLog( "------------------------------------------------------------------------------------------" ); writeToLog( "[TRANSFER-LIST] > " + window.futStatistics.soldItems + " item(s) sold" ); writeToLog( "------------------------------------------------------------------------------------------" ); window.clearSoldItems(); } sendPinEvents("Hub - Transfers"); }); }; window.waitSync = function (seconds = 1) { var isDone = false; var start = new Date().getTime(); var msToWait = seconds * 1000; do { var now = new Date().getTime(); var delta = now - start; if (delta >= msToWait) { isDone = true; } } while (!isDone); return; }; window.waitAsync = async function (seconds = 1) { await new Promise((resolve) => setTimeout(resolve, seconds * 1000)); }; window.clearSoldItems = function () { services.Item.clearSoldItems().observe(this, function (t, response) {}); }; window.initializeDiscordClient = function (cb) { const client = new Discord.Client(); let discordToken = jQuery(nameDiscordToken).val(); if (!discordToken) return null; client.login(discordToken); client.on("ready", function () { if (cb) { cb(); } }); client.on("message", function (message) { if (message.author.id == client.user.id) return; if (/start/i.test(message.content)) { window.activateAutoBuyer(true); message.channel.sendMessage("Bot started successfully"); } else if (/stop/i.test(message.content)) { window.deactivateAutoBuyer(true); message.channel.sendMessage("Bot stopped successfully"); } }); return client; }; })();