Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- /home/tank_report.lua
- local component = require("component")
- -- ===== Config =====
- local OUTPATH = "/home/tank_report.txt"
- local MAX_SIDES = 6 -- how many sides/indices to probe per controller
- -- ===== ANSI (console only) =====
- local RESET = "\27[0m"
- local RED = "\27[31m"
- local YELLOW = "\27[33m"
- local BLUE = "\27[34m"
- local CYAN = "\27[36m"
- -- ===== helpers =====
- -- helper to clean temp strings like "($cSearing$r)" or "§bCool" or "§6Hot" → "Searing" / "Cool" / "Hot"
- local function cleanTemp(raw)
- if not raw then return nil end
- -- strip parentheses
- raw = raw:gsub("[()]", "")
- -- strip Minecraft formatting codes
- raw = raw:gsub("%$%a", "") -- $c, $r, etc.
- raw = raw:gsub("§.", "") -- §b, §c, §6, §l, etc. (any § + 1 char)
- -- trim whitespace
- raw = raw:match("^%s*(.-)%s*$")
- return raw
- end
- local function splitLabel(label)
- -- returns base, temp (temp may be nil)
- local base, temp = label:match("^(.-)%s*%((.-)%)$")
- if base then
- return base, cleanTemp(temp)
- else
- return label, nil
- end
- end
- local function colorizeTemp(temp)
- if not temp then return nil end
- local lower = temp:lower()
- if lower:find("searing") then
- return RED .. temp .. RESET
- elseif lower:find("hot") then
- return YELLOW .. temp .. RESET
- elseif lower:find("cold") then
- return BLUE .. temp .. RESET
- elseif lower:find("cool") then
- return CYAN .. temp .. RESET
- else
- return temp
- end
- end
- local function percent(amount, capacity)
- if type(amount) ~= "number" or type(capacity) ~= "number" or capacity <= 0 then
- return "N/A"
- end
- return string.format("%.2f%%", (amount / capacity) * 100)
- end
- -- ===== collect all tank_controller addresses =====
- local tankAddresses = {}
- for addr, ctype in component.list() do
- if ctype == "tank_controller" then
- table.insert(tankAddresses, addr)
- end
- end
- -- ===== build and write report =====
- local lines = {}
- table.insert(lines, "OpenComputers Tank Controller Report")
- table.insert(lines, "Generated: " .. os.date("%Y-%m-%d %H:%M:%S"))
- table.insert(lines, "----------------------------------------")
- if #tankAddresses == 0 then
- table.insert(lines, "No tank_controller components found.")
- else
- for _, addr in ipairs(tankAddresses) do
- local tc = component.proxy(addr)
- table.insert(lines, "")
- table.insert(lines, ("Controller: %s"):format(addr))
- local anyFound = false
- for side = 1, MAX_SIDES do
- local ok, info = pcall(tc.getFluidInTank, side)
- if ok and info and info[1] then
- local t = info[1] or {}
- local label = t.label or "<unknown>"
- local base, temp = splitLabel(label)
- local amt = tonumber(t.amount) or tonumber(t.fluidAmount) or 0
- local cap = tonumber(t.capacity) or tonumber(t.max) or 0
- -- file (plain)
- local tempPlain = temp or ""
- local pct = percent(amt, cap)
- table.insert(lines, (" Side %d: %s%s%s %s/%s (%s)")
- :format(side, base, temp and (" ("..tempPlain..")") or "", "", tostring(amt), tostring(cap), pct))
- -- console (colored)
- local ctemp = colorizeTemp(temp)
- print(("Controller %s | Side %d | %s%s%s | %s/%s (%s)"):format(
- addr, side, base, ctemp and " " or "", ctemp or "", tostring(amt), tostring(cap), pct))
- anyFound = true
- end
- end
- if not anyFound then
- table.insert(lines, " No readable tank contents on probed sides (1.." .. MAX_SIDES .. ").")
- print(("Controller %s | %s"):format(addr, "no readable tank contents"))
- end
- end
- end
- -- write file
- local f, err = io.open(OUTPATH, "w")
- if not f then
- io.stderr:write("Failed to open " .. OUTPATH .. " for writing: " .. tostring(err) .. "\n")
- else
- for _, ln in ipairs(lines) do f:write(ln .. "\n") end
- f:close()
- print("Report written to " .. OUTPATH)
- end
Advertisement
Add Comment
Please, Sign In to add comment