osmarks

MW Server

Apr 11th, 2018
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local f = fs.open("conf", "r")
  2. local conf = textutils.unserialise(f.readAll())
  3. f.close()
  4.  
  5. rednet.open(conf.modem)
  6.  
  7. local inventories = {}
  8. for _, n in pairs(peripheral.getNames()) do
  9.     local p = peripheral.wrap(n)
  10.     if
  11.         string.find(n, "chest") or
  12.         string.find(n, "shulker") then
  13.         inventories[n] = p
  14.     end
  15. end
  16.  
  17. local nameCache = {}
  18.  
  19. function cache(item, chest, slot)
  20.     local idx = item.name .. ":" .. item.damage
  21.    
  22.     if nameCache[idx] then
  23.         return nameCache[idx]
  24.     else
  25.         local n = chest.getItemMeta(slot).displayName
  26.         nameCache[idx] = n
  27.         return n
  28.     end
  29. end
  30.  
  31. local index = {}
  32. function updateIndexFor(name)
  33.     local inv = inventories[name]
  34.     local data = inv.list()
  35.    
  36.     for slot, item in pairs(data) do
  37.         data[slot].displayName = cache(item, inv, slot)
  38.     end
  39.    
  40.     index[name] = data
  41. end
  42.  
  43. function updateIndex()
  44.     for n in pairs(inventories) do
  45.         updateIndexFor(n)
  46.         sleep()
  47.     end
  48.     print "Indexing complete."
  49. end
  50.  
  51. function find(predicate)
  52.     for name, items in pairs(index) do
  53.         for slot, item in pairs(items) do
  54.             if predicate(item) then
  55.                 return name, slot, item
  56.             end
  57.         end
  58.     end
  59. end
  60.  
  61. function findSpace()
  62.     for name, items in pairs(index) do
  63.         if #items < inventories[name].size() then
  64.             return name
  65.         end
  66.     end
  67. end
  68.  
  69. function processRequest(msg)
  70.     print(textutils.serialise(msg))
  71.  
  72.     if msg.cmd == "extract" then
  73.         local inv, slot, item = find(function(item)
  74.             return
  75.                 (not msg.meta or item.damage == msg.meta) and
  76.                 (not msg.name or item.name == msg.name) and
  77.                 (not msg.dname or string.find(item.displayName:lower(), msg.dname:lower()))
  78.         end)
  79.  
  80.         index[inv][slot] = nil
  81.  
  82.         local moved = peripheral.call(conf.bufferOutInternal, "pullItems", inv, slot, msg.qty or 64, 1)
  83.  
  84.         if msg.destInv then
  85.             moved = peripheral.call(conf.bufferOutExternal, "pushItems", msg.destInv, 1)
  86.         end
  87.  
  88.         return {moved, item}
  89.     elseif msg.cmd == "insert" then
  90.         if msg.fromInv and msg.fromSlot then
  91.             peripheral.call(conf.bufferInExternal, "pullItems", msg.fromInv, msg.fromSlot, msg.qty or 64, 1)
  92.         end
  93.  
  94.         local toInv = findSpace()
  95.         if not toInv then return "ERROR" end
  96.        
  97.         peripheral.call(conf.bufferInInternal, "pushItems", toInv, 1)
  98.  
  99.         updateIndexFor(toInv) -- I don't know a good way to figure out where exactly the items went
  100.  
  101.         return "OK"
  102.     elseif msg.cmd == "buffers" then
  103.         return { conf.bufferInExternal, conf.bufferOutExternal }
  104.     elseif msg.cmd == "reindex" then
  105.         updateIndex()
  106.         return "OK"
  107.     elseif msg.cmd == "list" then
  108.         return index
  109.     elseif msg.cmd == "name" then
  110.         msg.meta = msg.meta or 0
  111.         return msg.name and msg.meta and nameCache[msg.name .. ":" .. msg.meta]
  112.     end
  113. end
  114.  
  115. function processRequests()
  116.     while true do
  117.         local id, msg = rednet.receive "mw"
  118.         if msg and msg.cmd then
  119.             local ok, r = pcall(processRequest, msg)
  120.  
  121.             if not ok then r = "ERROR" end
  122.            
  123.             rednet.send(id, r, "mw")
  124.         end
  125.     end
  126. end
  127.  
  128. updateIndex()
  129. processRequests()
Add Comment
Please, Sign In to add comment