MattiasBuelens

MCMail client

Jul 23rd, 2012
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.94 KB | None | 0 0
  1. --[[
  2.  
  3.     MCNet Mail
  4.     Client program
  5.  
  6. --]]
  7.  
  8. -- Load dependencies
  9. dofile("/common/all")
  10. program.load("../mcnet/message", "../mcnet/names", "../mcnet/device")
  11. program.load("../mcnet/devices/client")
  12. program.load("../ccgui/all")
  13. program.load("mailbox")
  14. program.load("ui/console", "ui/main")
  15. program.load("ui/read", "ui/list", "ui/box", "ui/write")
  16.  
  17. -- Create client
  18. local configPath = "/client.conf"
  19. local defaultConfig = {
  20.     name = nil,
  21.     domain = nil,
  22.     detectTimeout = 1
  23. }
  24. local config = common.loadStore(configPath, defaultConfig)
  25. local client = mcnet.device.Client:new{
  26.     name = config.name,
  27.     domain = config.domain
  28. }
  29.  
  30. -- Message boxes
  31. local mailPath = "/mail.tbl"
  32. local mail = mcmail.newMail(mailPath)
  33. mail:load()
  34. local inbox = mail:getBox("inbox")
  35.  
  36. -- Get amount of unread mails
  37. local function getUnreadCount()
  38.     local count = 0
  39.     for i,msg in ipairs(inbox.messages) do
  40.         if not msg.read then
  41.             count = count + 1
  42.         end
  43.     end
  44.     return count
  45. end
  46.  
  47. -- Current screen
  48. local currentScreen = nil
  49. local function setCurrentScreen(newScreen)
  50.     -- Hide previous screen
  51.     if currentScreen ~= nil then
  52.         currentScreen:hide()
  53.     end
  54.     -- Set new screen
  55.     currentScreen = newScreen
  56.     -- Show new screen
  57.     if currentScreen ~= nil then
  58.         currentScreen:show()
  59.         currentScreen:repaint()
  60.     end
  61. end
  62.  
  63. -- Console screen
  64. local console = ui.ConsoleScreen:new{
  65.     title       = "MCNet Mail",
  66.     isVisible   = false
  67. }
  68. console:on("quit", function()
  69.     client:stop()
  70. end)
  71.  
  72. -- Main screen
  73. local main = ui.MainScreen:new{
  74.     title       = "MCNet Mail",
  75.     isVisible   = false
  76. }
  77. main:setAddress(mcnet.address.format(client.address))
  78. main:setUnread(getUnreadCount())
  79. main:on("quit", function()
  80.     client:stop()
  81. end)
  82.  
  83. -- Read
  84. local inboxPane = ui.BoxListPane:new{
  85.     tabStyle    = ccgui.Button,
  86.     spacing     = 2,
  87.     mailbox     = inbox,
  88.     _name       = "inboxPane"
  89. }
  90. main:addTab("Read", inboxPane)
  91.  
  92. local function updateUnreadCount()
  93.     main:setUnread(getUnreadCount())
  94. end
  95. inboxPane:on("readMessage", updateUnreadCount)
  96. inboxPane:on("unreadMessage", updateUnreadCount)
  97. inboxPane:on("addMessage", updateUnreadCount)
  98. inboxPane:on("removeMessage", updateUnreadCount)
  99.  
  100. -- Write
  101. local writePane = ui.WritePane:new{
  102.     _name       = "writePane"
  103. }
  104. writePane:on("sendMessage", function()
  105.     local result = client:post(writePane:buildMessage())
  106.     if result then
  107.         writePane:clearFields()
  108.     end
  109. end)
  110. main:addTab("Write", writePane)
  111. inboxPane:on("replyMessage", function(msg)
  112.     -- Set recepient address on write pane
  113.     writePane:setTo(msg.from:format())
  114.     -- Switch to write pane
  115.     main:setCurrentTab(writePane)
  116.     writePane:focusMessage()
  117. end)
  118.  
  119. -- Device handlers
  120. client:on("registerServer", function(serverId)
  121.     console:print("Registering server at "..serverId.."...")
  122. end)
  123.  
  124. client:on("registeredServer", function()
  125.     setCurrentScreen(main)
  126.     console:print("  Successfully registered at server")
  127. end)
  128.  
  129. client:on("unregisteredServer", function(serverId)
  130.     setCurrentScreen(console)
  131.     console:print("Unregistered server at "..serverId)
  132. end)
  133.  
  134. client:on("error", function(errorType, errorMessage)
  135.     console:print("[ERROR] "..errorMessage)
  136. end)
  137.  
  138. -- Mail message receiver
  139. client:addMessageHandler("mailMessage", function(self, senderId, msg)
  140.     -- Mark as unread
  141.     msg.read = false
  142.     -- Store message
  143.     inbox:add(msg)
  144.     -- Add message in inbox pane
  145.     inboxPane:addMessage(msg)
  146. end)
  147.  
  148. -- Start client
  149. console:print("Starting...")
  150. setCurrentScreen(console)
  151. client:start(config.detectTimeout)
  152. setCurrentScreen(currentScreen) -- reset screen, since client:start consumes frame timer events
  153.  
  154. console:write("  Detected:")
  155. for i,deviceId in pairs(client:neighbours()) do
  156.     console:write(" "..deviceId)
  157. end
  158. console:print()
  159.  
  160. while client.isRunning do
  161.     -- Wait for event
  162.     local event, p1, p2, p3, p4, p5 = os.pullEvent()
  163.     term.setCursorBlink(false)
  164.     -- Trigger on client and GUI
  165.     client:trigger(event, p1, p2, p3, p4, p5)
  166.     currentScreen:trigger(event, p1, p2, p3, p4, p5)
  167. end
  168.  
  169. -- Clear screen
  170. currentScreen:reset()
Advertisement
Add Comment
Please, Sign In to add comment