]> git.mxchange.org Git - friendica.git/commitdiff
notify folks who have been tagged in a post
authorMike Macgirvin <mike@macgirvin.com>
Mon, 1 Nov 2010 03:36:59 +0000 (20:36 -0700)
committerMike Macgirvin <mike@macgirvin.com>
Mon, 1 Nov 2010 03:36:59 +0000 (20:36 -0700)
boot.php
database.sql
include/items.php
include/notifier.php
include/salmon.php
mod/follow.php
mod/item.php
update.php

index 2e3ae0e6594f31b2cb509587cb66c51ea6309149..30e5a111e55a6b6d48624721cbf4b8a75d235498 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -2,7 +2,7 @@
 
 set_time_limit(0);
 
-define ( 'BUILD_ID',               1012   );
+define ( 'BUILD_ID',               1013   );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.0'  );
 
 define ( 'EOL',                    "<br />\r\n"     );
index 36c578961a98e5a2076ad2277dcae0903c074206..5b8141f7aed148308adb4664acb31798a839fc69 100644 (file)
@@ -176,6 +176,7 @@ CREATE TABLE IF NOT EXISTS `item` (
   `object` text NOT NULL,
   `resource-id` char(255) NOT NULL,
   `tag` mediumtext NOT NULL,
+  `inform` mediumtext NOT NULL,
   `location` char(255) NOT NULL,
   `coord` char(255) NOT NULL,
   `allow_cid` mediumtext NOT NULL,
index 951e5c6e395e2e958abb7d33879b62baf8bf78e0..d37f7708f99beacfeb1db6d8401e2bc7ea1b49c3 100644 (file)
@@ -587,7 +587,7 @@ function get_item_contact($item,$contacts) {
 }
 
 
-function dfrn_deliver($owner,$contact,$atom,$debugging = false) {
+function dfrn_deliver($owner,$contact,$atom) {
 
 
        if((! strlen($contact['dfrn-id'])) && (! $contact['duplex']) && (! ($owner['page-flags'] == PAGE_COMMUNITY)))
@@ -602,13 +602,11 @@ function dfrn_deliver($owner,$contact,$atom,$debugging = false) {
 
        $url = $contact['notify'] . '?dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION ;
 
-       if($debugging)
-               echo "URL: $url\n";
+       logger('dfrn_deliver: ' . $url);
 
        $xml = fetch_url($url);
 
-       if($debugging)
-               echo $xml;
+       logger('dfrn_deliver: ' . $xml);
 
        if(! $xml)
                return 3;
@@ -641,8 +639,7 @@ function dfrn_deliver($owner,$contact,$atom,$debugging = false) {
                $final_dfrn_id = substr($final_dfrn_id,2);
 
        if($final_dfrn_id != $orig_id) {
-               if($debugging)
-                       echo "Wrong ID - did not decode\n";
+               logger('dfrn_deliver: wrong dfrn_id.');
                // did not decode properly - cannot trust this site 
                return 3;
        }
@@ -662,10 +659,7 @@ function dfrn_deliver($owner,$contact,$atom,$debugging = false) {
 
        $xml = post_url($contact['notify'],$postvars);
 
-       if($debugging) {
-               echo "SENDING: " . print_r($postvars,true) . "\n";
-               echo "RECEIVING: " . $xml;
-       }
+       logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true) . "\n" . "RECEIVING: " . $xml);
 
        $res = simplexml_load_string($xml);
 
index cd75c1fff81c6e8d54fa6a05f2821708ecf6af86..884493a79a2d9c91a893a668de1308333832d71f 100644 (file)
                unset($db_host, $db_user, $db_pass, $db_data);
 
 
-       $debugging = get_config('system','debugging');
-
        require_once("session.php");
        require_once("datetime.php");
        require_once('include/items.php');
-
+       require_once('include/bbcode.php');
 
        if($argc < 3)
                exit;
                        break;
        }
 
-       if($debugging)
-               dbg(3);
-
        $recipients = array();
+       $url_recipients = array();
 
        if($cmd === 'mail') {
 
@@ -84,6 +80,7 @@
                killme();
 
        $hub = get_config('system','huburl');
+
        // If this is a public conversation, notify the feed hub
        $notify_hub = true;
 
                        if((strlen($parent['allow_cid'])) 
                                || (strlen($parent['allow_gid'])) 
                                || (strlen($parent['deny_cid'])) 
-                               || (strlen($parent['deny_gid'])))
+                               || (strlen($parent['deny_gid']))) {
                                $notify_hub = false; // private recipients, not public
+                       }
 
                        $allow_people = expand_acl($parent['allow_cid']);
                        $allow_groups = expand_groups(expand_acl($parent['allow_gid']));
                        foreach($items as $item) {
                                $recipients[] = $item['contact-id'];
                                $conversants[] = $item['contact-id'];
+                               // pull out additional tagged people to notify (if public message)
+                               if($notify_hub && strlen($item['inform'])) {
+                                       $people = explode(',',$item['inform']);
+                                       foreach($people as $person) {
+                                               if(substr($person,0,4) === 'cid:') {
+                                                       $recipients[] = intval(substr($person,4));
+                                                       $conversants[] = intval(substr($person,4));
+                                               }
+                                               else {
+                                                       $url_recipients[] = substr($person,4);
+                                               }
+                                       }
+                               }
                        }
 
+                       logger('notifier: url_recipients' . print_r($url_recipients,true));
+
                        $conversants = array_unique($conversants,SORT_NUMERIC);
 
 
        $mail_template = load_view_file('view/atom_mail.tpl');
 
        $atom = '';
-
        $hubxml = '';
+       $slaps = array();
+
        if(strlen($hub)) {
                $hubs = explode(',', $hub);
                if(count($hubs)) {
 
        if($cmd === 'mail') {
                $notify_hub = false;  // mail is  not public
+
                $atom .= replace_macros($mail_template, array(
                        '$name'         => xmlify($owner['name']),
                        '$profile_page' => xmlify($owner['url']),
 
                                if($item['id'] == $item_id) {
                                        $slap = replace_macros($cmnt_template, array(
+                                               '$name'               => xmlify($owner['name']),
+                                               '$profile_page'       => xmlify($owner['url']),
+                                               '$thumb'              => xmlify($owner['thumb']),
+                                               '$owner_name'         => xmlify($item['owner-name']),
+                                               '$owner_profile_page' => xmlify($item['owner-link']),
+                                               '$owner_thumb'        => xmlify($item['owner-avatar']),
+                                               '$item_id'            => xmlify($item['uri']),
+                                               '$title'              => xmlify($item['title']),
+                                               '$published'          => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)),
+                                               '$updated'            => xmlify(datetime_convert('UTC', 'UTC', $item['edited']  . '+00:00' , ATOM_TIME)),
+                                               '$location'           => xmlify($item['location']),
+                                               '$coord'              => xmlify($item['coord']),
+                                               '$type'               => 'html',
+                                               '$verb'               => xmlify($verb),
+                                               '$actobj'             => $actobj,
+                                               '$alt'                => xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']),
+                                               '$content'            => xmlify(bbcode($item['body'])),
+                                               '$parent_id'          => xmlify($item['parent-uri']),
+                                               '$comment_allow'      => 0
+                                       ));
+
+                                       $atom .= replace_macros($cmnt_template, array(
                                                '$name'               => xmlify($owner['name']),
                                                '$profile_page'       => xmlify($owner['url']),
                                                '$thumb'              => xmlify($owner['thumb']),
                                                '$parent_id'          => xmlify($item['parent-uri']),
                                                '$comment_allow'      => 0
                                        ));
+
                                }
+
+
                        }
-                       $atom .= $slap;
                }
                else {
                        foreach($items as $item) {
                                                '$id' => xmlify($item['uri']),
                                                '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , ATOM_TIME))
                                        ));
+                                       $slaps[] = replace_macros($tomb_template, array(
+                                               '$id' => xmlify($item['uri']),
+                                               '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , ATOM_TIME))
+                                       ));
                                }
                                else {
                                        $contact = get_item_contact($item,$contacts);
                                                        '$alt'                => xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']),
                                                        '$comment_allow'      => (($item['last-child']) ? 1 : 0)
                                                ));
+                                               $slaps[] = replace_macros($item_template, array(
+                                                       '$name'               => xmlify($contact['name']),
+                                                       '$profile_page'       => xmlify($contact['url']),
+                                                       '$thumb'              => xmlify($contact['thumb']),
+                                                       '$owner_name'         => xmlify($item['owner-name']),
+                                                       '$owner_profile_page' => xmlify($item['owner-link']),
+                                                       '$owner_thumb'        => xmlify($item['owner-avatar']),
+                                                       '$item_id'            => xmlify($item['uri']),
+                                                       '$title'              => xmlify($item['title']),
+                                                       '$published'          => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)),
+                                                       '$updated'            => xmlify(datetime_convert('UTC', 'UTC', $item['edited']  . '+00:00' , ATOM_TIME)),
+                                                       '$location'           => xmlify($item['location']),
+                                                       '$coord'              => xmlify($item['coord']),
+                                                       '$type'               => 'html',
+                                                       '$verb'               => xmlify($verb),
+                                                       '$actobj'             => $actobj,
+                                                       '$content'            => xmlify(bbcode($item['body'])),
+                                                       '$alt'                => xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']),
+                                                       '$comment_allow'      => (($item['last-child']) ? 1 : 0)
+                                               ));
+
                                        }
                                        else {
                                                $atom .= replace_macros($cmnt_template, array(
                                                        '$parent_id'     => xmlify($item['parent-uri']),
                                                        '$comment_allow' => (($item['last-child']) ? 1 : 0)
                                                ));
+                                               $slaps[] = replace_macros($cmnt_template, array(
+                                                       '$name'          => xmlify($contact['name']),
+                                                       '$profile_page'  => xmlify($contact['url']),
+                                                       '$thumb'         => xmlify($contact['thumb']),
+                                                       '$item_id'       => xmlify($item['uri']),
+                                                       '$title'         => xmlify($item['title']),
+                                                       '$published'     => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)),
+                                                       '$updated'       => xmlify(datetime_convert('UTC', 'UTC', $item['edited']  . '+00:00' , ATOM_TIME)),
+                                                       '$content'       => xmlify(bbcode($item['body'])),
+                                                       '$alt'           => xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']),
+                                                       '$location'      => xmlify($item['location']),
+                                                       '$coord'         => xmlify($item['coord']),
+                                                       '$type'          => 'html',
+                                                       '$verb'          => xmlify($verb),
+                                                       '$actobj'        => $actobj,
+                                                       '$parent_id'     => xmlify($item['parent-uri']),
+                                                       '$comment_allow' => (($item['last-child']) ? 1 : 0)
+                                               ));
                                        }
                                }
                        }
        }
        $atom .= '</feed>' . "\r\n";
 
-       if($debugging)
-               echo $atom;
+       logger('notifier: ' . $atom);
 
+       logger('notifier: slaps: ' . print_r($slaps,true));
 
        if($followup)
                $recip_str = $parent['contact-id'];
                $recip_str = implode(', ', $recipients);
 
 
-       $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) ",
+       $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 ",
                dbesc($recip_str)
        );
        if(! count($r))
 
        // delivery loop
 
-
+       require_once('include/salmon.php');
 
        foreach($r as $contact) {
                if($contact['self'])
 
                switch($contact['network']) {
                        case 'dfrn':
-                               $deliver_status = dfrn_deliver($owner,$contact,$atom,$debugging);
+                               $deliver_status = dfrn_deliver($owner,$contact,$atom);
+                               logger('notifier: delivery: ' . $contact['name']);
                                break;
                        default:
                                if($followup) {
-                                       require_once('include/salmon.php');
-                                       slapper($owner,$contact,$slap);
+                                       slapper($owner,$contact['notify'],$slap);
+                               }
+                               else {
+
+                                       // only send salmon if public - e.g. if it's ok to notify
+                                       // a public hub, it's ok to send a salmon
+
+                                       if(count($slaps) && $notify_hub) {
+                                               foreach($slaps as $slappy) {
+                                                       slapper($owner,$contact['notify'],$slappy);
+                                               }
+                                               logger('notifier: slapdelivery: ' . $contact['name']);
+                                       }
                                }
                                break;
                }
                                intval($item_id)
                        );
                }
+
+       }
+               
+       // send additional slaps to mentioned remote tags (@foo@example.com)
+
+       if(count($slaps) && count($url_recipients) && $notify_hub) {
+               foreach($url_recipients as $url) {
+                       foreach($slaps as $slappy) {
+                               slapper($owner,$url,$slappy);
+                       }
+                       logger('notifier: urldelivery: ' . $url);
+               }
        }
 
        if((strlen($hub)) && ($notify_hub)) {
index 872dcd5f313a8ed1200441c337a58b21ebc0792a..2838f2cbbf81afcd27168410c64bd5dcb18579a1 100644 (file)
@@ -86,13 +86,13 @@ function get_salmon_key($uri,$keyhash) {
 
        
                
-function slapper($owner,$contact,$slap) {
+function slapper($owner,$url,$slap) {
 
        logger('slapper called. Data: ' . $slap);
 
        // does contact have a salmon endpoint? 
 
-       if(! strlen($contact['notify']))
+       if(! strlen($url))
                return;
 
        // add all namespaces to item
@@ -147,7 +147,7 @@ EOT;
        ));
 
        // slap them 
-       post_url($contact['notify'],$salmon, array(
+       post_url($url,$salmon, array(
                'Content-type: application/magic-envelope+xml',
                'Content-length: ' . strlen($salmon)
        ));
@@ -172,7 +172,7 @@ EOT;
                ));
 
                // slap them 
-               post_url($contact['notify'],$salmon, array(
+               post_url($url,$salmon, array(
                        'Content-type: application/magic-envelope+xml',
                        'Content-length: ' . strlen($salmon)
                ));
index 29c5f4230686344181b6ae12f0177678e4a4cfa1..235353f7ab027d53ad0748d89c9d7d2629e893f3 100644 (file)
@@ -163,7 +163,7 @@ function follow_post(&$a) {
        );
 
        require_once('include/salmon.php');
-       slapper($r[0],$contact,$slap);
+       slapper($r[0],$contact['notify'],$slap);
 
        goaway($_SESSION['return_url']);
        // NOTREACHED
index af2c8d6f69bd864f3e8aab252d85fcaf0ffa465e..67832204d6bf0930f569738af76f73a01e7dec30 100644 (file)
@@ -14,8 +14,7 @@ function item_post(&$a) {
 
        require_once('include/security.php');
 
-       $uid = $_SESSION['uid'];
-
+       $uid = local_user();
 
        $parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0);
 
@@ -115,7 +114,7 @@ function item_post(&$a) {
        }
 
        $str_tags = '';
-       $tagged = array();
+       $inform   = '';
 
        $tags = get_tags($body);
 
@@ -125,14 +124,17 @@ function item_post(&$a) {
                        if(strpos($tag,'@') === 0) {
                                $name = substr($tag,1);
                                if(strpos($name,'@')) {
-
+                                       $newname = $name;
                                        $links = @webfinger($name);
                                        if(count($links)) {
                                                foreach($links as $link) {
                                                        if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
                                        $profile = $link['@attributes']['href'];
-                                                       if($link['@attributes']['rel'] === 'salmon')
-                                       $salmon = $link['@attributes']['href'];
+                                                       if($link['@attributes']['rel'] === 'salmon') {
+                                                               if(strlen($inform))
+                                                                       $inform .= ',';
+                                       $inform .= 'url:' . str_replace(',','%2c',$link['@attributes']['href']);
+                                                       }
                                                }
                                        }
                                }
@@ -153,7 +155,9 @@ function item_post(&$a) {
                                        }
                                        if(count($r)) {
                                                $profile = $r[0]['url'];
-                                               $salmon  = $r[0]['notify'];
+                                               if(strlen($inform))
+                                                       $inform .= ',';
+                                               $inform .= 'cid:' . $r[0]['id'];
                                        }
                                }
                                if($profile) {
@@ -181,9 +185,9 @@ function item_post(&$a) {
        $uri = item_new_uri($a->get_hostname(),$profile_uid);
 
        $r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, 
-               `author-name`, `author-link`, `author-avatar`, `created`,
-               `edited`, `changed`, `uri`, `title`, `body`, `location`, `coord`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`)
-               VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
+               `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `changed`, `uri`, `title`, `body`, `location`, `coord`, 
+               `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`)
+               VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
                intval($profile_uid),
                dbesc($post_type),
                intval($wall),
@@ -203,6 +207,8 @@ function item_post(&$a) {
                dbesc($body),
                dbesc($location),
                dbesc($coord),
+               dbesc($str_tags),
+               dbesc($inform),
                dbesc($verb),
                dbesc($str_contact_allow),
                dbesc($str_group_allow),
index f0d72ef1670abeca3e0dc8f75773065317bb121e..9c5caa0b59c41b3a7bf7e447035fd9db1ec8fc73 100644 (file)
@@ -92,4 +92,8 @@ function update_1011() {
                                );
                }
        }
+}
+
+function update_1012() {
+       q("ALTER TABLE `item` ADD `inform` MEDIUMTEXT NOT NULL AFTER `tag` ");
 }
\ No newline at end of file