diff --git a/init.lua b/init.lua index 4410e13..4423265 100644 --- a/init.lua +++ b/init.lua @@ -8,6 +8,7 @@ mail = { -- mail directory maildir = minetest.get_worldpath().."/mails", + contactsdir = minetest.get_worldpath().."/mails/contacts", -- allow item/node attachments allow_attachments = minetest.settings:get("mail.allow_attachments") == "true", diff --git a/migrate.lua b/migrate.lua index 6ce5dde..5780732 100644 --- a/migrate.lua +++ b/migrate.lua @@ -4,6 +4,7 @@ mail.migrate = function() -- create directory, just in case minetest.mkdir(mail.maildir) + minetest.mkdir(mail.contactsdir) local file = io.open(minetest.get_worldpath().."/mail.db", "r") if file then @@ -23,3 +24,28 @@ mail.migrate = function() end end + + +mail.migrate_contacts = function(playername) + local file = io.open(mail.getContactsFile(playername), 'r') + if not file then + file:close() -- file doesn't exist! This is a case for Migrate Man! + + local messages = mail.getMessages(playername) + local contacts = {} + + if messages and not contacts then + for k,message in pairs(messages) do + mail.ensure_new_format(message) + if contacts[string.lower(message.from)] == nil then + contacts[string.lower(message.from)] = { + name = message.from, + note = "", + } + end + end + end + else + file:close() -- uh, um, nope, let's leave those alone, shall we? + end +end diff --git a/onjoin.lua b/onjoin.lua index 79ad287..2433540 100644 --- a/onjoin.lua +++ b/onjoin.lua @@ -16,4 +16,6 @@ minetest.register_on_joinplayer(function(player) end end, player:get_player_name()) + + mail.migrate_contacts(player:get_player_name()) end) diff --git a/storage.lua b/storage.lua index 8f50a74..671242b 100644 --- a/storage.lua +++ b/storage.lua @@ -1,32 +1,70 @@ -- TODO: maybe local cache? -function getMailFile(playername) +function mail.getMailFile(playername) local saneplayername = string.gsub(playername, "[.|/]", "") return mail.maildir .. "/" .. saneplayername .. ".json" end +function mail.getContactsFile(playername) + local saneplayername = string.gsub(playername, "[.|/]", "") + return mail.maildir .. "/contacts/" .. saneplayername .. ".json" +end + + mail.getMessages = function(playername) - local file = io.open(getMailFile(playername), "r") - local messages = {} - if file then - local json = file:read("*a") - messages = minetest.parse_json(json or "[]") or {} + local messages = mail.read_json_file(mail.getMailFile(playername)) + if messages then mail.hud_update(playername, messages) - file:close() end return messages end mail.setMessages = function(playername, messages) - local file = io.open(getMailFile(playername),"w") - local json = minetest.write_json(messages) - if file and file:write(json) and file:close() then + if mail.write_json_file(mail.getMailFile(playername), messages) then mail.hud_update(playername, messages) return true else - minetest.log("error","[mail] Save failed - messages may be lost!") + minetest.log("error","[mail] Save failed - messages may be lost! ("..playername..")") + return false + end +end + + +mail.getContacts = function(playername) + return mail.read_json_file(mail.getContactsFile(playername)) +end + +mail.setContacts = function(playername, contacts) + if mail.write_json_file(mail.getContactsFile(playername), contacts) then + return true + else + minetest.log("error","[mail] Save failed - contacts may be lost! ("..playername..")") + return false + end +end + + +function mail.read_json_file(path) + local file = io.open(path, "r") + local content = {} + if file then + local json = file:read("*a") + print(string.format('read from %s: %s', path, json)) + content = minetest.parse_json(json or "[]") or {} + file:close() + end + return content +end + +function mail.write_json_file(path, content) + local file = io.open(path,"w") + local json = minetest.write_json(content) + print(string.format('writing to %s: %s', path, json)) + if file and file:write(json) and file:close() then + return true + else return false end end