Add ability to use maillist in messages and receive messages from them

This commit is contained in:
Athozus 2023-03-01 19:37:08 +01:00
parent 85a5e525be
commit 2443cc5dec
No known key found for this signature in database
GPG key ID: B50895022E8484BF
4 changed files with 87 additions and 16 deletions

Binary file not shown.

View file

@ -645,12 +645,16 @@ 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
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
mail.addContact(name, {name = recipient, note = ""})
end

View file

@ -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 = {}

View file

@ -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
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[player_name] = true
recipients[recipient_name] = true
end
end
end
return mail.concat_player_list(order)