Vitriol

Automatic market-watcher script that can watch items and warn if it's available (or instantly buy them) if the price is below a set maximum value.

  1. // ==UserScript==
  2. // @name Vitriol
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description Automatic market-watcher script that can watch items and warn if it's available (or instantly buy them) if the price is below a set maximum value.
  6. // @author **********
  7. // @include https://*.the-west.*/game.php*
  8. // @icon https://www.deviantart.com/ahnorac/art/Vitriol-998868964
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function () {
  13.  
  14. function ItemPrototype(item_id) {
  15. this.item_id = item_id;
  16. this.price = 0;
  17. this.instaBuy = false;
  18. }
  19. ItemPrototype.prototype = {
  20. setPrice: function (price) {
  21. this.price = price;
  22. },
  23.  
  24. setInstaBuy: function (instaBuy) {
  25. this.instaBuy = instaBuy;
  26. }
  27. }
  28.  
  29.  
  30. function SearchPrototype(searchKey) {
  31. this.searchKey = searchKey;
  32. this.selectedItems = [];
  33. }
  34. SearchPrototype.prototype = {
  35. addItem: function (item) {
  36. this.selectedItems.push(item);
  37. },
  38.  
  39. addItemByCreating: function (item) {
  40. var proto = new ItemPrototype(item.item_id);
  41. proto.setPrice(item.sell_price);
  42. proto.setInstaBuy(false);
  43. this.addItem(proto);
  44. },
  45.  
  46. removeItem: function (item_id) {
  47. for (var i = 0; i < this.selectedItems.length; i++) {
  48. if (this.selectedItems[i].item_id == item_id) {
  49. this.selectedItems.splice(i, 1);
  50. return;
  51. }
  52. }
  53. },
  54.  
  55. isAdded: function (item_id) {
  56. for (var i = 0; i < this.selectedItems.length; i++) {
  57. if (this.selectedItems[i].item_id == item_id) {
  58. return true;
  59. }
  60. }
  61. return false;
  62. },
  63. getMoney: function (item_id) {
  64. for (var i = 0; i < this.selectedItems.length; i++) {
  65. if (this.selectedItems[i].item_id == item_id) {
  66. return this.selectedItems[i].price;
  67. }
  68. }
  69. return 9999999;
  70. },
  71.  
  72. getInstaBuy: function (item_id) {
  73. for (var i = 0; i < this.selectedItems.length; i++) {
  74. if (this.selectedItems[i].item_id == item_id) {
  75. return this.selectedItems[i].instaBuy;
  76. }
  77. }
  78. return -1;
  79. },
  80.  
  81. setInstaBuy: function (item_id, value) {
  82. for (var i = 0; i < this.selectedItems.length; i++) {
  83. if (this.selectedItems[i].item_id == item_id) {
  84. this.selectedItems[i].instaBuy = value;
  85. }
  86. }
  87. },
  88.  
  89. setPrice: function (item_id, value) {
  90. for (var i = 0; i < this.selectedItems.length; i++) {
  91. if (this.selectedItems[i].item_id == item_id) {
  92. this.selectedItems[i].price = value;
  93. }
  94. }
  95. }
  96.  
  97. }
  98.  
  99. Vitriol = {
  100. window: null,
  101. keywordFilter: "",
  102. itemNameFilter: "",
  103. searchTablePosition: { content: "0px", scrollbar: "0px" },
  104. selectedItemsTablePosition: { content: "0px", scrollbar: "0px" },
  105. legenda: true,
  106. selectedKeyword: -1,
  107. itemListLoaded: false,
  108. itemList: [],
  109. itemNames: [],
  110. searchKeys: [],
  111. selectedItems: [],
  112. selectedItemsInputFieldCount: 0,
  113. settings: {
  114. searchDelay: 60
  115. },
  116. isRunning: false,
  117. userMessages: [],
  118. lastMessage: 0,
  119. messageDelay: 2000,
  120. statistics: {
  121. boughtItems : 0
  122. }
  123. }
  124.  
  125. Vitriol.log = function (message) {
  126. date = new Date();
  127. timeFormat = "[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Vitriol: ";
  128. console.log(timeFormat + message);
  129. }
  130.  
  131. Vitriol.logError = function (message) {
  132. document.querySelector("#errorMessage").innerHTML = message;
  133. date = new Date();
  134. timeFormat = "[" + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "] Vitriol: ";
  135. console.log("%c" + timeFormat + message, 'background: #f00; color: #ffff00');
  136. }
  137.  
  138. Vitriol.searchMarketPage = async function (search_key, page) {
  139. var reqObj = {
  140. pattern: search_key,
  141. nav: 'first',
  142. page: page,
  143. sort: 'bid',
  144. order: 'asc',
  145. type: '',
  146. level_range_min: 0,
  147. level_range_max: 250,
  148. usable: true,
  149. has_effect: false,
  150. visibility: 2
  151. };
  152.  
  153. var found = 0;
  154. var resultItems = [];
  155. await Ajax.remoteCall('building_market', 'search', reqObj, function (json) {
  156. if (json.error)
  157. console.log("Error!");
  158. if (json.msg.search_result.length == 0) {
  159. console.log("Nothing found")
  160.  
  161. }
  162. for (var i = 0; i < json.msg.search_result.length; i++) {
  163. resultItems.push(json.msg.search_result[i]);
  164. }
  165. found = json.msg.search_result.length;
  166. }, MarketWindow);
  167.  
  168. if (found == 31) {
  169. var other = await Vitriol.searchMarketPage(search_key, page+1);
  170. for (var i = 0; i < other.length; i++) {
  171. resultItems.push(other[i]);
  172. }
  173. }
  174.  
  175. return resultItems;
  176. }
  177.  
  178. Vitriol.marketSearch = async function (search_key) {
  179. var result = await Vitriol.searchMarketPage(search_key, 1);
  180. return result;
  181. }
  182.  
  183.  
  184.  
  185. Vitriol.getAllItems = function () {
  186. var items = [];
  187. var itemManagerItems = ItemManager.getAll();
  188. for (var k in itemManagerItems) {
  189. items.push(itemManagerItems[k]);
  190. }
  191. if(items.length > 0)
  192. {
  193. Vitriol.itemListLoaded = true;
  194. }
  195. return items;
  196. }
  197.  
  198. Vitriol.getAllItemNames = function () {
  199. if (Vitriol.itemList.length == 0)
  200. Vitriol.log("Sh1te, no items!");
  201. else {
  202. for (var i = 0; i < Vitriol.itemList.length; i++) {
  203. Vitriol.itemNames.push(Vitriol.itemList[i].name);
  204. }
  205. }
  206. }
  207.  
  208.  
  209. Vitriol.itemSearch = function (keyword) {
  210.  
  211. if(Vitriol.itemListLoaded == false)
  212. {
  213. Vitriol.itemList = Vitriol.getAllItems();
  214. Vitriol.getAllItemNames();
  215. }
  216.  
  217. var lcKeyword = keyword.toLowerCase();
  218.  
  219. var result = [];
  220.  
  221. for (var i = 0; i < Vitriol.itemNames.length; i++) {
  222. var itemName = Vitriol.itemNames[i].toLowerCase();
  223. var item = Vitriol.itemList[i];
  224.  
  225. if (itemName.includes(lcKeyword) && item.auctionable)
  226. result.push(Vitriol.itemList[i]);
  227. }
  228. return result;
  229. }
  230.  
  231. Vitriol.addSearchKeyword = function (keyword) {
  232. var min_length = 2;
  233. if (keyword.length < min_length) {
  234. Vitriol.logError("Keyword is too short")
  235. return false;
  236. }
  237. for(var key = 0; key < Vitriol.searchKeys.length; key++)
  238. {
  239. if (Vitriol.searchKeys[key].searchKey.toLowerCase() === keyword.toLowerCase()) {
  240. Vitriol.logError("Keyword is already used")
  241. return false;
  242. }
  243. }
  244.  
  245. var addable = new SearchPrototype(keyword);
  246. Vitriol.searchKeys.push(addable);
  247. return true;
  248. }
  249.  
  250. Vitriol.removeSearchKeyword = function (keyword) {
  251. for(var i = 0; i < Vitriol.searchKeys.length; i++)
  252. {
  253. if(keyword == Vitriol.searchKeys[i].searchKey)
  254. {
  255. Vitriol.searchKeys.splice(i,1);
  256. }
  257. }
  258. Vitriol.selectTab('searchtab');
  259. }
  260.  
  261. Vitriol.isSearchKeywordAdded = function (keyword) {
  262. for (var i = 0; i < Vitriol.searchKeys.length; i++) {
  263. if (Vitriol.searchKeys[i].searchKey.toLowerCase() === keyword.toLowerCase())
  264. return i;
  265. }
  266. return -1;
  267. }
  268.  
  269. Vitriol.addItemToSearchKeyword = function (keyword, item_id, price, instaBuy) {
  270. var index = Vitriol.isSearchKeywordAdded(keyword);
  271. if (index == -1) {
  272. Vitriol.logError("Keyword is not added yet.");
  273. return;
  274. }
  275. var items = Vitriol.itemSearch(keyword);
  276.  
  277. for (var i = 0; i < items.length; i++) {
  278. if (items[i].item_id == item_id) {
  279. var proto = new ItemPrototype(item_id);
  280. proto.setPrice(price);
  281. proto.setInstaBuy(instaBuy);
  282. Vitriol.searchKeys[index].addItem(proto);
  283. return;
  284. }
  285. }
  286. Vitriol.logError("Item ID not found in list.")
  287. }
  288.  
  289.  
  290. Vitriol.buyItem = function (item) {
  291. Ajax.remoteCall('building_market', 'bid', {
  292. bidtype: 0,
  293. bid: item.max_price,
  294. market_offer_id: item.market_offer_id
  295. }, function (resp) {
  296. if (resp.error)
  297. return new UserMessage(resp.msg).show();
  298. else {
  299. if (resp.msg.instantBuy) {
  300. new UserMessage((Character.charSex == 'female') ? "Ezt a trgyat rversen szerezted." : "Ezt a trgyat rversen szerezted.", UserMessage.TYPE_SUCCESS).show();
  301. } else {
  302. new UserMessage((Character.charSex == 'female') ? "Elkldted az rajnlatodat." : "Elkldted az rajnlatodat.", UserMessage.TYPE_SUCCESS).show();
  303. }
  304. Character.setMoney(resp.msg.money);
  305. Character.setDeposit(resp.msg.deposit);
  306. }
  307. }, MarketWindow);
  308. AudioController.play('mpi_game_ready_2');
  309. Vitriol.statistics.boughtItems++;
  310. Vitriol.setCookies();
  311. }
  312.  
  313. Vitriol.warnUserForItem = function (item) {
  314. var baseId = item.item_id / 1000;
  315. Vitriol.log("Found: " + ItemManager.getAll()[baseId].name + " from " + item.seller_name + " for " + item.max_price + "(x" + item.item_count + ")");
  316. Vitriol.addUserMessage("Found: " + ItemManager.getAll()[baseId].name);
  317.  
  318. }
  319.  
  320. Vitriol.instaBuyItem = function (item) {
  321. var baseId = item.item_id / 1000;
  322. Vitriol.log("Instabuy: " + ItemManager.getAll()[baseId].name + " from " + item.seller_name + " for " + item.max_price + "(x" + item.item_count + ")");
  323. Vitriol.addUserMessage("Bought: " + ItemManager.getAll()[baseId].name);
  324. Vitriol.buyItem(item);
  325. }
  326.  
  327. Vitriol.fullCheckMarket = async function () {
  328. for (var i = 0; i < Vitriol.searchKeys.length; i++) {
  329. var marketItems = await Vitriol.marketSearch(Vitriol.searchKeys[i].searchKey);
  330. for (var j = 0; j < marketItems.length; j++) {
  331. if (Vitriol.searchKeys[i].isAdded(marketItems[j].item_id))
  332. {
  333. var goodPrice = Vitriol.searchKeys[i].getMoney(marketItems[j].item_id);
  334. if (marketItems[j].max_price != null && (marketItems[j].max_price/marketItems[j].item_count) <= goodPrice) {
  335. var instaBuy = Vitriol.searchKeys[i].getInstaBuy(marketItems[j].item_id);
  336.  
  337. var baseId = marketItems[j].item_id / 1000;
  338.  
  339. if (instaBuy == -1)
  340. Vitriol.logError("Instabuy not found??");
  341. else if (instaBuy)
  342. Vitriol.instaBuyItem(marketItems[j]);
  343. else
  344. Vitriol.warnUserForItem(marketItems[j]);
  345. }
  346. }
  347. }
  348. }
  349. }
  350.  
  351. Vitriol.setCookies = function () {
  352. var expiracyDatePermanent = new Date();
  353. expiracyDatePermanent.setDate(expiracyDatePermanent.getDate() + 360000);
  354. var permanentObject = {
  355. settings: Vitriol.settings,
  356. statistics: Vitriol.statistics,
  357. searchKeys: Vitriol.searchKeys
  358.  
  359. };
  360. var jsonPermanent = JSON.stringify(permanentObject);
  361. document.cookie = "Vitriolpermanent=" + jsonPermanent + ";expires=" + expiracyDatePermanent.toGMTString() + ";";
  362. };
  363. Vitriol.getCookies = function () {
  364. var cookie = document.cookie.split("=");
  365. for (var i = 0; i < cookie.length; i++) {
  366. if (cookie[i].includes("Vitriolpermanent")) {
  367. var obj = cookie[i + 1].split(";");
  368. var permanentObject = JSON.parse(obj[0]);
  369. Vitriol.settings = permanentObject.settings;
  370. Vitriol.statistics = permanentObject.statistics;
  371. if (permanentObject.searchKeys) {
  372. for (var i = 0; i < permanentObject.searchKeys.length; i++) {
  373. var searchKey = permanentObject.searchKeys[i].searchKey;
  374. Vitriol.addSearchKeyword(searchKey);
  375. for (var j = 0; j < permanentObject.searchKeys[i].selectedItems.length; j++) {
  376. var item = permanentObject.searchKeys[i].selectedItems[j];
  377. var item_id = item.item_id;
  378. var price = item.price;
  379. var instaBuy = item.instaBuy;
  380. Vitriol.addItemToSearchKeyword(searchKey, item_id, price, instaBuy);
  381. }
  382. }
  383. }
  384.  
  385. }
  386. }
  387. };
  388.  
  389.  
  390. // =================== UI ===================
  391.  
  392. Vitriol.createWindow = function () {
  393. var window = wman.open("Vitriol").setResizeable(false).setMinSize(650, 480).setSize(650, 480).setMiniTitle("Vitriol");
  394. var content = $('<div class=\'Vitriolwindow\'/>');
  395. var tabs = {
  396. "searchtab": "Search",
  397. "itemstab": "Selected Items",
  398. "settings": "Settings"
  399. };
  400.  
  401. for (var tab in tabs) {
  402. window.addTab(tabs[tab], tab, Vitriol.tabLogic);
  403. }
  404. Vitriol.window = window;
  405. Vitriol.selectTab("searchtab");
  406. };
  407.  
  408. Vitriol.tabLogic = function (win, id) {
  409. var content = $('<div class=\'Vitriolwindow\'/>');
  410. switch (id) {
  411. case "searchtab":
  412. Vitriol.removeActiveTab(this);
  413. Vitriol.removeWindowContent();
  414. Vitriol.addActiveTab("searchtab", this);
  415. content.append(Vitriol.createSearchTab());
  416. Vitriol.window.appendToContentPane(content);
  417. Vitriol.addSearchTableCss();
  418. $(".Vitriolwindow .tw2gui_scrollpane_clipper_contentpane").css({ "top": Vitriol.searchTablePosition.content });
  419. $(".Vitriolwindow .tw2gui_scrollbar_pulley").css({ "top": Vitriol.searchTablePosition.scrollbar });
  420. break;
  421. case "itemstab":
  422. Vitriol.removeActiveTab(this);
  423. Vitriol.removeWindowContent();
  424. Vitriol.addActiveTab("itemstab", this);
  425. content.append(Vitriol.createSelectedItemsTab());
  426. Vitriol.window.appendToContentPane(content);
  427. $(".Kittymaticwindow .tw2gui_scrollpane_clipper_contentpane").css({ "top": Vitriol.selectedItemsTablePosition.content });
  428. $(".Kittymaticwindow .tw2gui_scrollbar_pulley").css({ "top": Vitriol.selectedItemsTablePosition.scrollbar });
  429. Vitriol.addSelectedItemsTableCss();
  430. Vitriol.addListenersToInputFields(Vitriol.selectedItemsInputFieldCount);
  431. Vitriol.addListenerToItemNameFilter();
  432. break;
  433. case "settings":
  434. Vitriol.removeActiveTab(this);
  435. Vitriol.removeWindowContent();
  436. Vitriol.addActiveTab("settings", this);
  437. content.append(Vitriol.createSettingsGui());
  438. Vitriol.window.appendToContentPane(content);
  439. break;
  440. }
  441. }
  442.  
  443. Vitriol.selectTab = function (key) {
  444. Vitriol.window.tabIds[key].f(Vitriol.window, key);
  445. };
  446.  
  447. Vitriol.removeActiveTab = function (window) {
  448. $('div.tw2gui_window_tab', window.divMain).removeClass('tw2gui_window_tab_active');
  449. };
  450.  
  451. Vitriol.removeWindowContent = function () {
  452. $(".Vitriolwindow").remove();
  453. };
  454.  
  455. Vitriol.addActiveTab = function (key, window) {
  456. $('div._tab_id_' + key, window.divMain).addClass('tw2gui_window_tab_active');
  457. };
  458.  
  459. Vitriol.createRemoveKeywordButton = function (keyword) {
  460. var buttonAdd = new west.gui.Button("Remove", function () {
  461. Vitriol.removeSearchKeyword(keyword);
  462. Vitriol.searchTablePosition.content = $(".Vitriolwindow .tw2gui_scrollpane_clipper_contentpane").css("top");
  463. Vitriol.searchTablePosition.scrollbar = $(".Vitriolwindow .tw2gui_scrollbar_pulley").css("top");
  464. });
  465. buttonAdd.setWidth(100);
  466. return buttonAdd.getMainDiv();
  467. };
  468.  
  469. Vitriol.filterSearchKeys = function (filter) {
  470. if (filter.length == 0)
  471. return Vitriol.searchKeys;
  472.  
  473. var keys = [];
  474.  
  475. for (var i = 0; i < Vitriol.searchKeys.length; i++) {
  476. if (Vitriol.searchKeys[i].searchKey.toLowerCase().includes(filter.toLowerCase()))
  477. keys.push(Vitriol.searchKeys[i]);
  478. }
  479.  
  480. return keys;
  481. }
  482.  
  483. Vitriol.createSearchTab = function () {
  484. var htmlSkel = $("<div id = \'search_overview'\></div>");
  485. var html = $("<div class = \'keywords_search'\ style=\'position:relative;'\><div id=\'keywordFilter'\style=\'position:absolute;top:10px;left:15px'\></div><div id=\'errorMessageContainer'\><p id=\'errorMessage'\></p></div><div id=\'button_add_keyword'\style=\'position:absolute;top:5px;left:340px;'\></div><div id=\'button_filter_keywords'\style=\'position:absolute;top:5px;left:450px;'\></div></div>");
  486. var table = new west.gui.Table();
  487. table.addColumn("keyWord", "keyWord").addColumn("removeKeyword", "removeKeyword");
  488. table.appendToCell("head", "keyWord", "Keyword").appendToCell("head", "removeKeyword", "Remove Keyword");
  489.  
  490. var filtered = Vitriol.filterSearchKeys(Vitriol.keywordFilter);
  491.  
  492. for (var i = 0; i < filtered.length; i++) {
  493. table.appendRow().appendToCell(-1, "keyWord", filtered[i].searchKey).appendToCell(-1, "removeKeyword", Vitriol.createRemoveKeywordButton(filtered[i].searchKey));
  494. }
  495.  
  496. var textfield = new west.gui.Textfield("keywordsearch").setPlaceholder("Select a keyword");
  497.  
  498. if (Vitriol.keywordFilter != "") {
  499. textfield.setValue(Vitriol.keywordFilter);
  500. }
  501.  
  502. var buttonAdd = new west.gui.Button("Add Keyword", function () {
  503. Vitriol.searchTablePosition.content = "0px";
  504. Vitriol.searchTablePosition.scrollbar = "0px";
  505. if(Vitriol.addSearchKeyword(textfield.getValue()))
  506. {
  507. Vitriol.setCookies();
  508. Vitriol.selectTab("searchtab");
  509. }
  510. });
  511.  
  512. var buttonFilter = new west.gui.Button("Filter", function () {
  513. Vitriol.keywordFilter = textfield.getValue();
  514. Vitriol.searchTablePosition.content = "0px";
  515. Vitriol.searchTablePosition.scrollbar = "0px";
  516. Vitriol.selectTab("searchtab");
  517. });
  518.  
  519. htmlSkel.append(table.getMainDiv());
  520. $('#keywordFilter', html).append(textfield.getMainDiv());
  521. $("#button_add_keyword", html).append(buttonAdd.getMainDiv());
  522. $("#button_filter_keywords", html).append(buttonFilter.getMainDiv());
  523. htmlSkel.append(html);
  524. return htmlSkel;
  525. };
  526.  
  527. Vitriol.filterItemnames = function (items, filter) {
  528.  
  529. if (filter.length == 0) {
  530. return items;
  531. }
  532. var goodItems = [];
  533.  
  534. for (var i = 0; i < items.length; i++) {
  535. if (items[i].name.toLowerCase().includes(filter.toLowerCase())) {
  536. goodItems.push(items[i]);
  537. }
  538. }
  539. return goodItems;
  540. }
  541.  
  542. Vitriol.addListenerToItemNameFilter = function () {
  543.  
  544. $("#itemNameSearch").on("keyup", function (e)
  545. {
  546. Vitriol.itemNameFilter = e.target.value;
  547. Vitriol.selectTab("itemstab");
  548. $("#itemNameSearch").trigger('focus');
  549. })
  550. }
  551.  
  552. Vitriol.createSelectedItemsTab = function () {
  553. var htmlSkel = $("<div id = \'items_overview'\></div>");
  554. var html = $("<div class = \'itemName_search'\ style=\'position:relative;'\><div id=\'itemNameFilter'\style=\'position:absolute;top:10px;left:15px'\></div><div id=\'combobox_keywords'\></div></div>");
  555. var combobox = new west.gui.Combobox("combobox_keywords");
  556. Vitriol.addComboboxItems(combobox);
  557. combobox = combobox.select(Vitriol.selectedKeyword);
  558. combobox.addListener(function (value) {
  559. Vitriol.selectedKeyword = value;
  560. Vitriol.selectTab("itemstab");
  561. });
  562.  
  563. var table = new west.gui.Table();
  564. table.addColumn("watch", "watch").addColumn("itemLogo","itemLogo").addColumn("itemName", "itemName").addColumn("setPrice", "setPrice").addColumn("vitrioling","vitrioling");
  565. table.appendToCell("head", "watch", "Watched").appendToCell("head","itemLogo","").appendToCell("head", "itemName", "Item Name").appendToCell("head", "setPrice", "Max price").appendToCell("head", "vitrioling", "Automation");
  566. var selectedItems;
  567. Vitriol.selectedItemsInputFieldCount = 0;
  568. Vitriol.selectedItems = [];
  569. if(Vitriol.selectedKeyword != -1)
  570. {
  571. selectedItems = Vitriol.itemSearch(Vitriol.searchKeys[Vitriol.selectedKeyword].searchKey);
  572. selectedItems = Vitriol.filterItemnames(selectedItems, Vitriol.itemNameFilter);
  573. Vitriol.selectedItems = selectedItems;
  574. Vitriol.selectedItemsInputFieldCount = selectedItems.length;
  575. for (var i = 0; i < selectedItems.length; i++) {
  576. table.appendRow().appendToCell(-1, "watch", Vitriol.createWatchCheckbox(selectedItems, i)).appendToCell(-1,"itemLogo",Vitriol.getItemLogo(selectedItems, i)).appendToCell(-1, "itemName", selectedItems[i].name).appendToCell(-1, "setPrice", Vitriol.createItemInputField(selectedItems, i)).appendToCell(-1, "vitrioling", Vitriol.createVitriolCheckbox(selectedItems, i));
  577. }
  578. }
  579.  
  580. var textfield = new west.gui.Textfield("itemNameSearch").setPlaceholder("Select an item");
  581.  
  582. if (Vitriol.itemNameFilter != "") {
  583. textfield.setValue(Vitriol.itemNameFilter);
  584. }
  585.  
  586.  
  587. htmlSkel.append(table.getMainDiv());
  588. $('#itemNameFilter', html).append(textfield.getMainDiv());
  589. $('#combobox_keywords', html).append(combobox.getMainDiv());
  590.  
  591. htmlSkel.append(html);
  592.  
  593. return htmlSkel;
  594. };
  595.  
  596. Vitriol.createSettingsGui = function () {
  597. var htmlSkel = $("<div id=\'settings_overview'\ style = \'padding:10px;'\></div>");
  598.  
  599. var htmlSearchDelay = $("<div></div>");
  600. htmlSearchDelay.append("<span> Search delay (seconds): </span>");
  601. var htmlSearchDelayTextfield = new west.gui.Textfield("searchDelay");
  602. htmlSearchDelayTextfield.setValue(Vitriol.settings.searchDelay);
  603. htmlSearchDelayTextfield.setWidth(100);
  604. htmlSearchDelay.append(htmlSearchDelayTextfield.getMainDiv());
  605.  
  606. var buttonApply = new west.gui.Button("Apply", function () {
  607. Vitriol.setCookies();
  608. if (Vitriol.isNumber(htmlSearchDelayTextfield.getValue())) {
  609. var searchDelay = parseInt(htmlSearchDelayTextfield.getValue());
  610. Vitriol.settings.searchDelay = searchDelay;
  611. }
  612. Vitriol.selectTab("settings");
  613. })
  614.  
  615. var buttonStart = new west.gui.Button("Start", function () {
  616. Vitriol.isRunning = true;
  617. Vitriol.run();
  618. Vitriol.selectTab("settings");
  619. })
  620.  
  621.  
  622. var buttonStop = new west.gui.Button("Stop", function () {
  623. Vitriol.isRunning = false;
  624. Vitriol.selectTab("settings");
  625. })
  626.  
  627.  
  628. htmlSkel.append(htmlSearchDelay);
  629. htmlSkel.append("<br>");
  630. if (Vitriol.isRunning)
  631. htmlSkel.append("<p style=\"color: green; \" id='isRunning'><strong>Vitriol is running.</strong></p>");
  632. else
  633. htmlSkel.append("<p style=\"color: red; \" id='isRunning'><strong>Vitriol is not running.</strong></p>");
  634. htmlSkel.append("<br>");
  635. htmlSkel.append(buttonApply.getMainDiv());
  636. htmlSkel.append(buttonStart.getMainDiv());
  637. htmlSkel.append(buttonStop.getMainDiv());
  638. return htmlSkel;
  639. };
  640.  
  641. Vitriol.isNumber = function (potentialNumber) {
  642. return Number.isInteger(parseInt(potentialNumber));
  643. };
  644.  
  645. Vitriol.addComboboxItems = function (combobox) {
  646. combobox.addItem(-1, "None");
  647. for (var i = 0; i < Vitriol.searchKeys.length; i++) {
  648. combobox.addItem(i.toString(), Vitriol.searchKeys[i].searchKey);
  649. }
  650. };
  651.  
  652. Vitriol.parseItemFields = function (selectedItems) {
  653.  
  654. for (var i = 0; i < selectedItems.length; i++) {
  655. if (Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[i].item_id)) {
  656. var price = $(".Vitriolwindow #id-" + i).prop("value");
  657. if (Vitriol.isNumber(price)) {
  658. if (price >= selectedItems[i].sell_price)
  659. Vitriol.searchKeys[Vitriol.selectedKeyword].setPrice(selectedItems[i].item_id, price);
  660. else
  661. Vitriol.searchKeys[Vitriol.selectedKeyword].setPrice(selectedItems[i].item_id, selectedItems[i].sell_price);
  662. }
  663. }
  664. }
  665. }
  666.  
  667. Vitriol.addListenersToInputFields = function (num) {
  668.  
  669. var createFunction = function (j) {
  670. var i = j;
  671. var f = function (e) {
  672. if (Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(Vitriol.selectedItems[i].item_id)) {
  673. var price = e.target.value;
  674. if (Vitriol.isNumber(price)) {
  675. if (price >= Vitriol.selectedItems[i].sell_price)
  676. Vitriol.searchKeys[Vitriol.selectedKeyword].setPrice(Vitriol.selectedItems[i].item_id, price);
  677. else
  678. Vitriol.searchKeys[Vitriol.selectedKeyword].setPrice(Vitriol.selectedItems[i].item_id, Vitriol.selectedItems[i].sell_price);
  679. Vitriol.setCookies();
  680. }
  681.  
  682. }
  683.  
  684. console.log(e.target.value);
  685. }
  686. return f;
  687. }
  688. for (var i = 0; i < num; i++) {
  689. $(".Vitriolwindow #id-" + i).on("change", createFunction(i));
  690. }
  691. }
  692.  
  693. Vitriol.getImageSkel = function () {
  694. return $("<img class='itemimage' src=''\>");
  695. };
  696. Vitriol.getItemImage = function (id) {
  697. return ItemManager.get(id).image;
  698. };
  699.  
  700. Vitriol.getItemLogo = function (selectedItems, index) {
  701. return Vitriol.getImageSkel().attr("src", Vitriol.getItemImage(selectedItems[index].item_id));
  702. }
  703.  
  704. Vitriol.createItemInputField = function (selectedItems, index) {
  705. var componentId = "id-" + index;
  706. var inputfield = new west.gui.Textfield("itemPrice").setPlaceholder("Price");
  707. inputfield.setId(componentId);
  708.  
  709.  
  710. var value = selectedItems[index].sell_price;
  711. if (Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[index].item_id))
  712. value = Vitriol.searchKeys[Vitriol.selectedKeyword].getMoney(selectedItems[index].item_id);
  713. inputfield.setValue(value);
  714. inputfield.setWidth(50);
  715.  
  716. return inputfield.getMainDiv();
  717. };
  718.  
  719. Vitriol.createVitriolCheckbox = function (selectedItems, index) {
  720. var checkbox = new west.gui.Checkbox();
  721. checkbox.setLabel("Auto Purchase");
  722.  
  723. checkbox.setSelected(Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[index].item_id) && Vitriol.searchKeys[Vitriol.selectedKeyword].getInstaBuy(selectedItems[index].item_id));
  724. checkbox.setCallback(function () {
  725.  
  726.  
  727. if (this.isSelected()) {
  728.  
  729. if (Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[index].item_id))
  730. Vitriol.searchKeys[Vitriol.selectedKeyword].setInstaBuy(selectedItems[index].item_id, true);
  731. }
  732. else {
  733. if (Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[index].item_id))
  734. Vitriol.searchKeys[Vitriol.selectedKeyword].setInstaBuy(selectedItems[index].item_id, false);
  735. Vitriol.setCookies();
  736. }
  737. });
  738.  
  739.  
  740. return checkbox.getMainDiv();
  741. };
  742.  
  743. Vitriol.createWatchCheckbox = function (selectedItems, index) {
  744. var checkbox = new west.gui.Checkbox();
  745. checkbox.setLabel("");
  746.  
  747. checkbox.setSelected(Vitriol.searchKeys[Vitriol.selectedKeyword].isAdded(selectedItems[index].item_id));
  748.  
  749. checkbox.setCallback(function () {
  750. if (this.isSelected()) {
  751. Vitriol.searchKeys[Vitriol.selectedKeyword].addItemByCreating(selectedItems[index]);
  752. }
  753. else {
  754. Vitriol.searchKeys[Vitriol.selectedKeyword].removeItem(selectedItems[index].item_id);
  755. }
  756. Vitriol.setCookies();
  757. });
  758.  
  759. return checkbox.getMainDiv();
  760. };
  761.  
  762. Vitriol.addSearchTableCss = function () {
  763. $(".Vitriolwindow .keyWord").css({ "width": "150px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  764. $(".Vitriolwindow .removeKeyword").css({ "width": "140px", "position": "relative", "top": "5px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  765. $(".Vitriolwindow .removeKeyword").first().css({"top":"0px"});
  766. $(".Vitriolwindow .row").css({ "height": "40px" });
  767. $(".Vitriolwindow #errorMessageContainer").css({ "position": "relative", "left": "250px", "top": "45px"});
  768. $(".Vitriolwindow #errorMessageContainer").css({ "font-weight": "bold", "color": "red"});
  769. $('.Vitriolwindow').find('.tw2gui_scrollpane').css('height', '250px');
  770. };
  771.  
  772. Vitriol.addSelectedItemsTableCss = function () {
  773. $(".Vitriolwindow .watch").css({ "position": "relative", "width": "100px", "top": "5px", "text-align": "center", "font-size": "small"});
  774. $(".Vitriolwindow .watch").first().css({ "position": "relative", "top": "0px", "width": "100px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  775. $(".Vitriolwindow .itemLogo").first().css({ "position": "relative", "top": "0px", "width": "30px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  776. $(".Vitriolwindow .itemLogo").css({"width": "30px", "text-align": "center" });
  777. $(".Vitriolwindow .itemimage").css({ "width": "25px", "height": "25px"});
  778. $(".Vitriolwindow .itemName").css({ "width": "150px", "text-align": "center", "font-size": "small"});
  779. $(".Vitriolwindow .itemName").first().css({ "width": "150px", "text-align": "center", "font-size": "larger"});
  780. $(".Vitriolwindow .setPrice").css({ "width": "80px", "text-align": "center" });
  781. $(".Vitriolwindow .setPrice").first().css({ "width": "80px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  782. $(".Vitriolwindow .vitrioling").css({ "width": "110px", "text-align": "center" });
  783. $(".Vitriolwindow .vitrioling").first().css({ "width": "110px", "text-align": "center", "font-size": "larger", "font-weight": "bold" });
  784. $(".Vitriolwindow .row").css({ "height": "40px" });
  785. $(".Vitriolwindow #combobox_keywords").css({ "position": "relative", "left": "110px", "top": "5px"});
  786. $('.Vitriolwindow').find('.tw2gui_scrollpane').css('height', '250px');
  787. $('.Vitriolwindow checkbox').css({ "position": "relative", "left": "100px"});
  788. };
  789.  
  790. Vitriol.createMenuIcon = function () {
  791. var menuimage = 'https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/500a81fb-2791-4d19-aad0-3d6b643fead6/dgip884-06ea316a-dde8-43d5-a2d0-b1b602ac8e95.png/v1/fill/w_25,h_25,q_80,strp/vitriol_by_ahnorac_dgip884-fullview.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MjUiLCJwYXRoIjoiXC9mXC81MDBhODFmYi0yNzkxLTRkMTktYWFkMC0zZDZiNjQzZmVhZDZcL2RnaXA4ODQtMDZlYTMxNmEtZGRlOC00M2Q1LWEyZDAtYjFiNjAyYWM4ZTk1LnBuZyIsIndpZHRoIjoiPD0yNSJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.fmPcGNHBjBn4bNnLhpgKJbu08Ul-uWnLd1lys5LfhQU';
  792. var div = $('<div class="ui_menucontainer" />');
  793. var link = $('<div id="Menu" class="menulink" onclick=Vitriol.createWindow(); title="Vitriol" />').css('background-image', 'url(' + menuimage + ')');
  794. $('#ui_menubar').append((div).append(link).append('<div class="menucontainer_bottom" />'));
  795. };
  796.  
  797. Vitriol.addUserMessage = function (msg) {
  798. Vitriol.userMessages.push(msg);
  799. }
  800.  
  801. Vitriol.canSayUserMessage = function () {
  802. return Vitriol.userMessages.length > 0 && get_server_date().valueOf() >= Vitriol.lastMessage + Vitriol.messageDelay;
  803. }
  804.  
  805. Vitriol.manageUserMessages = function() {
  806. new UserMessage(Vitriol.userMessages[0], UserMessage.TYPE_ERROR).show();
  807. Vitriol.lastMessage = get_server_date().valueOf();
  808. Vitriol.userMessages.splice(0, 1);
  809. }
  810.  
  811. Vitriol.run = async function () {
  812. var nextCheck = get_server_date().valueOf();
  813. while (true) {
  814. if (!Vitriol.isRunning)
  815. break;
  816. if (get_server_date().valueOf() >= nextCheck)
  817. {
  818. Vitriol.fullCheckMarket();
  819. nextCheck = get_server_date().valueOf() + Vitriol.settings.searchDelay * 1000;
  820. }
  821. await new Promise(r => setTimeout(r, 500));
  822. if (Vitriol.canSayUserMessage())
  823. Vitriol.manageUserMessages();
  824. }
  825. }
  826.  
  827. $(document).ready(function () {
  828. try {
  829. Vitriol.itemList = Vitriol.getAllItems();
  830. Vitriol.getAllItemNames();
  831. Vitriol.createMenuIcon();
  832. Vitriol.getCookies();
  833.  
  834. } catch (e) {
  835. Vitriol.logError("exception occured");
  836. }
  837. });
  838. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址