Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- MCNet Mail
- Client program
- --]]
- -- Load dependencies
- dofile("/common/all")
- program.load("../mcnet/message", "../mcnet/names", "../mcnet/device")
- program.load("../mcnet/devices/client")
- program.load("../ccgui/all")
- program.load("mailbox")
- program.load("ui/console", "ui/main")
- program.load("ui/read", "ui/list", "ui/box", "ui/write")
- -- Create client
- local configPath = "/client.conf"
- local defaultConfig = {
- name = nil,
- domain = nil,
- detectTimeout = 1
- }
- local config = common.loadStore(configPath, defaultConfig)
- local client = mcnet.device.Client:new{
- name = config.name,
- domain = config.domain
- }
- -- Message boxes
- local mailPath = "/mail.tbl"
- local mail = mcmail.newMail(mailPath)
- mail:load()
- local inbox = mail:getBox("inbox")
- -- Get amount of unread mails
- local function getUnreadCount()
- local count = 0
- for i,msg in ipairs(inbox.messages) do
- if not msg.read then
- count = count + 1
- end
- end
- return count
- end
- -- Current screen
- local currentScreen = nil
- local function setCurrentScreen(newScreen)
- -- Hide previous screen
- if currentScreen ~= nil then
- currentScreen:hide()
- end
- -- Set new screen
- currentScreen = newScreen
- -- Show new screen
- if currentScreen ~= nil then
- currentScreen:show()
- currentScreen:repaint()
- end
- end
- -- Console screen
- local console = ui.ConsoleScreen:new{
- title = "MCNet Mail",
- isVisible = false
- }
- console:on("quit", function()
- client:stop()
- end)
- -- Main screen
- local main = ui.MainScreen:new{
- title = "MCNet Mail",
- isVisible = false
- }
- main:setAddress(mcnet.address.format(client.address))
- main:setUnread(getUnreadCount())
- main:on("quit", function()
- client:stop()
- end)
- -- Read
- local inboxPane = ui.BoxListPane:new{
- tabStyle = ccgui.Button,
- spacing = 2,
- mailbox = inbox,
- _name = "inboxPane"
- }
- main:addTab("Read", inboxPane)
- local function updateUnreadCount()
- main:setUnread(getUnreadCount())
- end
- inboxPane:on("readMessage", updateUnreadCount)
- inboxPane:on("unreadMessage", updateUnreadCount)
- inboxPane:on("addMessage", updateUnreadCount)
- inboxPane:on("removeMessage", updateUnreadCount)
- -- Write
- local writePane = ui.WritePane:new{
- _name = "writePane"
- }
- writePane:on("sendMessage", function()
- local result = client:post(writePane:buildMessage())
- if result then
- writePane:clearFields()
- end
- end)
- main:addTab("Write", writePane)
- inboxPane:on("replyMessage", function(msg)
- -- Set recepient address on write pane
- writePane:setTo(msg.from:format())
- -- Switch to write pane
- main:setCurrentTab(writePane)
- writePane:focusMessage()
- end)
- -- Device handlers
- client:on("registerServer", function(serverId)
- console:print("Registering server at "..serverId.."...")
- end)
- client:on("registeredServer", function()
- setCurrentScreen(main)
- console:print(" Successfully registered at server")
- end)
- client:on("unregisteredServer", function(serverId)
- setCurrentScreen(console)
- console:print("Unregistered server at "..serverId)
- end)
- client:on("error", function(errorType, errorMessage)
- console:print("[ERROR] "..errorMessage)
- end)
- -- Mail message receiver
- client:addMessageHandler("mailMessage", function(self, senderId, msg)
- -- Mark as unread
- msg.read = false
- -- Store message
- inbox:add(msg)
- -- Add message in inbox pane
- inboxPane:addMessage(msg)
- end)
- -- Start client
- console:print("Starting...")
- setCurrentScreen(console)
- client:start(config.detectTimeout)
- setCurrentScreen(currentScreen) -- reset screen, since client:start consumes frame timer events
- console:write(" Detected:")
- for i,deviceId in pairs(client:neighbours()) do
- console:write(" "..deviceId)
- end
- console:print()
- while client.isRunning do
- -- Wait for event
- local event, p1, p2, p3, p4, p5 = os.pullEvent()
- term.setCursorBlink(false)
- -- Trigger on client and GUI
- client:trigger(event, p1, p2, p3, p4, p5)
- currentScreen:trigger(event, p1, p2, p3, p4, p5)
- end
- -- Clear screen
- currentScreen:reset()
Advertisement
Add Comment
Please, Sign In to add comment