Files
server/usr/share/psa-pear/pear/kronolith-agenda
2026-01-07 20:52:11 +01:00

203 lines
7.0 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
/**
* Copyright 2003-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Chuck Hagenbuch <chuck@horde.org>
*/
if (file_exists(__DIR__ . '/../../kronolith/lib/Application.php')) {
$baseDir = __DIR__ . '/../';
} else {
require_once 'PEAR/Config.php';
$baseDir = PEAR_Config::singleton()
->get('horde_dir', null, 'pear.horde.org') . '/kronolith/';
}
require_once $baseDir . 'lib/Application.php';
Horde_Registry::appInit('kronolith', array('cli' => true));
send_agendas();
/**
*/
function send_agendas()
{
if (isset($_SERVER['REQUEST_TIME'])) {
$runtime = $_SERVER['REQUEST_TIME'];
} else {
$runtime = time();
}
$kronolith_shares = $GLOBALS['injector']->getInstance('Kronolith_Shares');
$calendars = $kronolith_shares->listAllShares();
// If there are no calendars to check, we're done.
if (!count($calendars)) {
return;
}
if (empty($GLOBALS['conf']['reminder']['server_name']) ||
empty($GLOBALS['conf']['reminder']['from_addr'])) {
die('You must configure the server_name and from_addr settings for reminders in the calendar configuration.');
}
$_SERVER['SERVER_NAME'] = $GLOBALS['conf']['server']['name'] = $GLOBALS['conf']['reminder']['server_name'];
// Retrieve a list of users associated with each calendar, and
// thus a list of users who have used kronolith and
// potentially have an agenda preference set.
$users = array();
foreach (array_keys($calendars) as $calendarId) {
try {
$calendar = $kronolith_shares->getShare($calendarId);
} catch (Exception $e) {
continue;
}
$users = array_merge($users, $calendar->listUsers(Horde_Perms::READ));
}
// Remove duplicates.
$users = array_unique($users);
// Generate image mime part first and only once, because we need
// the Content-ID.
$image = Kronolith::getImagePart('big_agenda.png');
$runtime = new Horde_Date($runtime);
$default_timezone = date_default_timezone_get();
$kronolith_driver = Kronolith::getDriver();
$view = new Horde_View(array('templatePath' => KRONOLITH_TEMPLATES . '/agenda', 'encoding' => 'UTF-8'));
new Horde_View_Helper_Text($view);
$view->imageId = $image->getContentId();
$view->date = $runtime;
if (!$GLOBALS['prefs']->isLocked('daily_agenda')) {
$view->prefsUrl = Horde::url($GLOBALS['registry']->getServiceLink('prefs', 'kronolith'), true)->remove(session_name());
}
// Loop through the users and generate an agenda for them
foreach ($users as $user) {
$prefs = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Prefs')->create('kronolith', array(
'user' => $user
));
$agenda_calendars = $prefs->getValue('daily_agenda');
if (!$agenda_calendars) {
continue;
}
// Initialize the CalendarsManager for this user.
$GLOBALS['calendar_manager'] = new Kronolith_CalendarsManager($user);
// Try to find an email address for the user.
$identity = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create($user);
$email = $identity->getDefaultFromAddress(true);
// Check if user has a timezone pref, and set it. Otherwise, make
// sure to use the server's default timezone.
$tz = $prefs->getValue('timezone');
date_default_timezone_set(empty($tz) ? $default_timezone : $tz);
// If we found an email address, generate the agenda.
switch ($agenda_calendars) {
case 'owner':
$calendars = $kronolith_shares->listShares(
$user,
array('perm' => Horde_Perms::SHOW,
'attributes' => $user));
$calendars = array_keys($calendars);
break;
case 'read':
$calendars = $kronolith_shares->listShares(
$user,
array('perm' => Horde_Perms::READ));
$calendars = array_keys($calendars);
break;
case 'show':
default:
$calendars = array();
$shown_calendars = unserialize($prefs->getValue('display_cals'));
$cals = $kronolith_shares->listShares(
$user,
array('perm' => Horde_Perms::SHOW));
foreach (array_keys($cals) as $calId) {
if (in_array($calId, $shown_calendars)) {
$calendars[] = $calId;
}
}
}
// Get a list of events for today
$eventlist = array();
foreach ($calendars as $calId) {
$kronolith_driver->open($calId);
$events = $kronolith_driver->listEvents(
$runtime, $runtime, array('show_recurrence' => true));
foreach ($events as $dayevents) {
foreach ($dayevents as $event) {
// The event list contains events starting at 12am.
if ($event->start->compareDate($runtime) || $event->isPrivate($user)) {
continue;
}
$eventlist[] = $event;
}
}
}
if (!count($eventlist)) {
continue;
}
// If there are any events, generate and send the email.
usort($eventlist, 'sort_events');
$GLOBALS['registry']->setLanguageEnvironment($prefs->getValue('language'));
$twentyFour = $prefs->getValue('twentyFour');
$view->pad = max(Horde_String::length(_("All day")) + 2, $twentyFour ? 6 : 8);
$view->dateFormat = $prefs->getValue('date_format');
$view->timeformat = $twentyFour ? 'H:i' : 'h:ia';
$view->user = $user;
$view->events = $eventlist;
$mime_mail = new Horde_Mime_Mail(array(
'Subject' => sprintf(_("Your daily agenda for %s"), $runtime->strftime($view->dateFormat)),
'To' => $email,
'From' => $GLOBALS['conf']['reminder']['from_addr'],
'User-Agent' => 'Kronolith ' . $GLOBALS['registry']->getVersion(),
'Auto-Submitted' => 'auto-generated'));
try {
$mime_mail->addRecipients($email);
} catch (Horde_Mime_Exception $e) {}
$mime_mail->setBasePart(Kronolith::buildMimeMessage($view, 'notification', $image));
Horde::log(sprintf('Sending daily agenda to %s', $email), 'DEBUG');
try {
$mime_mail->send($GLOBALS['injector']->getInstance('Horde_Mail'));
} catch (Horde_Mime_Exception $e) {
Horde::log(sprintf('Error sending daily agenda to %s: %s', $email, $e->getMessage()), 'WARN');
}
}
}
function sort_events($a, $b)
{
if ($a->allday && $b->allday) {
return 0;
}
if ($a->allday || $b->allday) {
return ($a->allday) ? -1 : 1;
}
if ($a->start == $b->start) {
return 0;
}
return ($a->start < $b->start) ? -1 : 1;
}