/** * @brief generates the output for an event which will be readable for our js * @param (mixed) $event - event object / array * @param (int) $start - DateTime object of start * @param (int) $end - DateTime object of end * @return (array) $output - readable output */ public static function generateEventOutput(array $event, $start, $end, $list = false) { if (!isset($event['calendardata']) && !isset($event['vevent'])) { return false; } if (!isset($event['calendardata']) && isset($event['vevent'])) { $event['calendardata'] = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud's Internal iCal System\n" . $event['vevent']->serialize() . "END:VCALENDAR"; } try { $object = VObject::parse($event['calendardata']); if (!$object) { \OCP\Util::writeLog(self::$appname, __METHOD__ . ' Error parsing event: ' . print_r($event, true), \OCP\Util::DEBUG); return array(); } $output = array(); if ($object->name === 'VEVENT') { $vevent = $object; } elseif (isset($object->VEVENT)) { $vevent = $object->VEVENT; } else { \OCP\Util::writeLog(self::$appname, __METHOD__ . ' Object contains not event: ' . print_r($event, true), \OCP\Util::DEBUG); return $output; } $id = $event['id']; $SUMMARY = !is_null($vevent->SUMMARY) && $vevent->SUMMARY->getValue() != '' ? strtr($vevent->SUMMARY->getValue(), array('\\,' => ',', '\\;' => ';')) : (string) self::$l10n->t('unnamed'); if ($event['summary'] != '') { $SUMMARY = $event['summary']; } if (Object::getowner($id) !== \OCP\USER::getUser()) { // do not show events with private or unknown access class // \OCP\Util::writeLog('calendar','Sharee ID: ->'.$event['calendarid'].':'.$event['summary'], \OCP\Util::DEBUG); if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { $SUMMARY = (string) self::$l10n->t('Busy'); } if (isset($vevent->CLASS) && ($vevent->CLASS->getValue() === 'PRIVATE' || $vevent->CLASS->getValue() === '')) { return $output; } $object = Object::cleanByAccessClass($id, $object); } $event['orgevent'] = ''; if (array_key_exists('org_objid', $event) && $event['org_objid'] > 0) { $event['orgevent'] = array('calendarcolor' => '#000'); } $event['isalarm'] = false; if (isset($vevent->VALARM)) { $event['isalarm'] = true; } $event['privat'] = false; if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'PRIVATE') { $event['privat'] = 'private'; } if (isset($vevent->CLASS) && $vevent->CLASS->getValue() === 'CONFIDENTIAL') { $event['privat'] = 'confidential'; } $allday = $vevent->DTSTART->getValueType() == 'DATE' ? true : false; $last_modified = @$vevent->__get('LAST-MODIFIED'); $calid = ''; if (array_key_exists('calendarid', $event)) { $calid = $event['calendarid']; } /* $eventPerm = ''; if (array_key_exists('permissions', $event)) { $eventPerm = Calendar::permissionReader($event['permissions']); } $location = (!is_null($vevent -> LOCATION) && $vevent -> LOCATION -> getValue() != '') ? $vevent -> getAsString('LOCATION') : ''; */ $bDay = false; if (array_key_exists('bday', $event)) { $bDay = $event['bday']; } $isEventShared = false; if (isset($event['shared']) && $event['shared'] === 1) { $isEventShared = $event['shared']; } $lastmodified = $last_modified ? $last_modified->getDateTime()->format('U') : 0; $staticoutput = array('id' => (int) $event['id'], 'title' => $SUMMARY, 'lastmodified' => $lastmodified, 'categories' => $vevent->getAsArray('CATEGORIES'), 'calendarid' => (int) $calid, 'bday' => $bDay, 'shared' => $isEventShared, 'privat' => $event['privat'], 'isrepeating' => false, 'isalarm' => $event['isalarm'], 'orgevent' => $event['orgevent'], 'allDay' => $allday); if (Object::isrepeating($id) && Repeat::is_cached_inperiod($event['id'], $start, $end)) { $cachedinperiod = Repeat::get_inperiod($id, $start, $end); foreach ($cachedinperiod as $cachedevent) { $dynamicoutput = array(); if ($allday) { $start_dt = new \DateTime($cachedevent['startdate'], new \DateTimeZone('UTC')); $end_dt = new \DateTime($cachedevent['enddate'], new \DateTimeZone('UTC')); $dynamicoutput['start'] = $start_dt->format('Y-m-d'); $dynamicoutput['end'] = $end_dt->format('Y-m-d'); $dynamicoutput['startlist'] = $start_dt->format('Y/m/d'); $dynamicoutput['endlist'] = $end_dt->format('Y/m/d'); } else { $start_dt = new \DateTime($cachedevent['startdate'], new \DateTimeZone('UTC')); $end_dt = new \DateTime($cachedevent['enddate'], new \DateTimeZone('UTC')); $start_dt->setTimezone(new \DateTimeZone(self::$tz)); $end_dt->setTimezone(new \DateTimeZone(self::$tz)); $dynamicoutput['start'] = $start_dt->format('Y-m-d H:i:s'); $dynamicoutput['end'] = $end_dt->format('Y-m-d H:i:s'); $dynamicoutput['startlist'] = $start_dt->format('Y/m/d H:i:s'); $dynamicoutput['endlist'] = $end_dt->format('Y/m/d H:i:s'); } $dynamicoutput['isrepeating'] = true; $output[] = array_merge($staticoutput, $dynamicoutput); } } else { if (Object::isrepeating($id) || $event['repeating'] == 1) { $object->expand($start, $end); } foreach ($object->getComponents() as $singleevent) { if (!$singleevent instanceof \Sabre\VObject\Component\VEvent) { continue; } $dynamicoutput = Object::generateStartEndDate($singleevent->DTSTART, Object::getDTEndFromVEvent($singleevent), $allday, self::$tz); $output[] = array_merge($staticoutput, $dynamicoutput); } } return $output; } catch (\Exception $e) { $uid = 'unknown'; if (isset($event['uri'])) { $uid = $event['uri']; } \OCP\Util::writeLog(self::$appname, 'Event (' . $uid . ') contains invalid data!', \OCP\Util::WARN); } }
/** * @NoAdminRequired */ public function getEventsDayView() { \OC::$server->getSession()->close(); if (\OCP\User::isLoggedIn()) { $monthToCalc = intval($this->params('month')) + 1; $year = intval($this->params('year')); $ersterTag = mktime(0, 0, 0, $monthToCalc, 1, $year); if (date("L", $ersterTag)) { $iSchaltMonat = 29; } else { $iSchaltMonat = 28; } $MonthEndDayArray = array(31, $iSchaltMonat, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $letzterTag = mktime(23, 59, 59, $monthToCalc, $MonthEndDayArray[$monthToCalc - 1], $year); $start = new \DateTime('@' . $ersterTag); $end = new \DateTime('@' . $letzterTag); $calendars = CalendarCalendar::allCalendars($this->userId, true); $calendars[] = ['id' => 'shared_events', 'active' => 1]; $events = ''; foreach ($calendars as $calInfo) { $isAktiv = (int) $calInfo['active']; if ($this->configInfo->getUserValue($this->userId, $this->appName, 'calendar_' . $calInfo['id']) !== '') { $isAktiv = (int) $this->configInfo->getUserValue($this->userId, $this->appName, 'calendar_' . $calInfo['id']); } if ($calInfo['id'] !== 'birthday_' . $this->userId && $isAktiv === 1) { \OCP\Util::writeLog($this->appName, 'DAYVIEW => ' . $calInfo['id'], \OCP\Util::DEBUG); $events[] = CalendarApp::getrequestedEvents($calInfo['id'], $start, $end); } } $output = array(); $aSort = array(); $eventArray = array(); if (is_array($events)) { foreach ($events as $event) { foreach ($event as $eventInfo) { if ((int) $eventInfo['repeating'] === 0) { $start_dt = new \DateTime($eventInfo['startdate'], new \DateTimeZone('UTC')); $startDate = $start_dt->format('Y/m/d'); $start_tmst = new \DateTime($startDate, new \DateTimeZone('UTC')); $startTimeStamp = $start_tmst->format('U'); $end_dt = new \DateTime($eventInfo['enddate'], new \DateTimeZone('UTC')); $endTimeStamp = $end_dt->format('U'); $aSort[$startTimeStamp] = $startDate; if ($endTimeStamp > $startTimeStamp + 24 * 60 * 60) { $datetime1 = new \DateTime($eventInfo['startdate']); $datetime2 = new \DateTime($eventInfo['enddate']); $interval = $datetime1->diff($datetime2); $count = (int) $interval->format('%a'); for ($i = 1; $i < $count; $i++) { $start_dtNew = new \DateTime($eventInfo['startdate'], new \DateTimeZone('UTC')); $start_dtNew->modify('+' . $i . ' day'); $startDateNew = $start_dtNew->format('Y/m/d'); $start_tmstNew = new \DateTime($startDateNew, new \DateTimeZone('UTC')); $startTimeStampNew = $start_tmstNew->format('U'); $aSort[$startTimeStampNew] = $startDateNew; //OCP\Util::writeLog('calendar','STARTDATE'.$startDateNew.' -> '.$eventInfo['summary'], OCP\Util::DEBUG); $eventArray[$startDateNew][] = CalendarApp::generateEventOutput($eventInfo, $start, $end); } } $eventArray[$startDate][] = CalendarApp::generateEventOutput($eventInfo, $start, $end); } if ((int) $eventInfo['repeating'] === 1) { $cachedinperiod = Repeat::get_inperiod($eventInfo['id'], $start, $end); $counter = 0; foreach ($cachedinperiod as $cacheinfo) { $start_dt_cache = new \DateTime($cacheinfo['startdate'], new \DateTimeZone('UTC')); $startCacheDate = $start_dt_cache->format('Y/m/d'); $start_Cachetmst = new \DateTime($startCacheDate, new \DateTimeZone('UTC')); $startCacheTimeStamp = $start_Cachetmst->format('U'); $aSort[$startCacheTimeStamp] = $startCacheDate; $eventArray[$startCacheDate][] = CalendarApp::generateEventOutput($eventInfo, $start, $end); $counter++; } } if (is_array($eventArray)) { $output = array_merge($output, $eventArray); } } } ksort($aSort); $params = ['data' => $output, 'sortdate' => $aSort]; $response = new JSONResponse(); $response->setData($params); return $response; } } }