]> git.mxchange.org Git - friendica.git/blob - include/event.php
Merge pull request #1048 from tobiasd/20140711
[friendica.git] / include / event.php
1 <?php
2
3
4 function format_event_html($ev) {
5
6         require_once('include/bbcode.php');
7
8         if(! ((is_array($ev)) && count($ev)))
9                 return '';
10
11         $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
12
13         $o = '<div class="vevent">' . "\r\n";
14
15
16         $o .= '<p class="summary event-summary">' . bbcode($ev['summary']) .  '</p>' . "\r\n";
17
18         $o .= '<p class="description event-description">' . bbcode($ev['desc']) .  '</p>' . "\r\n";
19
20         $o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
21                 . datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
22                 . '" >' 
23                 . (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), 
24                         $ev['start'] , $bd_format ))
25                         :  day_translate(datetime_convert('UTC', 'UTC', 
26                         $ev['start'] , $bd_format)))
27                 . '</abbr></p>' . "\r\n";
28
29         if(! $ev['nofinish'])
30                 $o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="'
31                         . datetime_convert('UTC','UTC',$ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
32                         . '" >' 
33                         . (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), 
34                                 $ev['finish'] , $bd_format ))
35                                 :  day_translate(datetime_convert('UTC', 'UTC', 
36                                 $ev['finish'] , $bd_format )))
37                         . '</abbr></p>'  . "\r\n";
38
39         if(strlen($ev['location']))
40                 $o .= '<p class="event-location"> ' . t('Location:') . ' <span class="location">' 
41                         . bbcode($ev['location']) 
42                         . '</span></p>' . "\r\n";
43
44         $o .= '</div>' . "\r\n";
45         return $o;
46 }
47
48 /*
49 function parse_event($h) {
50
51         require_once('include/Scrape.php');
52         require_once('library/HTMLPurifier.auto.php');
53         require_once('include/html2bbcode');
54
55         $h = '<html><body>' . $h . '</body></html>';
56
57         $ret = array();
58
59
60         try {
61                 $dom = HTML5_Parser::parse($h);
62         } catch (DOMException $e) {
63                 logger('parse_event: parse error: ' . $e);
64         }
65
66         if(! $dom)
67                 return $ret;
68
69         $items = $dom->getElementsByTagName('*');
70
71         foreach($items as $item) {
72                 if(attribute_contains($item->getAttribute('class'), 'vevent')) {
73                         $level2 = $item->getElementsByTagName('*');
74                         foreach($level2 as $x) {
75                                 if(attribute_contains($x->getAttribute('class'),'dtstart') && $x->getAttribute('title')) {
76                                         $ret['start'] = $x->getAttribute('title');
77                                         if(! strpos($ret['start'],'Z'))
78                                                 $ret['adjust'] = true;
79                                 }
80                                 if(attribute_contains($x->getAttribute('class'),'dtend') && $x->getAttribute('title'))
81                                         $ret['finish'] = $x->getAttribute('title');
82
83                                 if(attribute_contains($x->getAttribute('class'),'description'))
84                                         $ret['desc'] = $x->textContent;
85                                 if(attribute_contains($x->getAttribute('class'),'location'))
86                                         $ret['location'] = $x->textContent;
87                         }
88                 }
89         }
90
91         // sanitise
92
93         if((x($ret,'desc')) && ((strpos($ret['desc'],'<') !== false) || (strpos($ret['desc'],'>') !== false))) {
94                 $config = HTMLPurifier_Config::createDefault();
95                 $config->set('Cache.DefinitionImpl', null);
96                 $purifier = new HTMLPurifier($config);
97                 $ret['desc'] = html2bbcode($purifier->purify($ret['desc']));
98         }
99
100         if((x($ret,'location')) && ((strpos($ret['location'],'<') !== false) || (strpos($ret['location'],'>') !== false))) {
101                 $config = HTMLPurifier_Config::createDefault();
102                 $config->set('Cache.DefinitionImpl', null);
103                 $purifier = new HTMLPurifier($config);
104                 $ret['location'] = html2bbcode($purifier->purify($ret['location']));
105         }
106
107         if(x($ret,'start'))
108                 $ret['start'] = datetime_convert('UTC','UTC',$ret['start']);
109         if(x($ret,'finish'))
110                 $ret['finish'] = datetime_convert('UTC','UTC',$ret['finish']);
111
112         return $ret;
113 }
114 */
115
116 function format_event_bbcode($ev) {
117
118         $o = '';
119
120         if($ev['summary'])
121                 $o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
122
123         if($ev['desc'])
124                 $o .= '[event-description]' . $ev['desc'] . '[/event-description]';
125
126         if($ev['start'])
127                 $o .= '[event-start]' . $ev['start'] . '[/event-start]';
128
129         if(($ev['finish']) && (! $ev['nofinish']))
130                 $o .= '[event-finish]' . $ev['finish'] . '[/event-finish]';
131  
132         if($ev['location'])
133                 $o .= '[event-location]' . $ev['location'] . '[/event-location]';
134
135         if($ev['adjust'])
136                 $o .= '[event-adjust]' . $ev['adjust'] . '[/event-adjust]';
137
138
139         return $o;
140
141 }
142
143 function bbtovcal($s) {
144         $o = '';
145         $ev = bbtoevent($s);
146         if($ev['desc'])
147                 $o = format_event_html($ev);
148         return $o;
149 }
150
151
152 function bbtoevent($s) {
153
154         $ev = array();
155
156         $match = '';
157         if(preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match))
158                 $ev['summary'] = $match[1];
159         $match = '';
160         if(preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
161                 $ev['desc'] = $match[1];
162         $match = '';
163         if(preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
164                 $ev['start'] = $match[1];
165         $match = '';
166         if(preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is",$s,$match))
167                 $ev['finish'] = $match[1];
168         $match = '';
169         if(preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is",$s,$match))
170                 $ev['location'] = $match[1];
171         $match = '';
172         if(preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",$s,$match))
173                 $ev['adjust'] = $match[1];
174         $ev['nofinish'] = (((x($ev, 'start') && $ev['start']) && (!x($ev, 'finish') || !$ev['finish'])) ? 1 : 0);
175         return $ev;
176
177 }
178
179
180 function sort_by_date($a) {
181
182         usort($a,'ev_compare');
183         return $a;
184 }
185
186
187 function ev_compare($a,$b) {
188
189         $date_a = (($a['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$a['start']) : $a['start']);
190         $date_b = (($b['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$b['start']) : $b['start']);
191
192         if($date_a === $date_b)
193                 return strcasecmp($a['desc'],$b['desc']);
194         
195         return strcmp($date_a,$date_b);
196 }
197
198
199
200 function event_store($arr) {
201
202         require_once('include/datetime.php');
203         require_once('include/items.php');
204         require_once('include/bbcode.php');
205
206         $a = get_app();
207
208         $arr['created'] = (($arr['created']) ? $arr['created'] : datetime_convert());
209         $arr['edited']  = (($arr['edited']) ? $arr['edited'] : datetime_convert());
210         $arr['type']    = (($arr['type']) ? $arr['type'] : 'event' );
211         $arr['cid']     = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
212         $arr['uri']     = (x($arr,'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(),$arr['uid']));
213         $arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0);
214
215         if($arr['cid'])
216                 $c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
217                         intval($arr['cid']),
218                         intval($arr['uid'])
219                 );
220         else
221                 $c = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
222                         intval($arr['uid'])
223                 );
224
225         if(count($c))
226                 $contact = $c[0];
227
228
229         // Existing event being modified
230
231         if($arr['id']) {
232
233                 // has the event actually changed?
234
235                 $r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
236                         intval($arr['id']),
237                         intval($arr['uid'])
238                 );
239                 if((! count($r)) || ($r[0]['edited'] === $arr['edited'])) {
240
241                         // Nothing has changed. Grab the item id to return.
242
243                         $r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
244                                 intval($arr['id']),
245                                 intval($arr['uid'])
246                         );
247                         return((count($r)) ? $r[0]['id'] : 0);
248                 }
249
250                 // The event changed. Update it.
251
252                 $r = q("UPDATE `event` SET
253                         `edited` = '%s',
254                         `start` = '%s',
255                         `finish` = '%s',
256                         `summary` = '%s',
257                         `desc` = '%s',
258                         `location` = '%s',
259                         `type` = '%s',
260                         `adjust` = %d,
261                         `nofinish` = %d,
262                         `allow_cid` = '%s',
263                         `allow_gid` = '%s',
264                         `deny_cid` = '%s',
265                         `deny_gid` = '%s'
266                         WHERE `id` = %d AND `uid` = %d",
267
268                         dbesc($arr['edited']),
269                         dbesc($arr['start']),
270                         dbesc($arr['finish']),
271                         dbesc($arr['summary']),
272                         dbesc($arr['desc']),
273                         dbesc($arr['location']),
274                         dbesc($arr['type']),
275                         intval($arr['adjust']),
276                         intval($arr['nofinish']),
277                         dbesc($arr['allow_cid']),
278                         dbesc($arr['allow_gid']),
279                         dbesc($arr['deny_cid']),
280                         dbesc($arr['deny_gid']),
281                         intval($arr['id']),
282                         intval($arr['uid'])
283                 );
284                 $r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
285                         intval($arr['id']),
286                         intval($arr['uid'])
287                 );
288                 if(count($r)) {
289                         $object = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['uri']) . '</id>';
290                         $object .= '<content>' . xmlify(format_event_bbcode($arr)) . '</content>';
291                         $object .= '</object>' . "\n";
292
293
294                         q("UPDATE `item` SET `body` = '%s', `object` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `edited` = '%s', `private` = %d WHERE `id` = %d AND `uid` = %d",
295                                 dbesc(format_event_bbcode($arr)),
296                                 dbesc($object),
297                                 dbesc($arr['allow_cid']),
298                                 dbesc($arr['allow_gid']),
299                                 dbesc($arr['deny_cid']),
300                                 dbesc($arr['deny_gid']),
301                                 dbesc($arr['edited']),
302                                 intval($arr['private']),
303                                 intval($r[0]['id']),
304                                 intval($arr['uid'])
305                         );
306
307                         $item_id = $r[0]['id'];
308                 }
309                 else
310                         $item_id = 0;
311
312                 call_hooks("event_updated", $arr['id']);
313
314                 return $item_id;
315         }
316         else {
317
318                 // New event. Store it. 
319
320                 $r = q("INSERT INTO `event` ( `uid`,`cid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
321                         `adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`)
322                         VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
323                         intval($arr['uid']),
324                         intval($arr['cid']),
325                         dbesc($arr['uri']),
326                         dbesc($arr['created']),
327                         dbesc($arr['edited']),
328                         dbesc($arr['start']),
329                         dbesc($arr['finish']),
330                         dbesc($arr['summary']),
331                         dbesc($arr['desc']),
332                         dbesc($arr['location']),
333                         dbesc($arr['type']),
334                         intval($arr['adjust']),
335                         intval($arr['nofinish']),
336                         dbesc($arr['allow_cid']),
337                         dbesc($arr['allow_gid']),
338                         dbesc($arr['deny_cid']),
339                         dbesc($arr['deny_gid'])
340
341                 );
342
343                 $r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
344                         dbesc($arr['uri']),
345                         intval($arr['uid'])
346                 );
347                 if(count($r))
348                         $event = $r[0];
349
350                 $item_arr = array();
351
352                 $item_arr['uid']           = $arr['uid'];
353                 $item_arr['contact-id']    = $arr['cid'];
354                 $item_arr['uri']           = $arr['uri'];
355                 $item_arr['parent-uri']    = $arr['uri'];
356                 $item_arr['type']          = 'activity';
357                 $item_arr['wall']          = (($arr['cid']) ? 0 : 1);
358                 $item_arr['contact-id']    = $contact['id'];
359                 $item_arr['owner-name']    = $contact['name'];
360                 $item_arr['owner-link']    = $contact['url'];
361                 $item_arr['owner-avatar']  = $contact['thumb'];
362                 $item_arr['author-name']   = $contact['name'];
363                 $item_arr['author-link']   = $contact['url'];
364                 $item_arr['author-avatar'] = $contact['thumb'];
365                 $item_arr['title']         = '';
366                 $item_arr['allow_cid']     = $arr['allow_cid'];
367                 $item_arr['allow_gid']     = $arr['allow_gid'];
368                 $item_arr['deny_cid']      = $arr['deny_cid'];
369                 $item_arr['deny_gid']      = $arr['deny_gid'];
370                 $item_arr['private']       = $arr['private'];
371                 $item_arr['last-child']    = 1;
372                 $item_arr['visible']       = 1;
373                 $item_arr['verb']          = ACTIVITY_POST;
374                 $item_arr['object-type']   = ACTIVITY_OBJ_EVENT;
375                 $item_arr['origin']        = ((intval($arr['cid']) == 0) ? 1 : 0);
376                 $item_arr['body']          = format_event_bbcode($event);
377
378
379                 $item_arr['object'] = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['uri']) . '</id>';
380                 $item_arr['object'] .= '<content>' . xmlify(format_event_bbcode($event)) . '</content>';
381                 $item_arr['object'] .= '</object>' . "\n";
382
383                 $item_id = item_store($item_arr);
384
385                 $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
386                         intval($arr['uid'])
387                 );
388                 if(count($r))
389                         $plink = $a->get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
390
391
392                 if($item_id) {
393                         q("UPDATE `item` SET `plink` = '%s', `event-id` = %d  WHERE `uid` = %d AND `id` = %d",
394                                 dbesc($plink),
395                                 intval($event['id']),
396                                 intval($arr['uid']),
397                                 intval($item_id)
398                         );
399                 }
400
401                 call_hooks("event_created", $event['id']);
402
403                 return $item_id;
404         }
405 }