davedumas0

buildcraft tank scanner for opencomputers

Sep 30th, 2025
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. -- /home/tank_report.lua
  2. local component = require("component")
  3.  
  4. -- ===== Config =====
  5. local OUTPATH = "/home/tank_report.txt"
  6. local MAX_SIDES = 6 -- how many sides/indices to probe per controller
  7.  
  8. -- ===== ANSI (console only) =====
  9. local RESET = "\27[0m"
  10. local RED = "\27[31m"
  11. local YELLOW = "\27[33m"
  12. local BLUE = "\27[34m"
  13. local CYAN = "\27[36m"
  14.  
  15. -- ===== helpers =====
  16. -- helper to clean temp strings like "($cSearing$r)" or "§bCool" or "§6Hot" → "Searing" / "Cool" / "Hot"
  17. local function cleanTemp(raw)
  18. if not raw then return nil end
  19. -- strip parentheses
  20. raw = raw:gsub("[()]", "")
  21. -- strip Minecraft formatting codes
  22. raw = raw:gsub("%$%a", "") -- $c, $r, etc.
  23. raw = raw:gsub("§.", "") -- §b, §c, §6, §l, etc. (any § + 1 char)
  24. -- trim whitespace
  25. raw = raw:match("^%s*(.-)%s*$")
  26. return raw
  27. end
  28.  
  29.  
  30.  
  31. local function splitLabel(label)
  32. -- returns base, temp (temp may be nil)
  33. local base, temp = label:match("^(.-)%s*%((.-)%)$")
  34. if base then
  35. return base, cleanTemp(temp)
  36. else
  37. return label, nil
  38. end
  39. end
  40.  
  41. local function colorizeTemp(temp)
  42. if not temp then return nil end
  43. local lower = temp:lower()
  44. if lower:find("searing") then
  45. return RED .. temp .. RESET
  46. elseif lower:find("hot") then
  47. return YELLOW .. temp .. RESET
  48. elseif lower:find("cold") then
  49. return BLUE .. temp .. RESET
  50. elseif lower:find("cool") then
  51. return CYAN .. temp .. RESET
  52. else
  53. return temp
  54. end
  55. end
  56.  
  57. local function percent(amount, capacity)
  58. if type(amount) ~= "number" or type(capacity) ~= "number" or capacity <= 0 then
  59. return "N/A"
  60. end
  61. return string.format("%.2f%%", (amount / capacity) * 100)
  62. end
  63.  
  64. -- ===== collect all tank_controller addresses =====
  65. local tankAddresses = {}
  66. for addr, ctype in component.list() do
  67. if ctype == "tank_controller" then
  68. table.insert(tankAddresses, addr)
  69. end
  70. end
  71.  
  72. -- ===== build and write report =====
  73. local lines = {}
  74. table.insert(lines, "OpenComputers Tank Controller Report")
  75. table.insert(lines, "Generated: " .. os.date("%Y-%m-%d %H:%M:%S"))
  76. table.insert(lines, "----------------------------------------")
  77.  
  78. if #tankAddresses == 0 then
  79. table.insert(lines, "No tank_controller components found.")
  80. else
  81. for _, addr in ipairs(tankAddresses) do
  82. local tc = component.proxy(addr)
  83. table.insert(lines, "")
  84. table.insert(lines, ("Controller: %s"):format(addr))
  85.  
  86. local anyFound = false
  87. for side = 1, MAX_SIDES do
  88. local ok, info = pcall(tc.getFluidInTank, side)
  89. if ok and info and info[1] then
  90. local t = info[1] or {}
  91. local label = t.label or "<unknown>"
  92. local base, temp = splitLabel(label)
  93.  
  94. local amt = tonumber(t.amount) or tonumber(t.fluidAmount) or 0
  95. local cap = tonumber(t.capacity) or tonumber(t.max) or 0
  96.  
  97. -- file (plain)
  98. local tempPlain = temp or ""
  99. local pct = percent(amt, cap)
  100. table.insert(lines, (" Side %d: %s%s%s %s/%s (%s)")
  101. :format(side, base, temp and (" ("..tempPlain..")") or "", "", tostring(amt), tostring(cap), pct))
  102.  
  103. -- console (colored)
  104. local ctemp = colorizeTemp(temp)
  105. print(("Controller %s | Side %d | %s%s%s | %s/%s (%s)"):format(
  106. addr, side, base, ctemp and " " or "", ctemp or "", tostring(amt), tostring(cap), pct))
  107.  
  108. anyFound = true
  109. end
  110. end
  111.  
  112. if not anyFound then
  113. table.insert(lines, " No readable tank contents on probed sides (1.." .. MAX_SIDES .. ").")
  114. print(("Controller %s | %s"):format(addr, "no readable tank contents"))
  115. end
  116. end
  117. end
  118.  
  119. -- write file
  120. local f, err = io.open(OUTPATH, "w")
  121. if not f then
  122. io.stderr:write("Failed to open " .. OUTPATH .. " for writing: " .. tostring(err) .. "\n")
  123. else
  124. for _, ln in ipairs(lines) do f:write(ln .. "\n") end
  125. f:close()
  126. print("Report written to " .. OUTPATH)
  127. end
  128.  
Advertisement
Add Comment
Please, Sign In to add comment