Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require("marketFunctions")
- ser = require("serialization")
- filesystem = require("filesystem")
- component = require("component")
- sides = require("sides")
- term = require("term")
- colors = require("colors")
- require 'hazeUI'
- marketGUI = {ui = {}, config = { admin = "Ben85" }, yOffset = 3 }
- function marketGUI:init(address, gpuAddress, index)
- self.ui = clone(hazeUI)
- self.ui.super = self
- self.ui.config.screen = address
- self.ui.config.gpu = gpuAddress
- self.ui.gpu = require("component").proxy(gpuAddress)
- self.ui.gpu.bind(address)
- self.ui:addButton(1, 1, 78, 1, "Trade-Station ("..index..")", "all", 0x0, 0xFFFFFF, "center", "printTrades")
- self.ui:addButton(1, 2, 80, 1, "", "all", 0x0, 0xEDEDED, "right")
- self.ui:addButton(79, 1, 2, 1, "#", "all", 0x0, 0xFAFAFA, "left", "adminMenue")
- end
- function marketGUI:addTrade(data)
- local offer = data[1]
- local price = data[2]
- if not offer then
- return
- end
- if not price then
- return
- end
- table.insert(_G.trades, { offer = offer, price = price })
- saveTradesConfig()
- self:importTrades()
- end
- function marketGUI:importTrades()
- self.ui:addButton(1, 4, 50, 3, "importing trades, this may take some time...", "market.importTrades", 0xFF00FF, 0x303030, "center")
- self.ui:drawScreen("market.importTrades")
- p = require("component").proxy(_G.config.pricing.t)
- s = p.getInventorySize(_G.config.pricing.side)
- fu = 1
- for j=1,(s/2) do
- self.ui:drawStatusbar(5, 10, 40, 1, s/2, j, "reading pricing inventory")
- local slot = j + (math.floor((j-1) / 9) * 9)
- local o = p.getStackInSlot(_G.config.pricing.side, slot);
- local p = p.getStackInSlot(_G.config.pricing.side, (slot+9))
- local addIt = false
- if o and p then
- addIt = true
- for k=1,#_G.trades do
- if _G.trades[k].price.name == p.name and _G.trades[k].price.size == p.size then
- if _G.trades[k].offer.name == o.name and _G.trades[k].offer.size == o.size then
- addIt = false
- end end
- end
- end
- if addIt then
- self.ui:addButton(2, 1+(fu*3), 40, 1, "‡ " .. o.size .. " x " .. o.name, 'market.importTradesList', 0x10EF10, 0x202020, "left", "addTrade", { o, p})
- self.ui:addButton(2, 2+(fu*3), 40, 1, "† price: " .. p.size .. " x " .. p.name, 'market.importTradesList', 0xEF1010, 0x202020, "left", "addTrade", { o, p})
- fu = fu + 1
- end
- end
- self.ui:drawScreen("market.importTradesList")
- end
- function marketGUI:refreshStock()
- self.ui:addButton(1, 4, 50, 3, "loading stock, this may take some time...", "loadStock", 0xFF00FF, 0x303030, "center")
- self.ui:drawScreen("loadStock")
- local sc = require("component").proxy(_G.config.stock.t)
- local s = sc.getInventorySize(_G.config.stock.side)
- print(sc.getInventorySize(_G.config.stock.side))
- _G.stock = {}
- for j=1,s do
- self.ui:drawStatusbar(5, 10, 40, 1, s, j, "reading stock inventory ")
- local stack = sc.getStackInSlot(_G.config.stock.side, j)
- if stack then
- stack.invSlot = j
- table.insert(_G.stock, stack)
- end
- end
- end
- function marketGUI:history(fileOffset)
- self.ui:flushElements(true)
- if not fileOffset or fileOffset == nil then
- marketHistory.load()
- end
- local pages = math.ceil(#marketHistory.files/8)
- if not fileOffset or fileOffset == nil or fileOffset < 0 or fileOffset > #marketHistory.files then
- fileOffset = (pages*8)-8
- end
- local page = 1+math.ceil(fileOffset/8)
- for i=1,#marketHistory.files do
- local fileIndex = fileOffset + i
- if i > 8 or fileIndex > #marketHistory.files then
- break
- end
- fd = io.open("/var/log/"..marketHistory.files[fileIndex], "r")
- local serTradeLog = fd:read("*a")
- fd:close()
- local tradeLog = ser.unserialize(serTradeLog)
- local color = 0x202020
- if tradeLog.cntLeft == 0 then
- color = 0x00EE00
- end
- local bgCol = 0xEEEEEE
- if i%2 == 0 then
- bgCol = 0xCCCCCC
- end
- 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])
- 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])
- self.ui:addButton(3, 3+(2*i), 8, 2, "#"..fileIndex, "history", 0x0, color, "right", self.historyShow, "/var/log/"..marketHistory.files[fileIndex])
- end
- if page > 1 then
- self.ui:addButton(1, 21, 15, 1, "< page "..(page-1), "history", 0x0, 0xFFFFFF, "left", self.history, (fileOffset-8))
- end
- if page < pages then
- self.ui:addButton(16, 21, 15, 1, "page "..(page+1).." >", "history", 0x0, 0xFFFFFF, "left", self.history, (fileOffset+8))
- end
- self.ui:addButton(1, 1, 30, 1, "file count: "..#files, "history", 0x0, 0xFFFFFF, "left")
- self.drawScreen("history")
- end
- function marketGUI:historyShow(filename)
- fd = io.open(filename, "r")
- local serTradeLog = fd:read("*a")
- fd:close()
- local tradeLog = ser.unserialize(serTradeLog)
- local color = 0x202020
- if tradeLog.cntLeft == 0 then
- color = 0x00EE00
- end
- self.ui:addButton(50, 3, 30, 1, "file: "..filename, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- self.ui:addButton(50, 4, 30, 1, "o>"..tradeLog.offer.label, "historyShow", 0x0, 0xFFFFFF, "center", self.history)
- self.ui:addButton(50, 5, 30, 1, "p<"..tradeLog.price.label, "historyShow", 0x0, 0xFFFFFF, "center", self.history)
- self.ui:addButton(50, 6, 30, 1, "date: "..tradeLog.date, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- self.ui:addButton(50, 7, 30, 1, "time: "..tradeLog.time, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- if tradeLog.userItem then
- self.ui:addButton(50, 8, 30, 1, "userItem: "..tradeLog.userItem.label, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- else
- self.ui:addButton(50, 8, 30, 1, "userItem: none", "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- end
- self.ui:addButton(50, 9, 30, 1, "username: "..tradeLog.user, "historyShow", 0x0, 0xFFFFFF, "left", self.history)
- self.ui:addButton(50, 10, 30, 1, 'cnt (left): '..tradeLog.cnt..'('..tradeLog.cntLeft..')', "historyShow", 0x0, color, "left", self.history)
- self.ui:addButton(65, 12, 15, 1, "back", "historyShow", 0x0, 0xFFFFFF, "center", self.history)
- self.drawScreen("historyShow")
- end
- function marketGUI:adminMenue()
- if self.ui.lastTouchUser ~= self.config.admin then
- return
- end
- self.ui:addButton(5, 5, 25, 2, "import trades", "adminMenue", 0x0, 0x808080, "center", "importTrades")
- self.ui:addButton(5, 8, 25, 2, "reload trades config", "adminMenue", 0x0, 0x808080, "center", loadTradesConfig)
- self.ui:addButton(5, 11, 25, 2, "reload stock", "adminMenue", 0x0, 0x808080, "center", "refreshStock")
- self.ui:addButton(5, 14, 25, 2, "close script", "adminMenue", 0x0, 0xEE1010, "center", os.exit)
- self.ui:addButton(5, 17, 25, 2, "save trades", "adminMenue", 0x0, 0x808080, "center", saveTradesConfig)
- self.ui:addButton(5, 20, 25, 2, "trade history", "adminMenue", 0x0, 0x808080, "center", "history")
- self.ui:drawScreen("adminMenue")
- end
- function marketGUI:trade(data)
- local screen = data.screen
- lockMutex(screen)
- local cnt = data.cnt
- local offer = data.offer
- local price = data.price
- local pri = calcPrice(offer, price, cnt)
- local userItem
- local i = component.proxy(_G.config.terminals[screen].t)
- local s = component.proxy(_G.config.stock.t)
- if _G._G.config.terminals[screen].inputType == "QSU" then
- userItem = i.getStackInSlot(_G.config.terminals[screen].input, 2)
- else
- userItem = i.getStackInSlot(_G.config.terminals[screen].input, 1)
- end
- local tradeLog = {}
- tradeLog.user = self.lastTouchUser
- tradeLog.date = os.date()
- tradeLog.time = os.time()
- tradeLog.offer = offer
- tradeLog.price = price
- tradeLog.userItem = userItem
- tradeLog.cnt = cnt
- tradeLog.cntLeft = cnt
- if not userItem then
- self.ui:addButton(5, 4, 70, 2, "you have to put your materials in the left QSU", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- elseif not compareStacks(userItem, price) then
- self.ui:addButton(5, 4, 70, 2, "wrong material in the input dsu", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- elseif userItem.size < pri then
- self.ui:addButton(5, 3, 70, 2, "not enough material to trade (lv)", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- elseif getStockSize(offer) < cnt then
- self.ui:addButton(5, 3, 70, 2, "not enough material in stock for trade", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- else
- local cntInLeft = pri
- -- flush item buffer (shouldnt be necessary...)
- bufferSize = s.getSlotStackSize(_G.config.stock.input, 1)
- s.transferItem(_G.config.stock.input, _G.config.stock.side, bufferSize, 1)
- for ts=1,math.ceil(pri/64) do
- bufferSize = 0
- copyCount = 64
- if cntInLeft < 64 then
- copyCount = cntInLeft
- end
- if _G.config.terminals[screen].inputType == "QSU" then
- i.transferItem(_G.config.terminals[screen].input, _G.config.terminals[screen].buffer, copyCount, 2)
- else
- i.transferItem(_G.config.terminals[screen].input, _G.config.terminals[screen].buffer, copyCount, 1)
- end
- while s.getSlotStackSize(_G.config.stock.input, 1) < copyCount do
- os.sleep(0.05)
- end
- cntInLeft = cntInLeft - copyCount;
- s.transferItem(_G.config.stock.input, _G.config.stock.side, copyCount, 1)
- local xy = s.getSlotStackSize(_G.config.stock.input, 1)
- if xy > 0 then
- self.ui:addButton(5, 3, 70, 2, "stock is full, your materials are in the output QSU", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- s.transferItem(_G.config.stock.buffer, _G.config.terminals[i].output.side, xy, 1)
- cntInLeft = cntInLeft + (copyCount - xy)
- end
- end
- if cntInLeft > 0 then
- self.ui:addButton(5, 3, 70, 2, "not enough material to trade (hv)", "trade", 0xEF0000, 0x202020, "center", self.printTrades)
- -- now we hack around...
- cnt = pri - cntInLeft
- offer = price
- end
- local c = cnt
- for j=1,#stock do
- c = cnt
- if cnt < 1 then
- break;
- end
- if compareStacks(stock[j], offer) then
- if stock[j].size < cnt then
- c = stock[j].size
- end
- s.transferItem(_G.config.stock.side, _G.config.terminals[i].output.side, c, stock[j].invSlot)
- stock[j].size = stock[j].size - c;
- -- if the slot is empty remove it from cache
- if stock[j].size == 0 then
- table.remove(stock, j)
- end
- cnt = cnt - c
- tradeLog.cntLeft = cnt
- end
- end
- if cnt < 1 then
- self.ui:addButton(5, 5, 40, 2, "your items are now in the right QSU", "trade", 0xFFFFFF, 0x005207, "center", self.printTrades)
- local meh = userItem.size - pri
- if meh > 0 then
- self.ui:addButton(5, 8, 40, 2, "you have " .. meh .. "x "..price.label.." left!", "trade", 0x000000, 0xFF9010, "center", self.printTrades)
- end
- else
- self.ui:addButton(5,10,40,2, "trade failed, back to main menue", "trade", 0xDDAAAA, 0x303030, "center", self.printTrades)
- end
- end
- self.ui:drawScreen("trade")
- --confusing
- logTrade(tradeLog)
- tradeMutex = false
- end
- function marketGUI:printTrades(page)
- self.ui:flushElements(true)
- if page == nil then
- page = 1
- end
- local o = ((page-1)*8)
- local tradesTemp = trades
- for s=1,#tradesTemp do
- local j = o+s
- if j > #tradesTemp then
- break
- end
- if s > 8 then
- break
- end
- local offer = tradesTemp[j].offer
- local price = tradesTemp[j].price
- local stockCnt = getStockSize(offer)
- if(stockCnt >= 1000) then
- stockCnt = ">1k"
- end
- l = j - ((page-1) * 8)
- local bgcolor = 0x202020;
- if s % 2 == 0 then
- bgcolor = 0x303030
- end
- self.ui:addButton(2, self.yOffset+(l*2)-1, 40, 1, "<| " .. offer.size .. " x " .. offer.label, 'printTrades', 0x10EF10, bgcolor, "left", self.openTrade, {offer, price})
- self.ui:addButton(2, self.yOffset+(l*2), 40, 1, " |> " .. price.size .. " x " .. price.label, 'printTrades', 0xEF1010, bgcolor, "left", self.openTrade, {offer, price})
- self.ui:addButton(42, self.yOffset+(l*2)-1, 8, 2, "(" .. stockCnt .. ")", 'printTrades', 0x939393, bgcolor, "right")
- end
- if page > 1 then
- self.ui:addButton(2, 21, 15, 2, "<< Page -", "printTrades", 0xFFFFFF, 0x303030, "left", self.printTrades, page-1)
- end
- self.ui:addButton(21, 21, 10, 2, page.." / "..math.ceil(#tradesTemp/8), "printTrades", 0xEEEEEE, 0x202020, "center", self.printTrades)
- if (#tradesTemp/8)-page > 0 then
- self.ui:addButton(35, 21, 15, 2, "Page + >>", "printTrades", 0xFFFFFF, 0x303030, "right", self.printTrades, page+1)
- end
- self.ui:addButton(52, 8, 28, 2, "How this works", "printTrades", 0xEEEEEE, 0x003676, "center")
- self.ui:addButton(52, 10, 28, 1, "1.) put your items in the", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 11, 28, 1, " left QSU", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 12, 28, 1, "2.) select a trade from", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 13, 28, 1, " the list", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 14, 28, 1, "3.) select the amount you", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 15, 28, 1, " want to buy on", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 16, 28, 1, " the right", "printTrades", 0xEEEEEE, 0x0058BD, "left")
- self.ui:addButton(52, 17, 28, 1, "", 0xEEEEEE, 0x0058BD, "left")
- self.ui:drawScreen('printTrades')
- end
- function marketGUI:openTrade(data)
- local offer = data[1]
- local price = data[2]
- if not offer or not price then
- return
- end
- self.openTradeListing(1, offer, price, 4)
- self.openTradeListing(2, offer, price, 7)
- self.openTradeListing(8, offer, price, 10)
- self.openTradeListing(16, offer, price, 13)
- self.openTradeListing(32, offer, price, 16)
- self.openTradeListing(64, offer, price, 19)
- self.ui:addButton(70, 22, 10, 2, 'cancel', 'openTrade', 0xEFEF00, 0x402020, "center", self.printTrades)
- if self.lastTouchUser == config.admin then
- self.ui:addButton(50, 22, 15, 2, 'remove', 'openTrade', 0x0, 0xEE2020, "center", removeTrade, { offer = offer, price = price })
- end
- self.ui:drawScreen("openTrade")
- end
- function marketGUI:openTradeListing(cnt, offer, price, posY)
- if cnt >= offer.size and price.size*cnt <= 64 then
- self.ui:addButton(50, posY, 30, 1, 'get '..cnt..'x ' .. offer.label, 'openTrade', 0x2EA604, 0x202020, "left", self.trade, { cnt = cnt, offer = offer, price = price})
- 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})
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement