Advertisement
Guest User

marketGUI.lua

a guest
Mar 26th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.56 KB | None | 0 0
  1. require("marketFunctions")
  2. ser = require("serialization")
  3. filesystem = require("filesystem")
  4. component = require("component")
  5. sides = require("sides")
  6. term = require("term")
  7. colors = require("colors")
  8. require 'hazeUI'
  9.  
  10. marketGUI = {ui = {}, config = { admin = "Ben85" }, yOffset = 3 }
  11.  
  12. function marketGUI:init(address, gpuAddress, index)
  13.   self.ui = clone(hazeUI)
  14.   self.ui.super = self
  15.   self.ui.config.screen = address
  16.   self.ui.config.gpu = gpuAddress
  17.   self.ui.gpu = require("component").proxy(gpuAddress)
  18.   self.ui.gpu.bind(address)
  19.   self.ui:addButton(1, 1, 78, 1, "Trade-Station ("..index..")", "all", 0x0, 0xFFFFFF, "center", "printTrades")
  20.   self.ui:addButton(1, 2, 80, 1, "", "all", 0x0, 0xEDEDED, "right")
  21.   self.ui:addButton(79, 1, 2, 1, "#", "all", 0x0, 0xFAFAFA, "left", "adminMenue")
  22. end
  23.  
  24.  
  25. function marketGUI:addTrade(data)
  26.   local offer = data[1]
  27.   local price = data[2]
  28.  
  29.   if not offer then
  30.     return
  31.   end
  32.   if not price then
  33.     return
  34.   end
  35.  
  36.     table.insert(_G.trades, { offer = offer, price = price })
  37.     saveTradesConfig()    
  38.    
  39.     self:importTrades()
  40. end
  41.  
  42.  
  43. function marketGUI:importTrades()
  44.   self.ui:addButton(1, 4, 50, 3, "importing trades, this may take some time...", "market.importTrades", 0xFF00FF, 0x303030, "center")
  45.   self.ui:drawScreen("market.importTrades")
  46.    
  47.   p = require("component").proxy(_G.config.pricing.t)
  48.    
  49.   s = p.getInventorySize(_G.config.pricing.side)
  50.   fu = 1
  51.  
  52.   for j=1,(s/2) do
  53.     self.ui:drawStatusbar(5, 10, 40, 1, s/2, j, "reading pricing inventory")
  54.    
  55.     local slot = j + (math.floor((j-1) / 9) * 9)
  56.    
  57.     local o = p.getStackInSlot(_G.config.pricing.side, slot);
  58.     local p = p.getStackInSlot(_G.config.pricing.side, (slot+9))
  59.    
  60.     local addIt = false
  61.    
  62.     if o and p then
  63.     addIt = true
  64.     for k=1,#_G.trades do
  65.       if _G.trades[k].price.name == p.name and _G.trades[k].price.size == p.size then
  66.        if _G.trades[k].offer.name == o.name and _G.trades[k].offer.size == o.size then
  67.         addIt = false
  68.       end end
  69.     end
  70.   end    
  71.   if addIt then
  72.     self.ui:addButton(2, 1+(fu*3), 40, 1, "‡ " .. o.size .. " x " .. o.name, 'market.importTradesList', 0x10EF10, 0x202020, "left", "addTrade", { o, p})
  73.     self.ui:addButton(2, 2+(fu*3), 40, 1, "† price: " .. p.size .. " x " .. p.name, 'market.importTradesList', 0xEF1010, 0x202020, "left", "addTrade", { o, p})
  74.     fu = fu + 1
  75.   end
  76.   end
  77.  
  78.   self.ui:drawScreen("market.importTradesList")
  79. end
  80.  
  81.  
  82. function marketGUI:refreshStock()
  83.   self.ui:addButton(1, 4, 50, 3, "loading stock, this may take some time...", "loadStock", 0xFF00FF, 0x303030, "center")
  84.   self.ui:drawScreen("loadStock")
  85.    
  86.   local sc = require("component").proxy(_G.config.stock.t)
  87.    
  88.   local s = sc.getInventorySize(_G.config.stock.side)
  89. print(sc.getInventorySize(_G.config.stock.side))
  90.   _G.stock = {}
  91.  
  92.   for j=1,s do
  93.   self.ui:drawStatusbar(5, 10, 40, 1, s, j, "reading stock inventory ")
  94.  
  95.   local stack = sc.getStackInSlot(_G.config.stock.side, j)
  96.  
  97.   if stack then
  98.     stack.invSlot = j
  99.     table.insert(_G.stock, stack)    
  100.   end
  101.    end
  102. end
  103.  
  104. function marketGUI:history(fileOffset)
  105.   self.ui:flushElements(true)
  106.   if not fileOffset or fileOffset == nil then
  107.     marketHistory.load()
  108.   end
  109.  
  110.   local pages = math.ceil(#marketHistory.files/8)
  111.  
  112.  
  113.  
  114.   if not fileOffset or fileOffset == nil or fileOffset < 0 or fileOffset > #marketHistory.files then
  115.     fileOffset = (pages*8)-8
  116.   end
  117.  
  118.   local page = 1+math.ceil(fileOffset/8)
  119.  
  120.   for i=1,#marketHistory.files do
  121.     local fileIndex = fileOffset + i
  122.  
  123.     if i > 8 or fileIndex > #marketHistory.files then
  124.       break
  125.     end
  126.  
  127.     fd = io.open("/var/log/"..marketHistory.files[fileIndex], "r")
  128.     local serTradeLog = fd:read("*a")
  129.     fd:close()
  130.  
  131.     local tradeLog = ser.unserialize(serTradeLog)
  132.  
  133.     local color = 0x202020
  134.  
  135.     if tradeLog.cntLeft == 0 then
  136.       color = 0x00EE00
  137.     end
  138.  
  139.     local bgCol = 0xEEEEEE
  140.  
  141.     if i%2 == 0 then
  142.       bgCol = 0xCCCCCC
  143.     end
  144.  
  145.     self.ui:addButton(11, 3+(2*i), 40, 1, tradeLog.offer.label .. " <> " .. tradeLog.price.label, "history", 0x0, bgCol, "left", self.historyShow, "/var/log/"..self.files[fileIndex])
  146.     self.ui:addButton(11, 4+(2*i), 40, 1, tradeLog.user .. " | " .. (tradeLog.cnt-tradeLog.cntLeft) .."/"..tradeLog.cnt, "history", 0x0, bgCol, "left", self.historyShow, "/var/log/"..marketHistory.files[fileIndex])
  147.  
  148.     self.ui:addButton(3, 3+(2*i), 8, 2, "#"..fileIndex, "history", 0x0, color, "right", self.historyShow, "/var/log/"..marketHistory.files[fileIndex])
  149.   end
  150.  
  151.   if page > 1 then
  152.     self.ui:addButton(1, 21, 15, 1, "< page "..(page-1), "history", 0x0, 0xFFFFFF, "left", self.history, (fileOffset-8))
  153.   end
  154.  
  155.   if page < pages then
  156.     self.ui:addButton(16, 21, 15, 1, "page "..(page+1).." >", "history", 0x0, 0xFFFFFF, "left", self.history, (fileOffset+8))
  157.   end
  158.  
  159.   self.ui:addButton(1, 1, 30, 1, "file count: "..#files, "history", 0x0, 0xFFFFFF, "left")
  160.   self.drawScreen("history")
  161. end
  162.  
  163. function marketGUI:historyShow(filename)
  164.   fd = io.open(filename, "r")
  165.   local serTradeLog = fd:read("*a")
  166.   fd:close()
  167.  
  168.   local tradeLog = ser.unserialize(serTradeLog)
  169.  
  170.   local color = 0x202020
  171.  
  172.   if tradeLog.cntLeft == 0 then
  173.     color = 0x00EE00
  174.   end
  175.  
  176.   self.ui:addButton(50, 3, 30, 1, "file: "..filename, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  177.     self.ui:addButton(50, 4, 30, 1, "o>"..tradeLog.offer.label, "historyShow", 0x0, 0xFFFFFF, "center", self.history)
  178.     self.ui:addButton(50, 5, 30, 1, "p<"..tradeLog.price.label, "historyShow", 0x0, 0xFFFFFF, "center", self.history)
  179.     self.ui:addButton(50, 6, 30, 1, "date: "..tradeLog.date, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  180.     self.ui:addButton(50, 7, 30, 1, "time: "..tradeLog.time, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  181.   if tradeLog.userItem then
  182.     self.ui:addButton(50, 8, 30, 1, "userItem: "..tradeLog.userItem.label, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  183.   else
  184.     self.ui:addButton(50, 8, 30, 1, "userItem: none", "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  185.   end
  186.   self.ui:addButton(50, 9, 30, 1, "username: "..tradeLog.user, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
  187.   self.ui:addButton(50, 10, 30, 1, 'cnt (left): '..tradeLog.cnt..'('..tradeLog.cntLeft..')', "historyShow", 0x0, color, "left", self.history)
  188.  
  189.   self.ui:addButton(65, 12, 15, 1, "back", "historyShow", 0x0, 0xFFFFFF, "center", self.history)
  190.  
  191.   self.drawScreen("historyShow")
  192. end
  193.  
  194. function marketGUI:adminMenue()
  195.  
  196.   if self.ui.lastTouchUser ~= self.config.admin then
  197.     return
  198.   end
  199.  
  200.   self.ui:addButton(5, 5, 25, 2, "import trades", "adminMenue", 0x0, 0x808080, "center", "importTrades")
  201.   self.ui:addButton(5, 8, 25, 2, "reload trades config", "adminMenue", 0x0, 0x808080, "center", loadTradesConfig)
  202.   self.ui:addButton(5, 11, 25, 2, "reload stock", "adminMenue", 0x0, 0x808080, "center", "refreshStock")
  203.   self.ui:addButton(5, 14, 25, 2, "close script", "adminMenue", 0x0, 0xEE1010, "center", os.exit)
  204.   self.ui:addButton(5, 17, 25, 2, "save trades", "adminMenue", 0x0, 0x808080, "center", saveTradesConfig)
  205.   self.ui:addButton(5, 20, 25, 2, "trade history", "adminMenue", 0x0, 0x808080, "center", "history")
  206.  
  207.   self.ui:drawScreen("adminMenue")
  208. end
  209.  
  210.  
  211.  
  212. function marketGUI:trade(data)
  213.   local screen = data.screen
  214.  
  215.   lockMutex(screen)
  216.  
  217.   local cnt = data.cnt
  218.   local offer = data.offer
  219.   local price = data.price
  220.  
  221.   local pri = calcPrice(offer, price, cnt)
  222.  
  223.   local userItem
  224.  
  225.  
  226.   local i = component.proxy(_G.config.terminals[screen].t)
  227.  
  228.   local s = component.proxy(_G.config.stock.t)
  229.  
  230.  
  231.   if _G._G.config.terminals[screen].inputType == "QSU" then
  232.   userItem = i.getStackInSlot(_G.config.terminals[screen].input, 2)
  233.   else
  234.   userItem = i.getStackInSlot(_G.config.terminals[screen].input, 1)
  235.   end
  236.  
  237.   local tradeLog = {}
  238.   tradeLog.user = self.lastTouchUser
  239.   tradeLog.date = os.date()
  240.   tradeLog.time = os.time()
  241.   tradeLog.offer = offer
  242.   tradeLog.price = price
  243.   tradeLog.userItem = userItem
  244.   tradeLog.cnt = cnt
  245.   tradeLog.cntLeft = cnt
  246.  
  247.   if not userItem then
  248.   self.ui:addButton(5, 4, 70, 2, "you have to put your materials in the left QSU", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  249.   elseif not compareStacks(userItem, price) then
  250.   self.ui:addButton(5, 4, 70, 2, "wrong material in the input dsu", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  251.   elseif userItem.size < pri then
  252.     self.ui:addButton(5, 3, 70, 2, "not enough material to trade (lv)", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  253.   elseif getStockSize(offer) < cnt then
  254.     self.ui:addButton(5, 3, 70, 2, "not enough material in stock for trade", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  255.   else
  256.  
  257.  
  258.   local cntInLeft = pri
  259.  
  260.   -- flush item buffer (shouldnt be necessary...)
  261.   bufferSize = s.getSlotStackSize(_G.config.stock.input, 1)
  262.   s.transferItem(_G.config.stock.input, _G.config.stock.side, bufferSize, 1)
  263.  
  264.   for ts=1,math.ceil(pri/64) do
  265.     bufferSize = 0
  266.  
  267.     copyCount = 64
  268.  
  269.     if cntInLeft < 64 then
  270.       copyCount = cntInLeft
  271.     end
  272.  
  273.     if _G.config.terminals[screen].inputType == "QSU" then
  274.       i.transferItem(_G.config.terminals[screen].input, _G.config.terminals[screen].buffer, copyCount, 2)
  275.     else
  276.       i.transferItem(_G.config.terminals[screen].input, _G.config.terminals[screen].buffer, copyCount, 1)
  277.     end
  278.  
  279.     while s.getSlotStackSize(_G.config.stock.input, 1) < copyCount do
  280.       os.sleep(0.05)
  281.     end
  282.  
  283.     cntInLeft = cntInLeft - copyCount;
  284.  
  285.     s.transferItem(_G.config.stock.input, _G.config.stock.side, copyCount, 1)
  286.     local xy = s.getSlotStackSize(_G.config.stock.input, 1)
  287.  
  288.     if xy > 0 then
  289.       self.ui:addButton(5, 3, 70, 2, "stock is full, your materials are in the output QSU", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  290.       s.transferItem(_G.config.stock.buffer, _G.config.terminals[i].output.side, xy, 1)
  291.       cntInLeft = cntInLeft + (copyCount - xy)
  292.     end
  293.   end
  294.  
  295.     if cntInLeft > 0 then
  296.     self.ui:addButton(5, 3, 70, 2, "not enough material to trade (hv)", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
  297.  
  298.     -- now we hack around...
  299.     cnt = pri - cntInLeft
  300.     offer = price
  301.     end
  302.  
  303.   local c = cnt
  304.  
  305.     for j=1,#stock do
  306.     c = cnt
  307.  
  308.     if cnt < 1 then
  309.       break;
  310.     end
  311.  
  312.  
  313.     if compareStacks(stock[j], offer) then
  314.       if stock[j].size < cnt then
  315.       c = stock[j].size
  316.       end
  317.  
  318.       s.transferItem(_G.config.stock.side, _G.config.terminals[i].output.side, c, stock[j].invSlot)
  319.       stock[j].size = stock[j].size - c;
  320.  
  321.       -- if the slot is empty remove it from cache
  322.       if stock[j].size == 0 then
  323.       table.remove(stock, j)
  324.       end
  325.  
  326.  
  327.       cnt = cnt - c
  328.       tradeLog.cntLeft = cnt
  329.     end
  330.     end
  331.  
  332.   if cnt < 1 then
  333.     self.ui:addButton(5, 5, 40, 2, "your items are now in the right QSU", "trade", 0xFFFFFF, 0x005207, "center", self.printTrades)
  334.  
  335.     local meh = userItem.size - pri
  336.     if meh > 0 then
  337.       self.ui:addButton(5, 8, 40, 2, "you have " .. meh .. "x "..price.label.." left!", "trade", 0x000000, 0xFF9010, "center", self.printTrades)
  338.     end
  339.   else
  340.     self.ui:addButton(5,10,40,2, "trade failed, back to main menue", "trade", 0xDDAAAA, 0x303030, "center", self.printTrades)
  341.   end
  342.   end
  343.     self.ui:drawScreen("trade")
  344. --confusing
  345.   logTrade(tradeLog)
  346.   tradeMutex = false
  347. end
  348.  
  349.  
  350. function marketGUI:printTrades(page)
  351.  self.ui:flushElements(true)
  352.  
  353.   if page == nil then
  354.     page = 1
  355.   end
  356.  
  357.  local o = ((page-1)*8)
  358.  
  359.  local tradesTemp = trades
  360.  
  361.  for s=1,#tradesTemp do
  362.     local j = o+s
  363.  
  364.     if j > #tradesTemp then
  365.       break
  366.     end
  367.  
  368.     if s > 8 then
  369.       break
  370.     end
  371.  
  372.     local offer = tradesTemp[j].offer
  373.     local price = tradesTemp[j].price
  374.     local stockCnt = getStockSize(offer)
  375.  
  376.     if(stockCnt >= 1000) then
  377.       stockCnt = ">1k"
  378.     end
  379.  
  380.      l = j - ((page-1) * 8)
  381.  
  382.     local bgcolor = 0x202020;
  383.  
  384.     if s % 2 == 0 then
  385.     bgcolor = 0x303030
  386.     end
  387.  
  388.  
  389.     self.ui:addButton(2, self.yOffset+(l*2)-1, 40, 1, "<| " .. offer.size .. " x " .. offer.label, 'printTrades', 0x10EF10, bgcolor, "left", self.openTrade, {offer, price})
  390.     self.ui:addButton(2, self.yOffset+(l*2), 40, 1,   " |> " .. price.size .. " x " .. price.label, 'printTrades', 0xEF1010, bgcolor, "left", self.openTrade, {offer, price})
  391.     self.ui:addButton(42, self.yOffset+(l*2)-1, 8, 2, "(" .. stockCnt .. ")", 'printTrades', 0x939393, bgcolor, "right")
  392.   end
  393.  
  394.  
  395.   if page > 1 then
  396.     self.ui:addButton(2, 21, 15, 2, "<< Page -", "printTrades", 0xFFFFFF, 0x303030, "left", self.printTrades, page-1)
  397.   end
  398.  
  399.   self.ui:addButton(21, 21, 10, 2, page.." / "..math.ceil(#tradesTemp/8), "printTrades", 0xEEEEEE, 0x202020, "center", self.printTrades)
  400.  
  401.   if (#tradesTemp/8)-page > 0 then
  402.     self.ui:addButton(35, 21, 15, 2, "Page + >>", "printTrades", 0xFFFFFF, 0x303030, "right", self.printTrades, page+1)
  403.   end
  404.  
  405.   self.ui:addButton(52, 8, 28, 2, "How this works", "printTrades", 0xEEEEEE, 0x003676, "center")
  406.   self.ui:addButton(52, 10, 28, 1, "1.) put your items in the", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  407.   self.ui:addButton(52, 11, 28, 1, "    left QSU", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  408.   self.ui:addButton(52, 12, 28, 1, "2.) select a trade from", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  409.   self.ui:addButton(52, 13, 28, 1, "    the list", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  410.   self.ui:addButton(52, 14, 28, 1, "3.) select the amount you", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  411.   self.ui:addButton(52, 15, 28, 1, "    want to buy on", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  412.   self.ui:addButton(52, 16, 28, 1, "    the right", "printTrades", 0xEEEEEE, 0x0058BD, "left")
  413.   self.ui:addButton(52, 17, 28, 1, "", 0xEEEEEE, 0x0058BD, "left")
  414.  
  415.  
  416.   self.ui:drawScreen('printTrades')
  417. end
  418.  
  419. function marketGUI:openTrade(data)
  420.  local offer = data[1]
  421.  local price = data[2]
  422.  
  423.  if not offer or not price then
  424.   return
  425.  end
  426.  
  427.  self.openTradeListing(1, offer, price, 4)
  428.  self.openTradeListing(2, offer, price, 7)
  429.  self.openTradeListing(8, offer, price, 10)
  430.  self.openTradeListing(16, offer, price, 13)
  431.  self.openTradeListing(32, offer, price, 16)
  432.  self.openTradeListing(64, offer, price, 19)
  433.  
  434.  self.ui:addButton(70, 22, 10, 2, 'cancel', 'openTrade', 0xEFEF00, 0x402020, "center", self.printTrades)
  435.  
  436.  if self.lastTouchUser == config.admin then
  437.   self.ui:addButton(50, 22, 15, 2, 'remove', 'openTrade', 0x0, 0xEE2020, "center", removeTrade, { offer = offer, price = price })
  438.  end
  439.  
  440.  self.ui:drawScreen("openTrade")
  441. end
  442.  
  443. function marketGUI:openTradeListing(cnt, offer, price, posY)
  444.  if cnt >= offer.size and price.size*cnt <= 64 then
  445.    self.ui:addButton(50, posY, 30, 1, 'get '..cnt..'x ' .. offer.label, 'openTrade', 0x2EA604, 0x202020, "left", self.trade, { cnt = cnt, offer = offer, price = price})
  446.    self.ui:addButton(50, posY+1, 30, 1, 'for '..calcPrice(offer, price, cnt) .. 'x ' .. price.label, 'openTrade', 0xFF2A2A, 0x202020, "right", self.trade, { cnt = cnt, offer = offer, price = price})
  447.  end
  448.  
  449. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement