-- === Miner Monitor (v2) ===
-- Auto-detects peripherals, monitors the miner named "chunkminer"
-- Modem: top
-- Monitor: left
local PROTOCOL = "miner_update"
-- === Peripheral Detection ===
local modemSide, monitorSide
for _, side in ipairs(peripheral.getNames()) do
local t = peripheral.getType(side)
if t == "modem" then modemSide = side end
if t == "monitor" then monitorSide = side end
end
if not modemSide then error("No modem found!") end
if not monitorSide then error("No monitor found!") end
-- === Initialize Devices ===
rednet.open(modemSide)
local mon = peripheral.wrap(monitorSide)
mon.setTextScale(0.5)
mon.clear()
print("Modem opened on "..modemSide..", monitor detected on "..monitorSide..".")
print("Listening for miner updates...")
-- === Drawing ===
local function drawHeader(mon)
mon.setCursorPos(1,1)
mon.setTextColor(colors.cyan)
mon.write("=== ChunkMiner Remote Monitor ===")
mon.setTextColor(colors.white)
end
local function drawStatus(data)
mon.clear()
drawHeader(mon)
mon.setCursorPos(1,3)
mon.write("Miner: " .. (data.label or "Unnamed"))
mon.setCursorPos(1,4)
mon.write("Status: " .. (data.msg or "Waiting..."))
mon.setCursorPos(1,5)
mon.write("Layer: " .. tostring(data.layer or "?"))
if data.maxDepth then
local remaining = (data.maxDepth - (data.layer or 0))
local percent = math.floor(((data.layer or 0) / data.maxDepth) * 100)
mon.setCursorPos(1,6)
mon.write(string.format("Remaining: %d layers (%d%%)", remaining, percent))
-- Draw progress bar
local barWidth = 30
local filled = math.floor((percent / 100) * barWidth)
mon.setCursorPos(1,8)
mon.write("[")
for i = 1, barWidth do
if i <= filled then
mon.setBackgroundColor(colors.lime)
mon.write(" ")
mon.setBackgroundColor(colors.black)
else
mon.write(" ")
end
end
mon.write("]")
end
mon.setCursorPos(1,10)
mon.write("Last update: " .. os.date("%H:%M:%S"))
end
-- === Main Loop ===
while true do
local id, raw, protocol = rednet.receive(PROTOCOL)
if protocol == PROTOCOL then
local ok, data = pcall(textutils.unserialize, raw)
if ok and type(data) == "table" and data.label == "chunkminer" then
drawStatus(data)
end
end
end