diff --git a/.storage.lua.kate-swp b/.storage.lua.kate-swp deleted file mode 100644 index 03eb306..0000000 Binary files a/.storage.lua.kate-swp and /dev/null differ diff --git a/gui.lua b/gui.lua index f98d9b6..1bed219 100644 --- a/gui.lua +++ b/gui.lua @@ -645,10 +645,14 @@ function mail.handle_receivefields(player, formname, fields) local recipients = mail.parse_player_list(fields.to) local isNew = true for r_,recipient in ipairs(recipients) do - for c_,contact in ipairs(contacts) do - if contact.name == recipient then - isNew = false - break + if mail.split(recipient, "@")[1] == "" then -- in case of maillist + isNew = false + else + for c_,contact in ipairs(contacts) do + if contact.name == recipient then + isNew = false + break + end end end if isNew then diff --git a/storage.lua b/storage.lua index 124a5ef..724ab3c 100644 --- a/storage.lua +++ b/storage.lua @@ -33,8 +33,7 @@ function mail.getPlayerMessages(playername) if msg.bcc then bcc = msg.bcc end - - local receivers = mail.split((msg.to .. "," .. cc .. "," .. bcc),",") -- split players into table + local receivers = mail.extractMaillists((msg.to .. "," .. (msg.cc or "") .. "," .. (msg.bcc or "")),",") -- extracted maillists from all receivers for _, receiver in ipairs(receivers) do receiver = string.gsub(receiver, " ", "") -- avoid blank spaces (ex : " singleplayer" instead of "singleplayer") if receiver == playername then -- check if player is a receiver @@ -79,7 +78,7 @@ end function mail.addMessage(message) local messages = mail.getMessages() - if #messages > 0 then + if messages[1] then local previousMsg = messages[1] message.id = previousMsg.id + 1 else @@ -89,7 +88,24 @@ function mail.addMessage(message) if mail.write_json_file(mail.maildir .. "/mail.messages.json", messages) then -- add default status (unread for receivers) of this message local isSenderAReceiver = false - local receivers = mail.split((message.to .. "," .. (message.cc or "") .. "," .. (message.bcc or "")),",") + + local receivers = mail.extractMaillists((message.to .. "," .. (message.cc or "") .. "," .. (message.bcc or "")),",") -- extracted maillists from all receivers + + -- extract players from mailing lists + for _, receiver in ipairs(globalReceivers) do + local receiverInfo = mail.split(receiver, "@") -- @maillist + if receiverInfo[1] == "" and receiverInfo[2] then -- in case of maillist + local players_ml = mail.getPlayersInMaillist(mail.getMaillistIdFromName(receiverInfo[2])) + if players_ml then + for _, player in ipairs(players_ml) do + table.insert(receivers, 1, player) + end + end + else -- in case of player + table.insert(receivers, 1, receiver) + end + end + for _, receiver in ipairs(receivers) do if minetest.player_exists(receiver) then -- avoid blank names mail.addStatus(receiver, message.id, "unread") @@ -188,7 +204,7 @@ end function mail.addMaillist(maillist, players_string) local maillists = mail.getMaillists() - if #maillists > 0 then + if maillists[1] then local previousMl = maillists[1] maillist.id = previousMl.id + 1 else @@ -211,9 +227,34 @@ function mail.addMaillist(maillist, players_string) end end +function mail.getMaillistIdFromName(ml_name) + local maillists = mail.getMaillists() + local ml_id = 0 + for _, maillist in ipairs(maillists) do + if maillist.name == ml_name then + ml_id = maillist.id + break + end + end + return ml_id +end + function mail.getPlayersInMaillists() - local messagesStatus = mail.read_json_file(mail.maildir .. "/mail.maillists_players.json") - return messagesStatus + local players_mls = mail.read_json_file(mail.maildir .. "/mail.maillists_players.json") + return players_mls +end + +function mail.getPlayersInMaillist(ml_id) + local players_mls = mail.getPlayersInMaillists() -- players from all maillists + local player_ml = {} -- players from this maillist + if players_mls[1] then + for _, playerInfo in ipairs(players_mls) do + if playerInfo.id == ml_id then + table.insert(player_ml, 1, playerInfo.player) + end + end + end + return player_ml end function mail.addPlayerToMaillist(player, ml_id, status) @@ -258,6 +299,28 @@ function mail.deleteMaillist(ml_id) end end +function mail.extractMaillists(receivers) + local globalReceivers = mail.split(receivers,",") -- receivers including maillists + local receivers = {} -- extracted receivers + + -- extract players from mailing lists + for _, receiver in ipairs(globalReceivers) do + local receiverInfo = mail.split(receiver, "@") -- @maillist + if receiverInfo[1] == "" and receiverInfo[2] then -- in case of maillist + local players_ml = mail.getPlayersInMaillist(mail.getMaillistIdFromName(receiverInfo[2])) + if players_ml then + for _, player in ipairs(players_ml) do + table.insert(receivers, 1, player) + end + end + else -- in case of player + table.insert(receivers, 1, receiver) + end + end + + return receivers +end + function mail.pairsByKeys(t, f) -- http://www.lua.org/pil/19.3.html local a = {} diff --git a/util/normalize.lua b/util/normalize.lua index 3064bf3..52eeab8 100644 --- a/util/normalize.lua +++ b/util/normalize.lua @@ -6,11 +6,15 @@ and add individual player names to recipient list --]] function mail.normalize_players_and_add_recipients(field, recipients, undeliverable) local order = mail.parse_player_list(field) - for _, player_name in ipairs(order) do - if not minetest.player_exists(player_name) then - undeliverable[player_name] = true - else - recipients[player_name] = true + for _, recipient_name in ipairs(order) do + if mail.split(recipient_name, "@")[1] == "" then -- in case of maillist + recipients[recipient_name] = true + else -- in case of playerˇ + if not minetest.player_exists(recipient_name) then + undeliverable[recipient_name] = true + else + recipients[recipient_name] = true + end end end return mail.concat_player_list(order)