redmine support
This commit is contained in:
parent
5161c51ff7
commit
276db82c88
2 changed files with 91 additions and 21 deletions
0
makexpi.sh
Normal file → Executable file
0
makexpi.sh
Normal file → Executable 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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue