From d51b363cbcd056a706d403c94e07fa10f608b02a Mon Sep 17 00:00:00 2001 From: Athozus Date: Thu, 4 May 2023 12:14:18 +0200 Subject: [PATCH] Add settings --- api.lua | 4 +- hud.lua | 2 +- init.lua | 5 +- locale/mail.de.tr | 48 ++++++++++++-------- locale/mail.fr.tr | 48 ++++++++++++-------- locale/mail.zh_TW.tr | 48 ++++++++++++-------- locale/template.txt | 48 ++++++++++++-------- onjoin.lua | 3 +- storage.lua | 52 +++++++++++++++++++++ ui/about.lua | 31 +++++++++---- ui/drafts.lua | 2 +- ui/events.lua | 4 +- ui/inbox.lua | 19 ++++---- ui/options.lua | 13 ++++++ ui/outbox.lua | 3 +- ui/settings.lua | 106 +++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 335 insertions(+), 101 deletions(-) create mode 100644 ui/options.lua create mode 100644 ui/settings.lua diff --git a/api.lua b/api.lua index 544e164..495ab45 100644 --- a/api.lua +++ b/api.lua @@ -98,7 +98,9 @@ function mail.send(m) for _, player in ipairs(minetest.get_connected_players()) do local name = player:get_player_name() if recipients[name] then - minetest.chat_send_player(name, mail_alert) + if mail.get_setting(name, "chatnotif") == true then + minetest.chat_send_player(name, mail_alert) + end local receiver_entry = mail.get_storage_entry(name) local receiver_messages = receiver_entry.inbox mail.hud_update(name, receiver_messages) diff --git a/hud.lua b/hud.lua index 592be35..66119f3 100644 --- a/hud.lua +++ b/hud.lua @@ -48,7 +48,7 @@ function mail.hud_update(playername, messages) end end - if unreadcount == 0 then + if unreadcount == 0 or (not mail.get_setting(playername, "hudnotif")) then player:hud_change(data.imageid, "text", "") player:hud_change(data.textid, "text", "") else diff --git a/init.lua b/init.lua index a8f0951..7973f0d 100644 --- a/init.lua +++ b/init.lua @@ -25,7 +25,8 @@ mail = { sortfield = {}, sortdirection = {}, filter = {}, - multipleselection = {} + multipleselection = {}, + optionstab = {} }, message_drafts = {} @@ -59,6 +60,8 @@ dofile(MP .. "/ui/select_contact.lua") dofile(MP .. "/ui/maillists.lua") dofile(MP .. "/ui/edit_maillists.lua") dofile(MP .. "/ui/compose.lua") +dofile(MP .. "/ui/options.lua") +dofile(MP .. "/ui/settings.lua") dofile(MP .. "/ui/about.lua") -- migrate storage diff --git a/locale/mail.de.tr b/locale/mail.de.tr index b0ea0b2..c95e11e 100644 --- a/locale/mail.de.tr +++ b/locale/mail.de.tr @@ -3,53 +3,65 @@ BCC=BCC Cancel=Abbrechen Save draft=Entwurf Speichern Send=Senden -Delete=Löschen -New=Neu -No drafts=Keine Entwürfe Edit=Bearbeiten -Subject=Betreff +New=Neu +Delete=Löschen +No drafts=Keine Entwürfe Player name=Spielername your contacts.=ihre Kontakte. The contact=Der Kontakt -Save=Speichern -That name=Der Name -is already in=ist bereits in -name cannot=Name kann nicht -be empty.=leer sein. -Back=Zurück -Note=Notiz Maillist name=Verteilerlistenname Desc=Beschreibung Players=Spieler your maillists.=ihre Verteilerlisten. The maillist=Die Verteilerliste +Save=Speichern +That name=Der Name +is already in=ist bereits in +name cannot=Name kann nicht +be empty.=leer sein. Mark Read=Als gelesen makieren Mark Unread=Als ungelesen makieren From=Von -(No description)=(Keine Beschreibung) -No maillist=Keine Verteilerliste -CC=CC Read=Lesen -Ascending= -Descending= Filter= Allow multiple selection= selected= (Un)select all= No mail=Keine Nachrichten +(No description)=(Keine Beschreibung) +No maillist=Keine Verteilerliste +Subject=Betreff Inbox=Posteingang Sent messages=Nachrichten senden Drafts=Entwürfe Contacts=Kontakte Mail lists=Verteilerlisten -About=Über +Options= Close=Schließen (No subject)=(Kein Betreff) -Date=Datum Reply=Antworten Reply all=Allen antworten Forward=Weiter Add=Hinzufügen Remove=Entfernen +CC=CC +Note=Notiz +Back=Zurück Name=Name To=An +Notifications= +Chat notifications= +On join notifications= +HUD notifications= +Message list= +Show unread in different color= +Show CC/BCC in different color= +Default sorting fields= +From/To= +Reset= +Settings= +About=Über +Ascending= +Descending= +Date=Datum diff --git a/locale/mail.fr.tr b/locale/mail.fr.tr index 1fcd868..bc94c5e 100644 --- a/locale/mail.fr.tr +++ b/locale/mail.fr.tr @@ -3,53 +3,65 @@ BCC=Cci Cancel=Annuler Save draft=Enregistrer le brouillon Send=Envoyer -Delete=Supprimer -New=Nouveau -No drafts=Pas de brouillons Edit=Modifier -Subject=Objet +New=Nouveau +Delete=Supprimer +No drafts=Pas de brouillons Player name=Nom du joueur your contacts.=vos contacts. The contact=Ce contact -Save=Sauvegarder -That name=Ce nom -is already in=existe déjà -name cannot=nom ne peut pas -be empty.=être vide. -Back=Retour -Note=Note Maillist name=Nom de la liste de diffusion Desc=Desc Players=Joueurs your maillists.=vos listes de diffusion. The maillist=Cette liste de diffusion +Save=Sauvegarder +That name=Ce nom +is already in=existe déjà +name cannot=nom ne peut pas +be empty.=être vide. Mark Read=Marquer comme lu Mark Unread=Marquer non lu From=De -(No description)=Sans description -No maillist=Aucune liste de diffusion -CC=Cc Read=Lire -Ascending=Croissant -Descending=Décroissant Filter=Filtre Allow multiple selection=Autoriser la sélection multiple selected=sélectionnés (Un)select all=Tout (dé)selectionner No mail=Aucun mail +(No description)=Sans description +No maillist=Aucune liste de diffusion +Subject=Objet Inbox=Boîte de réception Sent messages=Messages envoyés Drafts=Brouillons Contacts=Contacts Mail lists=Listes de diffusion -About=À propos +Options=Options Close=Fermer (No subject)=(Sans objet) -Date=Date Reply=Répondre Reply all=Répondre à tous Forward=Transférer Add=Ajouter Remove=Enlever +CC=Cc +Note=Note +Back=Retour Name=Nom To=À +Notifications=Notifications +Chat notifications=Notifications dans le tchat +On join notifications=Notifications à la connexion +HUD notifications=Notifications ATH +Message list=Liste de messages +Show unread in different color=Coloriser les non lus +Show CC/BCC in different color=Coloriser les Cc/Cci +Default sorting fields=Champs de tri par défaut +From/To=De/À +Reset=Réinitialiser +Settings=Paramètres +About=À propos +Ascending=Croissant +Descending=Décroissant +Date=Date diff --git a/locale/mail.zh_TW.tr b/locale/mail.zh_TW.tr index b0f56ab..5e5aa6a 100644 --- a/locale/mail.zh_TW.tr +++ b/locale/mail.zh_TW.tr @@ -3,53 +3,65 @@ BCC=密件副本 Cancel=取消 Save draft=儲存草稿 Send=發送 -Delete=刪除 -New=新建 -No drafts=沒有草稿 Edit=編輯 -Subject=主旨 +New=新建 +Delete=刪除 +No drafts=沒有草稿 Player name=玩家名稱 your contacts.= The contact= -Save=儲存 -That name= -is already in= -name cannot= -be empty.= -Back=返回 -Note=備註 Maillist name=郵件列表名稱 Desc=描述 Players=玩家 your maillists.= The maillist= +Save=儲存 +That name= +is already in= +name cannot= +be empty.= Mark Read=標記已讀 Mark Unread=標記未讀 From=寄件者 -(No description)=(沒有描述) -No maillist=沒有郵件列表 -CC=副本 Read=閱讀 -Ascending= -Descending= Filter= Allow multiple selection= selected= (Un)select all= No mail=沒有郵件 +(No description)=(沒有描述) +No maillist=沒有郵件列表 +Subject=主旨 Inbox=收件箱 Sent messages=寄件備份 Drafts=草稿 Contacts=聯繫人 Mail lists=郵件列表 -About=關於 +Options= Close=關閉 (No subject)=(沒有主旨) -Date=日期 Reply=回覆 Reply all=回覆所有人 Forward=轉寄 Add=加入 Remove=移除 +CC=副本 +Note=備註 +Back=返回 Name=名稱 To=收件人 +Notifications= +Chat notifications= +On join notifications= +HUD notifications= +Message list= +Show unread in different color= +Show CC/BCC in different color= +Default sorting fields= +From/To= +Reset= +Settings= +About=關於 +Ascending= +Descending= +Date=日期 diff --git a/locale/template.txt b/locale/template.txt index 9c1387f..63e9174 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -3,53 +3,65 @@ BCC= Cancel= Save draft= Send= -Delete= -New= -No drafts= Edit= -Subject= +New= +Delete= +No drafts= Player name= your contacts.= The contact= -Save= -That name= -is already in= -name cannot= -be empty.= -Back= -Note= Maillist name= Desc= Players= your maillists.= The maillist= +Save= +That name= +is already in= +name cannot= +be empty.= Mark Read= Mark Unread= From= -(No description)= -No maillist= -CC= Read= -Ascending= -Descending= Filter= Allow multiple selection= selected= (Un)select all= No mail= +(No description)= +No maillist= +Subject= Inbox= Sent messages= Drafts= Contacts= Mail lists= -About= +Options= Close= (No subject)= -Date= Reply= Reply all= Forward= Add= Remove= +CC= +Note= +Back= Name= To= +Notifications= +Chat notifications= +On join notifications= +HUD notifications= +Message list= +Show unread in different color= +Show CC/BCC in different color= +Default sorting fields= +From/To= +Reset= +Settings= +About= +Ascending= +Descending= +Date= diff --git a/onjoin.lua b/onjoin.lua index a93ea83..4230e65 100644 --- a/onjoin.lua +++ b/onjoin.lua @@ -12,10 +12,9 @@ minetest.register_on_joinplayer(function(player) end end - if unreadcount > 0 then + if unreadcount > 0 and mail.get_setting(name, "onjoinnotif") then minetest.chat_send_player(name, minetest.colorize("#00f529", "(" .. unreadcount .. ") You have mail! Type /mail to read")) - end end, player:get_player_name()) end) diff --git a/storage.lua b/storage.lua index e0de550..54deb29 100644 --- a/storage.lua +++ b/storage.lua @@ -9,6 +9,7 @@ local function populate_entry(e) e.outbox = e.outbox or {} e.drafts = e.drafts or {} e.lists = e.lists or {} + e.settings = e.settings or {} return e end @@ -246,6 +247,57 @@ function mail.extractMaillists(receivers_string, maillists_owner) return receivers end +function mail.get_setting_default_value(setting_name) + local default_values = { + chatnotif = true, + onjoinnotif = true, + hudnotif = true, + unreadcolorenable = true, + cccolorenable = true, + defaultsortfield = 3, + defaultsortdirection = 1, + } + return default_values[setting_name] +end + +function mail.get_setting(playername, setting_name) + local entry = mail.get_storage_entry(playername) + local setting = nil + for i, existing_setting in ipairs(entry.settings) do + if existing_setting.name == setting_name then + setting = entry.settings[i].value + break + end + end + if setting == nil then setting = mail.get_setting_default_value(setting_name) end + return setting +end + +-- add or update a setting +function mail.set_setting(playername, setting) + local entry = mail.get_storage_entry(playername) + local existing_updated = false + for i, existing_setting in ipairs(entry.settings) do + if existing_setting.name == setting.name then + -- update + entry.settings[i] = setting + existing_updated = true + break + end + end + if not existing_updated then + -- insert + table.insert(entry.settings, setting) + end + mail.set_storage_entry(playername, entry) +end + +function mail.reset_settings(playername) + local entry = mail.get_storage_entry(playername) + entry.settings = {} + mail.set_storage_entry(playername, entry) +end + function mail.pairsByKeys(t, f) -- http://www.lua.org/pil/19.3.html local a = {} diff --git a/ui/about.lua b/ui/about.lua index 74d5dd5..28ffd3c 100644 --- a/ui/about.lua +++ b/ui/about.lua @@ -1,17 +1,21 @@ +-- translation +local S = minetest.get_translator("mail") + local FORMNAME = "mail:about" function mail.show_about(name) local formspec = [[ size[10,6;] + tabheader[0.3,1;optionstab;]] .. S("Settings") .. "," .. S("About") .. [[;2;false;false] button[9.35,0;0.75,0.5;back;X] - label[0,0;Mail] - label[0,0.4;Provided my mt-mods] - label[0,0.8;Version: 1.1.4] - label[0,1.4;Licenses:] - label[0.2,1.8;Expat (code), WTFPL (textures)] - label[0,2.4;https://github.com/mt-mods/mail] - label[0,2.8;https://content.minetest.net/packages/mt-mods/mail] - textarea[0.5,4.0;4,5.5;;Note;]] .. + label[0,0.8;Mail] + label[0,1.2;Provided my mt-mods] + label[0,1.6;Version: 1.2.0-dev] + label[0,2.2;Licenses:] + label[0.2,2.6;Expat (code), WTFPL (textures)] + label[0,3.2;https://github.com/mt-mods/mail] + label[0,3.6;https://content.minetest.net/packages/mt-mods/mail] + textarea[0.5,4.8;4,5.5;;Note;]] .. [[NOTE: Communication using this system is NOT guaranteed to be private!]] .. [[ Admins are able to view the messages of any player.] @@ -42,8 +46,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end + local playername = player:get_player_name() + if fields.back then - local playername = player:get_player_name() mail.show_mail_menu(playername) + + elseif fields.optionstab == "1" then + mail.selected_idxs.optionstab[playername] = 1 + mail.show_settings(playername) + + elseif fields.optionstab == "2" then + mail.selected_idxs.optionstab[playername] = 2 + mail.show_about(playername) end end) diff --git a/ui/drafts.lua b/ui/drafts.lua index 03940df..f5c5adf 100644 --- a/ui/drafts.lua +++ b/ui/drafts.lua @@ -9,7 +9,7 @@ local drafts_formspec = "size[8.5,10;]" .. mail.theme .. [[ button[6,1.70;2.5,0.5;delete;]] .. S("Delete") .. [[] button[6,6.8;2.5,0.5;contacts;]] .. S("Contacts") .. [[] button[6,7.6;2.5,0.5;maillists;]] .. S("Mail lists") .. [[] - button[6,8.7;2.5,0.5;about;]] .. S("About") .. [[] + button[6,8.7;2.5,0.5;options;]] .. S("Options") .. [[] button_exit[6,9.5;2.5,0.5;quit;]] .. S("Close") .. [[] tablecolumns[color;text;text] diff --git a/ui/events.lua b/ui/events.lua index 3091ae5..08e23c4 100644 --- a/ui/events.lua +++ b/ui/events.lua @@ -249,8 +249,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) elseif fields.maillists then mail.show_maillists(name) - elseif fields.about then - mail.show_about(name) + elseif fields.options then + mail.show_options(name) elseif fields.selectall then if formname == "mail:inbox" then diff --git a/ui/inbox.lua b/ui/inbox.lua index dfecf49..44fa5a8 100644 --- a/ui/inbox.lua +++ b/ui/inbox.lua @@ -1,10 +1,9 @@ -- translation local S = minetest.get_translator("mail") - function mail.show_inbox(name, sortfieldindex, sortdirection, filter) - sortfieldindex = tonumber(sortfieldindex or mail.selected_idxs.sortfield[name]) or 3 - sortdirection = sortdirection or mail.selected_idxs.sortdirection[name] or "1" + sortfieldindex = tonumber(sortfieldindex or mail.selected_idxs.sortfield[name]) or mail.get_setting(name, "defaultsortfield") or 3 + sortdirection = sortdirection or mail.selected_idxs.sortdirection[name] or tostring(mail.get_setting(name, "defaultsortdirection")) or "1" filter = filter or mail.selected_idxs.filter[name] or "" mail.selected_idxs.inbox[name] = mail.selected_idxs.inbox[name] or {} @@ -21,7 +20,7 @@ function mail.show_inbox(name, sortfieldindex, sortdirection, filter) button[6,5.55;2.5,0.5;markunread;]] .. S("Mark Unread") .. [[] button[6,6.8;2.5,0.5;contacts;]] .. S("Contacts") .. [[] button[6,7.6;2.5,0.5;maillists;]] .. S("Mail lists") .. [[] - button[6,8.7;2.5,0.5;about;]] .. S("About") .. [[] + button[6,8.7;2.5,0.5;options;]] .. S("Options") .. [[] button_exit[6,9.5;2.5,0.5;quit;]] .. S("Close") .. [[] dropdown[0,8.4;2,0.5;sortfield;]] .. @@ -58,28 +57,28 @@ function mail.show_inbox(name, sortfieldindex, sortdirection, filter) end end if selected_id > 0 then - if not message.read then - if not mail.player_in_list(name, message.to) then + if not message.read and mail.get_setting(name, "unreadcolorenable") then + if not mail.player_in_list(name, message.to) and mail.get_setting(name, "cccolorenable") then formspec[#formspec + 1] = ",#A39E5D" else formspec[#formspec + 1] = ",#A39E19" end else - if not mail.player_in_list(name, message.to) then + if not mail.player_in_list(name, message.to) and mail.get_setting(name, "cccolorenable") then formspec[#formspec + 1] = ",#899888" else formspec[#formspec + 1] = ",#466432" end end else - if not message.read then - if not mail.player_in_list(name, message.to) then + if not message.read and mail.get_setting(name, "unreadcolorenable") then + if not mail.player_in_list(name, message.to) and mail.get_setting(name, "cccolorenable") then formspec[#formspec + 1] = ",#FFD788" else formspec[#formspec + 1] = ",#FFD700" end else - if not mail.player_in_list(name, message.to) then + if not mail.player_in_list(name, message.to) and mail.get_setting(name, "cccolorenable") then formspec[#formspec + 1] = ",#CCCCDD" else formspec[#formspec + 1] = "," diff --git a/ui/options.lua b/ui/options.lua new file mode 100644 index 0000000..f703794 --- /dev/null +++ b/ui/options.lua @@ -0,0 +1,13 @@ +-- helper function for tabbed options + +function mail.show_options(playername) + local index = mail.selected_idxs.optionstab[playername] or 1 + if not mail.selected_idxs.optionstab[playername] then + mail.selected_idxs.optionstab[playername] = 1 + end + if index == 1 then + mail.show_settings(playername) + elseif index == 2 then + mail.show_about(playername) + end +end diff --git a/ui/outbox.lua b/ui/outbox.lua index bf282be..3a0a7e3 100644 --- a/ui/outbox.lua +++ b/ui/outbox.lua @@ -1,7 +1,6 @@ -- translation local S = minetest.get_translator("mail") - function mail.show_sent(name, sortfieldindex, sortdirection, filter) sortfieldindex = tonumber(sortfieldindex or mail.selected_idxs.sortfield[name]) or 3 sortdirection = sortdirection or mail.selected_idxs.sortdirection[name] or "1" @@ -19,7 +18,7 @@ function mail.show_sent(name, sortfieldindex, sortdirection, filter) button[6,3.95;2.5,0.5;delete;]] .. S("Delete") .. [[] button[6,6.8;2.5,0.5;contacts;]] .. S("Contacts") .. [[] button[6,7.6;2.5,0.5;maillists;]] .. S("Mail lists") .. [[] - button[6,8.7;2.5,0.5;about;]] .. S("About") .. [[] + button[6,8.7;2.5,0.5;options;]] .. S("Options") .. [[] button_exit[6,9.5;2.5,0.5;quit;]] .. S("Close") .. [[] dropdown[0,8.4;2,0.5;sortfield;]] .. diff --git a/ui/settings.lua b/ui/settings.lua new file mode 100644 index 0000000..256f4a5 --- /dev/null +++ b/ui/settings.lua @@ -0,0 +1,106 @@ +-- translation +local S = minetest.get_translator("mail") + +local FORMNAME = "mail:settings" + +function mail.show_settings(name) + local formspec = [[ + size[10,6;] + tabheader[0.3,1;optionstab;]] .. S("Settings") .. "," .. S("About") .. [[;1;false;false] + button[9.35,0;0.75,0.5;back;X] + + box[0,0.8;3,0.45;#466432] + label[0.2,0.8;]] .. S("Notifications") .. [[] + checkbox[0,1.2;chatnotif;]] .. S("Chat notifications") .. [[;]] .. + tostring(mail.get_setting(name, "chatnotif")) .. [[] + checkbox[0,1.6;onjoinnotif;]] .. S("On join notifications") .. [[;]] .. + tostring(mail.get_setting(name, "onjoinnotif")) .. [[] + checkbox[0,2.0;hudnotif;]] .. S("HUD notifications") .. [[;]] .. + tostring(mail.get_setting(name, "hudnotif")) .. [[] + + box[5,0.8;3,0.45;#466432] + label[5.2,0.8;]] .. S("Message list") .. [[] + checkbox[5,1.2;unreadcolorenable;]] .. S("Show unread in different color") .. [[;]] .. + tostring(mail.get_setting(name, "unreadcolorenable")) .. [[] + checkbox[5,1.6;cccolorenable;]] .. S("Show CC/BCC in different color") .. [[;]] .. + tostring(mail.get_setting(name, "cccolorenable")) .. [[] + + label[5,2.6;]] .. S("Default sorting fields") .. [[] + dropdown[5.5,3.0;2,0.5;defaultsortfield;]] .. + S("From/To") .. "," .. S("Subject") .. "," .. S("Date") .. [[;]] .. + mail.get_setting(name, "defaultsortfield") .. [[;true] + dropdown[7.5,3.0;2,0.5;defaultsortdirection;]] .. + S("Ascending") .. "," .. S("Descending") .. [[;]] .. + mail.get_setting(name, "defaultsortdirection") .. [[;true] + + button[0,5.5;2.5,0.5;reset;]] .. S("Reset") .. [[] + ]] .. mail.theme + + minetest.show_formspec(name, FORMNAME, formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= FORMNAME then + return + end + + local playername = player:get_player_name() + + mail.set_setting(playername, { name = "defaultsortfield", value = tonumber(fields.defaultsortfield) } ) + mail.set_setting(playername, { name = "defaultsortdirection", value = tonumber(fields.defaultsortdirection) } ) + + if fields.back then + mail.show_mail_menu(playername) + return + + elseif fields.reset then + mail.reset_settings(playername) + + elseif fields.optionstab == "1" then + mail.selected_idxs.optionstab[playername] = 1 + + elseif fields.optionstab == "2" then + mail.selected_idxs.optionstab[playername] = 2 + mail.show_about(playername) + return + + elseif fields.chatnotif then + local setting = { + name = "chatnotif", + value = fields.chatnotif == "true", + } + mail.set_setting(playername, setting) + + elseif fields.onjoinnotif then + local setting = { + name = "onjoinnotif", + value = fields.onjoinnotif == "true", + } + mail.set_setting(playername, setting) + + elseif fields.hudnotif then + local setting = { + name = "hudnotif", + value = fields.hudnotif == "true", + } + mail.set_setting(playername, setting) + mail.hud_update(playername, mail.get_storage_entry(playername).inbox) + + elseif fields.unreadcolorenable then + local setting = { + name = "unreadcolorenable", + value = fields.unreadcolorenable == "true", + } + mail.set_setting(playername, setting) + + elseif fields.cccolorenable then + local setting = { + name = "cccolorenable", + value = fields.cccolorenable == "true", + } + mail.set_setting(playername, setting) + end + + mail.show_settings(playername) + return +end)