This commit is contained in:
PhieF 2024-09-16 19:28:18 +06:00 committed by GitHub
commit a40ef74167
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 48 deletions

File diff suppressed because one or more lines are too long

View file

@ -14,6 +14,7 @@ class ViewICSPlugin extends \RainLoop\Plugins\AbstractPlugin
{ {
// $this->UseLangs(true); // $this->UseLangs(true);
$this->addJs('message.js'); $this->addJs('message.js');
$this->addJs('ical.es5.min.cjs');
$this->addJs('windowsZones.js'); $this->addJs('windowsZones.js');
} }
} }

View file

@ -36,13 +36,13 @@
<details data-bind="if: viewICS, visible: viewICS"> <details data-bind="if: viewICS, visible: viewICS">
<summary data-icon="📅" data-bind="text: viewICS().SUMMARY"></summary> <summary data-icon="📅" data-bind="text: viewICS().SUMMARY"></summary>
<table><tbody style="white-space:pre"> <table><tbody style="white-space:pre">
<tr data-bind="visible: viewICS().ORGANIZER"><td>Organizer</td><td data-bind="text: viewICS().ORGANIZER"></td></tr> <tr data-bind="visible: viewICS().ORGANIZER_TXT"><td>Organizer: </td><td><a data-bind="text: viewICS().ORGANIZER_TXT, attr: { href: viewICS().ORGANIZER_MAIL }"></a></td></tr>
<tr><td>Start</td><td data-bind="text: viewICS().DTSTART"></td></tr> <tr><td>Start: </td><td data-bind="text: viewICS().DTSTART"></td></tr>
<tr><td>End</td><td data-bind="text: viewICS().DTEND"></td></tr> <tr><td>End: </td><td data-bind="text: viewICS().DTEND"></td></tr>
<tr data-bind="visible: viewICS().LOCATION"><td>Location: </td><td data-bind="text: viewICS().LOCATION"></td></tr>
<!-- <tr><td>Transparency</td><td data-bind="text: viewICS().TRANSP"></td></tr>--> <!-- <tr><td>Transparency</td><td data-bind="text: viewICS().TRANSP"></td></tr>-->
<tr data-bind="foreach: viewICS().ATTENDEE"> <tr><td>Attendees: </td><td data-bind="foreach: viewICS().ATTENDEE"><span data-bind="text: $data.replace(/;/g,';\\n')"></span> </td>
<td></td><td data-bind="text: $data.replace(/;/g,';\\n')"></td>
</tr>
</tbody></table> </tbody></table>
</details>`)); </details>`));
@ -88,55 +88,33 @@
}); });
// ICS attachment // ICS attachment
// let ics = msg.attachments.find(attachment => 'application/ics' == attachment.mimeType); // let ics = msg.attachments.find(attachment => 'application/ics' == attachment.mimeType);
let ics = msg.attachments.find(attachment => 'text/calendar' == attachment.mimeType); let ics = msg.attachments.find(attachment => 'text/calendar' == attachment.mimeType);
if (ics && ics.download) { if (ics && ics.download) {
// fetch it and parse the VEVENT // fetch it and parse the VEVENT
rl.fetch(ics.linkDownload()) rl.fetch(ics.linkDownload())
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response }))) .then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
.then(text => { .then(text => {
let VEVENT, let jcalData = ICAL.parse(text)
VALARM, var comp = new ICAL.Component(jcalData);
multiple = ['ATTACH','ATTENDEE','CATEGORIES','COMMENT','CONTACT','EXDATE', var vevent = comp.getFirstSubcomponent("vevent");
'EXRULE','RSTATUS','RELATED','RESOURCES','RDATE','RRULE'], var event = new ICAL.Event(vevent);
lines = text.split(/\r?\n/), let VEVENT = {};
i = lines.length; if(event.organizer.startsWith("mailto:")){
while (i--) { VEVENT.ORGANIZER_TXT=event.organizer.substr(7)
let line = lines[i]; VEVENT.ORGANIZER_MAIL = event.organizer
if (VEVENT) { } else
while (line.startsWith(' ') && i--) { VEVENT.ORGANIZER_TXT=event.organizer
line = lines[i] + line.slice(1); VEVENT.SUMMARY = event.summary;
} VEVENT.DTSTART = parseDate(vevent.getFirstPropertyValue("dtstart"));
if (line.startsWith('END:VALARM')) { VEVENT.DTEND = parseDate(vevent.getFirstPropertyValue("dtend"));
VALARM = {}; VEVENT.LOCATION = event.location;
continue; VEVENT.ATTENDEE = []
} else if (line.startsWith('BEGIN:VALARM')) { for(let attendee of event.attendees){
VEVENT.VALARM || (VEVENT.VALARM = []); VEVENT.ATTENDEE.push(attendee.getFirstParameter("cn"));
VEVENT.VALARM.push(VALARM);
VALARM = null;
continue;
} else if (line.startsWith('BEGIN:VEVENT')) {
break;
}
line = line.match(/^([^:;]+)[:;](.+)$/);
if (line) {
if (VALARM) {
VALARM[line[1]] = line[2];
} else if (multiple.includes(line[1]) || 'X-' == line[1].slice(0,2)) {
VEVENT[line[1]] || (VEVENT[line[1]] = []);
VEVENT[line[1]].push(line[2]);
} else {
if ('DTSTART' === line[1] || 'DTEND' === line[1]) {
line[2] = parseDate(line[2]);
}
VEVENT[line[1]] = line[2];
}
}
} else if (line.startsWith('END:VEVENT')) {
VEVENT = {};
}
} }
// METHOD:REPLY || METHOD:REQUEST
// console.dir({VEVENT:VEVENT});
if (VEVENT) { if (VEVENT) {
VEVENT.rawText = text; VEVENT.rawText = text;
VEVENT.isCancelled = () => VEVENT.STATUS?.includes('CANCELLED'); VEVENT.isCancelled = () => VEVENT.STATUS?.includes('CANCELLED');