2 /********************************************************************
3 * Name: Calendar Export
4 * Description: This addon exports the public events of your users as calendar files
6 * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
8 * ******************************************************************/
11 function cal_install()
13 register_hook('plugin_settings', 'addon/cal/cal.php', 'cal_addon_settings');
14 register_hook('plugin_settings_post', 'addon/cal/cal.php', 'cal_addon_settings_post');
16 function cal_uninstall()
18 unregister_hook('plugin_settings', 'addon/cal/cal.php', 'cal_addon_settings');
19 unregister_hook('plugin_settings_post', 'addon/cal/cal.php', 'cal_addon_settings_post');
25 * /cal/$user/export/$format
26 * currently supported formats are ical (iCalendar) and CSV
28 function cal_content()
33 $o .= "<h3>".t('Event Export')."</h3><p>".t('You can download public events from: ').$a->get_baseurl()."/cal/username/export/ical</p>";
34 } elseif ($a->argc==4) {
35 // get the parameters from the request we just received
36 $username = $a->argv[1];
38 $format = $a->argv[3];
39 // check that there is a user matching the requested profile
40 $r = q("SELECT uid FROM user WHERE nickname='".$username."' LIMIT 1;");
47 // if we shall do anything other then export, end here
48 if (! $do == 'export' )
50 // check if the user allows us to share the profile
51 $enable = get_pconfig( $uid, 'cal', 'enable');
53 info(t('The user does not export the calendar.'));
56 // we are allowed to show events
57 // get the timezone the user is in
58 $r = q("SELECT timezone FROM user WHERE uid=".$uid." LIMIT 1;");
60 $timezone = $r[0]['timezone'];
61 // does the user who requests happen to be the owner of the events
62 // requested? then show all of your events, otherwise only those that
63 // don't have limitations set in allow_cid and allow_gid
64 if (local_user() == $uid) {
65 $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location` FROM `event` WHERE `uid`=".$uid." and `cid`=0;");
67 $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location` FROM `event` WHERE `allow_cid`='' and `allow_gid`='' and `uid`='".$uid."' and `cid`='0';");
69 // we have the events that are available for the requestor
70 // now format the output according to the requested format
71 $res = cal_format_output($r, $format, $timezone);
75 // wrong number of parameters
81 function cal_format_output ($r, $f, $tz)
83 $res = t('This calendar format is not supported');
86 // format the exported data as a CSV file
88 header("Content-type: text/csv");
89 $o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL;
91 // TODO the time / date entries don't include any information about the
92 // timezone the event is scheduled in :-/
93 $tmp1 = strtotime($rr['start']);
94 $tmp2 = strtotime($rr['finish']);
95 $time_format = "%H:%M:%S";
96 $date_format = "%Y-%m-%d";
97 $o .= '"'.$rr['summary'].'", "'.strftime($date_format, $tmp1) .
98 '", "'.strftime($time_format, $tmp1).'", "'.$rr['desc'] .
99 '", "'.strftime($date_format, $tmp2) .
100 '", "'.strftime($time_format, $tmp2) .
101 '", "'.$rr['location'].'"' . PHP_EOL;
107 header("Content-type: text/ics");
108 $o = 'BEGIN:VCALENDAR'. PHP_EOL
109 . 'VERSION:2.0' . PHP_EOL
110 . 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL;
111 // TODO include timezone informations in cases were the time is not in UTC
112 // see http://tools.ietf.org/html/rfc2445#section-4.8.3
113 // . 'BEGIN:VTIMEZONE' . PHP_EOL
114 // . 'TZID:' . $tz . PHP_EOL
115 // . 'END:VTIMEZONE' . PHP_EOL;
116 // TODO instead of PHP_EOL CRLF should be used for long entries
117 // but test your solution against http://icalvalid.cloudapp.net/
118 // also long lines SHOULD be split at 75 characters length
119 foreach ($r as $rr) {
120 if ($rr['adjust'] == 1) {
125 $o .= 'BEGIN:VEVENT' . PHP_EOL;
127 $tmp = strtotime($rr['start']);
128 $dtformat = "%Y%m%dT%H%M%S".$UTC;
129 $o .= 'DTSTART:'.strftime($dtformat, $tmp).PHP_EOL;
132 $tmp = strtotime($rr['finish']);
133 $dtformat = "%Y%m%dT%H%M%S".$UTC;
134 $o .= 'DTEND:'.strftime($dtformat, $tmp).PHP_EOL;
137 $tmp = $rr['summary'];
138 $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp);
139 $tmp = addcslashes($tmp, ',;');
140 $o .= 'SUMMARY:' . $tmp . PHP_EOL;
143 $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp);
144 $tmp = addcslashes($tmp, ',;');
145 $o .= 'DESCRIPTION:' . $tmp . PHP_EOL;
146 if ($rr['location']) {
147 $tmp = $rr['location'];
148 $tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp);
149 $tmp = addcslashes($tmp, ',;');
150 $o .= 'LOCATION:' . $tmp . PHP_EOL;
152 $o .= 'END:VEVENT' . PHP_EOL;
154 $o .= 'END:VCALENDAR' . PHP_EOL;
161 function cal_addon_settings_post ( &$a, &$b )
166 if (!x($_POST,'cal-submit'))
169 set_pconfig(local_user(),'cal','enable',intval($_POST['cal-enable']));
171 function cal_addon_settings ( &$a, &$s )
176 $enabled = get_pconfig(local_user(), 'cal', 'enable');
177 $checked = (($enabled) ? ' checked="checked" ' : '');
178 $url = $a->get_baseurl().'/cal/'.$a->user['nickname'].'/export/<em>format</em>';
180 $s .= '<h3>'.t('Export Events').'</h3>';
181 $s .= '<p>'.t('If this is enabled, your public events will be available at').' <strong>'.$url.'</strong></p>';
182 $s .= '<p>'.t('Currently supported formats are ical and csv.').'</p>';
183 $s .= '<div id="cal-enable-wrapper">';
184 $s .= '<label id="cal-enable-label" for="cal-checkbox">'. t('Enable calendar export') .'</label>';
185 $s .= '<input id="cal-checkbox" type="checkbox" name="cal-enable" value="1" ' . $checked . '/>';
186 $s .= '</div><div class="clear"></div>';
187 $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="cal-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
188 $s .= '</div><div class="clear"></div>';