vx13

casegen.lua

Mar 12th, 2018
48
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local component = require "component"
  2. local fs = require "filesystem"
  3.  
  4. local sideToText = {
  5.   [0] = "bottom",
  6.   "top",
  7.   "north",
  8.   "south",
  9.   "west",
  10.   "east"
  11. }
  12.  
  13. local function mustWrite(f, s)
  14.   if not f:write(s) then
  15.     io.stderr:write("Ошибка записи в файл.\n")
  16.     os.exit(1)
  17.   end
  18. end
  19.  
  20. local function eJsonString(s)
  21.   s = string.gsub(s, '\\', '\\\\')
  22.   return string.gsub(s, '"', '\\"')
  23. end
  24.  
  25. local function makeItemKey(item)
  26.   local key = tostring(item.name)
  27.   if item.damage > 0 then
  28.     key = key..":"..item.damage
  29.   end
  30.   return key
  31. end
  32.  
  33. local function writeItemDesc(f, item, comma)
  34.   mustWrite(f, '"')
  35.   mustWrite(f, item.key)
  36.   mustWrite(f, '" : { "name" : "')
  37.   mustWrite(f, eJsonString(item.label))
  38.   mustWrite(f, '", "min" : 1, "max" : 1, "fortune" : 0.5}')
  39.   if comma then
  40.     mustWrite(f, ',')
  41.   end
  42.   mustWrite(f, '\n')
  43. end
  44.  
  45. local function writeCaseFile(items, fname)
  46.   local f, err = io.open(fname, "w")
  47.   if not f then
  48.     io.stderr:write("Не могу создать файл: '"..fname.."' : "..err.."\n")
  49.     os.exit(1)
  50.   end
  51.   f:setvbuf("line")
  52.   local n = #items
  53.   for i = 1, n do
  54.     writeItemDesc(f, items[i], i < n)
  55.   end
  56.   f:close()
  57. end
  58.  
  59. local function scanInv(tp, side)
  60.   local items = { }
  61.   local keys = { }
  62.   for slot = 1, tp.getInventorySize(side) do
  63.     local stack = tp.getStackInSlot(side, slot)
  64.     if stack then
  65.       local itemKey = makeItemKey(stack)
  66.       if keys[itemKey] then
  67.         return nil, "Дублирование предмета '"..itemKey.."'"
  68.       end
  69.       keys[itemKey] = true
  70.       table.insert(items, { key = itemKey, label = stack.label })
  71.     end
  72.   end
  73.   return items
  74. end
  75.  
  76. -- ======машинное время (время хоста)=======
  77.  
  78. --(установить для своего часового пояса, -12 : +13, например: -2 или 6)
  79. local TIME_ZONE = 2
  80.  
  81. --(не изменять!)
  82. local t_correction = TIME_ZONE * 3600
  83.  
  84. local function getTimeHost()
  85.     local file = io.open('/home/unix.tmp', 'w')
  86.     file:write('')
  87.     file:close()
  88.     local lastmod = tonumber(string.sub(fs.lastModified('/home/unix.tmp'), 1, -4)) + t_correction
  89.    
  90.     -- Вариант 4, все в куче, как мы привыкли, в правильном формате
  91.     local dt = os.date('%Y_%m_%d_%H_%M_%S', lastmod)
  92.     return dt
  93. end
  94.  
  95. local function main()
  96.   local caseDir = "/home/cases_"..getTimeHost()
  97.   local ok, err = fs.makeDirectory(caseDir)
  98.   if not ok then
  99.     io.stderr:write("Не могу создать каталог '"..caseDir.."' : "..err.."\n")
  100.     os.exit(1)
  101.   end
  102.   for addr in component.list("transposer") do
  103.     local tp = component.proxy(addr)
  104.     for side = 0, 5 do
  105.       if tp.getInventorySize(side) ~= nil then
  106.         local id =  tp.address:sub(1, 3).."_"..sideToText[side]:sub(1, 1)
  107.         local items, errScan = scanInv(tp, side)
  108.         if not items then
  109.           io.stderr:write(errScan.." в сундуке "..id.."\n")
  110.           os.exit(1)
  111.         end
  112.         local fname = fs.concat(caseDir, "case_"..id)
  113.         writeCaseFile(items, fname)
  114.       end
  115.     end
  116.   end
  117. end
  118.  
  119. main()
RAW Paste Data