// ==UserScript== // @name Vitriol // @namespace http://tampermonkey.net/ // @version 1.0 // @description First standalone version of Vitriol // @author ********** // @include https://*.the-west.*/game.php* // @icon https://www.deviantart.com/ahnorac/art/Vitriol-998868964 // @grant none // @downloadURL none // ==/UserScript== (function () { function ItemPrototype(item_id) { this.item_id = item_id; this.price = 0; this.instaBuy = false; } ItemPrototype.prototype = { setPrice: function (price) { this.price = price; }, setInstaBuy: function (instaBuy) { this.instaBuy = instaBuy; } } function SearchPrototype(searchKey) { this.searchKey = searchKey; this.selectedItems = []; } SearchPrototype.prototype = { addItem: function (item) { this.selectedItems.push(item); }, addItemByCreating: function (item) { var proto = new ItemPrototype(item.item_id); proto.setPrice(item.sell_price); proto.setInstaBuy(false); this.addItem(proto); }, removeItem: function (item_id) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { this.selectedItems.splice(i, 1); return; } } }, isAdded: function (item_id) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { return true; } } return false; }, getMoney: function (item_id) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { return this.selectedItems[i].price; } } return 9999999; }, getInstaBuy: function (item_id) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { return this.selectedItems[i].instaBuy; } } return -1; }, setInstaBuy: function (item_id, value) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { this.selectedItems[i].instaBuy = value; } } }, setPrice: function (item_id, value) { for (var i = 0; i < this.selectedItems.length; i++) { if (this.selectedItems[i].item_id == item_id) { this.selectedItems[i].price = value; } } } } Vitriol = { window: null, keywordFilter: "", itemNameFilter: "", searchTablePosition: { content: "0px", scrollbar: "0px" }, selectedItemsTablePosition: { content: "0px", scrollbar: "0px" }, legenda: true, selectedKeyword: -1, itemListLoaded: false, itemList: [], itemNames: [], searchKeys: [], selectedItems: [], selectedItemsInputFieldCount: 0, settings: { searchDelay: 60 }, isRunning: false, userMessages: [], lastMessage: 0, messageDelay: 2000, statistics: { boughtItems : 0 } } Vitriol.log = function (message) { date = new Date(); timeFormat = "[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Vitriol: "; console.log(timeFormat + message); } Vitriol.logError = function (message) { document.querySelector("#errorMessage").innerHTML = message; date = new Date(); timeFormat = "[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Vitriol: "; console.log("%c" + timeFormat + message, 'background: #f00; color: #ffff00'); } Vitriol.searchMarketPage = async function (search_key, page) { var reqObj = { pattern: search_key, nav: 'first', page: page, sort: 'bid', order: 'asc', type: '', level_range_min: 0, level_range_max: 250, usable: true, has_effect: false, visibility: 2 }; var found = 0; var resultItems = []; await Ajax.remoteCall('building_market', 'search', reqObj, function (json) { if (json.error) console.log("Error!"); if (json.msg.search_result.length == 0) { console.log("Nothing found") } for (var i = 0; i < json.msg.search_result.length; i++) { resultItems.push(json.msg.search_result[i]); } found = json.msg.search_result.length; }, MarketWindow); if (found == 31) { var other = await Vitriol.searchMarketPage(search_key, page+1); for (var i = 0; i < other.length; i++) { resultItems.push(other[i]); } } return resultItems; } Vitriol.marketSearch = async function (search_key) { var result = await Vitriol.searchMarketPage(search_key, 1); return result; } Vitriol.getAllItems = function () { var items = []; var itemManagerItems = ItemManager.getAll(); for (var k in itemManagerItems) { items.push(itemManagerItems[k]); } if(items.length > 0) { Vitriol.itemListLoaded = true; } return items; } Vitriol.getAllItemNames = function () { if (Vitriol.itemList.length == 0) Vitriol.log("Sh1te, no items!"); else { for (var i = 0; i < Vitriol.itemList.length; i++) { Vitriol.itemNames.push(Vitriol.itemList[i].name); } } } Vitriol.itemSearch = function (keyword) { if(Vitriol.itemListLoaded == false) { Vitriol.itemList = Vitriol.getAllItems(); Vitriol.getAllItemNames(); } var lcKeyword = keyword.toLowerCase(); var result = []; for (var i = 0; i < Vitriol.itemNames.length; i++) { var itemName = Vitriol.itemNames[i].toLowerCase(); var item = Vitriol.itemList[i]; if (itemName.includes(lcKeyword) && item.auctionable) result.push(Vitriol.itemList[i]); } return result; } Vitriol.addSearchKeyword = function (keyword) { var min_length = 2; if (keyword.length < min_length) { Vitriol.logError("Keyword is too short") return false; } for(var key = 0; key < Vitriol.searchKeys.length; key++) { if (Vitriol.searchKeys[key].searchKey.toLowerCase() === keyword.toLowerCase()) { Vitriol.logError("Keyword is already used") return false; } } var addable = new SearchPrototype(keyword); Vitriol.searchKeys.push(addable); return true; } Vitriol.removeSearchKeyword = function (keyword) { for(var i = 0; i < Vitriol.searchKeys.length; i++) { if(keyword == Vitriol.searchKeys[i].searchKey) { Vitriol.searchKeys.splice(i,1); } } Vitriol.selectTab('searchtab'); } Vitriol.isSearchKeywordAdded = function (keyword) { for (var i = 0; i < Vitriol.searchKeys.length; i++) { if (Vitriol.searchKeys[i].searchKey.toLowerCase() === keyword.toLowerCase()) return i; } return -1; } Vitriol.addItemToSearchKeyword = function (keyword, item_id, price, instaBuy) { var index = Vitriol.isSearchKeywordAdded(keyword); if (index == -1) { Vitriol.logError("Keyword is not added yet."); return; } var items = Vitriol.itemSearch(keyword); for (var i = 0; i < items.length; i++) { if (items[i].item_id == item_id) { var proto = new ItemPrototype(item_id); proto.setPrice(price); proto.setInstaBuy(instaBuy); Vitriol.searchKeys[index].addItem(proto); return; } } Vitriol.logError("Item ID not found in list.") } Vitriol.buyItem = function (item) { Ajax.remoteCall('building_market', 'bid', { bidtype: 0, bid: item.max_price, market_offer_id: item.market_offer_id }, function (resp) { if (resp.error) return new UserMessage(resp.msg).show(); else { if (resp.msg.instantBuy) { new UserMessage((Character.charSex == 'female') ? "Ezt a trgyat rversen szerezted." : "Ezt a trgyat rversen szerezted.", UserMessage.TYPE_SUCCESS).show(); } else { new UserMessage((Character.charSex == 'female') ? "Elkldted az rajnlatodat." : "Elkldted az rajnlatodat.", UserMessage.TYPE_SUCCESS).show(); } Character.setMoney(resp.msg.money); Character.setDeposit(resp.msg.deposit); } }, MarketWindow); AudioController.play('mpi_game_ready_2'); Vitriol.statistics.boughtItems++; Vitriol.setCookies(); } Vitriol.warnUserForItem = function (item) { var baseId = item.item_id / 1000; Vitriol.log("Found: " + ItemManager.getAll()[baseId].name + " from " + item.seller_name + " for " + item.max_price + "(x" + item.item_count + ")"); Vitriol.addUserMessage("Found: " + ItemManager.getAll()[baseId].name); } Vitriol.instaBuyItem = function (item) { var baseId = item.item_id / 1000; Vitriol.log("Instabuy: " + ItemManager.getAll()[baseId].name + " from " + item.seller_name + " for " + item.max_price + "(x" + item.item_count + ")"); Vitriol.addUserMessage("Bought: " + ItemManager.getAll()[baseId].name); Vitriol.buyItem(item); } Vitriol.fullCheckMarket = async function () { for (var i = 0; i < Vitriol.searchKeys.length; i++) { var marketItems = await Vitriol.marketSearch(Vitriol.searchKeys[i].searchKey); for (var j = 0; j < marketItems.length; j++) { if (Vitriol.searchKeys[i].isAdded(marketItems[j].item_id)) { var goodPrice = Vitriol.searchKeys[i].getMoney(marketItems[j].item_id); if (marketItems[j].max_price != null && (marketItems[j].max_price/marketItems[j].item_count) <= goodPrice) { var instaBuy = Vitriol.searchKeys[i].getInstaBuy(marketItems[j].item_id); var baseId = marketItems[j].item_id / 1000; if (instaBuy == -1) Vitriol.logError("Instabuy not found??"); else if (instaBuy) Vitriol.instaBuyItem(marketItems[j]); else Vitriol.warnUserForItem(marketItems[j]); } } } } } Vitriol.setCookies = function () { var expiracyDatePermanent = new Date(); expiracyDatePermanent.setDate(expiracyDatePermanent.getDate() + 360000); var permanentObject = { settings: Vitriol.settings, statistics: Vitriol.statistics, searchKeys: Vitriol.searchKeys }; var jsonPermanent = JSON.stringify(permanentObject); document.cookie = "Vitriolpermanent=" + jsonPermanent + ";expires=" + expiracyDatePermanent.toGMTString() + ";"; }; Vitriol.getCookies = function () { var cookie = document.cookie.split("="); for (var i = 0; i < cookie.length; i++) { if (cookie[i].includes("Vitriolpermanent")) { var obj = cookie[i + 1].split(";"); var permanentObject = JSON.parse(obj[0]); Vitriol.settings = permanentObject.settings; Vitriol.statistics = permanentObject.statistics; if (permanentObject.searchKeys) { for (var i = 0; i < permanentObject.searchKeys.length; i++) { var searchKey = permanentObject.searchKeys[i].searchKey; Vitriol.addSearchKeyword(searchKey); for (var j = 0; j < permanentObject.searchKeys[i].selectedItems.length; j++) { var item = permanentObject.searchKeys[i].selectedItems[j]; var item_id = item.item_id; var price = item.price; var instaBuy = item.instaBuy; Vitriol.addItemToSearchKeyword(searchKey, item_id, price, instaBuy); } } } } } }; // =================== UI =================== Vitriol.createWindow = function () { var window = wman.open("Vitriol").setResizeable(false).setMinSize(650, 480).setSize(650, 480).setMiniTitle("Vitriol"); var content = $('
Vitriol is running.
"); else htmlSkel.append("Vitriol is not running.
"); htmlSkel.append("