taSpamReport is now a class and not a singleton

This commit is contained in:
mic 2026-03-22 22:38:23 +01:00
parent 55240868dd
commit 1ea548a61d
3 changed files with 49 additions and 49 deletions

View file

@ -17,35 +17,35 @@
*/ */
import { taStorage } from './mzta-storage.js'; import { taStorage } from './mzta-storage.js';
import { taLogger } from './mzta-logger.js';
export const taSpamReport = { export class taSpamReport {
logger: console,
do_debug: false,
_data_prefix: 'mzta-spam-report-',
_processing_prefix: 'mzta-spam-processing-',
_max_reports: 100,
_storage: null,
_getStorage() { _processing_prefix = 'mzta-spam-processing-';
if (!this._storage) this._storage = new taStorage(this.do_debug); _max_reports = 100;
return this._storage; _storage = null;
}, taLog = null;
constructor(do_debug = false) {
this._storage = new taStorage(do_debug);
this.taLog = new taLogger('mzta-spamreport', do_debug);
}
async setProcessing(data_id) { async setProcessing(data_id) {
const key = this._processing_prefix + data_id; const key = this._processing_prefix + data_id;
await browser.storage.session.set({ [key]: true }); await browser.storage.session.set({ [key]: true });
}, }
async isProcessing(data_id) { async isProcessing(data_id) {
const key = this._processing_prefix + data_id; const key = this._processing_prefix + data_id;
let output = await browser.storage.session.get(key); let output = await browser.storage.session.get(key);
return output[key] || false; return output[key] || false;
}, }
async saveReportData(data, data_id) { async saveReportData(data, data_id) {
await this._getStorage().writeSpam(data_id, data, true); await this._storage.writeSpam(data_id, data, true);
await browser.storage.session.remove(this._processing_prefix + data_id); await browser.storage.session.remove(this._processing_prefix + data_id);
}, }
async saveError(data_id, error_message) { async saveError(data_id, error_message) {
let data = { let data = {
@ -56,11 +56,11 @@ export const taSpamReport = {
}; };
await this.saveReportData(data, data_id); await this.saveReportData(data, data_id);
return data; return data;
}, }
async loadReportData(data_id) { async loadReportData(data_id) {
let record = await this._getStorage().getRecord(data_id); let record = await this._storage.getRecord(data_id);
if (!record || !this._getStorage().hasField(record, 'spam')) return null; if (!record || !this._storage.hasField(record, 'spam')) return null;
let spam = record.spam; let spam = record.spam;
return { return {
headerMessageId: data_id, headerMessageId: data_id,
@ -73,42 +73,40 @@ export const taSpamReport = {
moved: spam.moved, moved: spam.moved,
SpamThreshold: spam.SpamThreshold, SpamThreshold: spam.SpamThreshold,
}; };
}, }
async removeReportData(data_id) { async removeReportData(data_id) {
await this._getStorage().deleteSpamField(data_id); await this._storage.deleteSpamField(data_id);
await browser.storage.session.remove(this._processing_prefix + data_id); await browser.storage.session.remove(this._processing_prefix + data_id);
}, }
async getAllReportData() { async getAllReportData() {
return await this._getStorage().getAllSpamRecords(); return await this._storage.getAllSpamRecords();
}, }
async clearReportData() { async clearReportData() {
let storage = this._getStorage(); let allSpam = await this._storage.getAllSpamRecords();
let allSpam = await storage.getAllSpamRecords();
for (let messageId of Object.keys(allSpam)) { for (let messageId of Object.keys(allSpam)) {
await storage.deleteSpamField(messageId); await this._storage.deleteSpamField(messageId);
} }
let allSession = await browser.storage.session.get(null); let allSession = await browser.storage.session.get(null);
let keysToDelete = Object.keys(allSession).filter(k => k.startsWith(this._processing_prefix)); let keysToDelete = Object.keys(allSession).filter(k => k.startsWith(this._processing_prefix));
for (let key of keysToDelete) { for (let key of keysToDelete) {
await browser.storage.session.remove(key); await browser.storage.session.remove(key);
} }
}, }
async truncReportData() { async truncReportData() {
let data = await this._getStorage().getAllSpamRecords(); let data = await this._storage.getAllSpamRecords();
let sortedData = this.sortReportsByDate(data); let sortedData = this.sortReportsByDate(data);
let keys = Object.keys(sortedData); let keys = Object.keys(sortedData);
if (keys.length > this._max_reports) { if (keys.length > this._max_reports) {
let storage = this._getStorage();
for (let i = this._max_reports; i < keys.length; i++) { for (let i = this._max_reports; i < keys.length; i++) {
await storage.deleteSpamField(keys[i]); await this._storage.deleteSpamField(keys[i]);
} }
} }
}, }
sortReportsByDate(data) { sortReportsByDate(data) {
if (!data) return {}; if (!data) return {};
@ -126,4 +124,4 @@ export const taSpamReport = {
return sortedReports; return sortedReports;
} }
}; }

View file

@ -94,6 +94,7 @@ await reload_pref_init();
let taLog = new taLogger("mzta-background",prefs_init.do_debug); let taLog = new taLogger("mzta-background",prefs_init.do_debug);
taWorkingStatus.taLog = taLog; taWorkingStatus.taLog = taLog;
let spamReport = new taSpamReport(prefs_init.do_debug);
let special_prompts_ids = getActiveSpecialPromptsIDs({ let special_prompts_ids = getActiveSpecialPromptsIDs({
addtags: prefs_init.add_tags, addtags: prefs_init.add_tags,
@ -359,10 +360,10 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (sender.tab.type !== 'messageDisplay' && sender.tab.type !== 'mail') return; if (sender.tab.type !== 'messageDisplay' && sender.tab.type !== 'mail') return;
let message = await browser.messageDisplay.getDisplayedMessage(tabId); let message = await browser.messageDisplay.getDisplayedMessage(tabId);
if (!message) return; if (!message) return;
let report = await taSpamReport.loadReportData(message.headerMessageId); let report = await spamReport.loadReportData(message.headerMessageId);
if (report) { if (report) {
browser.tabs.sendMessage(tabId, { command: "showSpamReport", data: report }); browser.tabs.sendMessage(tabId, { command: "showSpamReport", data: report });
} else if (await taSpamReport.isProcessing(message.headerMessageId)) { } else if (await spamReport.isProcessing(message.headerMessageId)) {
browser.tabs.sendMessage(tabId, { command: "showSpamCheckInProgress" }); browser.tabs.sendMessage(tabId, { command: "showSpamCheckInProgress" });
} }
} catch (e) { } catch (e) {
@ -372,7 +373,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
_checkSpamReport(sender.tab.id); _checkSpamReport(sender.tab.id);
break; break;
case 'removeSpamReport': case 'removeSpamReport':
taSpamReport.removeReportData(message.headerMessageId); spamReport.removeReportData(message.headerMessageId);
break; break;
default: default:
break; break;
@ -1042,9 +1043,6 @@ const newEmailListener = (folder, messagesList) => {
async function _newEmailListener(){ async function _newEmailListener(){
let messages = getMessages(messagesList); let messages = getMessages(messagesList);
taSpamReport.logger = taLog;
taSpamReport.do_debug = prefs_init.do_debug;
let add_tags_auto_enabled = prefs_init.add_tags && prefs_init.add_tags_auto; let add_tags_auto_enabled = prefs_init.add_tags && prefs_init.add_tags_auto;
await processEmails({ await processEmails({
@ -1054,7 +1052,7 @@ const newEmailListener = (folder, messagesList) => {
}); });
if(prefs_init.spamfilter){ if(prefs_init.spamfilter){
taSpamReport.truncReportData(); spamReport.truncReportData();
} }
} }
@ -1177,8 +1175,8 @@ async function processEmails(args) {
} }
} }
await taSpamReport.removeReportData(message.headerMessageId); await spamReport.removeReportData(message.headerMessageId);
await taSpamReport.setProcessing(message.headerMessageId); await spamReport.setProcessing(message.headerMessageId);
await updateSpamPanel(message.headerMessageId, "showSpamCheckInProgress"); await updateSpamPanel(message.headerMessageId, "showSpamCheckInProgress");
@ -1209,7 +1207,7 @@ async function processEmails(args) {
spamfilter_result = (await cmd_spamfilter.sendPrompt()).trim(); spamfilter_result = (await cmd_spamfilter.sendPrompt()).trim();
} catch (err) { } catch (err) {
console.error("[ThunderAI | SpamFilter] Error getting spamfilter: ", err); console.error("[ThunderAI | SpamFilter] Error getting spamfilter: ", err);
let err_data = await taSpamReport.saveError(message.headerMessageId, err.message || String(err)); let err_data = await spamReport.saveError(message.headerMessageId, err.message || String(err));
await updateSpamPanel(message.headerMessageId, "showSpamReport", err_data); await updateSpamPanel(message.headerMessageId, "showSpamReport", err_data);
continue; continue;
} }
@ -1220,7 +1218,7 @@ async function processEmails(args) {
jsonObj = extractJsonObject(spamfilter_result); jsonObj = extractJsonObject(spamfilter_result);
} catch (e) { } catch (e) {
console.error("[ThunderAI | SpamFilter] Error extracting JSON from AI response: ", e); console.error("[ThunderAI | SpamFilter] Error extracting JSON from AI response: ", e);
let err_data = await taSpamReport.saveError(message.headerMessageId, e.message || String(e)); let err_data = await spamReport.saveError(message.headerMessageId, e.message || String(e));
await updateSpamPanel(message.headerMessageId, "showSpamReport", err_data); await updateSpamPanel(message.headerMessageId, "showSpamReport", err_data);
continue; continue;
} }
@ -1246,7 +1244,7 @@ async function processEmails(args) {
taLog.log("Marked as spam [" + message.headerMessageId + "]"); taLog.log("Marked as spam [" + message.headerMessageId + "]");
} }
taSpamReport.saveReportData(report_data, message.headerMessageId); spamReport.saveReportData(report_data, message.headerMessageId);
// Check if the message is currently displayed and update the banner // Check if the message is currently displayed and update the banner
await updateSpamPanel(message.headerMessageId, "showSpamReport", report_data); await updateSpamPanel(message.headerMessageId, "showSpamReport", report_data);

View file

@ -41,11 +41,15 @@ import {
} from "../_lib/connection-ui.js"; } from "../_lib/connection-ui.js";
let autocompleteSuggestions = []; let autocompleteSuggestions = [];
let taLog = new taLogger("mzta-spamfilter-page",true); let taLog = null;
taSpamReport.logger = taLog; let spamReport = null;
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
let prefs = await browser.storage.sync.get({ do_debug: prefs_default.do_debug });
taLog = new taLogger("mzta-spamfilter-page", prefs.do_debug);
spamReport = new taSpamReport(prefs.do_debug);
let specialPrompts = await getSpecialPrompts(); let specialPrompts = await getSpecialPrompts();
let spamfilter_prompt = specialPrompts.find(prompt => prompt.id === 'prompt_spamfilter'); let spamfilter_prompt = specialPrompts.find(prompt => prompt.id === 'prompt_spamfilter');
@ -162,10 +166,10 @@ document.addEventListener('DOMContentLoaded', async () => {
} }
if (selectedAccounts.length === document.querySelectorAll('.accountCheckbox').length) { if (selectedAccounts.length === document.querySelectorAll('.accountCheckbox').length) {
browser.storage.sync.set({ spamfilter_enabled_accounts: [] }); browser.storage.sync.set({ spamfilter_enabled_accounts: [] });
taSpamReport.logger.log("All accounts selected, saving spamfilter_enabled_accounts = []."); taLog.log("All accounts selected, saving spamfilter_enabled_accounts = [].");
} else { } else {
browser.storage.sync.set({ spamfilter_enabled_accounts: selectedAccounts }); browser.storage.sync.set({ spamfilter_enabled_accounts: selectedAccounts });
taSpamReport.logger.log("Saving spamfilter_enabled_accounts = " + JSON.stringify(selectedAccounts) + "."); taLog.log("Saving spamfilter_enabled_accounts = " + JSON.stringify(selectedAccounts) + ".");
} }
}); });
}); });
@ -200,7 +204,7 @@ function check_spamfilter_threshold(event) {
} }
async function loadSpamReport(){ async function loadSpamReport(){
let report_data = await taSpamReport.getAllReportData(); let report_data = await spamReport.getAllReportData();
//console.log(">>>>>>>>>>>> loadSpamReport: " + JSON.stringify(report_data)); //console.log(">>>>>>>>>>>> loadSpamReport: " + JSON.stringify(report_data));
//document.getElementById("report_data").textContent = JSON.stringify(report_data, null, 2); //document.getElementById("report_data").textContent = JSON.stringify(report_data, null, 2);
if(report_data == undefined){ if(report_data == undefined){