From fa391b5ee63e49d45c003aefff2c9b30d1fe7162 Mon Sep 17 00:00:00 2001 From: Athozus Date: Sun, 18 Jun 2023 20:12:56 +0200 Subject: [PATCH] Store message list in context to improve performance They are deleted after closing formspec, and the json file is called only once --- init.lua | 7 +++++++ ui/drafts.lua | 3 +-- ui/events.lua | 28 +++++++++++++++++++++------- ui/inbox.lua | 3 +-- ui/mail.lua | 7 +++++++ ui/outbox.lua | 3 +-- ui/trash.lua | 3 +-- 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/init.lua b/init.lua index 7fc6260..049eeb4 100644 --- a/init.lua +++ b/init.lua @@ -37,6 +37,13 @@ mail = { trash_move_enable = {} }, + messages_context = { + inbox = {}, + outbox = {}, + drafts = {}, + trash = {} + }, + message_drafts = {} } diff --git a/ui/drafts.lua b/ui/drafts.lua index 6f164cc..f6d30d9 100644 --- a/ui/drafts.lua +++ b/ui/drafts.lua @@ -24,8 +24,7 @@ function mail.show_drafts(name) table[0,0.7;5.75,9.35;drafts;#999,]] .. S("To") .. "," .. S("Subject") local formspec = { drafts_formspec } - local entry = mail.get_storage_entry(name) - local messages = entry.drafts + local messages = mail.messages_context.drafts[name] mail.message_drafts[name] = nil diff --git a/ui/events.lua b/ui/events.lua index 009a7a2..f23fd00 100644 --- a/ui/events.lua +++ b/ui/events.lua @@ -1,4 +1,3 @@ - -- Getter to filter and sort messages on demand local function messageGetter(messages, sortfield, ascending, filter) local results @@ -15,15 +14,21 @@ local function nonempty(x) end minetest.register_on_player_receive_fields(function(player, formname, fields) + -- Get player name + local name = player:get_player_name() + if formname ~= "mail:inbox" and formname ~= "mail:outbox" and formname ~= "mail:drafts" and formname ~= "mail:trash" then return elseif fields.quit then + mail.messages_context.inbox[name] = nil + mail.messages_context.outbox[name] = nil + mail.messages_context.drafts[name] = nil + mail.messages_context.trash[name] = nil return end - -- Get player name and handle / convert common input fields - local name = player:get_player_name() + -- Convert common input fields local filter = (fields.search and fields.filter) or mail.selected_idxs.filter[name] or "" local sortfieldindex = tonumber(fields.sortfield or mail.selected_idxs.sortfield[name]) or 3 local sortdirection = fields.sortdirection or mail.selected_idxs.sortdirection[name] or "1" @@ -50,10 +55,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- split inbox and outbox msgs for different tests local entry = mail.get_storage_entry(name) - local messagesDrafts = entry.drafts - local messagesTrash = entry.trash - local getInbox = messageGetter(entry.inbox, inboxsortfield, sortdirection == "2", filter) - local getOutbox = messageGetter(entry.outbox, outboxsortfield, sortdirection == "2", filter) + local messagesDrafts = mail.messages_context.drafts[name] + local messagesTrash = mail.messages_context.trash[name] + local getInbox = messageGetter(mail.messages_context.inbox[name], inboxsortfield, sortdirection == "2", filter) + local getOutbox = messageGetter(mail.messages_context.outbox[name], outboxsortfield, sortdirection == "2", filter) -- Hanmdle formspec event if fields.inbox then -- inbox table @@ -219,6 +224,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) mail.delete_mail(name, mail.selected_idxs.inbox[name]) end mail.selected_idxs.inbox[name] = {} + mail.messages_context.inbox[name] = entry.inbox elseif formname == "mail:outbox" and mail.selected_idxs.outbox[name] then -- outbox table if trash_enabled then mail.trash_mail(name, mail.selected_idxs.outbox[name]) @@ -226,6 +232,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) mail.delete_mail(name, mail.selected_idxs.outbox[name]) end mail.selected_idxs.outbox[name] = {} + mail.messages_context.outbox[name] = entry.outbox elseif formname == "mail:drafts" and messagesDrafts[mail.selected_idxs.drafts[name]] then -- drafts table if trash_enabled then mail.trash_mail(name, messagesDrafts[mail.selected_idxs.drafts[name]].id) @@ -233,9 +240,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) mail.delete_mail(name, messagesDrafts[mail.selected_idxs.drafts[name]].id) end mail.selected_idxs.drafts[name] = nil + mail.messages_context.drafts[name] = entry.drafts elseif formname == "mail:trash" and messagesTrash[mail.selected_idxs.trash[name]] then -- trash table mail.delete_mail(name, messagesTrash[mail.selected_idxs.trash[name]].id, true) + mail.messages_context.trash[name] = entry.trash end mail.show_mail_menu(name, sortfieldindex, sortdirection, filter) @@ -244,6 +253,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if messagesTrash[mail.selected_idxs.trash[name]] then mail.restore_mail(name, messagesTrash[mail.selected_idxs.trash[name]].id) end + -- update messages lists + mail.messages_context.inbox[name] = entry.inbox + mail.messages_context.outbox[name] = entry.outbox + mail.messages_context.drafts[name] = entry.drafts + mail.messages_context.trash[name] = entry.trash mail.show_mail_menu(name, sortfieldindex, sortdirection, filter) elseif fields.reply then diff --git a/ui/inbox.lua b/ui/inbox.lua index ddcf5e2..11bde59 100644 --- a/ui/inbox.lua +++ b/ui/inbox.lua @@ -9,9 +9,8 @@ function mail.show_inbox(name, sortfieldindex, sortdirection, filter) filter = filter or mail.selected_idxs.filter[name] or "" mail.selected_idxs.inbox[name] = mail.selected_idxs.inbox[name] or {} - local entry = mail.get_storage_entry(name) local sortfield = ({"from","subject","time"})[sortfieldindex] - local messages = mail.sort_messages(entry.inbox, sortfield, sortdirection == "2", filter) + local messages = mail.sort_messages(mail.messages_context.inbox[name], sortfield, sortdirection == "2", filter) local trash_tab = "" if mail.get_setting(name, "trash_move_enable") then diff --git a/ui/mail.lua b/ui/mail.lua index 9bf114f..8b9345c 100644 --- a/ui/mail.lua +++ b/ui/mail.lua @@ -1,6 +1,13 @@ -- helper function for tabbed overview function mail.show_mail_menu(playername, sortfield, sortdirection, filter) + -- create contexts + local entry = mail.get_storage_entry(playername) + mail.messages_context.inbox[playername] = mail.messages_context.inbox[playername] or entry.inbox + mail.messages_context.outbox[playername] = mail.messages_context.outbox[playername] or entry.outbox + mail.messages_context.drafts[playername] = mail.messages_context.drafts[playername] or entry.drafts + mail.messages_context.trash[playername] = mail.messages_context.trash[playername] or entry.trash + local index = mail.selected_idxs.boxtab[playername] or 1 if not mail.selected_idxs.boxtab[playername] then mail.selected_idxs.boxtab[playername] = 1 diff --git a/ui/outbox.lua b/ui/outbox.lua index 84afeaf..e5921a6 100644 --- a/ui/outbox.lua +++ b/ui/outbox.lua @@ -9,9 +9,8 @@ function mail.show_outbox(name, sortfieldindex, sortdirection, filter) filter = filter or mail.selected_idxs.filter[name] or "" mail.selected_idxs.outbox[name] = mail.selected_idxs.outbox[name] or {} - local entry = mail.get_storage_entry(name) local sortfield = ({"to","subject","time"})[sortfieldindex] - local messages = mail.sort_messages(entry.outbox, sortfield, sortdirection == "2", filter) + local messages = mail.sort_messages(mail.messages_context.outbox[name], sortfield, sortdirection == "2", filter) local trash_tab = "" if mail.get_setting(name, "trash_move_enable") then diff --git a/ui/trash.lua b/ui/trash.lua index 892a29a..faf6db8 100644 --- a/ui/trash.lua +++ b/ui/trash.lua @@ -20,8 +20,7 @@ local trash_formspec = "size[8.5,10;]" .. mail.theme .. [[ function mail.show_trash(name) local formspec = { trash_formspec } - local entry = mail.get_storage_entry(name) - local messages = entry.trash + local messages = mail.messages_context.trash[name] if messages[1] then for _, message in ipairs(messages) do