diff --git a/api.lua b/api.lua index 1559954..5a7a634 100644 --- a/api.lua +++ b/api.lua @@ -93,13 +93,9 @@ function mail.send(...) body = m.body, time = os.time(), } - - -- send the mail to all recipients - for recipient in pairs(recipients) do - local messages = mail.getMessages(recipient) - table.insert(messages, 1, msg) - mail.setMessages(recipient, messages) - end + + -- insert in global storage + mail.addMessage(msg) -- notify recipients that happen to be online local mail_alert = f(mail.receive_mail_message, m.from, m.subject) diff --git a/gui.lua b/gui.lua index 2e5551a..7fa50a0 100644 --- a/gui.lua +++ b/gui.lua @@ -97,7 +97,7 @@ end function mail.show_inbox(name) local formspec = { mail.inbox_formspec } - local messages = mail.getMessages(name) + local messages = mail.getPlayerMessages(name) message_drafts[name] = nil @@ -148,7 +148,7 @@ function mail.show_sent(name) local playerContacts = mail.getContacts(name) local nbMails = 0 for k, contact, i, l in mail.pairsByKeys(playerContacts) do - local contactMessages = mail.getMessages(contact.name) + local contactMessages = mail.getPlayerMessages(contact.name) message_drafts[name] = nil @@ -317,7 +317,7 @@ function mail.compile_contact_list(name, selected, playernames) end function mail.show_message(name, msgnumber) - local messages = mail.getMessages(name) + local messages = mail.getPlayerMessages(name) local message = messages[msgnumber] local formspec = [[ size[8,9] @@ -444,7 +444,7 @@ function mail.handle_receivefields(player, formname, fields) elseif formname == "mail:inbox" or formname == "mail:sent" then local name = player:get_player_name() - local messages = mail.getMessages(name) + local messages = mail.getPlayerMessages(name) if fields.messages then local evt = minetest.explode_table_event(fields.messages) @@ -525,7 +525,7 @@ function mail.handle_receivefields(player, formname, fields) elseif formname == "mail:message" then local name = player:get_player_name() - local messages = mail.getMessages(name) + local messages = mail.getPlayerMessages(name) if fields.back then if boxtab_index == 1 then diff --git a/onjoin.lua b/onjoin.lua index c8e1877..4576c86 100644 --- a/onjoin.lua +++ b/onjoin.lua @@ -1,6 +1,6 @@ minetest.register_on_joinplayer(function(player) minetest.after(2, function(name) - local messages = mail.getMessages(name) + local messages = mail.getPlayerMessages(name) local unreadcount = 0 diff --git a/storage.lua b/storage.lua index 8e028eb..19f68f5 100644 --- a/storage.lua +++ b/storage.lua @@ -1,4 +1,3 @@ - function mail.getMailFile(playername) local saneplayername = string.gsub(playername, "[.|/]", "") return mail.maildir .. "/" .. saneplayername .. ".json" @@ -9,8 +8,24 @@ function mail.getContactsFile(playername) return mail.maildir .. "/contacts/" .. saneplayername .. ".json" end +function mail.getMessages() + local messages = mail.read_json_file(mail.maildir .. "/mail.messages.json") + if messages then + for _, msg in ipairs(messages) do + if not msg.time then + -- add missing time field if not available (happens with old data) + msg.time = 0 + end + end -function mail.getMessages(playername) + -- sort by received date descending + table.sort(messages, function(a,b) return a.time > b.time end) + end + + return messages +end + +function mail.getPlayerMessages(playername) local messages = mail.read_json_file(mail.getMailFile(playername)) if messages then for _, msg in ipairs(messages) do @@ -39,6 +54,16 @@ function mail.setMessages(playername, messages) end end +function mail.addMessage(message) + local messages = mail.getMessages() + table.insert(messages, 1, message) + if mail.write_json_file(mail.maildir .. "/mail.messages.json", messages) then + return true + else + minetest.log("error","[mail] Save failed - messages may be lost!") + return false + end +end function mail.getContacts(playername) return mail.read_json_file(mail.getContactsFile(playername))