jille_Jr icon

CC: Cannon mail [Server] - mail.lua

jille_Jr | PRO | 02/22/16 07:36:05 PM UTC | 0 ⭐ | 594 👁️ | Never ⏰ | []
Lua |

3.84 KB

|

None

|

0 👍

/

0 👎

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