-- mail.lua --[[-- Data structure for mail files: { ["sender"] = (string), ["receivers"] = (table) { [1] = (string), [2] = (string), etc. }, ["subject"] = (string), ["message"] = (string), } Printer page size: 25x21 --]]-- --(( Settings ))-- local filename = "mail.dat" local drivePath = "drive_1" local printerPath = "printer_2" --(( Variables ))-- err = { missing_item = "No item inside the disk drive!", invalid_item = "The received item is not valid!", missing_data = "No data found on the received disk!", invalid_data = "The data on the received disk is either corrupt or invalid!", } local printer = peripheral.wrap(printerPath) or error("Unable to wrap printer!") local drive = peripheral.wrap(drivePath) or error("Unable to wrap disk drive!") --(( Functions ))-- -- get the message from the disk drive function readMail() if not drive.isDiskPresent() then return {err="missing_item"} end if not drive.hasData() then return {err="invalid_item"} end -- Get file path local path = drive.getMountPath() path = fs.combine(path, filename) if not fs.exists(path) then return {err="missing_data"} end -- Read data local file = fs.open(path,"r") local rawData = file.readAll() if type(rawData) ~= "string" then return {err="invalid_data"} end -- Unserialize it local data = textutils.unserialize(rawData) if type(data) ~= "table" or type(data.sender) ~= "string" or type(data.receivers) ~= "table" or type(data.message) ~= "string" then return {err="invalid_data"} end -- Prepare message local mail = { sender = data.sender, receivers = {}, subject = data.subject, message = data.message, } -- validate the receivers for _,receiver in pairs(data.receivers) do if type(receiver) ~= "string" then return {err="invalid_data"} end table.insert(mail.receivers,receiver) end if #mail.receivers == 0 then return {err="invalid_data"} end return mail end -- write a letter function writeMail(mail) for _,receiver in ipairs(mail.receivers) do local dir = inv.getDirection(receiver) if type(dir) == "string" then local rows = prepareMessage(mail) local pages = math.ceil(#rows/21) -- the pages are 21 high for page = 1,pages do if not printer.newPage() then error("Unable to start new page!") end local title = '"' util.wordwrap(mail.subject, function(row) title=title..row end, 32, 0) title = title .. '" from ' util.wordwrap(mail.sender, function(row) title=title..row end, 32, 0) if pages > 1 then title = title .. " (page " .. page .. " of " .. pages .. ")" end printer.setPageTitle(title) local rows = prepareMessage(mail) for i,row in ipairs(rows) do if row == 666 then row = "[ Page " .. page .. " / " .. pages .. " ]--" row = string.rep("-",25-#row)..row printer.setCursorPos(1,21) else printer.setCursorPos(1,i-(page-1)*21) end printer.write(row) end if not printer.endPage() then error("Unable to end page!") end sleep(.5) inv.emptyDropper(dir) end else print("No mailbox for \"" .. receiver .. "\"!") end end end -- prepare the mail for writing function prepareMessage(mail) local w,h = 25,21 -- size of page local rows = {} local message = mail.message local offset = 0 repeat util.wordwrap("From: "..mail.sender, rows, w, 0) util.wordwrap("Subject: "..mail.subject, rows, w, 1) table.insert(rows, string.rep("-",w)) message = util.wordwrap(message, rows, w, h - #rows - 2 + offset) table.insert(rows,666) offset = #rows until message == nil return rows end function getDrive() return drive end function getPrinter() return printer end -- eof