From 617a1467d78738d75c94dccfda16d156b8bbc3a5 Mon Sep 17 00:00:00 2001 From: Mic Date: Tue, 22 Apr 2025 00:31:00 +0200 Subject: [PATCH] Add spam filter account selection and management features. see #326 --- _locales/en/messages.json | 4 +++ mzta-background.js | 15 ++++++-- options/mzta-options-default.js | 1 + pages/spamfilter/mzta-spamfilter.css | 15 +++++++- pages/spamfilter/mzta-spamfilter.html | 45 ++++++++++++++---------- pages/spamfilter/mzta-spamfilter.js | 49 ++++++++++++++++++++++++++- 6 files changed, 106 insertions(+), 23 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index d048d10f..6927118e 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1362,5 +1362,9 @@ "AccountSelector_AutoTags_infoline": { "message": "Each change is saved immediately.", "description": "" + }, + "AccountSelector_Spamfilter": { + "message": "Choose the accounts where the spam filter is enabled", + "description": "" } } \ No newline at end of file diff --git a/mzta-background.js b/mzta-background.js index 72267a41..86b43752 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -845,6 +845,9 @@ const newEmailListener = (folder, messagesList) => { async function processEmails(messages, addTagsAuto, spamFilter) { taWorkingStatus.startWorking(); + + let prefs_aats = await browser.storage.sync.get({ add_tags_maxnum: prefs_default.add_tags_maxnum, connection_type: prefs_default.connection_type, add_tags_force_lang: prefs_default.add_tags_force_lang, default_chatgpt_lang: prefs_default.default_chatgpt_lang, add_tags_auto_force_existing: prefs_default.add_tags_auto_force_existing, add_tags_enabled_accounts: prefs_default.add_tags_enabled_accounts, spamfilter_enabled_accounts: prefs_default.spamfilter_enabled_accounts }); + for await (let message of messages) { let curr_fullMessage = null; let msg_text = null; @@ -857,10 +860,9 @@ async function processEmails(messages, addTagsAuto, spamFilter) { } if (addTagsAuto) { - let prefs_aat = await browser.storage.sync.get({ add_tags_maxnum: prefs_default.add_tags_maxnum, connection_type: prefs_default.connection_type, add_tags_force_lang: prefs_default.add_tags_force_lang, default_chatgpt_lang: prefs_default.default_chatgpt_lang, add_tags_auto_force_existing: prefs_default.add_tags_auto_force_existing, add_tags_enabled_accounts: prefs_default.add_tags_enabled_accounts }); - if(prefs_aat.add_tags_enabled_accounts.length > 0){ + if(prefs_aats.add_tags_enabled_accounts.length > 0){ let accountId = message.folder.accountId; - if(!prefs_aat.add_tags_enabled_accounts.includes(accountId)){ + if(!prefs_aats.add_tags_enabled_accounts.includes(accountId)){ taLog.log("Account " + accountId + " not enabled for add_tags, skipping..."); continue; } @@ -886,6 +888,13 @@ async function processEmails(messages, addTagsAuto, spamFilter) { } if (spamFilter) { + if(prefs_aats.spamfilter_enabled_accounts.length > 0){ + let accountId = message.folder.accountId; + if(!prefs_aats.spamfilter_enabled_accounts.includes(accountId)){ + taLog.log("Account " + accountId + " not enabled for spamfilter, skipping..."); + continue; + } + } let curr_prompt_spamfilter = await getSpamFilterPrompt(); let chatgpt_lang = await taPromptUtils.getDefaultLang(curr_prompt_spamfilter); let specialFullPrompt_spamfilter = await taPromptUtils.preparePrompt(curr_prompt_spamfilter, message, chatgpt_lang, '', body_text, curr_fullMessage.headers.subject, msg_text, '', ''); diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index 409264dd..501b0254 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -59,4 +59,5 @@ export const prefs_default = { spamfilter: false, spamfilter_threshold: 70, spamfilter_context_menu: true, + spamfilter_enabled_accounts: [], } \ No newline at end of file diff --git a/pages/spamfilter/mzta-spamfilter.css b/pages/spamfilter/mzta-spamfilter.css index e62e300d..d570c93f 100644 --- a/pages/spamfilter/mzta-spamfilter.css +++ b/pages/spamfilter/mzta-spamfilter.css @@ -1,4 +1,4 @@ -#spamfilter_prompt_container{ +#spamfilter_container, #account_selector_container, #spamfitler_reports_container{ width: 90%; margin: 20px auto; } @@ -7,6 +7,19 @@ width: 100%; } +#account_selector_container{ + margin-top: 40px; + margin-bottom: 40px; +} + +#account_selector_checkboxes{ + padding: 10px; + border: 1px solid gray; + width: 24em; + margin-bottom: 10px; + margin-top: 10px; +} + .infoline{ font-size: 0.8em; font-style: italic; diff --git a/pages/spamfilter/mzta-spamfilter.html b/pages/spamfilter/mzta-spamfilter.html index 3ccf6155..2496b976 100644 --- a/pages/spamfilter/mzta-spamfilter.html +++ b/pages/spamfilter/mzta-spamfilter.html @@ -44,24 +44,33 @@
-

__MSG_SpamReport_Title__

- - - - - - - - - - - - - - - - -
Message_ID__MSG_Date____MSG_From____MSG_Subject____MSG_Spam_Value____MSG_Moved_to_Spam____MSG_Explanation____MSG_Report_Date__
+
+
__MSG_AccountSelector_Spamfilter__ +
__MSG_AccountSelector_AutoTags_infoline__
+
+ + +
+
+

__MSG_SpamReport_Title__

+ + + + + + + + + + + + + + + + +
Message_ID__MSG_Date____MSG_From____MSG_Subject____MSG_Spam_Value____MSG_Moved_to_Spam____MSG_Explanation____MSG_Report_Date__
+
diff --git a/pages/spamfilter/mzta-spamfilter.js b/pages/spamfilter/mzta-spamfilter.js index e0212f10..d537454a 100644 --- a/pages/spamfilter/mzta-spamfilter.js +++ b/pages/spamfilter/mzta-spamfilter.js @@ -22,6 +22,7 @@ import { getSpecialPrompts, setSpecialPrompts } from "../../js/mzta-prompts.js"; import { getPlaceholders } from "../../js/mzta-placeholders.js"; import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js"; import { taSpamReport } from '../../js/mzta-spamreport.js'; +import { getAccountsList } from "../../js/mzta-utils.js"; let autocompleteSuggestions = []; let taLog = new taLogger("mzta-spamfilter-page",true); @@ -80,7 +81,53 @@ document.addEventListener('DOMContentLoaded', async () => { autocompleteSuggestions = (await getPlaceholders(true)).filter(p => !(p.id === 'additional_text')).map(p => ({command: '{%'+p.id+'%}', type: p.type})); textareaAutocomplete(spamfilter_textarea, autocompleteSuggestions, 1); // type_value = 1, only when reading an email - loadSpamReport() + //Accounts manager + let accounts = await getAccountsList(); + const accountsContainer = document.getElementById('account_selector_checkboxes'); + accounts.forEach(account => { + const accountLabel = document.createElement('label'); + const accountCheckbox = document.createElement('input'); + accountCheckbox.type = 'checkbox'; + accountCheckbox.classList.add('accountCheckbox'); + accountCheckbox.value = account.id; + accountLabel.appendChild(accountCheckbox); + accountLabel.appendChild(document.createTextNode(account.name)); + accountsContainer.appendChild(accountLabel); + accountsContainer.appendChild(document.createElement('br')); + }); + + let prefs_spamfilter = await browser.storage.sync.get({ spamfilter_enabled_accounts: [] }); + let spamfilter_enabled_accounts = prefs_spamfilter.spamfilter_enabled_accounts; + document.querySelectorAll('.accountCheckbox').forEach(checkbox => { + if (spamfilter_enabled_accounts.length === 0 || spamfilter_enabled_accounts.includes(checkbox.value)) { + checkbox.checked = true; + } else { + checkbox.checked = false; + } + }); + + document.querySelectorAll('.accountCheckbox').forEach(checkbox => { + checkbox.addEventListener('change', () => { + let selectedAccounts = Array.from(document.querySelectorAll('.accountCheckbox:checked')).map(checkbox => checkbox.value); + if (selectedAccounts.length === document.querySelectorAll('.accountCheckbox').length) { + browser.storage.sync.set({ spamfilter_enabled_accounts: [] }); + } else { + browser.storage.sync.set({ spamfilter_enabled_accounts: selectedAccounts }); + } + }); + }); + + document.getElementById('accounts_select_all').addEventListener('click', () => { + let checkboxes = document.querySelectorAll('.accountCheckbox'); + checkboxes.forEach(checkbox => checkbox.checked = true); + }); + + document.getElementById('accounts_deselect_all').addEventListener('click', () => { + let checkboxes = document.querySelectorAll('.accountCheckbox'); + checkboxes.forEach(checkbox => checkbox.checked = false); + }); + + loadSpamReport(); }); function check_spamfilter_threshold(event) {