-- 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
Comments