Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement