b3e0c158f7
* Add tabheader & sent formspec * Add show_sent function and show sent messages * Remove comment on selected_idxs test (show_sent) * Add variable to keep the previous tab instead of going back to the first one * Remove index variable verification on mark read/unread buttons since they are necessarily clicked on inbox view * Resize messages table to be aligned with close button at the bottom * Show date time (#27) * Show date in message reading * Fix wrong registered dates Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Rework header layout to add better space for date --------- Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Add insertion of messages into global storage mail.messages.json * Receive player messages from global storage * Add automatic generation of status for a new message (unread) * Mark read/unread/delete a message * Fix messages loading * Show every message received/sent via specific functions * Use global contacts functions and reconfigure add/remove functions * Create mail lists formspec based on contacts * Add deleting contact * Add ability to create mail lists * Fix inability to edit contact * Rework on editing/deletion of contacts/maillists * Add at symbol as prefix on maillists view * Add ability to choose default status (to/cc/bcc) Signed-off-by: Athozus <athozus@gmail.com> * Add ability to add multiples players and choose their default status (to/cc/bcc) * Add ability to use maillist in messages and receive messages from them * Fix repetition of code causing a crash * Avoid multiples occurences of the same messages due to player both in maillist and receivers * Fix selected indexes for inbox/sent Now separated, fixed show_message() func selection of id from table dcl/read btn * Fix many issues related to maillists Notably : edit, delete, selection, creation, registration of players * Set up database version v3 and its migration from v2 + Check versions to choose v1->v2 or v2->v3 * Fix mtt.lua Due to old function getMessages(), replaced by getPlayerInboxMessages() * Add 10 seconds security to mtt.lua * Fix migrate.lua non-declared variable * Send msg table with string keys in mtt * Better log messages * Add message check * Fix mtt crash * Better syntax in storage.lua * Fix bcc forgotten in mail.send() * Fix mtt issue * Better compatibility for messages storage Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Replace mail.split by builtin func Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Use builtin split func Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Use builtin split func in storage.lua * re-add mtt if * luacheck on PR * add check for an ancient issue with missing `to` field * Fix luacheck on storage.lua * Fix luacheck warnings in migrate.lua * Fix luacheck warnings in gui.lua * Fix luacheck (too long lines) in storage.lua * Unused loop values in migrate.lua * Whitespace line in gui.lua * Whitespace line (init.lua) * Whitespace line (api.lua) * 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 * Fix luacheck * Fix table insertions at first index when no needed * Use funcs * Do not add maillist as a new contact when sending a mail * Fix removing elements from tables * Check maillists not added in contacts * storage rewrite wip * storage format docs * refactor ui components * show_compose cleanup * remove unused channel.lua * error -> err * status refactoring * contacts refactoring * maillist refactoring * docs * tests * fix some issues * re-enable migrations * contributors * prefix mail entries in the mod storage * internalize old mail-paths to migration module * add v1 and v2 player db examples and migration test * Ui improvements & fixes Move events code (if fields.x then) to events.lua (instead of inbox.lua), fix tab selection when going backward * Show most recent messages at first (outbox) * unified-inv fix --------- Signed-off-by: Athozus <athozus@gmail.com> Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
136 lines
4.0 KiB
Lua
136 lines
4.0 KiB
Lua
local FORMNAME = "mail:message"
|
|
|
|
function mail.show_message(name, id)
|
|
local message = mail.get_message(name, id)
|
|
|
|
local formspec = [[
|
|
size[8,9]
|
|
|
|
box[0,0;7,1.9;#466432]
|
|
|
|
button[7.25,0.15;0.75,0.5;back;X]
|
|
|
|
label[0.2,0.1;From: %s]
|
|
label[0.2,0.5;To: %s]
|
|
label[0.2,0.9;CC: %s]
|
|
label[0.2,1.3;Date: %s]
|
|
|
|
label[0,2.1;Subject: %s]
|
|
textarea[0.25,2.6;8,7.0;;;%s]
|
|
|
|
button[0,8.5;2,1;reply;Reply]
|
|
button[2,8.5;2,1;replyall;Reply All]
|
|
button[4,8.5;2,1;forward;Forward]
|
|
button[6,8.5;2,1;delete;Delete]
|
|
]] .. mail.theme
|
|
|
|
local from = minetest.formspec_escape(message.from) or ""
|
|
local to = minetest.formspec_escape(message.to) or ""
|
|
local cc = minetest.formspec_escape(message.cc) or ""
|
|
local date = type(message.time) == "number"
|
|
and minetest.formspec_escape(os.date("%Y-%m-%d %X", message.time)) or ""
|
|
local subject = minetest.formspec_escape(message.subject) or ""
|
|
local body = minetest.formspec_escape(message.body) or ""
|
|
formspec = string.format(formspec, from, to, cc, date, subject, body)
|
|
|
|
if not message.read then
|
|
-- mark as read
|
|
mail.mark_read(name, id)
|
|
end
|
|
|
|
minetest.show_formspec(name, FORMNAME, formspec)
|
|
end
|
|
|
|
function mail.reply(name, message)
|
|
local replyfooter = "Type your reply here.\n\n--Original message follows--\n" ..message.body
|
|
mail.show_compose(name, message.from, "Re: "..message.subject, replyfooter)
|
|
end
|
|
|
|
function mail.replyall(name, message)
|
|
local replyfooter = "Type your reply here.\n\n--Original message follows--\n" ..message.body
|
|
|
|
-- new recipients are the sender plus the original recipients, minus ourselves
|
|
local recipients = message.to or ""
|
|
if message.from ~= nil then
|
|
recipients = message.from .. ", " .. recipients
|
|
end
|
|
recipients = mail.parse_player_list(recipients)
|
|
for k,v in pairs(recipients) do
|
|
if v == name then
|
|
table.remove(recipients, k)
|
|
break
|
|
end
|
|
end
|
|
recipients = mail.concat_player_list(recipients)
|
|
|
|
-- new CC is old CC minus ourselves
|
|
local cc = mail.parse_player_list(message.cc)
|
|
for k,v in pairs(cc) do
|
|
if v == name then
|
|
table.remove(cc, k)
|
|
break
|
|
end
|
|
end
|
|
cc = mail.concat_player_list(cc)
|
|
|
|
mail.show_compose(name, recipients, "Re: "..message.subject, replyfooter, cc)
|
|
end
|
|
|
|
function mail.forward(name, message)
|
|
local fwfooter = "Type your message here.\n\n--Original message follows--\n" .. (message.body or "")
|
|
mail.show_compose(name, "", "Fw: " .. (message.subject or ""), fwfooter)
|
|
end
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
if formname ~= FORMNAME then
|
|
return
|
|
end
|
|
|
|
local name = player:get_player_name()
|
|
local entry = mail.get_storage_entry(name)
|
|
|
|
local messagesInbox = entry.inbox
|
|
local messagesSent = entry.outbox
|
|
|
|
if fields.back then
|
|
mail.show_mail_menu(name)
|
|
return true -- don't uselessly set messages
|
|
|
|
elseif fields.reply then
|
|
local message = ""
|
|
if messagesInbox[mail.selected_idxs.inbox[name]] then
|
|
message = messagesInbox[mail.selected_idxs.inbox[name]]
|
|
elseif messagesSent[mail.selected_idxs.sent[name]] then
|
|
message = messagesSent[mail.selected_idxs.sent[name]]
|
|
end
|
|
mail.reply(name, message)
|
|
|
|
elseif fields.replyall then
|
|
local message = ""
|
|
if messagesInbox[mail.selected_idxs.inbox[name]] then
|
|
message = messagesInbox[mail.selected_idxs.inbox[name]]
|
|
elseif messagesSent[mail.selected_idxs.sent[name]] then
|
|
message = messagesSent[mail.selected_idxs.sent[name]]
|
|
end
|
|
mail.replyall(name, message)
|
|
|
|
elseif fields.forward then
|
|
local message = ""
|
|
if messagesInbox[mail.selected_idxs.inbox[name]] then
|
|
message = messagesInbox[mail.selected_idxs.inbox[name]]
|
|
elseif messagesSent[mail.selected_idxs.sent[name]] then
|
|
message = messagesSent[mail.selected_idxs.sent[name]]
|
|
end
|
|
mail.forward(name, message)
|
|
|
|
elseif fields.delete then
|
|
if messagesInbox[mail.selected_idxs.inbox[name]] then
|
|
mail.delete_mail(name, messagesInbox[mail.selected_idxs.inbox[name]].id)
|
|
elseif messagesSent[mail.selected_idxs.sent[name]] then
|
|
mail.delete_mail(name, messagesSent[mail.selected_idxs.sent[name]].id)
|
|
end
|
|
mail.show_mail_menu(name)
|
|
end
|
|
|
|
return true
|
|
end) |