]> git.mxchange.org Git - friendica.git/commitdiff
notifications - move intros to NotificationsManager & make json output work
authorrabuzarus <>
Wed, 3 Aug 2016 10:44:04 +0000 (12:44 +0200)
committerrabuzarus <>
Wed, 3 Aug 2016 10:44:04 +0000 (12:44 +0200)
include/NotificationsManager.php
mod/notifications.php

index 362e3f53264a39a81eb5beb56d3a29f620dc3bf1..fef48d5d43f56f289d1d5c36ea07a0c9e91fc016 100644 (file)
@@ -1,6 +1,8 @@
 <?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");
@@ -8,7 +10,8 @@ require_once("include/bbcode.php");
 require_once("include/dbm.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;
@@ -45,7 +48,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"
@@ -89,7 +92,7 @@ class NotificationsManager {
        }
 
        /**
-        * @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
@@ -196,7 +199,7 @@ class NotificationsManager {
         *      string 'when' => Relative date of the notification
         *      bool 'seen' => Is the notification marked as "seen"
         */
-       private function format($notifs, $ident = "") {
+       private function formatNotifs($notifs, $ident = "") {
 
                $notif = array();
                $arr = array();
@@ -335,9 +338,9 @@ class NotificationsManager {
 
        /**
         * @brief Total number of network notifications 
-        * @param int $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      which aren't marked as "seen"
         * @return int Number of network notifications
         */
        private function networkTotal($seen = 0) {
@@ -361,17 +364,21 @@ class NotificationsManager {
        /**
         * @brief Get network notifications
         * 
-        * @param type $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      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 Query output
+        * @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 = 20) {
+       public function networkNotifs($seen = 0, $start = 0, $limit = 80) {
                $ident = 'network';
                $total = $this->networkTotal($seen);
+               $notifs = array();
 
                if($seen === 0)
                        $sql_seen = " AND `item`.`unseen` = 1 ";
@@ -380,33 +387,33 @@ class NotificationsManager {
                $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
+                       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)
+                       ORDER BY `item`.`created` DESC LIMIT %d, %d ",
+                               intval(local_user()),
+                               intval($start),
+                               intval($limit)
                );
 
-               if(dbm::is_result($r)) {
-                       $notifs = $this->format($r, $ident);
-                       $arr = array (
-                               'notifications' => $notifs,
-                               'ident' => $ident,
-                               'total' => $total,
-                       );
+               if(dbm::is_result($r))
+                       $notifs = $this->formatNotifs($r, $ident);
 
-                       return $arr;
-               }
+               $arr = array (
+                       'notifications' => $notifs,
+                       'ident' => $ident,
+                       'total' => $total,
+               );
+
+               return $arr;
        }
 
        /**
         * @brief Total number of system notifications 
-        * @param int $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      which aren't marked as "seen"
         * @return int Number of system notifications
         */
        private function systemTotal($seen = 0) {
@@ -426,17 +433,21 @@ class NotificationsManager {
                /**
         * @brief Get system notifications
         * 
-        * @param type $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      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 Query output
+        * @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 = 20) {
+       public function systemNotifs($seen = 0, $start = 0, $limit = 80) {
                $ident = 'system';
                $total = $this->systemTotal($seen);
+               $notifs = array();
 
                if($seen === 0)
                        $sql_seen = " AND `seen` = 0 ";
@@ -448,16 +459,16 @@ class NotificationsManager {
                        intval($limit)
                );
 
-               if(dbm::is_result($r)) {
-                       $notifs = $this->format($r, $ident);
-                       $arr = array (
-                               'notifications' => $notifs,
-                               'ident' => $ident,
-                               'total' => $total,
-                       );
+               if(dbm::is_result($r))
+                       $notifs = $this->formatNotifs($r, $ident);
 
-                       return $arr;
-               }
+               $arr = array (
+                       'notifications' => $notifs,
+                       'ident' => $ident,
+                       'total' => $total,
+               );
+
+               return $arr;
        }
 
        /**
@@ -481,9 +492,9 @@ class NotificationsManager {
 
        /**
         * @brief Total number of personal notifications 
-        * @param int $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      which aren't marked as "seen"
         * @return int Number of personal notifications
         */
        private function personalTotal($seen = 0) {
@@ -510,18 +521,22 @@ class NotificationsManager {
        /**
         * @brief Get personal notifications
         * 
-        * @param type $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      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 Query output
+        * @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 = 20) {
+       public function personalNotifs($seen = 0, $start = 0, $limit = 80) {
                $ident = 'personal';
-               $total = 0;
+               $total = $this->personalTotal($seen);
                $sql_extra .= $this->_personal_sql_extra();
+               $notifs = array();
 
                if($seen === 0)
                        $sql_seen = " AND `item`.`unseen` = 1 ";
@@ -529,34 +544,34 @@ class NotificationsManager {
                $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
+                       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)
+                       ORDER BY `item`.`created` DESC LIMIT %d, %d " ,
+                               intval(local_user()),
+                               intval($start),
+                               intval($limit)
                );
 
-               if(dbm::is_result($r)) {
-                       $notifs = $this->format($r, $ident);
-                       $arr = array (
-                               'notifications' => $notifs,
-                               'ident' => $ident,
-                               'total' => $total,
-                       );
+               if(dbm::is_result($r))
+                       $notifs = $this->formatNotifs($r, $ident);
+               
+               $arr = array (
+                       'notifications' => $notifs,
+                       'ident' => $ident,
+                       'total' => $total,
+               );
 
-                       return $arr;
-               }
+               return $arr;
        }
 
        /**
         * @brief Total number of home notifications 
-        * @param int $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      which aren't marked as "seen"
         * @return int Number of home notifications
         */
        private function homeTotal($seen = 0) {
@@ -579,45 +594,200 @@ class NotificationsManager {
        /**
         * @brief Get home notifications
         * 
-        * @param type $seen
+        * @param int|string $seen
         *      If 0 only include notifications into the query
-        *      which arn't marked as "seen" into
+        *      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 Query output
+        * @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 = 20) {
+       public function homeNotifs($seen = 0, $start = 0, $limit = 80) {
                $ident = 'home';
                $total = $this->homeTotal($seen);
+               $notifs = array();
 
                if($seen === 0)
                        $sql_seen = " AND `item`.`unseen` = 1 ";
 
-               $total = $this->homeTotal($seen);
-
                $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
+                       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)
+                       ORDER BY `item`.`created` DESC LIMIT %d, %d ",
+                               intval(local_user()),
+                               intval($start),
+                               intval($limit)
                );
 
-               if(dbm::is_result($r)) {
-                       $notifs = $this->format($r, $ident);
-                       $arr = array (
-                               'notifications' => $notifs,
-                               'ident' => $ident,
-                               'total' => $total,
-                       );
+               if(dbm::is_result($r))
+                       $notifs = $this->formatNotifs($r, $ident);
+
+               $arr = array (
+                       'notifications' => $notifs,
+                       'ident' => $ident,
+                       'total' => $total,
+               );
 
-                       return $arr;
+               return $arr;
+       }
+
+       /**
+        * @brief Total number of introductions 
+        * @param int $all
+        *      If 0 only include introductions into the query
+        *      which aren't marked as ignored
+        * @return int Number of introductions
+        */
+       private function introTotal($all) {
+               if($all === 0)
+                       $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 int $all
+        *      If 0 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 = 0, $start = 0, $limit = 80) {
+               $ident = 'introductions';
+               $total = $this->introTotal($seen);
+               $notifs = array();
+
+               if($all === 0)
+                       $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;
        }
 }
index a22703ba95c4cdb7a9bf77e591006ec094317ffe..fd7f0c33deb13a109dfce887ffa431bc593fa647 100644 (file)
@@ -1,8 +1,13 @@
 <?php
-include_once("include/NotificationsManager.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) {
 
@@ -77,259 +82,188 @@ function notifications_content(&$a) {
        $nm = new NotificationsManager();
 
        $o = '';
-       // get the nav tabs for the notification pages
+       // 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');
+               $notif_header = t('Notifications');
 
                if(($a->argc > 2) && ($a->argv[2] == 'all'))
-                       $sql_extra = '';
+                       $all = 1;
                else
-                       $sql_extra = " AND `ignore` = 0 ";
+                       $all = 0;
 
-               $notif_header = t('Notifications');
-               $notif_tpl = get_markup_template('notifications.tpl');
+               $notifs = $nm->introNotifs($all, $startrec, $perpage);
 
+       // Get the network notifications
+       } else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
 
-               $notif_show_lnk = array(
-                       'href' => ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ),
-                       'text' => ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')),
-                       'id' => "notifications-show-hide-link",
-               );
+               $notif_header = t('Network Notifications');
+               $notifs = $nm->networkNotifs($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(dbm::is_result($r)) {
-                       $a->set_pager_total($r[0]['total']);
-                       $a->set_pager_itemspage($perpage);
-               }
+       // Get the system notifications
+       } else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
 
-               /// @todo Fetch contact details by "get_contact_details_by_url" instead of queries to contact, fcontact and gcontact
+               $notif_header = t('System Notifications');
+               $notifs = $nm->systemNotifs($show, $startrec, $perpage);
 
-               $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']));
+       // Get the personal notifications
+       } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
 
-               if(dbm::is_result($r)) {
+               $notif_header = t('Personal Notifications');
+               $notifs = $nm->personalNotifs($show, $startrec, $perpage);
 
-                       $sugg = get_markup_template('suggestions.tpl');
-                       $tpl = get_markup_template("intros.tpl");
+       // Get the home notifications
+       } else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
 
-                       foreach($r as $rr) {
+               $notif_header = t('Home Notifications');
+               $notifs = $nm->homeNotifs($show, $startrec, $perpage);
 
-                               if($rr['fid']) {
+       }
 
-                                       $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
 
-                                       $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')),
+       // Set the pager
+       $a->set_pager_total($notifs['total']);
+       $a->set_pager_itemspage($perpage);
 
-                                               '$knowyou' => $knowyou,
-                                               '$approve' => t('Approve'),
-                                               '$note' => $rr['note'],
-                                               '$request' => $rr['frequest'] . '?addr=' . $return_addr,
-                                               '$ignore' => t('Ignore'),
-                                               '$discard' => t('Discard'),
+       // 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);
 
-                                       continue;
+       $notif_tpl = get_markup_template('notifications.tpl');
 
-                               }
-                               $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
-                               $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
-                               $dfrn_tpl = get_markup_template('netfriend.tpl');
+       // Process the data for template creation
+       if($notifs['ident'] === 'introductions') {
 
-                               $knowyou   = '';
-                               $dfrn_text = '';
+               $sugg = get_markup_template('suggestions.tpl');
+               $tpl = get_markup_template("intros.tpl");
 
-                               if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) {
-                                       if($rr['network'] === NETWORK_DFRN) {
-                                               $lbl_knowyou = t('Claims to be known to you: ');
-                                               $knowyou = (($rr['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: ');
+               // The link to switch between ignored and normal connection requests
+               $notif_show_lnk = array(
+                       'href' => ($all === 0 ? 'notifications/intros/all' : 'notifications/intros' ),
+                       'text' => ($all === 0 ? t('Show Ignored Requests') : t('Hide Ignored Requests'))
+               );
+
+               // 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' => $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' => $it['knowyou'],
+                                               '$approve' => t('Approve'),
+                                               '$note' => $it['note'],
+                                               '$request' => $it['request'],
+                                               '$ignore' => t('Ignore'),
+                                               '$discard' => t('Discard'),
+                                       ));
+                                       break;
+
+                               // 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($it['network'] === NETWORK_DFRN || $it['network'] === NETWORK_DIASPORA) {
+                                               if($it['network'] === NETWORK_DFRN) {
+                                                       $lbl_knowyou = t('Claims to be known to you: ');
+                                                       $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"];
-
-                               $ret = probe_url($rr["url"]);
-
-                               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'] = "";
-                               }
-
-                               $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')),
-                                       '$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),
-                                       '$location_label' => t('Location:'),
-                                       '$about' => bbcode($rr['gabout'], false, false),
-                                       '$about_label' => t('About:'),
-                                       '$keywords' => $rr['gkeywords'],
-                                       '$keywords_label' => t('Tags:'),
-                                       '$gender' => $rr['ggender'],
-                                       '$gender_label' => 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']),
-                                       '$url_label' => t('Profile URL'),
-                                       '$addr' => $rr['addr'],
-                                       '$lbl_knowyou' => $lbl_knowyou,
-                                       '$lbl_network' => t('Network:'),
-                                       '$network' => network_to_name($rr['gnetwork'], $rr['url']),
-                                       '$knowyou' => $knowyou,
-                                       '$approve' => t('Approve'),
-                                       '$note' => $rr['note'],
-                                       '$ignore' => t('Ignore'),
-                                       '$discard' => t('Discard'),
-
-                               ));
-                       }
-               }
-               else
-                       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');
 
-               $notifs = $nm->networkNotifs($show, $startrec, $perpage);
+                                       $header = $it["name"];
 
-               $notif_show_lnk = array(
-                       'href' => ($show ? 'notifications/network' : 'notifications/network?show=all' ),
-                       'text' => ($show ? t('Show unread') : t('Show all')),
-               );
+                                       if ($it["addr"] != "")
+                                               $header .= " <".$it["addr"].">";
 
-               if(!dbm::is_result($notifs)) {
-                       if($show)
-                               $notif_show_lnk = array();
+                                       $header .= " (".network_to_name($it['network'], $it['url']).")";
 
-                       $notif_nocontent = t('No more network notifications.');
-               }
-
-       } else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
-
-               $notif_header = t('System Notifications');
-               $notif_tpl = get_markup_template('notifications.tpl');
-
-               $notifs = $nm->systemNotifs($show, $startrec, $perpage);
-
-               $notif_show_lnk = array(
-                       'href' => ($show ? 'notifications/system' : 'notifications/system?show=all' ),
-                       'text' => ($show ? t('Show unread') : t('Show all')),
-               );
-
-               if(!dbm::is_result($notifs)) {
-                       if($show)
-                               $notif_show_lnk = array();
-
-                       $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');
-
-               $notifs = $nm->personalNotifs($show, $startrec, $perpage);
-
-               $notif_show_lnk = array(
-                       'href' => ($show ? 'notifications/personal' : 'notifications/personal?show=all' ),
-                       'text' => ($show ? t('Show unread') : t('Show all')),
-               );
-
-               if(!dbm::is_result($notifs)) {
-                       if($show)
-                               $notif_show_lnk = array();
-
-                       $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');
-
-               $notifs = $nm->homeNotifs($show, $startrec, $perpage);
-
-               $notif_show_lnk = array(
-                       'href' => ($show ? 'notifications/home' : 'notifications/home?show=all' ),
-                       'text' => ($show ? t('Show unread') : t('Show all')),
-               );
-
-               if(!dbm::is_result($notifs)) {
-                       if($show)
-                               $notif_show_lnk = array();
+                                       $notif_content[] = replace_macros($tpl, array(
+                                               '$header' => htmlentities($header),
+                                               '$str_notifytype' => t('Notification type: '),
+                                               '$notify_type' => $it['notify_type'],
+                                               '$dfrn_text' => $dfrn_text,
+                                               '$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' => $it['about'],
+                                               '$lbl_about' => t('About:'),
+                                               '$keywords' => $it['keywords'],
+                                               '$lbl_keywords' => t('Tags:'),
+                                               '$gender' => $it['gender'],
+                                               '$lbl_gender' => t('Gender:'),
+                                               '$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' => $it['addr'],
+                                               '$lbl_knowyou' => $lbl_knowyou,
+                                               '$lbl_network' => t('Network:'),
+                                               '$network' => network_to_name($it['network'], $it['url']),
+                                               '$knowyou' => $knowyou,
+                                               '$approve' => t('Approve'),
+                                               '$note' => $it['note'],
+                                               '$ignore' => t('Ignore'),
+                                               '$discard' => t('Discard'),
 
-                       $notif_nocontent = t('No more home notifications.');
+                                       ));
+                                       break;
+                       }
                }
 
-       }
-
-       if(count($notifs['notifications']) > 0 ) {
-               // set the pager
-               $a->set_pager_total($notifs['total']);
-               $a->set_pager_itemspage($perpage);
+               if($notifs['total'] == 0)
+                       info( t('No introductions.') . EOL);
 
-               // add additional informations (needed for json output)
-               $notifs['items_page'] = $a->pager['itemspage'];
-               $notifs['page'] = $a->pager['page'];
+       // Normal notifications (no introductions)
+       } else {
 
                // The template files we need in different cases for formatting the content
                $tpl_item_like = 'notifications_likes_item.tpl';
@@ -342,11 +276,15 @@ function notifications_content(&$a) {
                $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) {
-                       $tplname = 'tpl_item_'.$it['label'];
-                       $templ = get_markup_template($$tplname);
 
-                       $notif_content[] = replace_macros($templ,array(
+                       // 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'],
@@ -356,8 +294,21 @@ function notifications_content(&$a) {
                        ));
                }
 
+               // 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')),
+                       );
+               }
+
+               // Output if there aren't any notifications available
+               if($notifs['total'] == 0)
+                       $notif_nocontent = sprintf( t('No more %s notifications.'), $notifs['ident']);
        }
 
+
        $o .= replace_macros($notif_tpl, array(
                '$notif_header' => $notif_header,
                '$tabs' => $tabs,