2016-02-07 13:27:13 +00:00
< ? php
2016-02-08 08:47:59 +00:00
/**
* @ file include / NotificationsManager . php
2016-08-03 10:44:04 +00:00
* @ brief Methods for read and write notifications from / to database
* or for formatting notifications
2016-02-08 08:47:59 +00:00
*/
2016-02-11 08:05:00 +00:00
require_once ( 'include/html2plain.php' );
2016-02-07 13:27:13 +00:00
require_once ( " include/datetime.php " );
2016-02-08 08:47:59 +00:00
require_once ( " include/bbcode.php " );
2016-02-07 13:27:13 +00:00
2016-02-08 08:47:59 +00:00
/**
2016-08-03 10:44:04 +00:00
* @ brief Methods for read and write notifications from / to database
* or for formatting notifications
2016-02-08 08:47:59 +00:00
*/
2016-02-07 13:27:13 +00:00
class NotificationsManager {
2016-07-30 08:51:21 +00:00
private $a ;
public function __construct () {
$this -> a = get_app ();
}
2016-02-08 08:47:59 +00:00
/**
* @ brief set some extra note properties
*
* @ param array $notes array of note arrays from db
* @ return array Copy of input array with added properties
2017-04-30 04:17:49 +00:00
*
2016-02-08 08:47:59 +00:00
* Set some extra properties to note array from db :
* - timestamp as int in default TZ
* - date_rel : relative date string
* - msg_html : message as html string
* - msg_plain : message as plain text string
*/
2016-07-30 08:51:21 +00:00
private function _set_extra ( $notes ) {
$rets = array ();
2017-03-21 16:02:59 +00:00
foreach ( $notes as $n ) {
2016-07-30 08:51:21 +00:00
$local_time = datetime_convert ( 'UTC' , date_default_timezone_get (), $n [ 'date' ]);
$n [ 'timestamp' ] = strtotime ( $local_time );
$n [ 'date_rel' ] = relative_date ( $n [ 'date' ]);
$n [ 'msg_html' ] = bbcode ( $n [ 'msg' ], false , false , false , false );
$n [ 'msg_plain' ] = explode ( " \n " , trim ( html2plain ( $n [ 'msg_html' ], 0 )))[ 0 ];
$rets [] = $n ;
}
return $rets ;
}
/**
2016-08-03 10:44:04 +00:00
* @ brief Get all notifications for local_user ()
2016-07-30 08:51:21 +00:00
*
* @ param array $filter optional Array " column name " => value : filter query by columns values
* @ param string $order optional Space separated list of column to sort by . prepend name with " + " to sort ASC , " - " to sort DESC . Default to " -date "
* @ param string $limit optional Query limits
*
* @ return array of results or false on errors
*/
public function getAll ( $filter = array (), $order = " -date " , $limit = " " ) {
$filter_str = array ();
$filter_sql = " " ;
2017-03-21 16:02:59 +00:00
foreach ( $filter as $column => $value ) {
2016-07-30 08:51:21 +00:00
$filter_str [] = sprintf ( " `%s` = '%s' " , $column , dbesc ( $value ));
}
if ( count ( $filter_str ) > 0 ) {
$filter_sql = " AND " . implode ( " AND " , $filter_str );
}
$aOrder = explode ( " " , $order );
$asOrder = array ();
2017-03-21 16:02:59 +00:00
foreach ( $aOrder as $o ) {
2016-07-30 08:51:21 +00:00
$dir = " asc " ;
if ( $o [ 0 ] === " - " ) {
$dir = " desc " ;
$o = substr ( $o , 1 );
}
if ( $o [ 0 ] === " + " ) {
$dir = " asc " ;
$o = substr ( $o , 1 );
}
$asOrder [] = " $o $dir " ;
}
$order_sql = implode ( " , " , $asOrder );
2017-03-21 16:02:59 +00:00
if ( $limit != " " )
2016-08-06 16:59:39 +00:00
$limit = " LIMIT " . $limit ;
2016-07-30 08:51:21 +00:00
$r = q ( " SELECT * FROM `notify` WHERE `uid` = %d $filter_sql ORDER BY $order_sql $limit " ,
intval ( local_user ())
);
2016-08-06 16:59:39 +00:00
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-06 16:59:39 +00:00
return $this -> _set_extra ( $r );
2016-07-30 08:51:21 +00:00
return false ;
}
/**
2016-08-03 10:44:04 +00:00
* @ brief Get one note for local_user () by $id value
2016-07-30 08:51:21 +00:00
*
* @ param int $id
* @ return array note values or null if not found
*/
public function getByID ( $id ) {
$r = q ( " SELECT * FROM `notify` WHERE `id` = %d AND `uid` = %d LIMIT 1 " ,
intval ( $id ),
intval ( local_user ())
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r )) {
2016-07-30 08:51:21 +00:00
return $this -> _set_extra ( $r )[ 0 ];
}
return null ;
}
/**
* @ brief set seen state of $note of local_user ()
*
* @ param array $note
* @ param bool $seen optional true or false , default true
* @ return bool true on success , false on errors
*/
public function setSeen ( $note , $seen = true ) {
return q ( " UPDATE `notify` SET `seen` = %d WHERE ( `link` = '%s' OR ( `parent` != 0 AND `parent` = %d AND `otype` = '%s' )) AND `uid` = %d " ,
intval ( $seen ),
dbesc ( $note [ 'link' ]),
intval ( $note [ 'parent' ]),
dbesc ( $note [ 'otype' ]),
2016-02-07 13:27:13 +00:00
intval ( local_user ())
);
2016-07-30 08:51:21 +00:00
}
/**
* @ brief set seen state of all notifications of local_user ()
*
* @ param bool $seen optional true or false . default true
* @ return bool true on success , false on error
*/
public function setAllSeen ( $seen = true ) {
return q ( " UPDATE `notify` SET `seen` = %d WHERE `uid` = %d " ,
intval ( $seen ),
2016-02-07 13:27:13 +00:00
intval ( local_user ())
);
2016-07-30 08:51:21 +00:00
}
/**
* @ brief List of pages for the Notifications TabBar
2017-04-30 04:17:49 +00:00
*
2016-07-30 08:51:21 +00:00
* @ return array with with notifications TabBar data
*/
public function getTabs () {
$tabs = array (
array (
'label' => t ( 'System' ),
'url' => 'notifications/system' ,
'sel' => (( $this -> a -> argv [ 1 ] == 'system' ) ? 'active' : '' ),
2016-08-01 16:18:11 +00:00
'id' => 'system-tab' ,
2016-07-30 08:51:21 +00:00
'accesskey' => 'y' ,
),
array (
'label' => t ( 'Network' ),
'url' => 'notifications/network' ,
'sel' => (( $this -> a -> argv [ 1 ] == 'network' ) ? 'active' : '' ),
2016-08-01 16:18:11 +00:00
'id' => 'network-tab' ,
2016-07-30 08:51:21 +00:00
'accesskey' => 'w' ,
),
array (
'label' => t ( 'Personal' ),
'url' => 'notifications/personal' ,
'sel' => (( $this -> a -> argv [ 1 ] == 'personal' ) ? 'active' : '' ),
2016-08-01 16:18:11 +00:00
'id' => 'personal-tab' ,
2016-07-30 08:51:21 +00:00
'accesskey' => 'r' ,
),
array (
'label' => t ( 'Home' ),
'url' => 'notifications/home' ,
'sel' => (( $this -> a -> argv [ 1 ] == 'home' ) ? 'active' : '' ),
2016-08-01 16:18:11 +00:00
'id' => 'home-tab' ,
2016-07-30 08:51:21 +00:00
'accesskey' => 'h' ,
),
array (
'label' => t ( 'Introductions' ),
'url' => 'notifications/intros' ,
'sel' => (( $this -> a -> argv [ 1 ] == 'intros' ) ? 'active' : '' ),
2016-08-01 16:18:11 +00:00
'id' => 'intro-tab' ,
2016-07-30 08:51:21 +00:00
'accesskey' => 'i' ,
),
);
return $tabs ;
}
2016-08-01 21:04:41 +00:00
/**
* @ brief Format the notification query in an usable array
2017-04-30 04:17:49 +00:00
*
2016-08-01 21:04:41 +00:00
* @ param array $notifs The array from the db query
* @ param string $ident The notifications identifier ( e . g . network )
* @ return array
* string 'label' => The type of the notification
* string 'link' => URL to the source
* string 'image' => The avatar image
2016-12-21 23:28:52 +00:00
* string 'url' => The profile url of the contact
2016-08-01 21:04:41 +00:00
* string 'text' => The notification text
2016-12-21 23:28:52 +00:00
* string 'when' => The date of the notification
* string 'ago' => T relative date of the notification
2016-08-01 21:04:41 +00:00
* bool 'seen' => Is the notification marked as " seen "
*/
2016-08-03 10:44:04 +00:00
private function formatNotifs ( $notifs , $ident = " " ) {
2016-08-01 16:18:11 +00:00
$notif = array ();
$arr = array ();
if ( dbm :: is_result ( $notifs )) {
foreach ( $notifs as $it ) {
2016-08-01 21:04:41 +00:00
// Because we use different db tables for the notification query
// we have sometimes $it['unseen'] and sometimes $it['seen].
// So we will have to transform $it['unseen']
2016-11-16 03:57:55 +00:00
if ( array_key_exists ( 'unseen' , $it )) {
2016-08-01 16:18:11 +00:00
$it [ 'seen' ] = ( $it [ 'unseen' ] > 0 ? false : true );
2016-11-16 03:57:55 +00:00
}
2016-08-01 16:18:11 +00:00
2016-08-01 21:04:41 +00:00
// Depending on the identifier of the notification we need to use different defaults
2016-08-01 16:18:11 +00:00
switch ( $ident ) {
2016-07-30 08:51:21 +00:00
case 'system' :
2016-08-01 16:18:11 +00:00
$default_item_label = 'notify' ;
2016-08-01 21:04:41 +00:00
$default_item_link = $this -> a -> get_baseurl ( true ) . '/notify/view/' . $it [ 'id' ];
2016-07-30 08:51:21 +00:00
$default_item_image = proxy_url ( $it [ 'photo' ], false , PROXY_SIZE_MICRO );
2016-12-21 22:17:55 +00:00
$default_item_url = $it [ 'url' ];
2016-07-30 08:51:21 +00:00
$default_item_text = strip_tags ( bbcode ( $it [ 'msg' ]));
2016-12-21 23:28:52 +00:00
$default_item_when = datetime_convert ( 'UTC' , date_default_timezone_get (), $it [ 'date' ], 'r' );
$default_item_ago = relative_date ( $it [ 'date' ]);
2016-07-30 08:51:21 +00:00
break ;
case 'home' :
2016-08-01 16:18:11 +00:00
$default_item_label = 'comment' ;
2016-08-01 21:04:41 +00:00
$default_item_link = $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ];
2016-07-30 08:51:21 +00:00
$default_item_image = proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO );
2016-12-21 22:17:55 +00:00
$default_item_url = $it [ 'author-link' ];
2016-11-16 03:57:55 +00:00
$default_item_text = sprintf ( t ( " %s commented on %s's post " ), $it [ 'author-name' ], $it [ 'pname' ]);
2016-12-21 23:28:52 +00:00
$default_item_when = datetime_convert ( 'UTC' , date_default_timezone_get (), $it [ 'created' ], 'r' );
$default_item_ago = relative_date ( $it [ 'created' ]);
2016-07-30 08:51:21 +00:00
break ;
default :
2016-08-01 16:18:11 +00:00
$default_item_label = (( $it [ 'id' ] == $it [ 'parent' ]) ? 'post' : 'comment' );
2016-08-01 21:04:41 +00:00
$default_item_link = $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ];
2016-07-30 08:51:21 +00:00
$default_item_image = proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO );
2016-12-21 22:17:55 +00:00
$default_item_url = $it [ 'author-link' ];
2016-07-30 08:51:21 +00:00
$default_item_text = (( $it [ 'id' ] == $it [ 'parent' ])
2016-11-16 03:57:55 +00:00
? sprintf ( t ( " %s created a new post " ), $it [ 'author-name' ])
: sprintf ( t ( " %s commented on %s's post " ), $it [ 'author-name' ], $it [ 'pname' ]));
2016-12-21 23:28:52 +00:00
$default_item_when = datetime_convert ( 'UTC' , date_default_timezone_get (), $it [ 'created' ], 'r' );
$default_item_ago = relative_date ( $it [ 'created' ]);
2016-07-30 08:51:21 +00:00
}
2016-08-01 21:04:41 +00:00
// Transform the different types of notification in an usable array
2016-11-16 03:57:55 +00:00
switch ( $it [ 'verb' ]){
2016-07-30 08:51:21 +00:00
case ACTIVITY_LIKE :
2016-08-01 16:18:11 +00:00
$notif = array (
'label' => 'like' ,
2016-08-01 21:04:41 +00:00
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
2016-11-16 12:21:13 +00:00
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-11-16 03:57:55 +00:00
'text' => sprintf ( t ( " %s liked %s's post " ), $it [ 'author-name' ], $it [ 'pname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 16:18:11 +00:00
'seen' => $it [ 'seen' ]
);
2016-07-30 08:51:21 +00:00
break ;
case ACTIVITY_DISLIKE :
2016-08-01 16:18:11 +00:00
$notif = array (
'label' => 'dislike' ,
2016-08-01 21:04:41 +00:00
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
2016-08-01 16:18:11 +00:00
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-11-16 03:57:55 +00:00
'text' => sprintf ( t ( " %s disliked %s's post " ), $it [ 'author-name' ], $it [ 'pname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 16:18:11 +00:00
'seen' => $it [ 'seen' ]
);
2016-07-30 08:51:21 +00:00
break ;
2016-08-01 22:01:43 +00:00
case ACTIVITY_ATTEND :
$notif = array (
'label' => 'attend' ,
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-11-16 03:57:55 +00:00
'text' => sprintf ( t ( " %s is attending %s's event " ), $it [ 'author-name' ], $it [ 'pname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 22:01:43 +00:00
'seen' => $it [ 'seen' ]
);
break ;
case ACTIVITY_ATTENDNO :
$notif = array (
'label' => 'attendno' ,
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-08-01 22:01:43 +00:00
'text' => sprintf ( t ( " %s is not attending %s's event " ), $it [ 'author-name' ], $it [ 'pname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 22:01:43 +00:00
'seen' => $it [ 'seen' ]
);
break ;
case ACTIVITY_ATTENDMAYBE :
$notif = array (
'label' => 'attendmaybe' ,
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-11-16 03:57:55 +00:00
'text' => sprintf ( t ( " %s may attend %s's event " ), $it [ 'author-name' ], $it [ 'pname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 22:01:43 +00:00
'seen' => $it [ 'seen' ]
);
break ;
2016-07-30 08:51:21 +00:00
case ACTIVITY_FRIEND :
$xmlhead = " < " . " ?xml version='1.0' encoding='UTF-8' ? " . " > " ;
$obj = parse_xml_string ( $xmlhead . $it [ 'object' ]);
$it [ 'fname' ] = $obj -> title ;
2016-08-01 16:18:11 +00:00
$notif = array (
'label' => 'friend' ,
2016-08-01 21:04:41 +00:00
'link' => $this -> a -> get_baseurl ( true ) . '/display/' . $it [ 'pguid' ],
2016-08-01 16:18:11 +00:00
'image' => proxy_url ( $it [ 'author-avatar' ], false , PROXY_SIZE_MICRO ),
2016-12-21 22:17:55 +00:00
'url' => $it [ 'author-link' ],
2016-11-16 03:57:55 +00:00
'text' => sprintf ( t ( " %s is now friends with %s " ), $it [ 'author-name' ], $it [ 'fname' ]),
2016-12-21 23:28:52 +00:00
'when' => $default_item_when ,
'ago' => $default_item_ago ,
2016-08-01 16:18:11 +00:00
'seen' => $it [ 'seen' ]
);
2016-07-30 08:51:21 +00:00
break ;
default :
2016-08-01 16:18:11 +00:00
$notif = array (
'label' => $default_item_label ,
'link' => $default_item_link ,
'image' => $default_item_image ,
2016-12-21 22:17:55 +00:00
'url' => $default_item_url ,
2016-08-01 16:18:11 +00:00
'text' => $default_item_text ,
'when' => $default_item_when ,
2016-12-21 23:28:52 +00:00
'ago' => $default_item_ago ,
2016-08-01 16:18:11 +00:00
'seen' => $it [ 'seen' ]
);
2016-07-30 08:51:21 +00:00
}
2016-08-01 16:18:11 +00:00
$arr [] = $notif ;
2016-07-30 08:51:21 +00:00
}
}
2016-08-01 16:18:11 +00:00
return $arr ;
}
2016-08-01 21:04:41 +00:00
/**
2017-04-30 04:17:49 +00:00
* @ brief Total number of network notifications
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ return int Number of network notifications
*/
2016-08-01 16:18:11 +00:00
private function networkTotal ( $seen = 0 ) {
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT COUNT(*) AS `total`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem` . `id` = `item` . `parent`
WHERE `item` . `visible` = 1 AND `pitem` . `parent` != 0 AND
`item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 0
$sql_seen " ,
intval ( local_user ())
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-01 16:18:11 +00:00
return $r [ 0 ][ 'total' ];
return 0 ;
}
2016-08-01 21:04:41 +00:00
/**
* @ brief Get network notifications
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ param int $start Start the query at this point
* @ param int $limit Maximum number of query results
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ return array with
* string 'ident' => Notification identifier
* int 'total' => Total number of available network notifications
* array 'notifications' => Network notifications
2016-08-01 21:04:41 +00:00
*/
2016-08-03 10:44:04 +00:00
public function networkNotifs ( $seen = 0 , $start = 0 , $limit = 80 ) {
2016-08-01 16:18:11 +00:00
$ident = 'network' ;
$total = $this -> networkTotal ( $seen );
2016-08-03 10:44:04 +00:00
$notifs = array ();
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2016-08-01 16:18:11 +00:00
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
`item` . `author-link` , `item` . `author-avatar` , `item` . `created` , `item` . `object` AS `object` ,
`pitem` . `author-name` AS `pname` , `pitem` . `author-link` AS `plink` , `pitem` . `guid` AS `pguid`
2016-08-03 10:44:04 +00:00
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem` . `id` = `item` . `parent`
WHERE `item` . `visible` = 1 AND `pitem` . `parent` != 0 AND
2016-08-01 16:18:11 +00:00
`item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 0
$sql_seen
2016-08-03 10:44:04 +00:00
ORDER BY `item` . `created` DESC LIMIT % d , % d " ,
intval ( local_user ()),
intval ( $start ),
intval ( $limit )
2016-08-01 16:18:11 +00:00
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
$notifs = $this -> formatNotifs ( $r , $ident );
2016-08-01 16:18:11 +00:00
2016-08-03 10:44:04 +00:00
$arr = array (
'notifications' => $notifs ,
'ident' => $ident ,
'total' => $total ,
);
return $arr ;
2016-08-01 16:18:11 +00:00
}
2016-08-01 21:04:41 +00:00
/**
2017-04-30 04:17:49 +00:00
* @ brief Total number of system notifications
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ return int Number of system notifications
*/
2016-08-01 16:18:11 +00:00
private function systemTotal ( $seen = 0 ) {
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `seen` = 0 " ;
$r = q ( " SELECT COUNT(*) AS `total` FROM `notify` WHERE `uid` = %d $sql_seen " ,
intval ( local_user ())
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-01 16:18:11 +00:00
return $r [ 0 ][ 'total' ];
2016-07-30 08:51:21 +00:00
2016-08-01 16:18:11 +00:00
return 0 ;
}
2016-08-04 09:46:57 +00:00
/**
2016-08-01 21:04:41 +00:00
* @ brief Get system notifications
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ param int $start Start the query at this point
* @ param int $limit Maximum number of query results
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ return array with
* string 'ident' => Notification identifier
* int 'total' => Total number of available system notifications
* array 'notifications' => System notifications
2016-08-01 21:04:41 +00:00
*/
2016-08-03 10:44:04 +00:00
public function systemNotifs ( $seen = 0 , $start = 0 , $limit = 80 ) {
2016-08-01 16:18:11 +00:00
$ident = 'system' ;
$total = $this -> systemTotal ( $seen );
2016-08-03 10:44:04 +00:00
$notifs = array ();
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2016-08-01 16:18:11 +00:00
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `seen` = 0 " ;
2016-12-21 22:17:55 +00:00
$r = q ( " SELECT `id`, `url`, `photo`, `msg`, `date`, `seen` FROM `notify`
2016-08-01 21:04:41 +00:00
WHERE `uid` = % d $sql_seen ORDER BY `date` DESC LIMIT % d , % d " ,
intval ( local_user ()),
intval ( $start ),
intval ( $limit )
2016-08-01 16:18:11 +00:00
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
$notifs = $this -> formatNotifs ( $r , $ident );
2016-08-01 16:18:11 +00:00
2016-08-03 10:44:04 +00:00
$arr = array (
'notifications' => $notifs ,
'ident' => $ident ,
'total' => $total ,
);
return $arr ;
2016-08-01 16:18:11 +00:00
}
2016-08-01 21:04:41 +00:00
/**
* @ brief Addional SQL query string for the personal notifications
2017-04-30 04:17:49 +00:00
*
2016-08-01 21:04:41 +00:00
* @ return string The additional sql query
*/
2016-08-01 16:18:11 +00:00
private function _personal_sql_extra () {
2016-08-01 21:04:41 +00:00
$myurl = $this -> a -> get_baseurl ( true ) . '/profile/' . $this -> a -> user [ 'nickname' ];
2016-08-01 16:18:11 +00:00
$myurl = substr ( $myurl , strpos ( $myurl , '://' ) + 3 );
$myurl = str_replace ( array ( 'www.' , '.' ), array ( '' , '\\.' ), $myurl );
$diasp_url = str_replace ( '/profile/' , '/u/' , $myurl );
2016-08-06 16:59:39 +00:00
$sql_extra = sprintf ( " AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) " ,
2016-08-01 16:18:11 +00:00
dbesc ( $myurl . '$' ),
dbesc ( $myurl . '\\]' ),
dbesc ( $diasp_url . '\\]' )
);
return $sql_extra ;
}
2016-08-01 21:04:41 +00:00
/**
2017-04-30 04:17:49 +00:00
* @ brief Total number of personal notifications
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ return int Number of personal notifications
*/
2016-08-01 16:18:11 +00:00
private function personalTotal ( $seen = 0 ) {
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
$sql_extra = $this -> _personal_sql_extra ();
2016-08-01 16:18:11 +00:00
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT COUNT(*) AS `total`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem` . `id` = `item` . `parent`
WHERE `item` . `visible` = 1
$sql_extra
$sql_seen
AND `item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 0 " ,
intval ( local_user ())
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-01 16:18:11 +00:00
return $r [ 0 ][ 'total' ];
return 0 ;
}
2016-08-01 21:04:41 +00:00
/**
* @ brief Get personal notifications
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ param int $start Start the query at this point
* @ param int $limit Maximum number of query results
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ return array with
* string 'ident' => Notification identifier
* int 'total' => Total number of available personal notifications
* array 'notifications' => Personal notifications
2016-08-01 21:04:41 +00:00
*/
2016-08-03 10:44:04 +00:00
public function personalNotifs ( $seen = 0 , $start = 0 , $limit = 80 ) {
2016-08-01 16:18:11 +00:00
$ident = 'personal' ;
2016-08-03 10:44:04 +00:00
$total = $this -> personalTotal ( $seen );
2016-08-06 16:59:39 +00:00
$sql_extra = $this -> _personal_sql_extra ();
2016-08-03 10:44:04 +00:00
$notifs = array ();
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2016-08-01 16:18:11 +00:00
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
2017-04-30 04:17:49 +00:00
`item` . `author-link` , `item` . `author-avatar` , `item` . `created` , `item` . `object` AS `object` ,
`pitem` . `author-name` AS `pname` , `pitem` . `author-link` AS `plink` , `pitem` . `guid` AS `pguid`
2016-08-03 10:44:04 +00:00
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem` . `id` = `item` . `parent`
WHERE `item` . `visible` = 1
2016-08-01 16:18:11 +00:00
$sql_extra
$sql_seen
2017-04-30 04:17:49 +00:00
AND `item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 0
2016-08-03 10:44:04 +00:00
ORDER BY `item` . `created` DESC LIMIT % d , % d " ,
intval ( local_user ()),
intval ( $start ),
intval ( $limit )
2016-08-01 16:18:11 +00:00
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
$notifs = $this -> formatNotifs ( $r , $ident );
2017-04-30 04:17:49 +00:00
2016-08-03 10:44:04 +00:00
$arr = array (
'notifications' => $notifs ,
'ident' => $ident ,
'total' => $total ,
);
2016-08-01 16:18:11 +00:00
2016-08-03 10:44:04 +00:00
return $arr ;
2016-08-01 16:18:11 +00:00
}
2016-08-01 21:04:41 +00:00
/**
2017-04-30 04:17:49 +00:00
* @ brief Total number of home notifications
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ return int Number of home notifications
*/
2016-08-01 16:18:11 +00:00
private function homeTotal ( $seen = 0 ) {
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT COUNT(*) AS `total` FROM `item`
2016-08-01 21:04:41 +00:00
WHERE `item` . `visible` = 1 AND
2016-08-01 16:18:11 +00:00
`item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 1
$sql_seen " ,
intval ( local_user ())
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-01 21:04:41 +00:00
return $r [ 0 ][ 'total' ];
2016-08-01 16:18:11 +00:00
return 0 ;
}
2016-08-01 21:04:41 +00:00
/**
* @ brief Get home notifications
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ param int | string $seen
2016-08-01 21:04:41 +00:00
* If 0 only include notifications into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as " seen "
2016-08-01 21:04:41 +00:00
* @ param int $start Start the query at this point
* @ param int $limit Maximum number of query results
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ return array with
* string 'ident' => Notification identifier
* int 'total' => Total number of available home notifications
* array 'notifications' => Home notifications
2016-08-01 21:04:41 +00:00
*/
2016-08-03 10:44:04 +00:00
public function homeNotifs ( $seen = 0 , $start = 0 , $limit = 80 ) {
2016-08-01 16:18:11 +00:00
$ident = 'home' ;
$total = $this -> homeTotal ( $seen );
2016-08-03 10:44:04 +00:00
$notifs = array ();
2016-08-06 16:59:39 +00:00
$sql_seen = " " ;
2016-08-01 16:18:11 +00:00
2017-03-21 16:02:59 +00:00
if ( $seen === 0 )
2016-08-01 16:18:11 +00:00
$sql_seen = " AND `item`.`unseen` = 1 " ;
$r = q ( " SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
2016-12-21 22:17:55 +00:00
`item` . `author-link` , `item` . `author-avatar` , `item` . `created` , `item` . `object` AS `object` ,
`pitem` . `author-name` AS `pname` , `pitem` . `author-link` AS `plink` , `pitem` . `guid` AS `pguid`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem` . `id` = `item` . `parent`
2016-08-03 10:44:04 +00:00
WHERE `item` . `visible` = 1 AND
2016-08-01 16:18:11 +00:00
`item` . `deleted` = 0 AND `item` . `uid` = % d AND `item` . `wall` = 1
$sql_seen
2016-08-03 10:44:04 +00:00
ORDER BY `item` . `created` DESC LIMIT % d , % d " ,
intval ( local_user ()),
intval ( $start ),
intval ( $limit )
2016-08-01 16:18:11 +00:00
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
$notifs = $this -> formatNotifs ( $r , $ident );
$arr = array (
'notifications' => $notifs ,
'ident' => $ident ,
'total' => $total ,
);
2016-08-01 16:18:11 +00:00
2016-08-03 10:44:04 +00:00
return $arr ;
}
/**
2017-04-30 04:17:49 +00:00
* @ brief Total number of introductions
2016-08-06 16:59:39 +00:00
* @ param bool $all
* If false only include introductions into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as ignored
* @ return int Number of introductions
*/
2016-08-06 16:59:39 +00:00
private function introTotal ( $all = false ) {
$sql_extra = " " ;
2017-03-21 16:02:59 +00:00
if ( ! $all )
2016-08-03 10:44:04 +00:00
$sql_extra = " AND `ignore` = 0 " ;
$r = q ( " SELECT COUNT(*) AS `total` FROM `intro`
WHERE `intro` . `uid` = % d $sql_extra AND `intro` . `blocked` = 0 " ,
intval ( $_SESSION [ 'uid' ])
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
return $r [ 0 ][ 'total' ];
return 0 ;
}
/**
* @ brief Get introductions
2017-04-30 04:17:49 +00:00
*
2016-08-06 16:59:39 +00:00
* @ param bool $all
* If false only include introductions into the query
2016-08-03 10:44:04 +00:00
* which aren ' t marked as ignored
* @ param int $start Start the query at this point
* @ param int $limit Maximum number of query results
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ return array with
* string 'ident' => Notification identifier
* int 'total' => Total number of available introductions
* array 'notifications' => Introductions
*/
2016-08-06 16:59:39 +00:00
public function introNotifs ( $all = false , $start = 0 , $limit = 80 ) {
2016-08-03 10:44:04 +00:00
$ident = 'introductions' ;
$total = $this -> introTotal ( $seen );
$notifs = array ();
2016-08-06 16:59:39 +00:00
$sql_extra = " " ;
2016-08-03 10:44:04 +00:00
2017-03-21 16:02:59 +00:00
if ( ! $all )
2016-08-03 10:44:04 +00:00
$sql_extra = " AND `ignore` = 0 " ;
/// @todo Fetch contact details by "get_contact_details_by_url" instead of queries to contact, fcontact and gcontact
$r = q ( " SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`,
`gcontact` . `location` AS `glocation` , `gcontact` . `about` AS `gabout` ,
`gcontact` . `keywords` AS `gkeywords` , `gcontact` . `gender` AS `ggender` ,
`gcontact` . `network` AS `gnetwork`
FROM `intro`
LEFT JOIN `contact` ON `contact` . `id` = `intro` . `contact-id`
LEFT JOIN `gcontact` ON `gcontact` . `nurl` = `contact` . `nurl`
LEFT JOIN `fcontact` ON `intro` . `fid` = `fcontact` . `id`
WHERE `intro` . `uid` = % d $sql_extra AND `intro` . `blocked` = 0
LIMIT % d , % d " ,
intval ( $_SESSION [ 'uid' ]),
intval ( $start ),
intval ( $limit )
);
2016-12-14 08:42:36 +00:00
if ( dbm :: is_result ( $r ))
2016-08-03 10:44:04 +00:00
$notifs = $this -> formatIntros ( $r );
$arr = array (
'ident' => $ident ,
'total' => $total ,
'notifications' => $notifs ,
);
return $arr ;
}
/**
* @ brief Format the notification query in an usable array
2017-04-30 04:17:49 +00:00
*
2016-08-03 10:44:04 +00:00
* @ param array $intros The array from the db query
* @ return array with the introductions
*/
private function formatIntros ( $intros ) {
$knowyou = '' ;
2017-03-21 16:02:59 +00:00
foreach ( $intros as $it ) {
2016-08-03 10:44:04 +00:00
// There are two kind of introduction. Contacts suggested by other contacts and normal connection requests.
// We have to distinguish between these two because they use different data.
// Contact suggestions
2017-03-21 16:02:59 +00:00
if ( $it [ 'fid' ]) {
2016-08-03 10:44:04 +00:00
$return_addr = bin2hex ( $this -> a -> user [ 'nickname' ] . '@' . $this -> a -> get_hostname () . (( $this -> a -> path ) ? '/' . $this -> a -> path : '' ));
$intro = array (
'label' => 'friend_suggestion' ,
'notify_type' => t ( 'Friend Suggestion' ),
'intro_id' => $it [ 'intro_id' ],
'madeby' => $it [ 'name' ],
'contact_id' => $it [ 'contact-id' ],
'photo' => (( x ( $it , 'fphoto' )) ? proxy_url ( $it [ 'fphoto' ], false , PROXY_SIZE_SMALL ) : " images/person-175.jpg " ),
'name' => $it [ 'fname' ],
'url' => zrl ( $it [ 'furl' ]),
'hidden' => $it [ 'hidden' ] == 1 ,
'post_newfriend' => ( intval ( get_pconfig ( local_user (), 'system' , 'post_newfriend' )) ? '1' : 0 ),
'knowyou' => $knowyou ,
'note' => $it [ 'note' ],
'request' => $it [ 'frequest' ] . '?addr=' . $return_addr ,
);
// Normal connection requests
} else {
// Probe the contact url to get missing data
$ret = probe_url ( $it [ " url " ]);
if ( $it [ 'gnetwork' ] == " " )
$it [ 'gnetwork' ] = $ret [ " network " ];
// Don't show these data until you are connected. Diaspora is doing the same.
2017-03-21 16:02:59 +00:00
if ( $it [ 'gnetwork' ] === NETWORK_DIASPORA ) {
2016-08-03 10:44:04 +00:00
$it [ 'glocation' ] = " " ;
$it [ 'gabout' ] = " " ;
$it [ 'ggender' ] = " " ;
}
$intro = array (
'label' => (( $it [ 'network' ] !== NETWORK_OSTATUS ) ? 'friend_request' : 'follower' ),
'notify_type' => (( $it [ 'network' ] !== NETWORK_OSTATUS ) ? t ( 'Friend/Connect Request' ) : t ( 'New Follower' )),
'dfrn_id' => $it [ 'issued-id' ],
'uid' => $_SESSION [ 'uid' ],
'intro_id' => $it [ 'intro_id' ],
'contact_id' => $it [ 'contact-id' ],
'photo' => (( x ( $it , 'photo' )) ? proxy_url ( $it [ 'photo' ], false , PROXY_SIZE_SMALL ) : " images/person-175.jpg " ),
'name' => $it [ 'name' ],
'location' => bbcode ( $it [ 'glocation' ], false , false ),
'about' => bbcode ( $it [ 'gabout' ], false , false ),
'keywords' => $it [ 'gkeywords' ],
'gender' => $it [ 'ggender' ],
'hidden' => $it [ 'hidden' ] == 1 ,
'post_newfriend' => ( intval ( get_pconfig ( local_user (), 'system' , 'post_newfriend' )) ? '1' : 0 ),
'url' => $it [ 'url' ],
'zrl' => zrl ( $it [ 'url' ]),
'addr' => $ret [ 'addr' ],
'network' => $it [ 'gnetwork' ],
'knowyou' => $it [ 'knowyou' ],
'note' => $it [ 'note' ],
);
}
$arr [] = $intro ;
2016-08-01 16:18:11 +00:00
}
2016-08-03 10:44:04 +00:00
return $arr ;
2016-07-30 08:51:21 +00:00
}
2016-02-07 13:27:13 +00:00
}