|
|
|
@ -482,49 +482,54 @@ class ReminderService {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while ($iterator->valid()) {
|
|
|
|
|
$event = $iterator->getEventObject();
|
|
|
|
|
|
|
|
|
|
// Recurrence-exceptions are handled separately, so just ignore them here
|
|
|
|
|
if (\in_array($event, $recurrenceExceptions, true)) {
|
|
|
|
|
$iterator->next();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$recurrenceId = $this->getEffectiveRecurrenceIdOfVEvent($event);
|
|
|
|
|
if ($reminder['recurrence_id'] >= $recurrenceId) {
|
|
|
|
|
$iterator->next();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
while ($iterator->valid()) {
|
|
|
|
|
$event = $iterator->getEventObject();
|
|
|
|
|
|
|
|
|
|
foreach ($event->VALARM as $valarm) {
|
|
|
|
|
/** @var VAlarm $valarm */
|
|
|
|
|
$alarmHash = $this->getAlarmHash($valarm);
|
|
|
|
|
if ($alarmHash !== $reminder['alarm_hash']) {
|
|
|
|
|
// Recurrence-exceptions are handled separately, so just ignore them here
|
|
|
|
|
if (\in_array($event, $recurrenceExceptions, true)) {
|
|
|
|
|
$iterator->next();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$triggerTime = $valarm->getEffectiveTriggerTime();
|
|
|
|
|
|
|
|
|
|
// If effective trigger time is in the past
|
|
|
|
|
// just skip and generate for next event
|
|
|
|
|
$diff = $now->diff($triggerTime);
|
|
|
|
|
if ($diff->invert === 1) {
|
|
|
|
|
$recurrenceId = $this->getEffectiveRecurrenceIdOfVEvent($event);
|
|
|
|
|
if ($reminder['recurrence_id'] >= $recurrenceId) {
|
|
|
|
|
$iterator->next();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->backend->removeReminder($reminder['id']);
|
|
|
|
|
$alarms = $this->getRemindersForVAlarm($valarm, [
|
|
|
|
|
'calendarid' => $reminder['calendar_id'],
|
|
|
|
|
'id' => $reminder['object_id'],
|
|
|
|
|
], $reminder['event_hash'], $alarmHash, true, false);
|
|
|
|
|
$this->writeRemindersToDatabase($alarms);
|
|
|
|
|
foreach ($event->VALARM as $valarm) {
|
|
|
|
|
/** @var VAlarm $valarm */
|
|
|
|
|
$alarmHash = $this->getAlarmHash($valarm);
|
|
|
|
|
if ($alarmHash !== $reminder['alarm_hash']) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Abort generating reminders after creating one successfully
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
$triggerTime = $valarm->getEffectiveTriggerTime();
|
|
|
|
|
|
|
|
|
|
$iterator->next();
|
|
|
|
|
// If effective trigger time is in the past
|
|
|
|
|
// just skip and generate for next event
|
|
|
|
|
$diff = $now->diff($triggerTime);
|
|
|
|
|
if ($diff->invert === 1) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->backend->removeReminder($reminder['id']);
|
|
|
|
|
$alarms = $this->getRemindersForVAlarm($valarm, [
|
|
|
|
|
'calendarid' => $reminder['calendar_id'],
|
|
|
|
|
'id' => $reminder['object_id'],
|
|
|
|
|
], $reminder['event_hash'], $alarmHash, true, false);
|
|
|
|
|
$this->writeRemindersToDatabase($alarms);
|
|
|
|
|
|
|
|
|
|
// Abort generating reminders after creating one successfully
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$iterator->next();
|
|
|
|
|
}
|
|
|
|
|
} catch (MaxInstancesExceededException $e) {
|
|
|
|
|
// Using debug logger as this isn't really an error
|
|
|
|
|
$this->logger->debug('Recurrence with too many instances detected, skipping VEVENT', ['exception' => $e]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->backend->removeReminder($reminder['id']);
|
|
|
|
|