mirror of
https://github.com/mt-mods/mail.git
synced 2025-07-08 07:30:34 -04:00
maillist refactoring
This commit is contained in:
parent
a690fc721d
commit
8ce3dc2ecf
5 changed files with 77 additions and 199 deletions
1
api.lua
1
api.lua
|
@ -88,6 +88,7 @@ function mail.send(...)
|
||||||
|
|
||||||
-- form the actual mail
|
-- form the actual mail
|
||||||
local msg = {
|
local msg = {
|
||||||
|
id = mail.new_uuid(),
|
||||||
sender = m.from,
|
sender = m.from,
|
||||||
to = m.to,
|
to = m.to,
|
||||||
cc = m.cc,
|
cc = m.cc,
|
||||||
|
|
16
migrate.lua
16
migrate.lua
|
@ -1,6 +1,18 @@
|
||||||
|
|
||||||
local STORAGE_VERSION_KEY = "@@version"
|
local STORAGE_VERSION_KEY = "@@version"
|
||||||
|
|
||||||
|
local function read_json_file(path)
|
||||||
|
local file = io.open(path, "r")
|
||||||
|
local content = {}
|
||||||
|
if file then
|
||||||
|
local json = file:read("*a")
|
||||||
|
content = minetest.parse_json(json or "[]") or {}
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
return content
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function mail.migrate()
|
function mail.migrate()
|
||||||
local version = mail.storage:get_int(STORAGE_VERSION_KEY)
|
local version = mail.storage:get_int(STORAGE_VERSION_KEY)
|
||||||
if version < 3 then
|
if version < 3 then
|
||||||
|
@ -18,13 +30,13 @@ function mail.migrate_v2_to_v3()
|
||||||
for playername, _ in minetest.get_auth_handler().iterate() do
|
for playername, _ in minetest.get_auth_handler().iterate() do
|
||||||
local entry = mail.get_storage_entry(playername)
|
local entry = mail.get_storage_entry(playername)
|
||||||
|
|
||||||
local player_contacts = mail.read_json_file(mail.maildir .. "/contacts/" .. playername .. ".json")
|
local player_contacts = read_json_file(mail.maildir .. "/contacts/" .. playername .. ".json")
|
||||||
for _, c in pairs(player_contacts) do
|
for _, c in pairs(player_contacts) do
|
||||||
table.insert(entry.contacts, { name = c.name, note = c.note })
|
table.insert(entry.contacts, { name = c.name, note = c.note })
|
||||||
end
|
end
|
||||||
|
|
||||||
local saneplayername = string.gsub(playername, "[.|/]", "")
|
local saneplayername = string.gsub(playername, "[.|/]", "")
|
||||||
local player_inbox = mail.read_json_file(mail.maildir .. "/" .. saneplayername .. ".json")
|
local player_inbox = read_json_file(mail.maildir .. "/" .. saneplayername .. ".json")
|
||||||
for _, msg in ipairs(player_inbox) do
|
for _, msg in ipairs(player_inbox) do
|
||||||
if msg.to then
|
if msg.to then
|
||||||
table.insert(entry.inbox, {
|
table.insert(entry.inbox, {
|
||||||
|
|
233
storage.lua
233
storage.lua
|
@ -16,7 +16,10 @@ end
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
Mail format (inbox, outbox):
|
Mail format (inbox, outbox):
|
||||||
{
|
|
||||||
|
table of: {
|
||||||
|
-- globally unique mail id
|
||||||
|
id = "d6cce35c-487a-458f-bab2-9032c2621f38",
|
||||||
-- sending player name
|
-- sending player name
|
||||||
sender = "",
|
sender = "",
|
||||||
-- receiving player name
|
-- receiving player name
|
||||||
|
@ -36,21 +39,23 @@ Mail format (inbox, outbox):
|
||||||
}
|
}
|
||||||
|
|
||||||
Contact format:
|
Contact format:
|
||||||
{
|
|
||||||
-- name of the player
|
table of: {
|
||||||
|
-- name of the player (unique key in the list)
|
||||||
name = "",
|
name = "",
|
||||||
-- note
|
-- note
|
||||||
note = ""
|
note = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
Mail-list format:
|
Mail-list format:
|
||||||
{
|
|
||||||
-- name of the maillist
|
table of: {
|
||||||
|
-- name of the maillist (unique key in the list)
|
||||||
name = "",
|
name = "",
|
||||||
-- description
|
-- description
|
||||||
description = "",
|
description = "",
|
||||||
-- player list (delimited by newline)
|
-- playername list
|
||||||
players = ""
|
players = {"playername", "playername2"}
|
||||||
}
|
}
|
||||||
|
|
||||||
--]]
|
--]]
|
||||||
|
@ -121,11 +126,12 @@ end
|
||||||
function mail.update_contact(playername, contact)
|
function mail.update_contact(playername, contact)
|
||||||
local entry = mail.get_storage_entry(playername)
|
local entry = mail.get_storage_entry(playername)
|
||||||
local existing_updated = false
|
local existing_updated = false
|
||||||
for _, existing_contact in ipairs(entry.contacts) do
|
for i, existing_contact in ipairs(entry.contacts) do
|
||||||
if existing_contact.name == contact.name then
|
if existing_contact.name == contact.name then
|
||||||
-- update
|
-- update
|
||||||
existing_contact.note = contact.note
|
entry.contacts[i] = contact
|
||||||
existing_updated = true
|
existing_updated = true
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not existing_updated then
|
if not existing_updated then
|
||||||
|
@ -154,165 +160,51 @@ function mail.get_contacts(playername)
|
||||||
return entry.contact
|
return entry.contact
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- returns the maillists of a player
|
||||||
function mail.getMaillists()
|
function mail.get_maillists(playername)
|
||||||
local maillists = mail.read_json_file(mail.maildir .. "/mail.maillists.json")
|
local entry = mail.get_storage_entry(playername)
|
||||||
return maillists
|
return entry.lists
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.getPlayerMaillists(playername)
|
-- returns the maillists of a player
|
||||||
local maillists = mail.getMaillists()
|
function mail.get_maillist_by_name(playername, listname)
|
||||||
local playerMaillists = {}
|
local entry = mail.get_storage_entry(playername)
|
||||||
for _, maillist in ipairs(maillists) do
|
for _, list in ipairs(entry.lists) do
|
||||||
if maillist.owner == playername then
|
if list.name == listname then
|
||||||
table.insert(playerMaillists, {id = maillist.id, name = maillist.name, desc = maillist.desc})
|
return list
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return playerMaillists
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.addMaillist(maillist, players_string)
|
|
||||||
local maillists = mail.getMaillists()
|
|
||||||
if maillists[1] then
|
|
||||||
local previousMl = maillists[1]
|
|
||||||
maillist.id = previousMl.id + 1
|
|
||||||
else
|
|
||||||
maillist.id = 1
|
|
||||||
end
|
|
||||||
table.insert(maillists, maillist)
|
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists.json", maillists) then
|
|
||||||
-- add status for players contained in the maillist
|
|
||||||
local players = mail.parse_player_list(players_string)
|
|
||||||
for _, player in ipairs(players) do
|
|
||||||
if minetest.player_exists(player) then -- avoid blank names
|
|
||||||
mail.addPlayerToMaillist(player, maillist.id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
minetest.log("error","[mail] Save failed - maillist may be lost!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.setMaillist(ml_id, updated_maillist, players_string)
|
-- updates or creates a maillist
|
||||||
local maillists = mail.getMaillists()
|
function mail.update_maillist(playername, list)
|
||||||
local maillist_id = 0
|
local entry = mail.get_storage_entry(playername)
|
||||||
for _, maillist in ipairs(maillists) do
|
local existing_updated = false
|
||||||
if maillist.id == ml_id then
|
for i, existing_list in ipairs(entry.lists) do
|
||||||
maillist_id = maillist.id
|
if existing_list.name == list.name then
|
||||||
maillists[_] = {
|
-- update
|
||||||
id = maillist_id,
|
entry.lists[i] = list
|
||||||
owner = updated_maillist.owner,
|
existing_updated = true
|
||||||
name = updated_maillist.name,
|
|
||||||
desc = updated_maillist.desc}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists.json", maillists) then
|
|
||||||
-- remove all players
|
|
||||||
mail.removePlayersFromMaillist(maillist_id)
|
|
||||||
-- to add those registered in the updated maillist
|
|
||||||
local players = mail.parse_player_list(players_string)
|
|
||||||
for _, player in ipairs(players) do
|
|
||||||
if minetest.player_exists(player) then -- avoid blank names
|
|
||||||
mail.addPlayerToMaillist(player, maillist_id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
minetest.log("error","[mail] Save failed - maillist may be lost!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.getMaillistIdFromName(ml_name, owner)
|
|
||||||
local maillists = mail.getMaillists()
|
|
||||||
local ml_id = 0
|
|
||||||
for _, maillist in ipairs(maillists) do
|
|
||||||
if maillist.name == ml_name and maillist.owner == owner then
|
|
||||||
ml_id = maillist.id
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return ml_id
|
if not existing_updated then
|
||||||
|
-- insert
|
||||||
|
table.insert(entry.lists, list)
|
||||||
|
end
|
||||||
|
mail.set_storage_entry(playername, entry)
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.getPlayersInMaillists()
|
function mail.delete_maillist(playername, listname)
|
||||||
local players_mls = mail.read_json_file(mail.maildir .. "/mail.maillists_players.json")
|
local entry = mail.get_storage_entry(playername)
|
||||||
return players_mls
|
for i, list in ipairs(entry.lists) do
|
||||||
end
|
if list.name == listname then
|
||||||
|
-- delete
|
||||||
function mail.getPlayersDataInMaillist(ml_id)
|
table.remove(entry.lists, i)
|
||||||
local players_mls = mail.getPlayersInMaillists() -- players from all maillists
|
mail.set_storage_entry(playername, entry)
|
||||||
local players_ml = {} -- players from this maillist
|
return
|
||||||
if players_mls[1] then
|
|
||||||
for _, playerInfo in ipairs(players_mls) do
|
|
||||||
if playerInfo.id == ml_id then
|
|
||||||
table.insert(players_ml, playerInfo)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return players_ml
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.getPlayersInMaillist(ml_id)
|
|
||||||
local players_ml = mail.getPlayersDataInMaillist(ml_id) -- players from this maillist
|
|
||||||
local players_names_ml = {}
|
|
||||||
if players_ml[1] then
|
|
||||||
for _, playerInfo in ipairs(players_ml) do
|
|
||||||
if playerInfo and playerInfo.player and minetest.player_exists(playerInfo.player) then
|
|
||||||
table.insert(players_names_ml, playerInfo.player)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return players_names_ml
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.addPlayerToMaillist(player, ml_id)
|
|
||||||
local playersMls = mail.getPlayersInMaillists()
|
|
||||||
local new_player = {id = ml_id, player = player}
|
|
||||||
table.insert(playersMls, new_player)
|
|
||||||
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)
|
|
||||||
local maillists_players = mail.getPlayersInMaillists()
|
|
||||||
for i=#maillists_players,1,-1 do
|
|
||||||
local playerInfo = maillists_players[i]
|
|
||||||
if playerInfo.id == ml_id then
|
|
||||||
table.remove(maillists_players, i)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if mail.write_json_file(mail.maildir .. "/mail.maillists_players.json", maillists_players) then
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
minetest.log("error","[mail] Save failed!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function mail.deleteMaillist(ml_id)
|
|
||||||
local maillists = mail.getMaillists()
|
|
||||||
-- remove players attached to the maillist
|
|
||||||
local players_writing_done = mail.removePlayersFromMaillist(ml_id)
|
|
||||||
-- then remove the maillist itself
|
|
||||||
for _, maillist in ipairs(maillists) do
|
|
||||||
if maillist.id == ml_id then
|
|
||||||
table.remove(maillists, _)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local maillist_writing_done = mail.write_json_file(mail.maildir .. "/mail.maillists.json", maillists)
|
|
||||||
if players_writing_done and maillist_writing_done then
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
minetest.log("error","[mail] Save failed!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.extractMaillists(receivers_string, maillists_owner)
|
function mail.extractMaillists(receivers_string, maillists_owner)
|
||||||
|
@ -322,12 +214,11 @@ function mail.extractMaillists(receivers_string, maillists_owner)
|
||||||
-- 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 receiver == "@" .. receiverInfo[1]
|
if receiverInfo[1] and receiver == "@" .. receiverInfo[1] then
|
||||||
and mail.getMaillistIdFromName(receiverInfo[1], maillists_owner) ~= 0 then -- in case of maillist
|
local maillist = mail.get_maillist_by_name(maillists_owner, receiverInfo[1])
|
||||||
local players_ml = mail.getPlayersInMaillist(mail.getMaillistIdFromName(receiverInfo[1], maillists_owner))
|
if maillist then
|
||||||
if players_ml then
|
for _, playername in ipairs(maillist.players) do
|
||||||
for _, player in ipairs(players_ml) do
|
table.insert(receivers, playername)
|
||||||
table.insert(receivers, player)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else -- in case of player
|
else -- in case of player
|
||||||
|
@ -357,23 +248,3 @@ function mail.pairsByKeys(t, f)
|
||||||
return iter
|
return iter
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.read_json_file(path)
|
|
||||||
local file = io.open(path, "r")
|
|
||||||
local content = {}
|
|
||||||
if file then
|
|
||||||
local json = file:read("*a")
|
|
||||||
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)
|
|
||||||
if file and file:write(json) and file:close() then
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -36,19 +36,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local maillists = mail.getPlayerMaillists(name)
|
|
||||||
|
|
||||||
if fields.save then
|
if fields.save then
|
||||||
local maillist = {
|
mail.update_maillist(name, {
|
||||||
owner = name,
|
owner = name,
|
||||||
name = fields.name,
|
name = fields.name,
|
||||||
desc = fields.desc,
|
desc = fields.desc,
|
||||||
}
|
players = mail.parse_player_list(fields.players)
|
||||||
if mail.selected_idxs.maillists[name] and mail.selected_idxs.maillists[name] ~= "#NEW#" then
|
})
|
||||||
mail.setMaillist(maillists[mail.selected_idxs.maillists[name]].id, maillist, fields.players)
|
|
||||||
else
|
|
||||||
mail.addMaillist(maillist, fields.players)
|
|
||||||
end
|
|
||||||
mail.show_maillists(name)
|
mail.show_maillists(name)
|
||||||
|
|
||||||
elseif fields.back then
|
elseif fields.back then
|
||||||
|
|
|
@ -10,7 +10,7 @@ local maillists_formspec = "size[8,9;]" .. mail.theme .. [[
|
||||||
|
|
||||||
function mail.show_maillists(name)
|
function mail.show_maillists(name)
|
||||||
local formspec = { maillists_formspec }
|
local formspec = { maillists_formspec }
|
||||||
local maillists = mail.getPlayerMaillists(name)
|
local maillists = mail.get_maillists(name)
|
||||||
|
|
||||||
if maillists[1] then
|
if maillists[1] then
|
||||||
for _, maillist in ipairs(maillists) do
|
for _, maillist in ipairs(maillists) do
|
||||||
|
@ -46,14 +46,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local maillists = mail.getPlayerMaillists(name)
|
local maillists = mail.get_maillists(name)
|
||||||
|
|
||||||
if fields.maillists then
|
if fields.maillists then
|
||||||
local evt = minetest.explode_table_event(fields.maillists)
|
local evt = minetest.explode_table_event(fields.maillists)
|
||||||
mail.selected_idxs.maillists[name] = evt.row - 1
|
mail.selected_idxs.maillists[name] = evt.row - 1
|
||||||
if evt.type == "DCL" and maillists[mail.selected_idxs.maillists[name]] then
|
if evt.type == "DCL" and maillists[mail.selected_idxs.maillists[name]] then
|
||||||
local players_ml = mail.getPlayersInMaillist(maillists[mail.selected_idxs.maillists[name]].id)
|
local maillist = mail.get_maillist_by_name(name, maillists[mail.selected_idxs.maillists[name]].name)
|
||||||
local players_string = mail.concat_player_list(players_ml)
|
local players_string = mail.concat_player_list(maillist.players)
|
||||||
mail.show_edit_maillist(
|
mail.show_edit_maillist(
|
||||||
name,
|
name,
|
||||||
maillists[mail.selected_idxs.maillists[name]].name,
|
maillists[mail.selected_idxs.maillists[name]].name,
|
||||||
|
@ -67,8 +67,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
mail.show_edit_maillist(name, "", "", "Player1, Player2, Player3")
|
mail.show_edit_maillist(name, "", "", "Player1, Player2, Player3")
|
||||||
|
|
||||||
elseif fields.edit and maillists[mail.selected_idxs.maillists[name]] then
|
elseif fields.edit and maillists[mail.selected_idxs.maillists[name]] then
|
||||||
local players_ml = mail.getPlayersInMaillist(maillists[mail.selected_idxs.maillists[name]].id)
|
local maillist = mail.get_maillist_by_name(name, maillists[mail.selected_idxs.maillists[name]].name)
|
||||||
local players_string = mail.concat_player_list(players_ml)
|
local players_string = mail.concat_player_list(maillist.players)
|
||||||
mail.show_edit_maillist(
|
mail.show_edit_maillist(
|
||||||
name,
|
name,
|
||||||
maillists[mail.selected_idxs.maillists[name]].name,
|
maillists[mail.selected_idxs.maillists[name]].name,
|
||||||
|
@ -87,7 +87,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
mail.selected_idxs.maillists[name] = k
|
mail.selected_idxs.maillists[name] = k
|
||||||
break
|
break
|
||||||
elseif k == mail.selected_idxs.maillists[name] then
|
elseif k == mail.selected_idxs.maillists[name] then
|
||||||
mail.deleteMaillist(maillists[mail.selected_idxs.maillists[name]].id)
|
mail.delete_maillist(maillists[mail.selected_idxs.maillists[name]].name)
|
||||||
mail.selected_idxs.maillists[name] = nil
|
mail.selected_idxs.maillists[name] = nil
|
||||||
found = true
|
found = true
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue