2010-07-20 05:52:31 +00:00
< ? php
2014-06-30 20:16:21 +00:00
/**
* @ file mod / ping . php
*
*/
2010-07-20 05:52:31 +00:00
2012-07-13 14:09:29 +00:00
require_once ( 'include/bbcode.php' );
2012-10-27 11:43:39 +00:00
require_once ( 'include/notify.php' );
2012-05-22 23:01:07 +00:00
2014-06-30 20:16:21 +00:00
/**
* @ brief do several updates when pinged .
*
* This function does several tasks . Whenever called it checks for new messages ,
* introductions , notifications , etc . and returns a json with the results .
*
* @ param App & $a
* @ result JSON
*/
2014-07-01 00:03:00 +00:00
2012-07-13 14:09:29 +00:00
function ping_init ( & $a ) {
2011-09-28 07:30:22 +00:00
2012-07-13 14:09:29 +00:00
$result = array ();
$notifs = array ();
2012-05-22 23:01:07 +00:00
2012-07-16 04:06:07 +00:00
$result [ 'notify' ] = 0 ;
$result [ 'home' ] = 0 ;
$result [ 'network' ] = 0 ;
$result [ 'intros' ] = 0 ;
$result [ 'mail' ] = 0 ;
$result [ 'register' ] = 0 ;
2012-07-29 00:21:42 +00:00
$result [ 'events' ] = 0 ;
2012-07-29 00:39:26 +00:00
$result [ 'events_today' ] = 0 ;
2012-08-17 06:11:24 +00:00
$result [ 'birthdays' ] = 0 ;
$result [ 'birthdays_today' ] = 0 ;
2012-08-27 06:05:00 +00:00
$result [ 'all_events' ] = 0 ;
$result [ 'all_events_today' ] = 0 ;
2012-07-16 04:06:07 +00:00
$result [ 'notice' ] = array ();
$result [ 'info' ] = array ();
2012-07-26 05:55:43 +00:00
$t0 = dba_timer ();
2012-07-16 04:06:07 +00:00
2012-07-13 14:09:29 +00:00
header ( " content-type: application/json " );
2012-05-22 23:01:07 +00:00
2014-07-01 00:03:00 +00:00
/**
* If you have several windows open to this site and switch to a different channel
* in one of them , the others may get into a confused state showing you a page or options
* on that page which were only valid under the old identity . You session has changed .
* Therefore we send a notification of this fact back to the browser where it is picked up
* in javascript and which reloads the page it is on so that it is valid under the context
* of the now current channel .
*/
2014-02-22 21:33:18 +00:00
$result [ 'invalid' ] = (( intval ( $_GET [ 'uid' ])) && ( intval ( $_GET [ 'uid' ]) != local_user ()) ? 1 : 0 );
2012-07-16 04:06:07 +00:00
2014-07-01 00:03:00 +00:00
/**
* Send all system messages ( alerts ) to the browser .
* Some are marked as informational and some represent
* errors or serious notifications . These typically
* will popup on the current page ( no matter what page it is )
*/
2014-06-30 20:16:21 +00:00
if ( x ( $_SESSION , 'sysmsg' )){
2012-07-16 04:06:07 +00:00
foreach ( $_SESSION [ 'sysmsg' ] as $m ){
$result [ 'notice' ][] = array ( 'message' => $m );
}
unset ( $_SESSION [ 'sysmsg' ]);
}
2014-06-30 20:16:21 +00:00
if ( x ( $_SESSION , 'sysmsg_info' )){
2012-07-16 04:06:07 +00:00
foreach ( $_SESSION [ 'sysmsg_info' ] as $m ){
$result [ 'info' ][] = array ( 'message' => $m );
}
unset ( $_SESSION [ 'sysmsg_info' ]);
}
2014-02-07 05:31:42 +00:00
if ( $a -> install ) {
echo json_encode ( $result );
killme ();
}
2014-07-01 00:03:00 +00:00
/**
* Update chat presence indication ( if applicable )
*/
2014-01-28 23:52:54 +00:00
if ( get_observer_hash () && ( ! $result [ 'invalid' ])) {
2014-01-31 03:01:03 +00:00
$r = q ( " select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1 " ,
2014-01-29 10:25:21 +00:00
dbesc ( get_observer_hash ()),
dbesc ( $_SERVER [ 'REMOTE_ADDR' ])
2014-01-28 23:52:54 +00:00
);
2014-01-29 10:25:21 +00:00
$basic_presence = false ;
2014-01-28 23:52:54 +00:00
if ( $r ) {
2014-01-31 03:01:03 +00:00
$basic_presence = true ;
q ( " update chatpresence set cp_last = '%s' where cp_id = %d limit 1 " ,
dbesc ( datetime_convert ()),
intval ( $r [ 0 ][ 'cp_id' ])
);
2014-01-28 23:52:54 +00:00
}
2014-01-29 10:25:21 +00:00
if ( ! $basic_presence ) {
2014-01-28 23:52:54 +00:00
q ( " insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client)
values ( '%s' , '%s' , '%s' , '%s' ) " ,
dbesc ( get_observer_hash ()),
dbesc ( datetime_convert ()),
dbesc ( 'online' ),
dbesc ( $_SERVER [ 'REMOTE_ADDR' ])
);
}
}
2014-07-01 00:03:00 +00:00
/**
* Chatpresence continued ... if somebody hasn 't pinged recently, they' ve most likely left the page
* and shouldn ' t count as online anymore . We allow an expection for bots .
*/
2014-04-26 23:47:43 +00:00
q ( " delete from chatpresence where cp_last < UTC_TIMESTAMP() - INTERVAL 3 MINUTE and cp_client != 'auto' " );
2014-01-28 23:52:54 +00:00
2012-07-16 04:06:07 +00:00
if (( ! local_user ()) || ( $result [ 'invalid' ])) {
2012-07-13 14:09:29 +00:00
echo json_encode ( $result );
killme ();
}
2012-02-24 00:50:29 +00:00
2014-07-01 00:03:00 +00:00
/**
* Everything following is only permitted under the context of a locally authenticated site member .
*/
/**
* Handle " mark all xyz notifications read " requests .
*/
2014-06-30 20:16:21 +00:00
// mark all items read
if ( x ( $_REQUEST , 'markRead' ) && local_user ()) {
2013-02-04 03:07:01 +00:00
switch ( $_REQUEST [ 'markRead' ]) {
case 'network' :
$r = q ( " update item set item_flags = ( item_flags ^ %d ) where (item_flags & %d) and uid = %d " ,
intval ( ITEM_UNSEEN ),
intval ( ITEM_UNSEEN ),
intval ( local_user ())
);
break ;
case 'home' :
$r = q ( " update item set item_flags = ( item_flags ^ %d ) where (item_flags & %d) and (item_flags & %d) and uid = %d " ,
intval ( ITEM_UNSEEN ),
intval ( ITEM_UNSEEN ),
intval ( ITEM_WALL ),
intval ( local_user ())
);
break ;
case 'messages' :
2013-02-04 08:03:19 +00:00
$r = q ( " update mail set mail_flags = ( mail_flags ^ %d ) where channel_id = %d and not (mail_flags & %d) " ,
2013-02-04 03:07:01 +00:00
intval ( MAIL_SEEN ),
intval ( local_user ()),
intval ( MAIL_SEEN )
);
break ;
case 'all_events' :
2013-04-17 02:59:12 +00:00
$r = q ( " update event set `ignore` = 1 where `ignore` = 0 and uid = %d " ,
2013-02-04 03:07:01 +00:00
intval ( local_user ())
);
break ;
case 'notify' :
$r = q ( " update notify set seen = 1 where uid = %d " ,
intval ( local_user ())
);
break ;
default :
break ;
}
}
2014-07-01 00:03:00 +00:00
/**
* URL ping / something will return detail for " something " , e . g . a json list with which to populate a notification
* dropdown menu .
*/
2012-08-30 06:03:03 +00:00
if ( argc () > 1 && argv ( 1 ) === 'notify' ) {
2012-03-01 00:26:07 +00:00
$t = q ( " select count(*) as total from notify where uid = %d and seen = 0 " ,
2012-02-22 03:03:55 +00:00
intval ( local_user ())
);
2012-03-01 00:26:07 +00:00
if ( $t && intval ( $t [ 0 ][ 'total' ]) > 49 ) {
$z = q ( " select * from notify where uid = %d
and seen = 0 order by date desc limit 0 , 50 " ,
intval ( local_user ())
);
}
else {
$z1 = q ( " select * from notify where uid = %d
and seen = 0 order by date desc limit 0 , 50 " ,
intval ( local_user ())
);
$z2 = q ( " select * from notify where uid = %d
and seen = 1 order by date desc limit 0 , % d " ,
intval ( local_user ()),
intval ( 50 - intval ( $t [ 0 ][ 'total' ]))
);
$z = array_merge ( $z1 , $z2 );
}
2012-07-13 14:09:29 +00:00
if ( count ( $z )) {
foreach ( $z as $zz ) {
$notifs [] = array (
'notify_link' => $a -> get_baseurl () . '/notify/view/' . $zz [ 'id' ],
2013-02-11 03:34:02 +00:00
'name' => '' , // not required here because the name is in the message
2012-07-13 14:09:29 +00:00
'url' => $zz [ 'url' ],
'photo' => $zz [ 'photo' ],
'when' => relative_date ( $zz [ 'date' ]),
2012-07-18 05:11:24 +00:00
'class' => (( $zz [ 'seen' ]) ? 'notify-seen' : 'notify-unseen' ),
2012-07-13 14:09:29 +00:00
'message' => strip_tags ( bbcode ( $zz [ 'msg' ]))
);
2011-09-28 07:30:22 +00:00
}
2011-08-23 11:52:20 +00:00
}
2012-07-13 14:09:29 +00:00
echo json_encode ( array ( 'notify' => $notifs ));
killme ();
}
2012-10-27 11:43:39 +00:00
2013-01-08 10:49:08 +00:00
if ( argc () > 1 && argv ( 1 ) === 'messages' ) {
$channel = $a -> get_channel ();
$t = q ( " select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
2013-01-08 19:59:29 +00:00
where channel_id = % d and not ( mail_flags & % d ) and not ( mail_flags & % d )
2013-01-08 10:49:08 +00:00
and from_xchan != '%s' order by created desc limit 0 , 50 " ,
intval ( local_user ()),
intval ( MAIL_SEEN ),
intval ( MAIL_DELETED ),
dbesc ( $channel [ 'channel_hash' ])
);
if ( $t ) {
foreach ( $t as $zz ) {
$notifs [] = array (
2013-12-22 07:47:44 +00:00
'notify_link' => $a -> get_baseurl () . '/mail/' . $zz [ 'id' ],
2013-01-08 10:49:08 +00:00
'name' => $zz [ 'xchan_name' ],
'url' => $zz [ 'xchan_url' ],
'photo' => $zz [ 'xchan_photo_s' ],
'when' => relative_date ( $zz [ 'created' ]),
'class' => (( $zz [ 'mail_flags' ] & MAIL_SEEN ) ? 'notify-seen' : 'notify-unseen' ),
'message' => t ( 'sent you a private message' ),
);
}
}
echo json_encode ( array ( 'notify' => $notifs ));
killme ();
}
2012-10-27 11:43:39 +00:00
if ( argc () > 1 && ( argv ( 1 ) === 'network' || argv ( 1 ) === 'home' )) {
$result = array ();
2012-12-02 23:45:13 +00:00
2012-11-30 04:46:45 +00:00
$r = q ( " SELECT * FROM item
WHERE item_restrict = % d and ( item_flags & % d ) and uid = % d " ,
2012-10-27 11:43:39 +00:00
intval ( ITEM_VISIBLE ),
intval ( ITEM_UNSEEN ),
intval ( local_user ())
);
2012-12-02 23:45:13 +00:00
2012-10-27 11:43:39 +00:00
if ( $r ) {
2012-11-14 00:04:22 +00:00
xchan_query ( $r );
2012-10-27 11:43:39 +00:00
foreach ( $r as $item ) {
2012-11-30 04:46:45 +00:00
if (( argv ( 1 ) === 'home' ) && ( ! ( $item [ 'item_flags' ] & ITEM_WALL )))
2012-10-27 11:43:39 +00:00
continue ;
$result [] = format_notification ( $item );
}
2014-06-30 20:16:21 +00:00
}
logger ( 'ping (network||home): ' . print_r ( $result , true ), LOGGER_DATA );
2013-01-08 19:59:29 +00:00
echo json_encode ( array ( 'notify' => $result ));
2012-10-27 11:43:39 +00:00
killme ();
}
2013-01-10 07:07:13 +00:00
if ( argc () > 1 && ( argv ( 1 ) === 'intros' )) {
2012-12-02 23:45:13 +00:00
$result = array ();
2014-07-06 04:45:13 +00:00
$r = q ( " SELECT * FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and (abook_flags & %d) and not ((abook_flags & %d) or (xchan_flags & %d)) " ,
2012-12-02 23:45:13 +00:00
intval ( local_user ()),
intval ( ABOOK_FLAG_PENDING ),
2014-07-06 04:45:13 +00:00
intval ( ABOOK_FLAG_SELF | ABOOK_FLAG_IGNORED ),
intval ( XCHAN_FLAGS_DELETED | XCHAN_FLAGS_ORPHAN )
2012-12-02 23:45:13 +00:00
);
if ( $r ) {
foreach ( $r as $rr ) {
$result [] = array (
2014-01-08 19:32:06 +00:00
'notify_link' => $a -> get_baseurl () . '/connedit/' . $rr [ 'abook_id' ],
2012-12-02 23:45:13 +00:00
'name' => $rr [ 'xchan_name' ],
'url' => $rr [ 'xchan_url' ],
'photo' => $rr [ 'xchan_photo_s' ],
'when' => relative_date ( $rr [ 'abook_created' ]),
'class' => ( 'notify-unseen' ),
2013-01-10 07:07:13 +00:00
'message' => t ( 'added your channel' )
2012-12-02 23:45:13 +00:00
);
}
2014-06-30 20:16:21 +00:00
}
logger ( 'ping (intros): ' . print_r ( $result , true ), LOGGER_DATA );
2013-01-10 07:07:13 +00:00
echo json_encode ( array ( 'notify' => $result ));
2012-12-02 23:45:13 +00:00
killme ();
}
2013-01-16 10:01:23 +00:00
if ( argc () > 1 && ( argv ( 1 ) === 'all_events' )) {
2013-01-16 11:18:32 +00:00
$bd_format = t ( 'g A l F d' ) ; // 8 AM Friday January 18
2013-01-16 10:01:23 +00:00
$result = array ();
$r = q ( " SELECT * FROM event left join xchan on event_xchan = xchan_hash
WHERE `event` . `uid` = % d AND start < '%s' AND start > '%s' and `ignore` = 0
ORDER BY `start` DESC " ,
intval ( local_user ()),
2014-06-30 20:16:21 +00:00
dbesc ( datetime_convert ( 'UTC' , date_default_timezone_get (), 'now + 7 days' )),
dbesc ( datetime_convert ( 'UTC' , date_default_timezone_get (), 'now - 1 days' ))
2013-01-16 10:01:23 +00:00
);
if ( $r ) {
foreach ( $r as $rr ) {
2013-01-16 11:18:32 +00:00
if ( $rr [ 'adjust' ])
2014-06-30 20:16:21 +00:00
$md = datetime_convert ( 'UTC' , date_default_timezone_get (), $rr [ 'start' ], 'Y/m' );
2013-01-16 11:18:32 +00:00
else
2014-06-30 20:16:21 +00:00
$md = datetime_convert ( 'UTC' , 'UTC' , $rr [ 'start' ], 'Y/m' );
2013-01-16 11:18:32 +00:00
2014-07-01 00:03:00 +00:00
$strt = datetime_convert ( 'UTC' , (( $rr [ 'adjust' ]) ? date_default_timezone_get () : 'UTC' ), $rr [ 'start' ]);
2014-06-30 20:16:21 +00:00
$today = (( substr ( $strt , 0 , 10 ) === datetime_convert ( 'UTC' , date_default_timezone_get (), 'now' , 'Y-m-d' )) ? true : false );
2013-01-16 11:18:32 +00:00
2014-07-01 00:03:00 +00:00
$when = day_translate ( datetime_convert ( 'UTC' , (( $rr [ 'adjust' ]) ? date_default_timezone_get () : 'UTC' ), $rr [ 'start' ], $bd_format )) . (( $today ) ? ' ' . t ( '[today]' ) : '' );
2013-01-16 11:18:32 +00:00
2013-01-16 10:01:23 +00:00
$result [] = array (
2013-11-13 22:18:07 +00:00
'notify_link' => $a -> get_baseurl () . '/events' , // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
2013-01-16 10:01:23 +00:00
'name' => $rr [ 'xchan_name' ],
'url' => $rr [ 'xchan_url' ],
'photo' => $rr [ 'xchan_photo_s' ],
2013-01-16 11:18:32 +00:00
'when' => $when ,
2013-01-16 10:01:23 +00:00
'class' => ( 'notify-unseen' ),
'message' => t ( 'posted an event' )
);
}
2014-06-30 20:16:21 +00:00
}
logger ( 'ping (all_events): ' . print_r ( $result , true ), LOGGER_DATA );
2013-01-16 10:01:23 +00:00
echo json_encode ( array ( 'notify' => $result ));
killme ();
}
2014-07-01 00:03:00 +00:00
/**
* Normal ping - just the counts , no detail
*/
2012-07-13 14:09:29 +00:00
$t = q ( " select count(*) as total from notify where uid = %d and seen = 0 " ,
intval ( local_user ())
);
if ( $t )
$result [ 'notify' ] = intval ( $t [ 0 ][ 'total' ]);
2012-07-26 05:55:43 +00:00
$t1 = dba_timer ();
2012-10-08 01:44:06 +00:00
$r = q ( " SELECT id, item_restrict, item_flags FROM item
2012-12-20 00:58:25 +00:00
WHERE ( item_restrict = % d ) and ( item_flags & % d ) and uid = % d " ,
2012-10-08 01:44:06 +00:00
intval ( ITEM_VISIBLE ),
intval ( ITEM_UNSEEN ),
2012-07-13 14:09:29 +00:00
intval ( local_user ())
);
2012-09-28 00:48:10 +00:00
if ( count ( $r )) {
2012-10-02 01:02:11 +00:00
$arr = array ( 'items' => $r );
call_hooks ( 'network_ping' , $arr );
2012-09-28 00:48:10 +00:00
2012-07-13 14:09:29 +00:00
foreach ( $r as $it ) {
2012-10-08 01:44:06 +00:00
if ( $it [ 'item_flags' ] & ITEM_WALL )
2012-07-13 14:09:29 +00:00
$result [ 'home' ] ++ ;
else
$result [ 'network' ] ++ ;
2011-09-28 07:30:22 +00:00
}
2012-07-13 14:09:29 +00:00
}
2011-08-17 19:59:06 +00:00
2012-07-26 05:55:43 +00:00
$t2 = dba_timer ();
2014-07-06 04:45:13 +00:00
$intr = q ( " SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and (abook_flags & %d) and not ((abook_flags & %d) or (xchan_flags & %d)) " ,
intval ( local_user ()),
2012-12-20 00:48:17 +00:00
intval ( ABOOK_FLAG_PENDING ),
2014-07-06 04:45:13 +00:00
intval ( ABOOK_FLAG_SELF | ABOOK_FLAG_IGNORED ),
intval ( XCHAN_FLAGS_DELETED | XCHAN_FLAGS_ORPHAN )
2012-07-13 14:09:29 +00:00
);
2012-07-26 05:55:43 +00:00
$t3 = dba_timer ();
2012-12-20 00:48:17 +00:00
if ( $intr )
$result [ 'intros' ] = intval ( $intr [ 0 ][ 'total' ]);
2012-07-13 14:09:29 +00:00
2012-07-26 05:55:43 +00:00
$t4 = dba_timer ();
2012-12-05 02:24:46 +00:00
$channel = get_app () -> get_channel ();
2012-07-26 05:55:43 +00:00
2012-12-05 02:24:46 +00:00
$mails = q ( " SELECT count(id) as total from mail
WHERE channel_id = % d AND not ( mail_flags & % d ) and from_xchan != '%s' " ,
2012-07-13 14:09:29 +00:00
intval ( local_user ()),
2012-12-05 02:24:46 +00:00
intval ( MAIL_SEEN ),
dbesc ( $channel [ 'channel_hash' ])
2012-07-13 14:09:29 +00:00
);
if ( $mails )
$result [ 'mail' ] = intval ( $mails [ 0 ][ 'total' ]);
2013-02-09 21:20:10 +00:00
if ( $a -> config [ 'system' ][ 'register_policy' ] == REGISTER_APPROVE && is_site_admin ()) {
$regs = q ( " SELECT count(account_id) as total from account where (account_flags & %d) " ,
intval ( ACCOUNT_PENDING )
);
2012-07-13 14:09:29 +00:00
if ( $regs )
$result [ 'register' ] = intval ( $regs [ 0 ][ 'total' ]);
}
2012-07-26 05:55:43 +00:00
$t5 = dba_timer ();
2013-01-03 10:10:37 +00:00
$events = q ( " SELECT type, start, adjust FROM `event`
2013-01-16 04:13:25 +00:00
WHERE `event` . `uid` = % d AND start < '%s' AND start > '%s' and `ignore` = 0
2012-07-29 00:21:42 +00:00
ORDER BY `start` ASC " ,
intval ( local_user ()),
2014-06-30 20:16:21 +00:00
dbesc ( datetime_convert ( 'UTC' , date_default_timezone_get (), 'now + 7 days' )),
dbesc ( datetime_convert ( 'UTC' , date_default_timezone_get (), 'now - 1 days' ))
2012-07-29 00:21:42 +00:00
);
2013-01-03 10:10:37 +00:00
if ( $events ) {
$result [ 'all_events' ] = count ( $events );
2012-07-26 05:55:43 +00:00
2012-08-27 06:05:00 +00:00
if ( $result [ 'all_events' ]) {
2014-07-01 00:03:00 +00:00
$str_now = datetime_convert ( 'UTC' , date_default_timezone_get (), 'now' , 'Y-m-d' );
2012-07-29 00:39:26 +00:00
foreach ( $events as $x ) {
2012-08-17 06:11:24 +00:00
$bd = false ;
if ( $x [ 'type' ] === 'birthday' ) {
$result [ 'birthdays' ] ++ ;
$bd = true ;
}
2012-08-27 06:05:00 +00:00
else {
$result [ 'events' ] ++ ;
}
2014-07-01 00:03:00 +00:00
if ( datetime_convert ( 'UTC' , (( intval ( $x [ 'adjust' ])) ? date_default_timezone_get () : 'UTC' ), $x [ 'start' ], 'Y-m-d' ) === $str_now ) {
2012-08-27 06:05:00 +00:00
$result [ 'all_events_today' ] ++ ;
2012-08-17 06:11:24 +00:00
if ( $bd )
$result [ 'birthdays_today' ] ++ ;
2012-08-27 06:05:00 +00:00
else
$result [ 'events_today' ] ++ ;
2012-08-17 06:11:24 +00:00
}
2012-07-29 00:39:26 +00:00
}
}
}
2012-07-26 05:55:43 +00:00
$x = json_encode ( $result );
2011-09-05 12:01:21 +00:00
2012-07-26 05:55:43 +00:00
$t6 = dba_timer ();
// logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0));
echo $x ;
2010-07-20 05:52:31 +00:00
killme ();
}