milo: reduce modem traffic

This commit is contained in:
kepler155c
2018-11-25 12:33:22 -05:00
parent 3830a02c34
commit bf4f45f5e5
2 changed files with 49 additions and 21 deletions

View File

@@ -196,7 +196,7 @@ function page:setStatus(status)
self:sync() self:sync()
end end
function page:sendRequest(data) function page:sendRequest(data, statusMsg)
local response local response
if not config.server then if not config.server then
@@ -230,6 +230,9 @@ function page:sendRequest(data)
end end
end end
if socket then if socket then
if statusMsg then
self:setStatus(statusMsg)
end
if socket:write(data) then if socket:write(data) then
response = socket:read(2) response = socket:read(2)
if response then if response then
@@ -244,12 +247,10 @@ function page:sendRequest(data)
end end
end end
socket:close() socket:close()
socket = nil
end end
end end
self:setStatus(msg or 'Failed to connect') self:setStatus(msg or 'Failed to connect')
Event.onTimeout(2, function()
self:setStatus('')
end)
end) end)
return response return response
@@ -271,8 +272,8 @@ function page.grid:getDisplayValues(row)
return row return row
end end
function page:transfer(item, count) function page:transfer(item, count, msg)
local response = self:sendRequest({ request = 'transfer', item = item, count = count }) local response = self:sendRequest({ request = 'transfer', item = item, count = count }, msg)
if response then if response then
item.count = response.current - response.count item.count = response.current - response.count
self.grid:draw() self.grid:draw()
@@ -333,22 +334,19 @@ shell.openForegroundTab('packages/milo/MiloRemote')]])
elseif event.type == 'eject' or event.type == 'grid_select' then elseif event.type == 'eject' or event.type == 'grid_select' then
local item = self.grid:getSelected() local item = self.grid:getSelected()
if item then if item then
self:setStatus('requesting 1 ...') self:transfer(item, 1, 'requesting 1 ...')
self:transfer(item, 1)
end end
elseif event.type == 'eject_stack' then elseif event.type == 'eject_stack' then
local item = self.grid:getSelected() local item = self.grid:getSelected()
if item then if item then
self:setStatus('requesting stack ...') self:transfer(item, 'stack', 'requesting stack ...')
self:transfer(item, 'stack')
end end
elseif event.type == 'eject_all' then elseif event.type == 'eject_all' then
local item = self.grid:getSelected() local item = self.grid:getSelected()
if item then if item then
self:setStatus('requesting all ...') self:transfer(item, 'all', 'requesting all ...')
self:transfer(item, 'all')
end end
elseif event.type == 'eject_specified' then elseif event.type == 'eject_specified' then
@@ -357,21 +355,18 @@ shell.openForegroundTab('packages/milo/MiloRemote')]])
if item and count then if item and count then
self.statusBar.amount:reset() self.statusBar.amount:reset()
self:setFocus(self.statusBar.filter) self:setFocus(self.statusBar.filter)
self:setStatus('requesting ' .. count .. ' ...') self:transfer(item, count, 'requesting ' .. count .. ' ...')
self:transfer(item, count)
else else
self:setStatus('nope ...') self:setStatus('nope ...')
end end
elseif event.type == 'rescan' then elseif event.type == 'rescan' then
self:setFocus(self.statusBar.filter) self:setFocus(self.statusBar.filter)
self:setStatus('rescanning ...')
self:refresh('scan') self:refresh('scan')
self.grid:draw() self.grid:draw()
elseif event.type == 'refresh' then elseif event.type == 'refresh' then
self:setFocus(self.statusBar.filter) self:setFocus(self.statusBar.filter)
self:setStatus('updating ...')
self:refresh('list') self:refresh('list')
self.grid:draw() self.grid:draw()
@@ -412,11 +407,33 @@ function page:enable()
end) end)
end end
local function splitKey(key)
local t = Util.split(key, '(.-):')
local item = { }
if #t[#t] > 8 then
item.nbtHash = table.remove(t)
end
item.damage = tonumber(table.remove(t))
item.name = table.concat(t, ':')
return item
end
function page:expandList(list)
local t = { }
for k,v in pairs(list) do
local item = splitKey(k)
item.count, item.displayName = v:match('(%d+):(.+)')
item.count = tonumber(item.count) or 0
t[k] = item
end
return t
end
function page:refresh(requestType) function page:refresh(requestType)
local items = self:sendRequest({ request = requestType }) local items = self:sendRequest({ request = requestType }, 'refreshing...')
if items then if items then
self.items = items self.items = self:expandList(items)
self:applyFilter() self:applyFilter()
end end
end end

View File

@@ -13,9 +13,12 @@ local context = Milo:getContext()
local function getNameSafe(v) local function getNameSafe(v)
local name local name
pcall(function() local s, m = pcall(function()
name = v.getName() name = v.getName()
end) end)
if not s then
_G._debug(m)
end
return name return name
end end
@@ -27,6 +30,14 @@ local function getManipulatorForUser(user)
end end
end end
local function compactList(list)
local c = { }
for k,v in pairs(list) do
c[k]= v.count .. ':' .. v.displayName
end
return c
end
local function client(socket) local function client(socket)
_G._debug('REMOTE: connection from ' .. socket.dhost) _G._debug('REMOTE: connection from ' .. socket.dhost)
@@ -58,11 +69,11 @@ local function client(socket)
if data.request == 'scan' then -- full scan of all inventories if data.request == 'scan' then -- full scan of all inventories
local items = Milo:mergeResources(Milo:listItems(true)) local items = Milo:mergeResources(Milo:listItems(true))
socket:write(items) socket:write(compactList(items))
elseif data.request == 'list' then elseif data.request == 'list' then
local items = Milo:mergeResources(Milo:listItems()) local items = Milo:mergeResources(Milo:listItems())
socket:write(items) socket:write(compactList(items))
elseif data.request == 'deposit' then elseif data.request == 'deposit' then
local function deposit() local function deposit()