From 28df35052a452ad992ad8d67cffbfa380759e414 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 5 Jan 2014 16:10:02 +0100 Subject: [PATCH] Send notifications for each new post of a contact, option for creating a summary for a feed post --- boot.php | 6 +- include/enotify.php | 36 ++++++++---- include/items.php | 101 +++++++++++++++++++++++++++----- mod/contacts.php | 12 +++- mod/crepair.php | 9 ++- update.php | 18 +++++- view/templates/contact_edit.tpl | 3 +- view/templates/crepair.tpl | 2 + 8 files changed, 155 insertions(+), 32 deletions(-) diff --git a/boot.php b/boot.php index 6b130edf9c..72eaec8fe5 100644 --- a/boot.php +++ b/boot.php @@ -14,7 +14,7 @@ require_once('include/features.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_VERSION', '3.2.1745' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); -define ( 'DB_UPDATE_VERSION', 1167 ); +define ( 'DB_UPDATE_VERSION', 1169 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); @@ -197,6 +197,7 @@ define ( 'NOTIFY_PROFILE', 0x0040 ); define ( 'NOTIFY_TAGSELF', 0x0080 ); define ( 'NOTIFY_TAGSHARE', 0x0100 ); define ( 'NOTIFY_POKE', 0x0200 ); +define ( 'NOTIFY_SHARE', 0x0400 ); define ( 'NOTIFY_SYSTEM', 0x8000 ); @@ -395,6 +396,9 @@ if(! class_exists('App')) { // array of instanced template engines ('name'=>'instance') public $template_engine_instance = array(); + // Used for reducing load to the ostatus completion + public $last_ostatus_conversation_url; + private $ldelim = array( 'internal' => '', 'smarty3' => '{{' diff --git a/include/enotify.php b/include/enotify.php index 72365a762f..c121debe66 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -58,11 +58,12 @@ function notification($params) { // Check to see if there was already a tag notify or comment notify for this post. // If so don't create a second notification - + $p = null; - $p = q("select id from notify where ( type = %d or type = %d ) and link = '%s' and uid = %d limit 1", + $p = q("select id from notify where (type = %d or type = %d or type = %d) and link = '%s' and uid = %d limit 1", intval(NOTIFY_TAGSELF), intval(NOTIFY_COMMENT), + intval(NOTIFY_SHARE), dbesc($params['link']), intval($params['uid']) ); @@ -70,7 +71,7 @@ function notification($params) { pop_lang(); return; } - + // if it's a post figure out who's post it is. @@ -99,7 +100,7 @@ function notification($params) { $itemlink, $p[0]['author-name'], $item_post_type); - + // "your post" if($p[0]['owner-name'] == $p[0]['author-name'] && $p[0]['wall']) $dest_str = sprintf(t('%1$s commented on [url=%2$s]your %3$s[/url]'), @@ -114,7 +115,7 @@ function notification($params) { $subject = sprintf( t('[Friendica:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $params['source_name']); $preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']); - $epreamble = $dest_str; + $epreamble = $dest_str; $sitelink = t('Please visit %s to view and/or reply to the conversation.'); $tsitelink = sprintf( $sitelink, $siteurl ); @@ -126,11 +127,11 @@ function notification($params) { $subject = sprintf( t('[Friendica:Notify] %s posted to your profile wall') , $params['source_name']); $preamble = sprintf( t('%1$s posted to your profile wall at %2$s') , $params['source_name'], $sitename); - - $epreamble = sprintf( t('%1$s posted to [url=%2$s]your wall[/url]') , + + $epreamble = sprintf( t('%1$s posted to [url=%2$s]your wall[/url]') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', - $params['link']); - + $params['link']); + $sitelink = t('Please visit %s to view and/or reply to the conversation.'); $tsitelink = sprintf( $sitelink, $siteurl ); $hsitelink = sprintf( $sitelink, '' . $sitename . ''); @@ -140,9 +141,22 @@ function notification($params) { if($params['type'] == NOTIFY_TAGSELF) { $subject = sprintf( t('[Friendica:Notify] %s tagged you') , $params['source_name']); $preamble = sprintf( t('%1$s tagged you at %2$s') , $params['source_name'], $sitename); - $epreamble = sprintf( t('%1$s [url=%2$s]tagged you[/url].') , + $epreamble = sprintf( t('%1$s [url=%2$s]tagged you[/url].') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', - $params['link']); + $params['link']); + + $sitelink = t('Please visit %s to view and/or reply to the conversation.'); + $tsitelink = sprintf( $sitelink, $siteurl ); + $hsitelink = sprintf( $sitelink, '' . $sitename . ''); + $itemlink = $params['link']; + } + + if($params['type'] == NOTIFY_SHARE) { + $subject = sprintf( t('[Friendica:Notify] %s shared a new post') , $params['source_name']); + $preamble = sprintf( t('%1$s shared a new post at %2$s') , $params['source_name'], $sitename); + $epreamble = sprintf( t('%1$s [url=%2$s]shared a post[/url].') , + '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', + $params['link']); $sitelink = t('Please visit %s to view and/or reply to the conversation.'); $tsitelink = sprintf( $sitelink, $siteurl ); diff --git a/include/items.php b/include/items.php index a1aad551f6..ffd549ea14 100755 --- a/include/items.php +++ b/include/items.php @@ -406,7 +406,7 @@ function title_is_body($title, $body) { -function get_atom_elements($feed,$item) { +function get_atom_elements($feed, $item, $contact = array()) { require_once('library/HTMLPurifier.auto.php'); require_once('include/html2bbcode.php'); @@ -542,7 +542,7 @@ function get_atom_elements($feed,$item) { $res['body'] = notags(base64url_decode($res['body'])); } - + $res['body'] = limit_body_size($res['body']); // It isn't certain at this point whether our content is plaintext or html and we'd be foolish to trust @@ -846,6 +846,11 @@ function get_atom_elements($feed,$item) { }; } + if (isset($contact["network"]) AND ($contact["network"] == NETWORK_FEED) AND $contact['fetch_further_information']) { + $res["body"] = $res["title"]."\n\n[class=type-link]".fetch_siteinfo($res['plink'])."[/class]"; + $res["title"] = ""; + } + $arr = array('feed' => $feed, 'item' => $item, 'result' => $res); call_hooks('parse_atom', $arr); @@ -860,6 +865,31 @@ function get_atom_elements($feed,$item) { return $res; } +function fetch_siteinfo($url) { + require_once("mod/parse_url.php"); + + // Fetch site infos - but only from the meta data + $data = parseurl_getsiteinfo($url, true); + + $text = ""; + + if (!is_string($data["text"]) AND (sizeof($data["images"]) == 0) AND ($data["title"] == $url)) + return(""); + + if (is_string($data["title"])) + $text .= "[bookmark=".$url."]".trim($data["title"])."[/bookmark]\n"; + + if (sizeof($data["images"]) > 0) { + $imagedata = $data["images"][0]; + $text .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]' . "\n"; + } + + if (is_string($data["text"])) + $text .= "[quote]".$data["text"]."[/quote]"; + + return($text); +} + function encode_rel_links($links) { $o = ''; if(! ((is_array($links)) && (count($links)))) @@ -1100,10 +1130,10 @@ function item_store($arr,$force_parent = false) { logger('item_store: ' . print_r($arr,true), LOGGER_DATA); - $r = dbq("INSERT INTO `item` (`" - . implode("`, `", array_keys($arr)) - . "`) VALUES ('" - . implode("', '", array_values($arr)) + $r = dbq("INSERT INTO `item` (`" + . implode("`, `", array_keys($arr)) + . "`) VALUES ('" + . implode("', '", array_values($arr)) . "')" ); // find the item we just created @@ -1117,6 +1147,49 @@ function item_store($arr,$force_parent = false) { $current_post = $r[0]['id']; logger('item_store: created item ' . $current_post); create_tags_from_item($r[0]['id']); + + // Only check for notifications on start posts + if ($arr['parent-uri'] === $arr['uri']) { + logger('item_store: Check notification for contact '.$arr['contact-id'].' and post '.$current_post, LOGGER_DEBUG); + + // Send a notification for every new post? + $r = q("SELECT `notify_new_posts` FROM `contact` WHERE `id` = %d AND `uid` = %d AND `notify_new_posts` LIMIT 1", + intval($arr['contact-id']), + intval($arr['uid']) + ); + + if(count($r)) { + logger('item_store: Send notification for contact '.$arr['contact-id'].' and post '.$current_post, LOGGER_DEBUG); + $u = q("SELECT * FROM user WHERE uid = %d LIMIT 1", + intval($arr['uid'])); + + $item = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d", + intval($current_post), + intval($arr['uid']) + ); + + $a = get_app(); + + require_once('include/enotify.php'); + notification(array( + 'type' => NOTIFY_SHARE, + 'notify_flags' => $u[0]['notify-flags'], + 'language' => $u[0]['language'], + 'to_name' => $u[0]['username'], + 'to_email' => $u[0]['email'], + 'uid' => $u[0]['uid'], + 'item' => $item[0], + 'link' => $a->get_baseurl().'/display/'.$u[0]['nickname'].'/'.$current_post, + 'source_name' => $item[0]['author-name'], + 'source_link' => $item[0]['author-link'], + 'source_photo' => $item[0]['author-avatar'], + 'verb' => ACTIVITY_TAG, + 'otype' => 'item' + )); + logger('item_store: Notification sent for contact '.$arr['contact-id'].' and post '.$current_post, LOGGER_DEBUG); + } + } + } else { logger('item_store: could not locate created item'); return 0; @@ -1136,9 +1209,9 @@ function item_store($arr,$force_parent = false) { if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid)) $private = 1; else - $private = $arr['private']; + $private = $arr['private']; - // Set parent id - and also make sure to inherit the parent's ACL's. + // Set parent id - and also make sure to inherit the parent's ACLs. $r = q("UPDATE `item` SET `parent` = %d, `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `private` = %d, `deleted` = %d WHERE `id` = %d", @@ -1201,7 +1274,7 @@ function item_store($arr,$force_parent = false) { // current post can be deleted if is for a communuty page and no mention are // in it. if (!$deleted) { - + // Store the fresh generated item into the cache $cachefile = get_cachefile($arr["guid"]."-".hash("md5", $arr['body'])); @@ -2023,7 +2096,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) // Have we seen it? If not, import it. $item_id = $item->get_id(); - $datarray = get_atom_elements($feed,$item); + $datarray = get_atom_elements($feed, $item, $contact); if((! x($datarray,'author-name')) && ($contact['network'] != NETWORK_DFRN)) $datarray['author-name'] = $contact['name']; @@ -2164,7 +2237,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) $item_id = $item->get_id(); - $datarray = get_atom_elements($feed,$item); + $datarray = get_atom_elements($feed, $item, $contact); if(is_array($contact)) { if((! x($datarray,'author-name')) && ($contact['network'] != NETWORK_DFRN)) @@ -2894,7 +2967,7 @@ function local_delivery($importer,$data) { foreach($feed->get_items() as $item) { - $is_reply = false; + $is_reply = false; $item_id = $item->get_id(); $rawthread = $item->get_item_tags( NAMESPACE_THREAD, 'in-reply-to'); if(isset($rawthread[0]['attribs']['']['ref'])) { @@ -2961,7 +3034,7 @@ function local_delivery($importer,$data) { $is_like = false; // remote reply to our post. Import and then notify everybody else. - $datarray = get_atom_elements($feed,$item); + $datarray = get_atom_elements($feed, $item); $r = q("SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($item_id), @@ -3426,7 +3499,7 @@ function local_delivery($importer,$data) { // send a notification require_once('include/enotify.php'); - + notification(array( 'type' => NOTIFY_POKE, 'notify_flags' => $importer['notify-flags'], diff --git a/mod/contacts.php b/mod/contacts.php index a405cedbc6..f48978aaec 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -68,7 +68,7 @@ function contacts_init(&$a) { } function contacts_post(&$a) { - + if(! local_user()) return; @@ -103,6 +103,10 @@ function contacts_post(&$a) { $hidden = intval($_POST['hidden']); + $notify = intval($_POST['notify']); + + $fetch_further_information = intval($_POST['fetch_further_information']); + $priority = intval($_POST['poll']); if($priority > 5 || $priority < 0) $priority = 0; @@ -110,11 +114,13 @@ function contacts_post(&$a) { $info = fix_mce_lf(escape_tags(trim($_POST['info']))); $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', - `hidden` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", + `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($profile_id), intval($priority), dbesc($info), intval($hidden), + intval($notify), + intval($fetch_further_information), intval($contact_id), intval(local_user()) ); @@ -417,6 +423,8 @@ function contacts_content(&$a) { '$ignored' => (($contact['readonly']) ? t('Currently ignored') : ''), '$archived' => (($contact['archive']) ? t('Currently archived') : ''), '$hidden' => array('hidden', t('Hide this contact from others'), ($contact['hidden'] == 1), t('Replies/likes to your public posts may still be visible')), + '$notify' => array('notify', t('Notification for new posts'), ($contact['notify_new_posts'] == 1), t('Send a notification of every new post of this contact')), + '$fetch_further_information' => array('fetch_further_information', t('Fetch further information for feeds'), ($contact['fetch_further_information'] == 1), t('Fetch further information for feeds')), '$photo' => $contact['photo'], '$name' => $contact['name'], '$dir_icon' => $dir_icon, diff --git a/mod/crepair.php b/mod/crepair.php index ec56d7c284..171e88f312 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -28,7 +28,7 @@ function crepair_init(&$a) { $o .= ''; $a->page['aside'] .= $o; - } + } } @@ -59,8 +59,9 @@ function crepair_post(&$a) { $poll = ((x($_POST,'poll')) ? $_POST['poll'] : ''); $attag = ((x($_POST,'attag')) ? $_POST['attag'] : ''); $photo = ((x($_POST,'photo')) ? $_POST['photo'] : ''); + $remote_self = ((x($_POST,'remote_self')) ? $_POST['remote_self'] : false); - $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s' + $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s' , `remote_self` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", dbesc($name), dbesc($nick), @@ -70,6 +71,7 @@ function crepair_post(&$a) { dbesc($notify), dbesc($poll), dbesc($attag), + intval($remote_self), intval($contact['id']), local_user() ); @@ -154,6 +156,7 @@ function crepair_content(&$a) { '$label_notify' => t('Notification Endpoint URL'), '$label_poll' => t('Poll/Feed URL'), '$label_photo' => t('New photo from this URL'), + '$label_self' => t('Mirror all posts to the wall?'), '$contact_name' => $contact['name'], '$contact_nick' => $contact['nick'], '$contact_id' => $contact['id'], @@ -163,6 +166,8 @@ function crepair_content(&$a) { '$notify' => $contact['notify'], '$poll' => $contact['poll'], '$contact_attag' => $contact['attag'], + '$contact_self' => array('remote_self', t('Mirror all posts to the wall?'), $contact['remote_self'], + t('Shall all posts from this contact posted like your own posts?')), '$lbl_submit' => t('Submit') )); diff --git a/update.php b/update.php index 343be1a4c1..ed631fee4e 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ {{/if}}
- + {{include file="field_checkbox.tpl" field=$notify}} + {{include file="field_checkbox.tpl" field=$fetch_further_information}} {{include file="field_checkbox.tpl" field=$hidden}}
diff --git a/view/templates/crepair.tpl b/view/templates/crepair.tpl index 8d3ed7df89..5278e42f08 100644 --- a/view/templates/crepair.tpl +++ b/view/templates/crepair.tpl @@ -44,6 +44,8 @@
+{{include file="field_checkbox.tpl" field=$contact_self}} +