From 418cda1adc0823c7a8dd5b6eae1636b788f23705 Mon Sep 17 00:00:00 2001 From: Athozus Date: Sun, 2 Apr 2023 10:37:58 +0200 Subject: [PATCH] Fix maillists issues (#49) * Fix maillist deletion * Fix duplicating of maillist while changing its name * Permit sub-lists * Fix messages with no mailing lists --- storage.lua | 42 +++++++++++++++++++++--------------------- ui/edit_maillists.lua | 4 +++- ui/maillists.lua | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/storage.lua b/storage.lua index 0f7b138..806f464 100644 --- a/storage.lua +++ b/storage.lua @@ -148,21 +148,17 @@ function mail.get_maillist_by_name(playername, listname) end -- updates or creates a maillist -function mail.update_maillist(playername, list) +function mail.update_maillist(playername, list, old_list_name) local entry = mail.get_storage_entry(playername) - local existing_updated = false for i, existing_list in ipairs(entry.lists) do - if existing_list.name == list.name then - -- update - entry.lists[i] = list - existing_updated = true + if existing_list.name == old_list_name then + -- delete + table.remove(entry.lists, i) break end end - if not existing_updated then - -- insert - table.insert(entry.lists, list) - end + -- insert + table.insert(entry.lists, list) mail.set_storage_entry(playername, entry) end @@ -179,22 +175,26 @@ function mail.delete_maillist(playername, listname) end function mail.extractMaillists(receivers_string, maillists_owner) - local globalReceivers = mail.parse_player_list(receivers_string) -- receivers including maillists - local receivers = {} -- extracted receivers + local receivers = mail.parse_player_list(receivers_string) -- extracted receivers -- extract players from mailing lists - for _, receiver in ipairs(globalReceivers) do - local receiverInfo = receiver:split("@") -- @maillist - if receiverInfo[1] and receiver == "@" .. receiverInfo[1] then - local maillist = mail.get_maillist_by_name(maillists_owner, receiverInfo[1]) - if maillist then - for _, playername in ipairs(maillist.players) do - table.insert(receivers, playername) + while string.find(receivers_string, "@") do + local globalReceivers = mail.parse_player_list(receivers_string) -- receivers including maillists + receivers = {} + for _, receiver in ipairs(globalReceivers) do + local receiverInfo = receiver:split("@") -- @maillist + if receiverInfo[1] and receiver == "@" .. receiverInfo[1] then + local maillist = mail.get_maillist_by_name(maillists_owner, receiverInfo[1]) + if maillist then + for _, playername in ipairs(maillist.players) do + table.insert(receivers, playername) + end end + else -- in case of player + table.insert(receivers, receiver) end - else -- in case of player - table.insert(receivers, receiver) end + receivers_string = mail.concat_player_list(receivers) end return receivers diff --git a/ui/edit_maillists.lua b/ui/edit_maillists.lua index 416856d..847a860 100644 --- a/ui/edit_maillists.lua +++ b/ui/edit_maillists.lua @@ -1,9 +1,11 @@ -- translation local S = minetest.get_translator("mail") +local old_lists_names = {} local FORMNAME = "mail:editmaillist" function mail.show_edit_maillist(playername, maillist_name, desc, players, illegal_name_hint) + old_lists_names[playername] = maillist_name local formspec = [[ size[6,7] button[4,6.25;2,0.5;back;]] .. S("Back") .. [[] @@ -45,7 +47,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) name = fields.name, desc = fields.desc, players = mail.parse_player_list(fields.players) - }) + }, old_lists_names[name]) mail.show_maillists(name) elseif fields.back then diff --git a/ui/maillists.lua b/ui/maillists.lua index fcf8e82..4182949 100644 --- a/ui/maillists.lua +++ b/ui/maillists.lua @@ -90,7 +90,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) mail.selected_idxs.maillists[name] = k break elseif k == mail.selected_idxs.maillists[name] then - mail.delete_maillist(maillists[mail.selected_idxs.maillists[name]].name) + mail.delete_maillist(name, maillists[mail.selected_idxs.maillists[name]].name) mail.selected_idxs.maillists[name] = nil found = true else