mirror of
https://github.com/mt-mods/mail.git
synced 2025-04-30 16:31:43 -04:00
Significantly improve maillist behaviour
Replace maillist by its players when sending a message List of players separated by , Avoid doublons when editing more than 2 times a maillist
This commit is contained in:
parent
1e6e06e56f
commit
c4dd235782
4 changed files with 36 additions and 61 deletions
3
api.lua
3
api.lua
|
@ -47,11 +47,14 @@ function mail.send(...)
|
||||||
-- normalize to, cc and bcc while compiling a list of all recipients
|
-- normalize to, cc and bcc while compiling a list of all recipients
|
||||||
local recipients = {}
|
local recipients = {}
|
||||||
local undeliverable = {}
|
local undeliverable = {}
|
||||||
|
m.to = mail.concat_player_list(mail.extractMaillists(m.to, m.from))
|
||||||
m.to = mail.normalize_players_and_add_recipients(m.to, recipients, undeliverable)
|
m.to = mail.normalize_players_and_add_recipients(m.to, recipients, undeliverable)
|
||||||
if m.cc then
|
if m.cc then
|
||||||
|
m.cc = mail.concat_player_list(mail.extractMaillists(m.cc, m.from))
|
||||||
m.cc = mail.normalize_players_and_add_recipients(m.cc, recipients, undeliverable)
|
m.cc = mail.normalize_players_and_add_recipients(m.cc, recipients, undeliverable)
|
||||||
end
|
end
|
||||||
if m.bcc then
|
if m.bcc then
|
||||||
|
m.bcc = mail.concat_player_list(mail.extractMaillists(m.bcc, m.from))
|
||||||
m.bcc = mail.normalize_players_and_add_recipients(m.bcc, recipients, undeliverable)
|
m.bcc = mail.normalize_players_and_add_recipients(m.bcc, recipients, undeliverable)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
16
gui.lua
16
gui.lua
|
@ -937,11 +937,8 @@ function mail.handle_receivefields(player, formname, fields)
|
||||||
local evt = minetest.explode_table_event(fields.maillists)
|
local evt = minetest.explode_table_event(fields.maillists)
|
||||||
selected_idxs.maillists[name] = evt.row - 1
|
selected_idxs.maillists[name] = evt.row - 1
|
||||||
if evt.type == "DCL" and maillists[selected_idxs.maillists[name]] then
|
if evt.type == "DCL" and maillists[selected_idxs.maillists[name]] then
|
||||||
local players_ml = mail.getPlayersDataInMaillist(maillists[selected_idxs.maillists[name]].id)
|
local players_ml = mail.getPlayersInMaillist(maillists[selected_idxs.maillists[name]].id)
|
||||||
local players_string = ""
|
local players_string = mail.concat_player_list(players_ml)
|
||||||
for _, p in ipairs(players_ml) do
|
|
||||||
players_string = players_string .. p.player .. " " .. p.status .. "\n"
|
|
||||||
end
|
|
||||||
mail.show_edit_maillist(
|
mail.show_edit_maillist(
|
||||||
name,
|
name,
|
||||||
maillists[selected_idxs.maillists[name]].name,
|
maillists[selected_idxs.maillists[name]].name,
|
||||||
|
@ -952,14 +949,11 @@ function mail.handle_receivefields(player, formname, fields)
|
||||||
|
|
||||||
elseif fields.new then
|
elseif fields.new then
|
||||||
selected_idxs.maillists[name] = "#NEW#"
|
selected_idxs.maillists[name] = "#NEW#"
|
||||||
mail.show_edit_maillist(name, "", "", "Player1 to\nPlayer2 cc\nPlayer3 bcc")
|
mail.show_edit_maillist(name, "", "", "Player1, Player2, Player3")
|
||||||
|
|
||||||
elseif fields.edit and maillists[selected_idxs.maillists[name]] then
|
elseif fields.edit and maillists[selected_idxs.maillists[name]] then
|
||||||
local players_ml = mail.getPlayersDataInMaillist(maillists[selected_idxs.maillists[name]].id)
|
local players_ml = mail.getPlayersInMaillist(maillists[selected_idxs.maillists[name]].id)
|
||||||
local players_string = ""
|
local players_string = mail.concat_player_list(players_ml)
|
||||||
for _, p in ipairs(players_ml) do
|
|
||||||
players_string = players_string .. p.player .. " " .. p.status .. "\n"
|
|
||||||
end
|
|
||||||
mail.show_edit_maillist(
|
mail.show_edit_maillist(
|
||||||
name,
|
name,
|
||||||
maillists[selected_idxs.maillists[name]].name,
|
maillists[selected_idxs.maillists[name]].name,
|
||||||
|
|
66
storage.lua
66
storage.lua
|
@ -47,8 +47,7 @@ function mail.getPlayerMessages(playername)
|
||||||
if msg.bcc then
|
if msg.bcc then
|
||||||
bcc = msg.bcc
|
bcc = msg.bcc
|
||||||
end
|
end
|
||||||
-- extracted maillists from all receivers
|
local receivers = (msg.to .. "," .. cc .. "," .. bcc):split(",")
|
||||||
local receivers = mail.extractMaillists((msg.to .. "," .. cc .. "," .. bcc),",")
|
|
||||||
for _, receiver in ipairs(receivers) do
|
for _, receiver in ipairs(receivers) do
|
||||||
receiver = string.gsub(receiver, " ", "") -- avoid blank spaces (ex : " singleplayer" instead of "singleplayer")
|
receiver = string.gsub(receiver, " ", "") -- avoid blank spaces (ex : " singleplayer" instead of "singleplayer")
|
||||||
if receiver == playername then -- check if player is a receiver
|
if receiver == playername then -- check if player is a receiver
|
||||||
|
@ -82,8 +81,7 @@ function mail.getPlayerInboxMessages(playername)
|
||||||
if msg.bcc then
|
if msg.bcc then
|
||||||
bcc = msg.bcc
|
bcc = msg.bcc
|
||||||
end
|
end
|
||||||
-- extracted maillists from all receivers
|
local receivers = (msg.to .. "," .. cc .. "," .. bcc):split(",")
|
||||||
local receivers = mail.extractMaillists((msg.to .. "," .. cc .. "," .. bcc),",")
|
|
||||||
for _, receiver in ipairs(receivers) do
|
for _, receiver in ipairs(receivers) do
|
||||||
receiver = string.gsub(receiver, " ", "") -- avoid blank spaces (ex : " singleplayer" instead of "singleplayer")
|
receiver = string.gsub(receiver, " ", "") -- avoid blank spaces (ex : " singleplayer" instead of "singleplayer")
|
||||||
if receiver == playername then -- check if player is a receiver
|
if receiver == playername then -- check if player is a receiver
|
||||||
|
@ -143,7 +141,7 @@ function mail.addMessage(message)
|
||||||
local isSenderAReceiver = false
|
local isSenderAReceiver = false
|
||||||
|
|
||||||
-- extracted maillists from all receivers
|
-- extracted maillists from all receivers
|
||||||
local receivers = mail.extractMaillists((message.to .. "," .. (message.cc or "") .. "," .. (message.bcc or "")))
|
local receivers = mail.extractMaillists((message.to .. "," .. (message.cc or "") .. "," .. (message.bcc or "")), message.sender)
|
||||||
|
|
||||||
for _, receiver in ipairs(receivers) do
|
for _, receiver in ipairs(receivers) do
|
||||||
if minetest.player_exists(receiver) then -- avoid blank names
|
if minetest.player_exists(receiver) then -- avoid blank names
|
||||||
|
@ -252,11 +250,10 @@ function mail.addMaillist(maillist, players_string)
|
||||||
table.insert(maillists, 1, maillist)
|
table.insert(maillists, 1, maillist)
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists.json", maillists) then
|
if mail.write_json_file(mail.maildir .. "/mail.maillists.json", maillists) then
|
||||||
-- add status for players contained in the maillist
|
-- add status for players contained in the maillist
|
||||||
local players = players_string:split("\n")
|
local players = mail.parse_player_list(players_string)
|
||||||
for _, player in ipairs(players) do
|
for _, player in ipairs(players) do
|
||||||
local playerInfo = player:split(" ")
|
if minetest.player_exists(player) then -- avoid blank names
|
||||||
if minetest.player_exists(playerInfo[1]) then -- avoid blank names
|
mail.addPlayerToMaillist(player, maillist.id)
|
||||||
mail.addPlayerToMaillist(playerInfo[1], maillist.id, playerInfo[2])
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
|
@ -283,11 +280,10 @@ function mail.setMaillist(ml_id, updated_maillist, players_string)
|
||||||
-- remove all players
|
-- remove all players
|
||||||
mail.removePlayersFromMaillist(maillist_id)
|
mail.removePlayersFromMaillist(maillist_id)
|
||||||
-- to add those registered in the updated maillist
|
-- to add those registered in the updated maillist
|
||||||
local players = players_string:split("\n")
|
local players = mail.parse_player_list(players_string)
|
||||||
for _, player in ipairs(players) do
|
for _, player in ipairs(players) do
|
||||||
local playerInfo = player:split(" ")
|
if minetest.player_exists(player) then -- avoid blank names
|
||||||
if minetest.player_exists(playerInfo[1]) then -- avoid blank names
|
mail.addPlayerToMaillist(player, maillist_id)
|
||||||
mail.addPlayerToMaillist(playerInfo[1], maillist_id, playerInfo[2])
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
|
@ -297,11 +293,11 @@ function mail.setMaillist(ml_id, updated_maillist, players_string)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.getMaillistIdFromName(ml_name)
|
function mail.getMaillistIdFromName(ml_name, owner)
|
||||||
local maillists = mail.getMaillists()
|
local maillists = mail.getMaillists()
|
||||||
local ml_id = 0
|
local ml_id = 0
|
||||||
for _, maillist in ipairs(maillists) do
|
for _, maillist in ipairs(maillists) do
|
||||||
if maillist.name == ml_name then
|
if maillist.name == ml_name and maillist.owner == owner then
|
||||||
ml_id = maillist.id
|
ml_id = maillist.id
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
@ -332,15 +328,17 @@ function mail.getPlayersInMaillist(ml_id)
|
||||||
local players_names_ml = {}
|
local players_names_ml = {}
|
||||||
if players_ml[1] then
|
if players_ml[1] then
|
||||||
for _, playerInfo in ipairs(players_ml) do
|
for _, playerInfo in ipairs(players_ml) do
|
||||||
|
if playerInfo and playerInfo.player and minetest.player_exists(playerInfo.player) then
|
||||||
table.insert(players_names_ml, 1, playerInfo.player)
|
table.insert(players_names_ml, 1, playerInfo.player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
return players_names_ml
|
return players_names_ml
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.addPlayerToMaillist(player, ml_id, status)
|
function mail.addPlayerToMaillist(player, ml_id)
|
||||||
local playersMls = mail.getPlayersInMaillists()
|
local playersMls = mail.getPlayersInMaillists()
|
||||||
local new_player = {id = ml_id, player = player, status = status}
|
local new_player = {id = ml_id, player = player}
|
||||||
table.insert(playersMls, 1, new_player)
|
table.insert(playersMls, 1, new_player)
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", playersMls) then
|
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", playersMls) then
|
||||||
return true
|
return true
|
||||||
|
@ -350,31 +348,15 @@ function mail.addPlayerToMaillist(player, ml_id, status)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.setPlayerInMaillist(playername, ml_id, status)
|
|
||||||
local playersMls = mail.getPlayersInMaillists()
|
|
||||||
local updated_player = {id = ml_id, player = playername, status = status}
|
|
||||||
table.insert(playersMls, 1, updated_player)
|
|
||||||
for _, player in ipairs(playersMls) do
|
|
||||||
if player.player == playername and player.id == ml_id then
|
|
||||||
playersMls[_] = {id = ml_id, player = player, status = status}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", playersMls) then
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
minetest.log("error","[mail] Save failed - maillist may be lost!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.removePlayersFromMaillist(ml_id)
|
function mail.removePlayersFromMaillist(ml_id)
|
||||||
local maillists_players = mail.getPlayersInMaillists()
|
local maillists_players = mail.getPlayersInMaillists()
|
||||||
for _, player in ipairs(maillists_players) do
|
local updated_players = {}
|
||||||
if player.id == ml_id then
|
for _, playerInfo in ipairs(maillists_players) do
|
||||||
table.remove(maillists_players, _)
|
if playerInfo.id ~= ml_id then
|
||||||
|
table.insert(updated_players, playerInfo)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", maillists_players) then
|
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", updated_players) then
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
minetest.log("error","[mail] Save failed!")
|
minetest.log("error","[mail] Save failed!")
|
||||||
|
@ -407,15 +389,15 @@ function mail.deleteMaillist(ml_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.extractMaillists(receivers_string)
|
function mail.extractMaillists(receivers_string, maillists_owner)
|
||||||
local globalReceivers = receivers_string:split(",") -- receivers including maillists
|
local globalReceivers = mail.parse_player_list(receivers_string) -- receivers including maillists
|
||||||
local receivers = {} -- extracted receivers
|
local receivers = {} -- extracted receivers
|
||||||
|
|
||||||
-- extract players from mailing lists
|
-- extract players from mailing lists
|
||||||
for _, receiver in ipairs(globalReceivers) do
|
for _, receiver in ipairs(globalReceivers) do
|
||||||
local receiverInfo = receiver:split("@") -- @maillist
|
local receiverInfo = receiver:split("@") -- @maillist
|
||||||
if receiverInfo[1] == "" and receiverInfo[2] then -- in case of maillist
|
if receiverInfo[1] and receiver == "@" .. receiverInfo[1] and mail.getMaillistIdFromName(receiverInfo[1], maillists_owner) ~= 0 then -- in case of maillist
|
||||||
local players_ml = mail.getPlayersInMaillist(mail.getMaillistIdFromName(receiverInfo[2]))
|
local players_ml = mail.getPlayersInMaillist(mail.getMaillistIdFromName(receiverInfo[1], maillists_owner))
|
||||||
if players_ml then
|
if players_ml then
|
||||||
for _, player in ipairs(players_ml) do
|
for _, player in ipairs(players_ml) do
|
||||||
table.insert(receivers, 1, player)
|
table.insert(receivers, 1, player)
|
||||||
|
|
|
@ -7,16 +7,12 @@ and add individual player names to recipient list
|
||||||
function mail.normalize_players_and_add_recipients(field, recipients, undeliverable)
|
function mail.normalize_players_and_add_recipients(field, recipients, undeliverable)
|
||||||
local order = mail.parse_player_list(field)
|
local order = mail.parse_player_list(field)
|
||||||
for _, recipient_name in ipairs(order) do
|
for _, recipient_name in ipairs(order) do
|
||||||
if recipient_name:split("@")[1] == "" then -- in case of maillist
|
|
||||||
recipients[recipient_name] = true
|
|
||||||
else -- in case of playerˇ
|
|
||||||
if not minetest.player_exists(recipient_name) then
|
if not minetest.player_exists(recipient_name) then
|
||||||
undeliverable[recipient_name] = true
|
undeliverable[recipient_name] = true
|
||||||
else
|
else
|
||||||
recipients[recipient_name] = true
|
recipients[recipient_name] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
return mail.concat_player_list(order)
|
return mail.concat_player_list(order)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue