From 276db82c88b92ff714d0a48318731b041d341913 Mon Sep 17 00:00:00 2001 From: Pavel Gnedov Date: Sat, 29 Aug 2026 02:14:16 +0700 Subject: [PATCH] redmine support --- makexpi.sh | 0 src/background.js | 112 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 91 insertions(+), 21 deletions(-) mode change 100644 => 100755 makexpi.sh diff --git a/makexpi.sh b/makexpi.sh old mode 100644 new mode 100755 diff --git a/src/background.js b/src/background.js index 0364875..6e130dc 100644 --- a/src/background.js +++ b/src/background.js @@ -14,28 +14,98 @@ async function* iterateMessagePages(page) { } async function load() { - await messenger.messages.onNewMailReceived.addListener(async (folder, messages) => { - for await (let message of iterateMessagePages(messages)) { - let full = await messenger.messages.getFull(message.id); - let inReplyTos = full["headers"]["in-reply-to"]; - if (inReplyTos.length > 0) { - let inReplyTo = inReplyTos[0] - if (inReplyTo.startsWith("<")) { - inReplyTo = inReplyTo.substring(1); - } - if (inReplyTo.endsWith(">")) { - inReplyTo = inReplyTo.substring(0, inReplyTo.length - 1) - } - let queryResult = await messenger.messages.query({"headerMessageId" : inReplyTo}) - if (queryResult.messages.length > 0) { - let parent = queryResult.messages[0] - if (parent['folder'] != message['folder']) { - messenger.messages.move([message.id], parent['folder']) - } - } - } + const getSubject = (full) => { + try { + const res = full?.headers?.subject && full?.headers?.subject[0] ? full.headers.subject[0] : null; + return res; + } catch (ex) { + console.error('===> ex:', ex); + return null; } - }) + } + const getIssueBlock = (subject) => { + if (!subject) return null; + const re = /\[.* #\d+\]/; + const match = subject.match(re); + if (match && match[0]) return match[0]; + return null; + }; + const getReplyTo = (inReplyTos) => { + if (!inReplyTos || inReplyTos.length <= 0) return null; + let inReplyTo = inReplyTos[0] + if (inReplyTo.startsWith("<")) { + inReplyTo = inReplyTo.substring(1); + } + if (inReplyTo.endsWith(">")) { + inReplyTo = inReplyTo.substring(0, inReplyTo.length - 1) + } + return inReplyTo; + }; + const sortByDateAsc = (messages) => { + return messages.slice().sort((a, b) => a.date - b.date); + }; + const findByReplyTo = async (accountId, inReplyTo) => { + if (!inReplyTo) return null; + let queryResult = await messenger.messages.query({"headerMessageId" : inReplyTo, accountId: accountId}) + // console.debug('===> findByReplyTo > queryResult.messages', queryResult.messages); + const foundMessages = sortByDateAsc(queryResult.messages); + if (foundMessages.length > 0) { + // console.debug('===> findByReplyTo > queryResult.messages', foundMessages); + return foundMessages[0]; + } + return null; + } + const findBySubject = async (accountId, subject) => { + if (!subject) return null; + let queryResult = await messenger.messages.query({"subject" : subject, accountId: accountId}); + // console.debug('===> findBySubject > queryResult.messages', queryResult.messages); + const foundMessages = sortByDateAsc(queryResult.messages); + if (foundMessages.length > 0) { + // console.debug('===> findBySubject > foundMessages:', foundMessages); + return foundMessages[0]; + } + return null; + } + const processMessage = async (folder, message) => { + console.log(`Анализ входящего сообщения ${JSON.stringify(message.subject)}`); + const accountId = message?.folder?.accountId; + // console.debug('===> accountId:', accountId); + let full = await messenger.messages.getFull(message.id); + const subject = getSubject(full); + const subjectIssue = getIssueBlock(subject); + let inReplyTos = full["headers"]["in-reply-to"]; + const inReplyTo = getReplyTo(inReplyTos); + let parent = await findByReplyTo(accountId, inReplyTo) || await findBySubject(accountId, subjectIssue); + // console.debug('===> parent:', parent); + if (parent && parent['folder'] != message['folder']) { + if (parent['folder']['accountId'] == message['folder']['accountId']) { + console.log(`Автоматическое перемещение сообщения ${JSON.stringify(subject)} в папку ${parent['folder'].path} -`, parent['folder']); + try { + messenger.messages.move([message.id], parent['folder']) + } catch (ex) { + console.error(`Ошибка при перемещении письма ${subject} в папку ${parent?.folder?.path}:`, ex); + return; + } + } else { + console.warn('Перемещение в другой аккаунт предотвращено'); + } + } else { + console.log(`Перемещение ${JSON.stringify(subject)} не требуется`); + } + }; + const onNewMail = async (folder, messages) => { + for await (let message of iterateMessagePages(messages)) { + await processMessage(folder, message); + } + }; + window.__debug__.processMessage = processMessage; + window.__debug__.onNewMail = onNewMail; + window.__debug__.messenger = messenger; + await messenger.messages.onNewMailReceived.addListener(onNewMail); +} + +window.__debug__ = { + load: load } document.addEventListener("DOMContentLoaded", load);