Merge pull request #2702 from rabuzarus/0308-Notifications-restructure
notifications restructure
This commit is contained in:
commit
61e3a8ca3a
12 changed files with 992 additions and 553 deletions
|
@ -1,13 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* @file include/NotificationsManager.php
|
||||
* @brief Methods for read and write notifications from/to database
|
||||
* or for formatting notifications
|
||||
*/
|
||||
require_once('include/html2plain.php');
|
||||
require_once("include/datetime.php");
|
||||
require_once("include/bbcode.php");
|
||||
|
||||
/**
|
||||
* @brief Read and write notifications from/to database
|
||||
* @brief Methods for read and write notifications from/to database
|
||||
* or for formatting notifications
|
||||
*/
|
||||
class NotificationsManager {
|
||||
private $a;
|
||||
|
@ -44,7 +47,7 @@ class NotificationsManager {
|
|||
|
||||
|
||||
/**
|
||||
* @brief get all notifications for local_user()
|
||||
* @brief Get all notifications for local_user()
|
||||
*
|
||||
* @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"
|
||||
|
@ -78,17 +81,21 @@ class NotificationsManager {
|
|||
}
|
||||
$order_sql = implode(", ", $asOrder);
|
||||
|
||||
if ($limit!="") $limit = " LIMIT ".$limit;
|
||||
if($limit!="")
|
||||
$limit = " LIMIT ".$limit;
|
||||
|
||||
$r = q("SELECT * FROM `notify` WHERE `uid` = %d $filter_sql ORDER BY $order_sql $limit",
|
||||
intval(local_user())
|
||||
);
|
||||
if ($r!==false && count($r)>0) return $this->_set_extra($r);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $this->_set_extra($r);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get one note for local_user() by $id value
|
||||
* @brief Get one note for local_user() by $id value
|
||||
*
|
||||
* @param int $id
|
||||
* @return array note values or null if not found
|
||||
|
@ -98,7 +105,7 @@ class NotificationsManager {
|
|||
intval($id),
|
||||
intval(local_user())
|
||||
);
|
||||
if($r!==false && count($r)>0) {
|
||||
if(dbm::is_result($r)) {
|
||||
return $this->_set_extra($r)[0];
|
||||
}
|
||||
return null;
|
||||
|
@ -133,4 +140,671 @@ class NotificationsManager {
|
|||
intval(local_user())
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief List of pages for the Notifications TabBar
|
||||
*
|
||||
* @param app $a The
|
||||
* @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' : ''),
|
||||
'id' => 'system-tab',
|
||||
'accesskey' => 'y',
|
||||
),
|
||||
array(
|
||||
'label' => t('Network'),
|
||||
'url'=>'notifications/network',
|
||||
'sel'=> (($this->a->argv[1] == 'network') ? 'active' : ''),
|
||||
'id' => 'network-tab',
|
||||
'accesskey' => 'w',
|
||||
),
|
||||
array(
|
||||
'label' => t('Personal'),
|
||||
'url'=>'notifications/personal',
|
||||
'sel'=> (($this->a->argv[1] == 'personal') ? 'active' : ''),
|
||||
'id' => 'personal-tab',
|
||||
'accesskey' => 'r',
|
||||
),
|
||||
array(
|
||||
'label' => t('Home'),
|
||||
'url' => 'notifications/home',
|
||||
'sel'=> (($this->a->argv[1] == 'home') ? 'active' : ''),
|
||||
'id' => 'home-tab',
|
||||
'accesskey' => 'h',
|
||||
),
|
||||
array(
|
||||
'label' => t('Introductions'),
|
||||
'url' => 'notifications/intros',
|
||||
'sel'=> (($this->a->argv[1] == 'intros') ? 'active' : ''),
|
||||
'id' => 'intro-tab',
|
||||
'accesskey' => 'i',
|
||||
),
|
||||
);
|
||||
|
||||
return $tabs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Format the notification query in an usable array
|
||||
*
|
||||
* @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
|
||||
* string 'text' => The notification text
|
||||
* string 'when' => Relative date of the notification
|
||||
* bool 'seen' => Is the notification marked as "seen"
|
||||
*/
|
||||
private function formatNotifs($notifs, $ident = "") {
|
||||
|
||||
$notif = array();
|
||||
$arr = array();
|
||||
|
||||
if (dbm::is_result($notifs)) {
|
||||
|
||||
foreach ($notifs as $it) {
|
||||
// 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']
|
||||
if($it['unseen'])
|
||||
$it['seen'] = ($it['unseen'] > 0 ? false : true);
|
||||
|
||||
// Depending on the identifier of the notification we need to use different defaults
|
||||
switch ($ident) {
|
||||
case 'system':
|
||||
$default_item_label = 'notify';
|
||||
$default_item_link = $this->a->get_baseurl(true).'/notify/view/'. $it['id'];
|
||||
$default_item_image = proxy_url($it['photo'], false, PROXY_SIZE_MICRO);
|
||||
$default_item_text = strip_tags(bbcode($it['msg']));
|
||||
$default_item_when = relative_date($it['date']);
|
||||
$default_tpl = $tpl_notify;
|
||||
break;
|
||||
|
||||
case 'home':
|
||||
$default_item_label = 'comment';
|
||||
$default_item_link = $this->a->get_baseurl(true).'/display/'.$it['pguid'];
|
||||
$default_item_image = proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO);
|
||||
$default_item_text = sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']);
|
||||
$default_item_when = relative_date($it['created']);
|
||||
$default_tpl = $tpl_item_comments;
|
||||
break;
|
||||
|
||||
default:
|
||||
$default_item_label = (($it['id'] == $it['parent']) ? 'post' : 'comment');
|
||||
$default_item_link = $this->a->get_baseurl(true).'/display/'.$it['pguid'];
|
||||
$default_item_image = proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO);
|
||||
$default_item_text = (($it['id'] == $it['parent'])
|
||||
? sprintf( t("%s created a new post"), $it['author-name'])
|
||||
: sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
|
||||
$default_item_when = relative_date($it['created']);
|
||||
$default_tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
|
||||
|
||||
}
|
||||
|
||||
// Transform the different types of notification in an usable array
|
||||
switch($it['verb']){
|
||||
case ACTIVITY_LIKE:
|
||||
$notif = array(
|
||||
'label' => 'like',
|
||||
'link' => $this->a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'seen' => $it['seen']
|
||||
);
|
||||
break;
|
||||
|
||||
case ACTIVITY_DISLIKE:
|
||||
$notif = array(
|
||||
'label' => 'dislike',
|
||||
'link' => $this->a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'seen' => $it['seen']
|
||||
);
|
||||
break;
|
||||
|
||||
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),
|
||||
'text' => sprintf( t("%s is attending %s's event"), $it['author-name'], $it['pname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'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),
|
||||
'text' => sprintf( t("%s is not attending %s's event"), $it['author-name'], $it['pname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'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),
|
||||
'text' => sprintf( t("%s may attend %s's event"), $it['author-name'], $it['pname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'seen' => $it['seen']
|
||||
);
|
||||
break;
|
||||
|
||||
case ACTIVITY_FRIEND:
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
$obj = parse_xml_string($xmlhead.$it['object']);
|
||||
$it['fname'] = $obj->title;
|
||||
|
||||
$notif = array(
|
||||
'label' => 'friend',
|
||||
'link' => $this->a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
||||
'when' => relative_date($it['created']),
|
||||
'seen' => $it['seen']
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
$notif = array(
|
||||
'label' => $default_item_label,
|
||||
'link' => $default_item_link,
|
||||
'image' => $default_item_image,
|
||||
'text' => $default_item_text,
|
||||
'when' => $default_item_when,
|
||||
'seen' => $it['seen']
|
||||
);
|
||||
}
|
||||
|
||||
$arr[] = $notif;
|
||||
}
|
||||
}
|
||||
|
||||
return $arr;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Total number of network notifications
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @return int Number of network notifications
|
||||
*/
|
||||
private function networkTotal($seen = 0) {
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$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())
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $r[0]['total'];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get network notifications
|
||||
*
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @param int $start Start the query at this point
|
||||
* @param int $limit Maximum number of query results
|
||||
*
|
||||
* @return array with
|
||||
* string 'ident' => Notification identifier
|
||||
* int 'total' => Total number of available network notifications
|
||||
* array 'notifications' => Network notifications
|
||||
*/
|
||||
public function networkNotifs($seen = 0, $start = 0, $limit = 80) {
|
||||
$ident = 'network';
|
||||
$total = $this->networkTotal($seen);
|
||||
$notifs = array();
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$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`
|
||||
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
|
||||
ORDER BY `item`.`created` DESC LIMIT %d, %d ",
|
||||
intval(local_user()),
|
||||
intval($start),
|
||||
intval($limit)
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
$notifs = $this->formatNotifs($r, $ident);
|
||||
|
||||
$arr = array (
|
||||
'notifications' => $notifs,
|
||||
'ident' => $ident,
|
||||
'total' => $total,
|
||||
);
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Total number of system notifications
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @return int Number of system notifications
|
||||
*/
|
||||
private function systemTotal($seen = 0) {
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$sql_seen = " AND `seen` = 0 ";
|
||||
|
||||
$r = q("SELECT COUNT(*) AS `total` FROM `notify` WHERE `uid` = %d $sql_seen",
|
||||
intval(local_user())
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $r[0]['total'];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get system notifications
|
||||
*
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @param int $start Start the query at this point
|
||||
* @param int $limit Maximum number of query results
|
||||
*
|
||||
* @return array with
|
||||
* string 'ident' => Notification identifier
|
||||
* int 'total' => Total number of available system notifications
|
||||
* array 'notifications' => System notifications
|
||||
*/
|
||||
public function systemNotifs($seen = 0, $start = 0, $limit = 80) {
|
||||
$ident = 'system';
|
||||
$total = $this->systemTotal($seen);
|
||||
$notifs = array();
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$sql_seen = " AND `seen` = 0 ";
|
||||
|
||||
$r = q("SELECT `id`, `photo`, `msg`, `date`, `seen` FROM `notify`
|
||||
WHERE `uid` = %d $sql_seen ORDER BY `date` DESC LIMIT %d, %d ",
|
||||
intval(local_user()),
|
||||
intval($start),
|
||||
intval($limit)
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
$notifs = $this->formatNotifs($r, $ident);
|
||||
|
||||
$arr = array (
|
||||
'notifications' => $notifs,
|
||||
'ident' => $ident,
|
||||
'total' => $total,
|
||||
);
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Addional SQL query string for the personal notifications
|
||||
*
|
||||
* @return string The additional sql query
|
||||
*/
|
||||
private function _personal_sql_extra() {
|
||||
$myurl = $this->a->get_baseurl(true) . '/profile/'. $this->a->user['nickname'];
|
||||
$myurl = substr($myurl,strpos($myurl,'://')+3);
|
||||
$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
|
||||
$diasp_url = str_replace('/profile/','/u/',$myurl);
|
||||
$sql_extra = sprintf(" AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) ",
|
||||
dbesc($myurl . '$'),
|
||||
dbesc($myurl . '\\]'),
|
||||
dbesc($diasp_url . '\\]')
|
||||
);
|
||||
|
||||
return $sql_extra;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Total number of personal notifications
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @return int Number of personal notifications
|
||||
*/
|
||||
private function personalTotal($seen = 0) {
|
||||
$sql_seen = "";
|
||||
$sql_extra = $this->_personal_sql_extra();
|
||||
|
||||
if($seen === 0)
|
||||
$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())
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $r[0]['total'];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get personal notifications
|
||||
*
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @param int $start Start the query at this point
|
||||
* @param int $limit Maximum number of query results
|
||||
*
|
||||
* @return array with
|
||||
* string 'ident' => Notification identifier
|
||||
* int 'total' => Total number of available personal notifications
|
||||
* array 'notifications' => Personal notifications
|
||||
*/
|
||||
public function personalNotifs($seen = 0, $start = 0, $limit = 80) {
|
||||
$ident = 'personal';
|
||||
$total = $this->personalTotal($seen);
|
||||
$sql_extra = $this->_personal_sql_extra();
|
||||
$notifs = array();
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$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`,
|
||||
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
|
||||
ORDER BY `item`.`created` DESC LIMIT %d, %d " ,
|
||||
intval(local_user()),
|
||||
intval($start),
|
||||
intval($limit)
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
$notifs = $this->formatNotifs($r, $ident);
|
||||
|
||||
$arr = array (
|
||||
'notifications' => $notifs,
|
||||
'ident' => $ident,
|
||||
'total' => $total,
|
||||
);
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Total number of home notifications
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @return int Number of home notifications
|
||||
*/
|
||||
private function homeTotal($seen = 0) {
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$sql_seen = " AND `item`.`unseen` = 1 ";
|
||||
|
||||
$r = q("SELECT COUNT(*) AS `total` FROM `item`
|
||||
WHERE `item`.`visible` = 1 AND
|
||||
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1
|
||||
$sql_seen",
|
||||
intval(local_user())
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $r[0]['total'];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get home notifications
|
||||
*
|
||||
* @param int|string $seen
|
||||
* If 0 only include notifications into the query
|
||||
* which aren't marked as "seen"
|
||||
* @param int $start Start the query at this point
|
||||
* @param int $limit Maximum number of query results
|
||||
*
|
||||
* @return array with
|
||||
* string 'ident' => Notification identifier
|
||||
* int 'total' => Total number of available home notifications
|
||||
* array 'notifications' => Home notifications
|
||||
*/
|
||||
public function homeNotifs($seen = 0, $start = 0, $limit = 80) {
|
||||
$ident = 'home';
|
||||
$total = $this->homeTotal($seen);
|
||||
$notifs = array();
|
||||
$sql_seen = "";
|
||||
|
||||
if($seen === 0)
|
||||
$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`
|
||||
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
|
||||
WHERE `item`.`visible` = 1 AND
|
||||
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1
|
||||
$sql_seen
|
||||
ORDER BY `item`.`created` DESC LIMIT %d, %d ",
|
||||
intval(local_user()),
|
||||
intval($start),
|
||||
intval($limit)
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
$notifs = $this->formatNotifs($r, $ident);
|
||||
|
||||
$arr = array (
|
||||
'notifications' => $notifs,
|
||||
'ident' => $ident,
|
||||
'total' => $total,
|
||||
);
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Total number of introductions
|
||||
* @param bool $all
|
||||
* If false only include introductions into the query
|
||||
* which aren't marked as ignored
|
||||
* @return int Number of introductions
|
||||
*/
|
||||
private function introTotal($all = false) {
|
||||
$sql_extra = "";
|
||||
|
||||
if(!$all)
|
||||
$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'])
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
return $r[0]['total'];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get introductions
|
||||
*
|
||||
* @param bool $all
|
||||
* If false only include introductions into the query
|
||||
* which aren't marked as ignored
|
||||
* @param int $start Start the query at this point
|
||||
* @param int $limit Maximum number of query results
|
||||
*
|
||||
* @return array with
|
||||
* string 'ident' => Notification identifier
|
||||
* int 'total' => Total number of available introductions
|
||||
* array 'notifications' => Introductions
|
||||
*/
|
||||
public function introNotifs($all = false, $start = 0, $limit = 80) {
|
||||
$ident = 'introductions';
|
||||
$total = $this->introTotal($seen);
|
||||
$notifs = array();
|
||||
$sql_extra = "";
|
||||
|
||||
if(!$all)
|
||||
$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)
|
||||
);
|
||||
|
||||
if(dbm::is_result($r))
|
||||
$notifs = $this->formatIntros($r);
|
||||
|
||||
$arr = array (
|
||||
'ident' => $ident,
|
||||
'total' => $total,
|
||||
'notifications' => $notifs,
|
||||
);
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Format the notification query in an usable array
|
||||
*
|
||||
* @param array $intros The array from the db query
|
||||
* @return array with the introductions
|
||||
*/
|
||||
private function formatIntros($intros) {
|
||||
$knowyou = '';
|
||||
|
||||
foreach($intros as $it) {
|
||||
// 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
|
||||
if($it['fid']) {
|
||||
|
||||
$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.
|
||||
if($it['gnetwork'] === NETWORK_DIASPORA) {
|
||||
$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;
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
<?php
|
||||
include_once("include/bbcode.php");
|
||||
include_once("include/contact_selectors.php");
|
||||
include_once("include/Scrape.php");
|
||||
|
||||
/**
|
||||
* @file mod/notifications.php
|
||||
* @brief The notifications module
|
||||
*/
|
||||
|
||||
require_once("include/NotificationsManager.php");
|
||||
require_once("include/contact_selectors.php");
|
||||
require_once("include/network.php");
|
||||
|
||||
function notifications_post(&$a) {
|
||||
|
||||
|
@ -66,499 +72,248 @@ function notifications_content(&$a) {
|
|||
return;
|
||||
}
|
||||
|
||||
$page = (x($_REQUEST,'page') ? $_REQUEST['page'] : 1);
|
||||
$show = (x($_REQUEST,'show') ? $_REQUEST['show'] : 0);
|
||||
|
||||
nav_set_selected('notifications');
|
||||
|
||||
$json = (($a->argc > 1 && $a->argv[$a->argc - 1] === 'json') ? true : false);
|
||||
|
||||
$nm = new NotificationsManager();
|
||||
|
||||
$o = '';
|
||||
// get the nav tabs for the notification pages
|
||||
$tabs = notifications_tabs($a);
|
||||
// Get the nav tabs for the notification pages
|
||||
$tabs = $nm->getTabs();
|
||||
$notif_content = array();
|
||||
|
||||
// Notification results per page
|
||||
$perpage = 20;
|
||||
$startrec = ($page * $perpage) - $perpage;
|
||||
|
||||
// Get introductions
|
||||
if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) {
|
||||
nav_set_selected('introductions');
|
||||
|
||||
if(($a->argc > 2) && ($a->argv[2] == 'all'))
|
||||
$sql_extra = '';
|
||||
else
|
||||
$sql_extra = " AND `ignore` = 0 ";
|
||||
|
||||
$notif_header = t('Notifications');
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
$notif_ignored_lnk .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ) . '" id="notifications-show-hide-link" >'
|
||||
. ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n";
|
||||
$all = (($a->argc > 2) && ($a->argv[2] == 'all'));
|
||||
|
||||
$notifs = $nm->introNotifs($all, $startrec, $perpage);
|
||||
|
||||
// Get the network notifications
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
|
||||
|
||||
$notif_header = t('Network Notifications');
|
||||
$notifs = $nm->networkNotifs($show, $startrec, $perpage);
|
||||
|
||||
// Get the system notifications
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
|
||||
|
||||
$notif_header = t('System Notifications');
|
||||
$notifs = $nm->systemNotifs($show, $startrec, $perpage);
|
||||
|
||||
// Get the personal notifications
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
|
||||
|
||||
$notif_header = t('Personal Notifications');
|
||||
$notifs = $nm->personalNotifs($show, $startrec, $perpage);
|
||||
|
||||
// Get the home notifications
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
|
||||
|
||||
$notif_header = t('Home Notifications');
|
||||
$notifs = $nm->homeNotifs($show, $startrec, $perpage);
|
||||
|
||||
$r = q("SELECT COUNT(*) AS `total` FROM `intro`
|
||||
WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
|
||||
intval($_SESSION['uid'])
|
||||
);
|
||||
if($r && count($r)) {
|
||||
$a->set_pager_total($r[0]['total']);
|
||||
$a->set_pager_itemspage(20);
|
||||
}
|
||||
|
||||
/// @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 ",
|
||||
intval($_SESSION['uid']));
|
||||
// Set the pager
|
||||
$a->set_pager_total($notifs['total']);
|
||||
$a->set_pager_itemspage($perpage);
|
||||
|
||||
if(($r !== false) && (count($r))) {
|
||||
// Add additional informations (needed for json output)
|
||||
$notifs['items_page'] = $a->pager['itemspage'];
|
||||
$notifs['page'] = $a->pager['page'];
|
||||
|
||||
// Json output
|
||||
if(intval($json) === 1)
|
||||
json_return_and_die($notifs);
|
||||
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
// Process the data for template creation
|
||||
if($notifs['ident'] === 'introductions') {
|
||||
|
||||
$sugg = get_markup_template('suggestions.tpl');
|
||||
$tpl = get_markup_template("intros.tpl");
|
||||
|
||||
foreach($r as $rr) {
|
||||
// The link to switch between ignored and normal connection requests
|
||||
$notif_show_lnk = array(
|
||||
'href' => (!$all ? 'notifications/intros/all' : 'notifications/intros' ),
|
||||
'text' => (!$all ? t('Show Ignored Requests') : t('Hide Ignored Requests'))
|
||||
);
|
||||
|
||||
if($rr['fid']) {
|
||||
|
||||
$return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
|
||||
// Loop through all introduction notifications.This creates an array with the output html for each
|
||||
// introduction
|
||||
foreach ($notifs['notifications'] as $it) {
|
||||
|
||||
// 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.
|
||||
switch ($it['label']) {
|
||||
case 'friend_suggestion':
|
||||
$notif_content[] = replace_macros($sugg, array(
|
||||
'$str_notifytype' => t('Notification type: '),
|
||||
'$notify_type' => t('Friend Suggestion'),
|
||||
'$intro_id' => $rr['intro_id'],
|
||||
'$madeby' => sprintf( t('suggested by %s'),$rr['name']),
|
||||
'$contact_id' => $rr['contact-id'],
|
||||
'$photo' => ((x($rr,'fphoto')) ? proxy_url($rr['fphoto'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"),
|
||||
'$fullname' => $rr['fname'],
|
||||
'$url' => zrl($rr['furl']),
|
||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
||||
'$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
|
||||
'$notify_type' => $it['notify_type'],
|
||||
'$intro_id' => $it['intro_id'],
|
||||
'$madeby' => sprintf( t('suggested by %s'),$it['madeby']),
|
||||
'$contact_id' => $it['contact-id'],
|
||||
'$photo' => $it['photo'],
|
||||
'$fullname' => $it['name'],
|
||||
'$url' => $it['url'],
|
||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''),
|
||||
'$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')),
|
||||
|
||||
'$knowyou' => $knowyou,
|
||||
'$knowyou' => $it['knowyou'],
|
||||
'$approve' => t('Approve'),
|
||||
'$note' => $rr['note'],
|
||||
'$request' => $rr['frequest'] . '?addr=' . $return_addr,
|
||||
'$note' => $it['note'],
|
||||
'$request' => $it['request'],
|
||||
'$ignore' => t('Ignore'),
|
||||
'$discard' => t('Discard'),
|
||||
|
||||
));
|
||||
break;
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
$friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
|
||||
$fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
|
||||
// Normal connection requests
|
||||
default:
|
||||
$friend_selected = (($it['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
|
||||
$fan_selected = (($it['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
|
||||
$dfrn_tpl = get_markup_template('netfriend.tpl');
|
||||
|
||||
$knowyou = '';
|
||||
$dfrn_text = '';
|
||||
|
||||
if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) {
|
||||
if($rr['network'] === NETWORK_DFRN) {
|
||||
if($it['network'] === NETWORK_DFRN || $it['network'] === NETWORK_DIASPORA) {
|
||||
if($it['network'] === NETWORK_DFRN) {
|
||||
$lbl_knowyou = t('Claims to be known to you: ');
|
||||
$knowyou = (($rr['knowyou']) ? t('yes') : t('no'));
|
||||
$knowyou = (($it['knowyou']) ? t('yes') : t('no'));
|
||||
$helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Fan/Admirer" means that you allow to read but you do not want to read theirs. Approve as: ');
|
||||
} else {
|
||||
$knowyou = '';
|
||||
$helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Sharer" means that you allow to read but you do not want to read theirs. Approve as: ');
|
||||
}
|
||||
}
|
||||
|
||||
$dfrn_text = replace_macros($dfrn_tpl,array(
|
||||
'$intro_id' => $rr['intro_id'],
|
||||
'$intro_id' => $it['intro_id'],
|
||||
'$friend_selected' => $friend_selected,
|
||||
'$fan_selected' => $fan_selected,
|
||||
'$approve_as' => $helptext,
|
||||
'$as_friend' => t('Friend'),
|
||||
'$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
|
||||
'$as_fan' => (($it['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
|
||||
));
|
||||
}
|
||||
|
||||
$header = $rr["name"];
|
||||
$header = $it["name"];
|
||||
|
||||
$ret = probe_url($rr["url"]);
|
||||
if ($it["addr"] != "")
|
||||
$header .= " <".$it["addr"].">";
|
||||
|
||||
if ($rr['gnetwork'] == "")
|
||||
$rr['gnetwork'] = $ret["network"];
|
||||
|
||||
if ($ret["addr"] != "")
|
||||
$header .= " <".$ret["addr"].">";
|
||||
|
||||
$header .= " (".network_to_name($rr['gnetwork'], $rr['url']).")";
|
||||
|
||||
// Don't show these data until you are connected. Diaspora is doing the same.
|
||||
if($rr['gnetwork'] === NETWORK_DIASPORA) {
|
||||
$rr['glocation'] = "";
|
||||
$rr['gabout'] = "";
|
||||
$rr['ggender'] = "";
|
||||
}
|
||||
$header .= " (".network_to_name($it['network'], $it['url']).")";
|
||||
|
||||
$notif_content[] = replace_macros($tpl, array(
|
||||
'$header' => htmlentities($header),
|
||||
'$str_notifytype' => t('Notification type: '),
|
||||
'$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
|
||||
'$notify_type' => $it['notify_type'],
|
||||
'$dfrn_text' => $dfrn_text,
|
||||
'$dfrn_id' => $rr['issued-id'],
|
||||
'$uid' => $_SESSION['uid'],
|
||||
'$intro_id' => $rr['intro_id'],
|
||||
'$contact_id' => $rr['contact-id'],
|
||||
'$photo' => ((x($rr,'photo')) ? proxy_url($rr['photo'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"),
|
||||
'$fullname' => $rr['name'],
|
||||
'$location' => bbcode($rr['glocation'], false, false),
|
||||
'$dfrn_id' => $it['dfrn_id'],
|
||||
'$uid' => $it['uid'],
|
||||
'$intro_id' => $it['intro_id'],
|
||||
'$contact_id' => $it['contact_id'],
|
||||
'$photo' => $it['photo'],
|
||||
'$fullname' => $it['name'],
|
||||
'$location' => $it['location'],
|
||||
'$lbl_location' => t('Location:'),
|
||||
'$about' => bbcode($rr['gabout'], false, false),
|
||||
'$about' => $it['about'],
|
||||
'$lbl_about' => t('About:'),
|
||||
'$keywords' => $rr['gkeywords'],
|
||||
'$keywords' => $it['keywords'],
|
||||
'$lbl_keywords' => t('Tags:'),
|
||||
'$gender' => $rr['ggender'],
|
||||
'$gender' => $it['gender'],
|
||||
'$lbl_gender' => t('Gender:'),
|
||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
||||
'$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
|
||||
'$url' => $rr['url'],
|
||||
'$zrl' => zrl($rr['url']),
|
||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($it['hidden'] == 1), ''),
|
||||
'$activity' => array('activity', t('Post a new friend activity'), $it['post_newfriend'], t('if applicable')),
|
||||
'$url' => $it['url'],
|
||||
'$zrl' => $it['zrl'],
|
||||
'$lbl_url' => t('Profile URL'),
|
||||
'$addr' => $rr['addr'],
|
||||
'$addr' => $it['addr'],
|
||||
'$lbl_knowyou' => $lbl_knowyou,
|
||||
'$lbl_network' => t('Network:'),
|
||||
'$network' => network_to_name($rr['gnetwork'], $rr['url']),
|
||||
'$network' => network_to_name($it['network'], $it['url']),
|
||||
'$knowyou' => $knowyou,
|
||||
'$approve' => t('Approve'),
|
||||
'$note' => $rr['note'],
|
||||
'$note' => $it['note'],
|
||||
'$ignore' => t('Ignore'),
|
||||
'$discard' => t('Discard'),
|
||||
|
||||
));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if($notifs['total'] == 0)
|
||||
info( t('No introductions.') . EOL);
|
||||
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
|
||||
|
||||
$notif_header = t('Network Notifications');
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
|
||||
`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`
|
||||
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND `pitem`.`parent` != 0 AND
|
||||
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
|
||||
intval(local_user())
|
||||
);
|
||||
|
||||
$tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
|
||||
$tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
|
||||
$tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
|
||||
$tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
|
||||
$tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
|
||||
|
||||
if ($r) {
|
||||
|
||||
foreach ($r as $it) {
|
||||
switch($it['verb']){
|
||||
case ACTIVITY_LIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_likes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
case ACTIVITY_DISLIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_dislikes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
case ACTIVITY_FRIEND:
|
||||
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
$obj = parse_xml_string($xmlhead.$it['object']);
|
||||
$it['fname'] = $obj->title;
|
||||
|
||||
$notif_content[] = replace_macros($tpl_item_friends,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
default:
|
||||
$item_text = (($it['id'] == $it['parent'])
|
||||
? sprintf( t("%s created a new post"), $it['author-name'])
|
||||
: sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
|
||||
$tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
|
||||
|
||||
$notif_content[] = replace_macros($tpl,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||
'$item_text' => $item_text,
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// Normal notifications (no introductions)
|
||||
} else {
|
||||
|
||||
$notif_nocontent = t('No more network notifications.');
|
||||
// The template files we need in different cases for formatting the content
|
||||
$tpl_item_like = 'notifications_likes_item.tpl';
|
||||
$tpl_item_dislike = 'notifications_dislikes_item.tpl';
|
||||
$tpl_item_attend = 'notifications_attend_item.tpl';
|
||||
$tpl_item_attendno = 'notifications_attend_item.tpl';
|
||||
$tpl_item_attendmaybe = 'notifications_attend_item.tpl';
|
||||
$tpl_item_friend = 'notifications_friends_item.tpl';
|
||||
$tpl_item_comment = 'notifications_comments_item.tpl';
|
||||
$tpl_item_post = 'notifications_posts_item.tpl';
|
||||
$tpl_item_notify = 'notify.tpl';
|
||||
|
||||
// Loop trough ever notification This creates an array with the output html for each
|
||||
// notification and apply the correct template according to the notificationtype (label).
|
||||
foreach ($notifs['notifications'] as $it) {
|
||||
|
||||
// We use the notification label to get the correct template file
|
||||
$tpl_var_name = 'tpl_item_'.$it['label'];
|
||||
$tpl_notif = get_markup_template($$tpl_var_name);
|
||||
|
||||
$notif_content[] = replace_macros($tpl_notif,array(
|
||||
'$item_label' => $it['label'],
|
||||
'$item_link' => $it['link'],
|
||||
'$item_image' => $it['image'],
|
||||
'$item_text' => $it['text'],
|
||||
'$item_when' => $it['when'],
|
||||
'$item_seen' => $it['seen'],
|
||||
));
|
||||
}
|
||||
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
|
||||
|
||||
$notif_header = t('System Notifications');
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
$not_tpl = get_markup_template('notify.tpl');
|
||||
require_once('include/bbcode.php');
|
||||
|
||||
$r = q("SELECT * from notify where uid = %d and seen = 0 order by date desc",
|
||||
intval(local_user())
|
||||
// It doesn't make sense to show the Show unread / Show all link visible if the user is on the
|
||||
// "Show all" page and there are no notifications. So we will hide it.
|
||||
if($show == 0 || intval($show) && $notifs['total'] > 0) {
|
||||
$notif_show_lnk = array(
|
||||
'href' => ($show ? 'notifications/'.$notifs['ident'] : 'notifications/'.$notifs['ident'].'?show=all' ),
|
||||
'text' => ($show ? t('Show unread') : t('Show all')),
|
||||
);
|
||||
|
||||
if (count($r) > 0) {
|
||||
foreach ($r as $it) {
|
||||
$notif_content[] = replace_macros($not_tpl,array(
|
||||
'$item_link' => $a->get_baseurl(true).'/notify/view/'. $it['id'],
|
||||
'$item_image' => proxy_url($it['photo'], false, PROXY_SIZE_MICRO),
|
||||
'$item_text' => strip_tags(bbcode($it['msg'])),
|
||||
'$item_when' => relative_date($it['date'])
|
||||
));
|
||||
}
|
||||
} else {
|
||||
$notif_nocontent = t('No more system notifications.');
|
||||
}
|
||||
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
|
||||
|
||||
$notif_header = t('Personal Notifications');
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
$myurl = $a->get_baseurl(true) . '/profile/'. $a->user['nickname'];
|
||||
$myurl = substr($myurl,strpos($myurl,'://')+3);
|
||||
$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
|
||||
$diasp_url = str_replace('/profile/','/u/',$myurl);
|
||||
$sql_extra .= sprintf(" AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) ",
|
||||
dbesc($myurl . '$'),
|
||||
dbesc($myurl . '\\]'),
|
||||
dbesc($diasp_url . '\\]')
|
||||
);
|
||||
|
||||
|
||||
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
|
||||
`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`
|
||||
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1
|
||||
$sql_extra
|
||||
AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
|
||||
intval(local_user())
|
||||
);
|
||||
|
||||
$tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
|
||||
$tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
|
||||
$tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
|
||||
$tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
|
||||
$tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
|
||||
|
||||
if (count($r) > 0) {
|
||||
|
||||
foreach ($r as $it) {
|
||||
switch($it['verb']){
|
||||
case ACTIVITY_LIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_likes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
case ACTIVITY_DISLIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_dislikes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
case ACTIVITY_FRIEND:
|
||||
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
$obj = parse_xml_string($xmlhead.$it['object']);
|
||||
$it['fname'] = $obj->title;
|
||||
|
||||
$notif_content[] = replace_macros($tpl_item_friends,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
break;
|
||||
|
||||
default:
|
||||
$item_text = (($it['id'] == $it['parent'])
|
||||
? sprintf( t("%s created a new post"), $it['author-name'])
|
||||
: sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
|
||||
$tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
|
||||
|
||||
$notif_content[] = replace_macros($tpl,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => $item_text,
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
}
|
||||
// Output if there aren't any notifications available
|
||||
if($notifs['total'] == 0)
|
||||
$notif_nocontent = sprintf( t('No more %s notifications.'), $notifs['ident']);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$notif_nocontent = t('No more personal notifications.');
|
||||
}
|
||||
|
||||
} else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
|
||||
|
||||
$notif_header = t('Home Notifications');
|
||||
$notif_tpl = get_markup_template('notifications.tpl');
|
||||
|
||||
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
|
||||
`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`
|
||||
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
|
||||
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 ORDER BY `item`.`created` DESC",
|
||||
intval(local_user())
|
||||
);
|
||||
|
||||
$tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
|
||||
$tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
|
||||
$tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
|
||||
$tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
|
||||
|
||||
if (count($r) > 0) {
|
||||
|
||||
foreach ($r as $it) {
|
||||
switch($it['verb']){
|
||||
case ACTIVITY_LIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_likes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
|
||||
break;
|
||||
case ACTIVITY_DISLIKE:
|
||||
$notif_content[] = replace_macros($tpl_item_dislikes,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
|
||||
break;
|
||||
case ACTIVITY_FRIEND:
|
||||
|
||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||
$obj = parse_xml_string($xmlhead.$it['object']);
|
||||
$it['fname'] = $obj->title;
|
||||
|
||||
$notif_content[] = replace_macros($tpl_item_friends,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
|
||||
break;
|
||||
default:
|
||||
$notif_content[] = replace_macros($tpl_item_comments,array(
|
||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||
'$item_image' => $it['author-avatar'],
|
||||
'$item_text' => sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']),
|
||||
'$item_when' => relative_date($it['created'])
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
$notif_nocontent = t('No more home notifications.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$o .= replace_macros($notif_tpl, array(
|
||||
'$notif_header' => $notif_header,
|
||||
'$tabs' => $tabs,
|
||||
'$notif_content' => $notif_content,
|
||||
'$notif_nocontent' => $notif_nocontent,
|
||||
'$notif_ignored_lnk' => $notif_ignored_lnk,
|
||||
'$notif_show_lnk' => $notif_show_lnk,
|
||||
'$notif_paginate' => paginate($a)
|
||||
));
|
||||
$o .= paginate($a);
|
||||
|
||||
return $o;
|
||||
}
|
||||
/**
|
||||
* @brief List of pages for the Notifications TabBar
|
||||
*
|
||||
* @param app $a The
|
||||
* @return array with with notifications TabBar data
|
||||
*/
|
||||
function notifications_tabs($a) {
|
||||
$tabs = array(
|
||||
array(
|
||||
'label' => t('System'),
|
||||
'url'=>'notifications/system',
|
||||
'sel'=> (($a->argv[1] == 'system') ? 'active' : ''),
|
||||
'accesskey' => 'y',
|
||||
),
|
||||
array(
|
||||
'label' => t('Network'),
|
||||
'url'=>'notifications/network',
|
||||
'sel'=> (($a->argv[1] == 'network') ? 'active' : ''),
|
||||
'accesskey' => 'w',
|
||||
),
|
||||
array(
|
||||
'label' => t('Personal'),
|
||||
'url'=>'notifications/personal',
|
||||
'sel'=> (($a->argv[1] == 'personal') ? 'active' : ''),
|
||||
'accesskey' => 'r',
|
||||
),
|
||||
array(
|
||||
'label' => t('Home'),
|
||||
'url' => 'notifications/home',
|
||||
'sel'=> (($a->argv[1] == 'home') ? 'active' : ''),
|
||||
'accesskey' => 'h',
|
||||
),
|
||||
array(
|
||||
'label' => t('Introductions'),
|
||||
'url' => 'notifications/intros',
|
||||
'sel'=> (($a->argv[1] == 'intros') ? 'active' : ''),
|
||||
'accesskey' => 'i',
|
||||
),
|
||||
/*array(
|
||||
'label' => t('Messages'),
|
||||
'url' => 'message',
|
||||
'sel'=> '',
|
||||
),*/ /*while I can have notifications for messages, this tablist is not place for message page link */
|
||||
);
|
||||
|
||||
return $tabs;
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<div class="notif-network-wrapper">
|
||||
{{* The "show ignored" link *}}
|
||||
{{if $notif_ignored_lnk}}{{$notif_ignored_lnk}}{{/if}}
|
||||
{{if $notif_show_lnk}}<a href="{{$notif_show_lnk.href}}" id="notifications-show-hide-link">{{$notif_show_lnk.text}}</a>{{/if}}
|
||||
|
||||
{{* The notifications *}}
|
||||
{{if $notif_content}}
|
||||
|
@ -19,4 +19,7 @@
|
|||
{{if $notif_nocontent}}
|
||||
<div class="notif_nocontent">{{$notif_nocontent}}</div>
|
||||
{{/if}}
|
||||
|
||||
{{* The pager *}}
|
||||
{{$notif_paginate}}
|
||||
</div>
|
||||
|
|
4
view/templates/notifications_attend_item.tpl
Normal file
4
view/templates/notifications_attend_item.tpl
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notification"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notification"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
<div class="notif-item">
|
||||
<div class="notif-item {{if !$item_seen}}unseen{{/if}}">
|
||||
<a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
|
||||
</div>
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<div class="notif-network-wrapper">
|
||||
{{* The "show ignored" link *}}
|
||||
{{if $notif_ignored_lnk}}{{$notif_ignored_lnk}}{{/if}}
|
||||
{{if $notif_show_lnk}}<a href="{{$notif_show_lnk.href}}" id="notifications-show-hide-link">{{$notif_show_lnk.text}}</a>{{/if}}
|
||||
|
||||
{{* The notifications *}}
|
||||
{{if $notif_content}}
|
||||
|
@ -22,4 +22,7 @@
|
|||
<div class="notif_nocontent">{{$notif_nocontent}}</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{* The pager *}}
|
||||
{{$notif_paginate}}
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue