redmine support

This commit is contained in:
Pavel Gnedov 2026-08-29 02:14:16 +07:00
parent 5161c51ff7
commit 276db82c88
2 changed files with 91 additions and 21 deletions

0
makexpi.sh Normal file → Executable file
View file

View file

@ -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);