]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #2099 from rabuzarus/2611_new_user_addr
authorMichael Vogel <icarus@dabo.de>
Fri, 27 Nov 2015 20:35:46 +0000 (21:35 +0100)
committerMichael Vogel <icarus@dabo.de>
Fri, 27 Nov 2015 20:35:46 +0000 (21:35 +0100)
generate addr for new registered users

18 files changed:
include/Scrape.php
include/delivery.php
include/forums.php
include/items.php
include/notifier.php
include/ostatus.php
include/pubsubpublish.php
include/salmon.php
js/main.js
mod/ping.php
view/global.css
view/templates/widget_forumlist.tpl
view/theme/duepuntozero/style.css
view/theme/frost/style.css
view/theme/quattro/js/quattro.js
view/theme/vier/style.css
view/theme/vier/templates/widget_forumlist_right.tpl [new file with mode: 0644]
view/theme/vier/theme.php

index 64a930bfdaedebfccbf46acb9f37a03085174cbe..4f9d675c1801309f5d11fee3a6bd2a79b28ea21e 100644 (file)
@@ -17,10 +17,12 @@ function scrape_dfrn($url, $dont_probe = false) {
        if(! $s)
                return $ret;
 
-       $probe = probe_url($url);
+       if (!$dont_probe) {
+               $probe = probe_url($url);
 
-       if (isset($probe["addr"]))
-               $ret["addr"] = $probe["addr"];
+               if (isset($probe["addr"]))
+                       $ret["addr"] = $probe["addr"];
+       }
 
        $headers = $a->get_curl_headers();
        logger('scrape_dfrn: headers=' . $headers, LOGGER_DEBUG);
index cdd59451f0f2b0065cdc76b324ba6521fa6edb56..dc02faaba8e03d1957797861a6cd4a0ee9defa59 100644 (file)
@@ -2,6 +2,7 @@
 require_once("boot.php");
 require_once('include/queue_fn.php');
 require_once('include/html2plain.php');
+require_once("include/ostatus.php");
 
 function delivery_run(&$argv, &$argc){
        global $a, $db;
@@ -391,7 +392,8 @@ function delivery_run(&$argv, &$argc){
                                                        continue;
 
                                                if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
-                                                       $slaps[] = atom_entry($item,'html',null,$owner,true);
+                                                       $slaps[] = ostatus_salmon($item,$owner);
+                                                       //$slaps[] = atom_entry($item,'html',null,$owner,true);
                                        }
 
                                        logger('notifier: slapdelivery: ' . $contact['name']);
index d8da36cc5c694760036980f970c806ae946b9b8c..13a3afcaaeffdd71d00079140ee08e59f1f855c2 100644 (file)
@@ -87,6 +87,7 @@ function widget_forumlist($a) {
                                'url' => $a->get_baseurl() . '/network?f=&cid=' . $contact['id'],
                                'external_url' => $a->get_baseurl() . '/redir/' . $contact['id'],
                                'name' => $contact['name'],
+                               'cid' => $contact['id'],
                                'micro' => proxy_url($contact['micro'], false, PROXY_SIZE_MICRO),
                                'id' => ++$id,
                        );
@@ -147,3 +148,30 @@ function forumlist_profile_advanced($uid) {
                $o .= $forumlist;
                return $o;
 }
+
+/**
+ * @brief count unread forum items
+ *
+ * Count unread items of connected forums and private groups
+ * 
+ * @return array
+ *     'id' => contact id
+ *     'name' => contact/forum name
+ *     'count' => counted unseen forum items
+ * 
+ */
+
+function forums_count_unseen() {
+       $r = q("SELECT `contact`.`id`, `contact`.`name`, COUNT(`item`.`unseen`) AS `count` FROM `item`
+                       INNER JOIN `contact` ON `item`.`contact-id` = `contact`.`id`
+                       WHERE `item`.`uid` = %d AND `item`.`visible` AND NOT `item`.`deleted`
+                       AND `contact`.`network`= 'dfrn' AND (`contact`.`forum` OR `contact`.`prv`)
+                       AND NOT `contact`.`blocked` AND NOT `contact`.`hidden`
+                       AND NOT `contact`.`pending` AND NOT `contact`.`archive`
+                       AND `contact`.`success_update` > `failure_update`
+                       GROUP BY `contact`.`id` ",
+               intval(local_user())
+       );
+
+       return $r;
+}
index c4310c24e2233a3a83761ae38429d8d42483b1b0..53f4784c2d053fe06661a979d4ffdca507d71937 100644 (file)
@@ -4479,7 +4479,8 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
        //$o .= "\t".'<link rel="self" type="application/atom+xml" href="'.xmlify($a->get_baseurl().'/api/statuses/show/'.$item['id'].'.atom').'"/>'."\r\n";
        //$o .= "\t".'<link rel="edit" type="application/atom+xml" href="'.xmlify($a->get_baseurl().'/api/statuses/show/'.$item['id'].'.atom').'"/>'."\r\n";
 
-       $o .= item_get_attachment($item);
+       // Deactivated since it was meant only for OStatus
+       //$o .= item_get_attachment($item);
 
        $o .= item_getfeedattach($item);
 
index 9dac5f114b177d617956a9772d733194d13bd0f1..ec2b666bede9109304020a3bc3993c66abe7ea03 100644 (file)
@@ -4,6 +4,7 @@ require_once('include/queue_fn.php');
 require_once('include/html2plain.php');
 require_once("include/Scrape.php");
 require_once('include/diaspora.php');
+require_once("include/ostatus.php");
 
 /*
  * This file was at one time responsible for doing all deliveries, but this caused
@@ -529,7 +530,8 @@ function notifier_run(&$argv, &$argc){
                unset($photos);
        } else {
 
-               $slap = atom_entry($target_item,'html',null,$owner,false);
+               $slap = ostatus_salmon($target_item,$owner);
+               //$slap = atom_entry($target_item,'html',null,$owner,false);
 
                if($followup) {
                        foreach($items as $item) {  // there is only one item
@@ -569,7 +571,8 @@ function notifier_run(&$argv, &$argc){
                                        $atom .= atom_entry($item,'text',null,$owner,true);
 
                                if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
-                                       $slaps[] = atom_entry($item,'html',null,$owner,true);
+                                       $slaps[] = ostatus_salmon($item,$owner);
+                                       //$slaps[] = atom_entry($item,'html',null,$owner,true);
                        }
                }
        }
index 523ccfe510e55144255fb0052dd693db7425c976..ce254ed61ad012328d362234882b6738c03c5cea 100644 (file)
@@ -14,6 +14,15 @@ define('OSTATUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
 define('OSTATUS_DEFAULT_POLL_TIMEFRAME', 1440); // given in minutes
 define('OSTATUS_DEFAULT_POLL_TIMEFRAME_MENTIONS', 14400); // given in minutes
 
+define("NS_ATOM", "http://www.w3.org/2005/Atom");
+define("NS_THR", "http://purl.org/syndication/thread/1.0");
+define("NS_GEORSS", "http://www.georss.org/georss");
+define("NS_ACTIVITY", "http://activitystrea.ms/spec/1.0/");
+define("NS_MEDIA", "http://purl.org/syndication/atommedia");
+define("NS_POCO", "http://portablecontacts.net/spec/1.0");
+define("NS_OSTATUS", "http://ostatus.org/schema/1.0");
+define("NS_STATUSNET", "http://status.net/schema/api/1/");
+
 function ostatus_check_follow_friends() {
        $r = q("SELECT `uid`,`v` FROM `pconfig` WHERE `cat`='system' AND `k`='ostatus_legacy_contact' AND `v` != ''");
 
@@ -1067,4 +1076,382 @@ function ostatus_store_conversation($itemid, $conversation_url) {
                logger('Storing conversation url '.$conversation_url.' for id '.$itemid);
        }
 }
+
+function xml_add_element($doc, $parent, $element, $value = "", $attributes = array()) {
+       $element = $doc->createElement($element, xmlify($value));
+
+       foreach ($attributes AS $key => $value) {
+               $attribute = $doc->createAttribute($key);
+               $attribute->value = xmlify($value);
+               $element->appendChild($attribute);
+       }
+
+       $parent->appendChild($element);
+}
+
+function ostatus_add_header($doc, $owner) {
+       $a = get_app();
+
+       $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`",
+               intval($owner["uid"]));
+       if (!$r)
+               return;
+
+       $profile = $r[0];
+
+       $root = $doc->createElementNS(NS_ATOM, 'feed');
+       $doc->appendChild($root);
+
+       $root->setAttribute("xmlns:thr", NS_THR);
+       $root->setAttribute("xmlns:georss", NS_GEORSS);
+       $root->setAttribute("xmlns:activity", NS_ACTIVITY);
+       $root->setAttribute("xmlns:media", NS_MEDIA);
+       $root->setAttribute("xmlns:poco", NS_POCO);
+       $root->setAttribute("xmlns:ostatus", NS_OSTATUS);
+       $root->setAttribute("xmlns:statusnet", NS_STATUSNET);
+
+       $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION);
+       xml_add_element($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes);
+       xml_add_element($doc, $root, "id", $a->get_baseurl()."/profile/".$owner["nick"]);
+       xml_add_element($doc, $root, "title", sprintf("%s timeline", $profile["name"]));
+       xml_add_element($doc, $root, "subtitle", sprintf("Updates from %s on %s", $profile["name"], $a->config["sitename"]));
+       xml_add_element($doc, $root, "logo", $profile["photo"]);
+       xml_add_element($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME));
+
+       $author = ostatus_add_author($doc, $owner, $profile);
+       $root->appendChild($author);
+
+       $attributes = array("href" => $owner["url"], "rel" => "alternate", "type" => "text/html");
+       xml_add_element($doc, $root, "link", "", $attributes);
+
+       // To-Do: We have to find out what this is
+       //$attributes = array("href" => $a->get_baseurl()."/sup",
+       //              "rel" => "http://api.friendfeed.com/2008/03#sup",
+       //              "type" => "application/json");
+       //xml_add_element($doc, $root, "link", "", $attributes);
+
+       ostatus_hublinks($doc, $root);
+
+       $attributes = array("href" => $a->get_baseurl()."/salmon/".$owner["nick"], "rel" => "salmon");
+       xml_add_element($doc, $root, "link", "", $attributes);
+
+       $attributes = array("href" => $a->get_baseurl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies");
+       xml_add_element($doc, $root, "link", "", $attributes);
+
+       $attributes = array("href" => $a->get_baseurl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention");
+       xml_add_element($doc, $root, "link", "", $attributes);
+
+       $attributes = array("href" => $a->get_baseurl()."/api/statuses/user_timeline/".$owner["nick"].".atom",
+                       "rel" => "self", "type" => "application/atom+xml");
+       xml_add_element($doc, $root, "link", "", $attributes);
+
+       return $root;
+}
+
+function ostatus_hublinks($doc, $root) {
+       $a = get_app();
+       $hub = get_config('system','huburl');
+
+       $hubxml = '';
+       if(strlen($hub)) {
+               $hubs = explode(',', $hub);
+               if(count($hubs)) {
+                       foreach($hubs as $h) {
+                               $h = trim($h);
+                               if(! strlen($h))
+                                       continue;
+                               if ($h === '[internal]')
+                                       $h = $a->get_baseurl() . '/pubsubhubbub';
+                               xml_add_element($doc, $root, "link", "", array("href" => $h, "rel" => "hub"));
+                       }
+               }
+       }
+}
+
+function ostatus_get_attachment($doc, $root, $item) {
+       $o = "";
+       $siteinfo = get_attached_data($item["body"]);
+
+       switch($siteinfo["type"]) {
+               case 'link':
+                       $attributes = array("rel" => "enclosure",
+                                       "href" => $siteinfo["url"],
+                                       "type" => "text/html; charset=UTF-8",
+                                       "length" => "",
+                                       "title" => $siteinfo["title"]);
+                       xml_add_element($doc, $root, "link", "", $attributes);
+                       break;
+               case 'photo':
+                       $imgdata = get_photo_info($siteinfo["image"]);
+                       $attributes = array("rel" => "enclosure",
+                                       "href" => $siteinfo["image"],
+                                       "type" => $imgdata["mime"],
+                                       "length" => intval($imgdata["size"]));
+                       xml_add_element($doc, $root, "link", "", $attributes);
+                       break;
+               case 'video':
+                       $attributes = array("rel" => "enclosure",
+                                       "href" => $siteinfo["url"],
+                                       "type" => "text/html; charset=UTF-8",
+                                       "length" => "",
+                                       "title" => $siteinfo["title"]);
+                       xml_add_element($doc, $root, "link", "", $attributes);
+                       break;
+               default:
+                       break;
+       }
+
+       $arr = explode('[/attach],',$item['attach']);
+       if(count($arr)) {
+               foreach($arr as $r) {
+                       $matches = false;
+                       $cnt = preg_match('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"|',$r,$matches);
+                       if($cnt) {
+                               $attributes = array("rel" => "enclosure",
+                                               "href" => $matches[1],
+                                               "type" => $matches[3]);
+
+                               if(intval($matches[2]))
+                                       $attributes["length"] = intval($matches[2]);
+
+                               if(trim($matches[4]) != "")
+                                       $attributes["title"] = trim($matches[4]);
+
+                               xml_add_element($doc, $root, "link", "", $attributes);
+                       }
+               }
+       }
+}
+
+function ostatus_add_author($doc, $owner, $profile) {
+       $a = get_app();
+
+       $author = $doc->createElement("author");
+       xml_add_element($doc, $author, "activity:object-type", ACTIVITY_OBJ_PERSON);
+       xml_add_element($doc, $author, "uri", $owner["url"]);
+       xml_add_element($doc, $author, "name", $owner["nick"]);
+
+       $attributes = array("rel" => "alternate", "type" => "text/html", "href" => $owner["url"]);
+       xml_add_element($doc, $author, "link", "", $attributes);
+
+       $attributes = array(
+                       "rel" => "avatar",
+                       "type" => "image/jpeg", // To-Do?
+                       "media:width" => 175,
+                       "media:height" => 175,
+                       "href" => $profile["photo"]);
+       xml_add_element($doc, $author, "link", "", $attributes);
+
+       $attributes = array(
+                       "rel" => "avatar",
+                       "type" => "image/jpeg", // To-Do?
+                       "media:width" => 80,
+                       "media:height" => 80,
+                       "href" => $profile["thumb"]);
+       xml_add_element($doc, $author, "link", "", $attributes);
+
+       xml_add_element($doc, $author, "poco:preferredUsername", $owner["nick"]);
+       xml_add_element($doc, $author, "poco:displayName", $profile["name"]);
+       xml_add_element($doc, $author, "poco:note", $profile["about"]);
+
+       if (trim($owner["location"]) != "") {
+               $element = $doc->createElement("poco:address");
+               xml_add_element($doc, $element, "poco:formatted", $owner["location"]);
+               $author->appendChild($element);
+       }
+
+       if (trim($profile["homepage"]) != "") {
+               $urls = $doc->createElement("poco:urls");
+               xml_add_element($doc, $urls, "poco:type", "homepage");
+               xml_add_element($doc, $urls, "poco:value", $profile["homepage"]);
+               xml_add_element($doc, $urls, "poco:primary", "true");
+               $author->appendChild($urls);
+       }
+
+       xml_add_element($doc, $author, "followers", "", array("url" => $a->get_baseurl()."/viewcontacts/".$owner["nick"]));
+       xml_add_element($doc, $author, "statusnet:profile_info", "", array("local_id" => $owner["uid"]));
+
+       return $author;
+}
+
+function ostatus_entry($doc, $item, $owner, $toplevel = false) {
+       $a = get_app();
+
+       if (!$toplevel) {
+               $entry = $doc->createElement("entry");
+               $title = sprintf("New note by %s", $owner["nick"]);
+       } else {
+               $entry = $doc->createElementNS(NS_ATOM, "entry");
+
+               $entry->setAttribute("xmlns:thr", NS_THR);
+               $entry->setAttribute("xmlns:georss", NS_GEORSS);
+               $entry->setAttribute("xmlns:activity", NS_ACTIVITY);
+               $entry->setAttribute("xmlns:media", NS_MEDIA);
+               $entry->setAttribute("xmlns:poco", NS_POCO);
+               $entry->setAttribute("xmlns:ostatus", NS_OSTATUS);
+               $entry->setAttribute("xmlns:statusnet", NS_STATUSNET);
+
+               $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is-default`",
+                       intval($owner["uid"]));
+               if (!$r)
+                       return;
+
+               $profile = $r[0];
+
+               $author = ostatus_add_author($doc, $owner, $profile);
+               $entry->appendChild($author);
+
+               $title = sprintf("New comment by %s", $owner["nick"]);
+       }
+
+       // To use the object-type "bookmark" we have to implement these elements:
+       //
+       // <activity:object-type>http://activitystrea.ms/schema/1.0/bookmark</activity:object-type>
+       // <title>Historic Rocket Landing</title>
+       // <summary>Nur ein Testbeitrag.</summary>
+       // <link rel="related" href="https://www.youtube.com/watch?v=9pillaOxGCo"/>
+       // <link rel="preview" href="https://pirati.cc/file/thumb-4526-450x338-b48c8055f0c2fed0c3f67adc234c4b99484a90c42ed3cac73dc1081a4d0a7bc1.jpg.jpg" media:width="450" media:height="338"/>
+       //
+       // But: it seems as if it doesn't federate well between the GS servers
+       // So we just set it to "note" to be sure that it reaches their target systems
+
+       xml_add_element($doc, $entry, "activity:object-type", ACTIVITY_OBJ_NOTE);
+       xml_add_element($doc, $entry, "id", $item["uri"]);
+       xml_add_element($doc, $entry, "title", $title);
+
+       if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
+               $body = fix_private_photos($item['body'],$owner['uid'],$item, 0);
+       else
+               $body = $item['body'];
+
+       if ($item['title'] != "")
+               $body = "[b]".$item['title']."[/b]\n\n".$body;
+
+       $body = bbcode($body, false, false, 7);
+
+       xml_add_element($doc, $entry, "content", $body, array("type" => "html"));
+
+       xml_add_element($doc, $entry, "link", "", array("rel" => "alternate", "type" => "text/html",
+                                                       "href" => $a->get_baseurl()."/display/".$item["guid"]));
+
+       xml_add_element($doc, $entry, "status_net", "", array("notice_id" => $item["id"]));
+       xml_add_element($doc, $entry, "activity:verb", construct_verb($item));
+       xml_add_element($doc, $entry, "published", datetime_convert("UTC","UTC",$item["created"]."+00:00",ATOM_TIME));
+       xml_add_element($doc, $entry, "updated", datetime_convert("UTC","UTC",$item["edited"]."+00:00",ATOM_TIME));
+
+       if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
+               $parent = q("SELECT `guid` FROM `item` WHERE `id` = %d", intval($item["parent"]));
+               $parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
+
+               $attributes = array(
+                               "ref" => $parent_item,
+                               "type" => "text/html",
+                               "href" => $a->get_baseurl()."/display/".$parent[0]["guid"]);
+               xml_add_element($doc, $entry, "thr:in-reply-to", "", $attributes);
+
+               $attributes = array(
+                               "rel" => "related",
+                               "href" => $a->get_baseurl()."/display/".$parent[0]["guid"]);
+               xml_add_element($doc, $entry, "link", "", $attributes);
+        }
+
+       xml_add_element($doc, $entry, "link", "", array("rel" => "ostatus:conversation",
+                                                       "href" => $a->get_baseurl()."/display/".$owner["nick"]."/".$item["parent"]));
+       xml_add_element($doc, $entry, "ostatus:conversation", $a->get_baseurl()."/display/".$owner["nick"]."/".$item["parent"]);
+
+       $tags = item_getfeedtags($item);
+
+       if(count($tags))
+               foreach($tags as $t)
+                       if ($t[0] == "@")
+                               xml_add_element($doc, $entry, "link", "", array("rel" => "mentioned",
+                                                                               "ostatus:object-type" => ACTIVITY_OBJ_PERSON,
+                                                                               "href" => $t[1]));
+
+       if (!$item["private"])
+               xml_add_element($doc, $entry, "link", "", array("rel" => "mentioned",
+                                                               "ostatus:object-type" => "http://activitystrea.ms/schema/1.0/collection",
+                                                               "href" => "http://activityschema.org/collection/public"));
+
+       if(count($tags))
+               foreach($tags as $t)
+                       if ($t[0] != "@")
+                               xml_add_element($doc, $entry, "category", "", array("term" => $t[2]));
+
+       ostatus_get_attachment($doc, $entry, $item);
+
+       // To-Do:
+       // The API call has yet to be implemented
+       //$attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
+       //              "rel" => "self", "type" => "application/atom+xml");
+       //xml_add_element($doc, $entry, "link", "", $attributes);
+
+       //$attributes = array("href" => $a->get_baseurl()."/api/statuses/show/".$item["id"].".atom",
+       //              "rel" => "edit", "type" => "application/atom+xml");
+       //xml_add_element($doc, $entry, "link", "", $attributes);
+
+       $app = $item["app"];
+       if ($app == "")
+               $app = "web";
+
+       xml_add_element($doc, $entry, "statusnet:notice_info", "", array("local_id" => $item["id"], "source" => $app));
+
+       return $entry;
+}
+
+function ostatus_feed(&$a, $owner_nick, $last_update) {
+
+       $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
+                       FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
+                       WHERE `contact`.`self` AND `user`.`nickname` = '%s' LIMIT 1",
+                       dbesc($owner_nick));
+       if (!$r)
+               return;
+
+       $owner = $r[0];
+
+       if(!strlen($last_update))
+               $last_update = 'now -30 days';
+
+       $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');
+
+       $items = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id` FROM `item`
+                       INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
+                       LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid`
+                       WHERE `item`.`uid` = %d AND `item`.`received` > '%s' AND NOT `item`.`private` AND NOT `item`.`deleted`
+                               AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid`  = '' AND `item`.`deny_gid`  = ''
+                               AND ((`item`.`wall` AND (`item`.`parent` = `item`.`id`))
+                                       OR (`item`.`network` = '%s' AND ((`thread`.`network`='%s') OR (`thritem`.`network` = '%s'))) AND `thread`.`mention`)
+                               AND (`item`.`owner-link` IN ('%s', '%s'))
+                       ORDER BY `item`.`received` DESC
+                       LIMIT 0, 300",
+                       intval($owner["uid"]), dbesc($check_date),
+                       dbesc(NETWORK_DFRN), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_OSTATUS),
+                       dbesc($owner["nurl"]), dbesc(str_replace("http://", "https://", $owner["nurl"]))
+               );
+
+       $doc = new DOMDocument('1.0', 'utf-8');
+       $doc->formatOutput = true;
+
+       $root = ostatus_add_header($doc, $owner);
+
+       foreach ($items AS $item) {
+               $entry = ostatus_entry($doc, $item, $owner);
+               $root->appendChild($entry);
+       }
+
+       return($doc->saveXML());
+}
+
+function ostatus_salmon($item,$owner) {
+
+       $doc = new DOMDocument('1.0', 'utf-8');
+       $doc->formatOutput = true;
+
+       $entry = ostatus_entry($doc, $item, $owner, true);
+
+       $doc->appendChild($entry);
+
+       return($doc->saveXML());
+}
 ?>
index bc81fd78680c16cf0b429abeb557aa6b59727c87..d27beea3d5ea7683a771afd319b54fac3abd571a 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 require_once("boot.php");
+require_once("include/ostatus.php");
 
 function handle_pubsubhubbub() {
        global $a, $db;
@@ -12,17 +13,17 @@ function handle_pubsubhubbub() {
        $r = q("SELECT * FROM `push_subscriber` WHERE `push` > 0");
 
        foreach($r as $rr) {
-               $params = get_feed_for($a, '', $rr['nickname'], $rr['last_update'], 0, true);
+               //$params = get_feed_for($a, '', $rr['nickname'], $rr['last_update'], 0, true);
+               $params = ostatus_feed($a, $rr['nickname'], $rr['last_update']);
                $hmac_sig = hash_hmac("sha1", $params, $rr['secret']);
 
                $headers = array("Content-type: application/atom+xml",
-                                               sprintf("Link: <%s>;rel=hub," .
-                                                               "<%s>;rel=self",
-                                                               $a->get_baseurl() . '/pubsubhubbub',
-                                                               $rr['topic']),
-                                               "X-Hub-Signature: sha1=" . $hmac_sig);
+                               sprintf("Link: <%s>;rel=hub,<%s>;rel=self",
+                                       $a->get_baseurl().'/pubsubhubbub',
+                                       $rr['topic']),
+                               "X-Hub-Signature: sha1=".$hmac_sig);
 
-               logger('POST '. print_r($headers, true)."\n".$params, LOGGER_DEBUG);
+               logger('POST '.print_r($headers, true)."\n".$params, LOGGER_DEBUG);
 
                post_url($rr['callback_url'], $params, $headers);
                $ret = $a->get_curl_code();
index 7574374907eabf3f4cca2789b5be712dfebadee5..a254fe7e97086953d4a8b1c607ad0e1feefd6b39 100644 (file)
@@ -66,8 +66,6 @@ function get_salmon_key($uri,$keyhash) {
 
 function slapper($owner,$url,$slap) {
 
-       logger('slapper called for '.$url.'. Data: ' . $slap);
-
        // does contact have a salmon endpoint?
 
        if(! strlen($url))
@@ -97,6 +95,8 @@ EOT;
 
        $slap = str_replace('<entry>',$namespaces,$slap);
 
+       logger('slapper called for '.$url.'. Data: ' . $slap);
+
        // create a magic envelope
 
        $data      = base64url_encode($slap);
index df454afe1fb8bbccdf1aa86fafe9486917da74c0..f67d7183cedabb5e476e094459c386592a070ff9 100644 (file)
                                $(".group-"+gid+" .notify").addClass("show").text(gcount);
                        });
 
+                       $(".forum-widget-entry .notify").removeClass("show");
+                       $(data).find("forum").each(function() {
+                               var fid = this.id;
+                               var fcount = this.innerHTML;
+                               $(".forum-"+fid+" .notify").addClass("show").text(fcount);
+                       });
+
 
                        var eNotif = $(data).find('notif')
 
index 8cbfd308e67aa3792a0a5329617ae84efa609fe7..967555881c0c1f5f535163fb1657b8ea9349a642 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 require_once("include/datetime.php");
 require_once('include/bbcode.php');
+require_once('include/forums.php');
 require_once("mod/proxy.php");
 
 function ping_init(&$a) {
@@ -34,6 +35,7 @@ function ping_init(&$a) {
                $home = 0;
                $network = 0;
                $network_group = array();
+               $forums_unseen = array();
 
                $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`,
                                `item`.`contact-id`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
@@ -100,6 +102,10 @@ function ping_init(&$a) {
                        #echo '<SQL id="' . intval(local_user()) . '">' . $sql . '</SQL>';
                        $network_group = q($sql, intval(local_user()), intval(local_user()));
                        #echo '<COUNT R="' . count($network_group) . '"/>';
+
+                       if(intval(feature_enabled(local_user(),'forumlist_widget'))) {
+                               $forums_unseen = forums_count_unseen();
+                       }
                }
 
                $intros1 = q("SELECT  `intro`.`id`, `intro`.`datetime`,
@@ -220,6 +226,7 @@ function ping_init(&$a) {
                                <net>$network</net>
                                <home>$home</home>\r\n";
                if ($register!=0) echo "<register>$register</register>";
+
                if ( count($network_group) ) {
                        echo '<groups>';
                        foreach ($network_group as $it) {
@@ -228,6 +235,14 @@ function ping_init(&$a) {
                        echo "</groups>";
                }
 
+               if ( count($forums_unseen) ) {
+                       echo '<forums>';
+                       foreach ($forums_unseen as $it) {
+                               echo '<forum id="' . $it['id'] . '">' . $it['count'] . "</forum>";
+                       }
+                       echo "</forums>";
+               }
+
                echo "<all-events>$all_events</all-events>
                        <all-events-today>$all_events_today</all-events-today>
                        <events>$events</events>
index 24d0819db5b82d81619351afc04dd1e0b844e2de..115fab27119ca710cabfe615b661204aa27c454f 100644 (file)
@@ -288,28 +288,16 @@ ul.credits li {
 }
 
 /* forumlist widget */
-#hide-forum-list {
-  opacity: 0.3;
-  filter:alpha(opacity=30);
-}
-
-#hide-forum-list:hover {
-  opacity: 1.0;
-  filter:alpha(opacity=100);
-}
-
-
-#forumlist-settings-label, #forumlist-random-label, #forumlist-profile-label, #forumlist-network-label {
-  float: left;
-  width: 200px;
-  margin-bottom: 25px;
+.forumlist-img {
+  height: 20px;
+  width: 20px;
+  vertical-align: middle;
 }
 
-#forumlist-max-forumlists, #forumlist-random, #forumlist-profile, #forumlist-network {
-  float: left;
+#forum-widget-collapse {
+  opacity: 0.3;
 }
 
-.forumlist-img {
-  height: 20px;
-  width: 20px;
+#forum-widget-collapse:hover {
+  opacity: 1.0;
 }
index 44dcd8f1e884255b002bb1891248bf97da0b086f..54d7df82d219cdd0da068913dc32626f87210e58 100644 (file)
@@ -1,45 +1,46 @@
 <script>
 
 function showHideForumlist() {
-       if( $("div[id^='forum-widget-entry-extended-']").is(':visible')) {
-               $("div[id^='forum-widget-entry-extended-']").hide();
-               $('#forum-widget-collapse').html(window.showMore);
+       if( $("li[id^='forum-widget-entry-extended-']").is(':visible')) {
+               $("li[id^='forum-widget-entry-extended-']").hide();
+               $("li#forum-widget-collapse").html(window.showMore);
 
        }
        else {
-               $("div[id^='forum-widget-entry-extended-']").show();
-               $('#forum-widget-collapse').html(window.showFewer);
-       }
+               $("li[id^='forum-widget-entry-extended-']").show();
+               $("li#forum-widget-collapse").html(window.showFewer);
        }
+}
 </script>
 
 <div id="forumlist-sidebar" class="widget">
        <h3 id="forumlist">{{$title}}</h3>
 
-       {{foreach $forums as $forum}}
+       <ul id="forumlist-sidbar-ul" role="menu">
+               {{foreach $forums as $forum}}
                {{if $forum.id <= $visible_forums}}
-               <div class="forum-widget-entry" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
+               <li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
+                       <span class="notify badge pull-right"></span>
                        <a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank">
                                <img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
                        </a>
                        <a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}" >{{$forum.name}}</a>
-               </div>
+               </li>
                {{/if}}
        
                {{if $forum.id > $visible_forums}}
-               <div class="forum-widget-entry" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
+               <li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
+                       <span class="notify badge pull-right"></span>
                        <a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank">
                                <img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
                        </a>
                        <a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}" >{{$forum.name}}</a>
-               </div>
+               </li>
                {{/if}}
-       {{/foreach}}
-
-       {{if $total > $visible_forums }}
-       <div id="forum-widget-showmore" class="forum-widget-entry" role="menuitem">
-               <a onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link">{{$showmore}}</a>
-       </div>
-       {{/if}}
+               {{/foreach}}
 
+               {{if $total > $visible_forums }}
+               <li onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link fakelink tool">{{$showmore}}</li>
+               {{/if}}
+       </ul>
 </div>
index 4642fb2b75416cb9399d847bc07aa18e507b610b..255a1d089ab606e56eb37e63e08b713c0cbac2f0 100644 (file)
@@ -2039,7 +2039,7 @@ a.mail-list-link {
 #sidebar-group-list ul {
        list-style-type: none;
 }
-.sidebar-group-li .notify {
+.sidebar-group-li .notify, .forum-widget-entry .notify {
        display: none;
        font-size: 9px;
        border: 1px solid rgb(221, 221, 221);
@@ -2047,7 +2047,7 @@ a.mail-list-link {
        float: right;
        background-color: #BABDB6;
 }
-.sidebar-group-li .notify.show {
+.sidebar-group-li .notify.show, .forum-widget-entry .notify.show {
        display: block;
 }
 
@@ -2061,6 +2061,10 @@ a.mail-list-link {
        margin-top: 10px;
 }
 
+#forumlist-sidebar ul {
+       list-style: none;
+}
+
 .nets-ul, .fileas-ul, .categories-ul, .datebrowse-ul {
        list-style-type: none;
 }
index 14899a866be004717261a029bffb594a1a6f1a26..24fe47559a47acb804cc53eea92fc39fb884ffa6 100644 (file)
@@ -2357,6 +2357,16 @@ a.mail-list-link {
        margin-top: 10px;
 }
 
+#forumlist-sidebar ul {
+       list-style: none;
+}
+
+.forumlist-img {
+       height: 20px;
+       width: 20px;
+       vertical-align: middle;
+}
+
 .nets-ul, .fileas-ul, .categories-ul, .datebrowse-ul {
        list-style-type: none;
 }
index c2573ebd1d5f726cf58e03c2895c7afe28499ca0..259874a299d4fb634852ead2c2fc19dc221bf90b 100644 (file)
@@ -11,6 +11,13 @@ $(document).ready(function(){
                        $(".group-"+gid+" .notify").addClass("on").text(gcount);
                });
 
+               $(".forum-widget-entry .notify").removeClass("on");
+               $(data).find("forum").each(function() {
+                       var fid = this.id;
+                       var fcount = this.innerHTML;
+                       $(".forum-"+fid+" .notify").addClass("on").text(fcount);
+               });
+
                console.log(intro,mail);
 
                if (notifCount > 0 ) {
index db96be9fb1c474557b32c173b1240836f38c0160..ecbb2ad96cb8c156305dc69f9476911b71145ad9 100644 (file)
@@ -343,6 +343,22 @@ code {
   margin-top: 20px;
   max-width: 640px;
 }
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: 700;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  /* background-color: #737373*/;
+  background-color: #36C;
+  border-radius: 4px;
+  opacity: 0.3;
+}
 #panel {
   position: absolute;
   width: 10em;
@@ -386,7 +402,7 @@ code {
 .tool a {
 /*  color: #000; */
 }
-.tool a:hover, .widget a:hover, #nets-sidear a:hover, #hide-forum-list:hover, .admin.link a:hover, aside h4 a:hover, right_aside h4 a:hover {
+.tool a:hover, .widget a:hover, #nets-sidear a:hover, #forum-widget-collapse:hover, .admin.link a:hover, aside h4 a:hover, right_aside h4 a:hover {
   /* text-decoration: underline; */
   text-decoration: none;
   color: black;
@@ -400,8 +416,8 @@ code {
   opacity: 1;
 }
 
-.sidebar-group-li:hover, #sidebar-new-group:hover, #hide-forum-list:hover,
-#sidebar-ungrouped:hover, .side-link:hover, .nets-ul li:hover, #forumlist-sidebar div:hover, #forum-list-right div:hover,
+.sidebar-group-li:hover, #sidebar-new-group:hover, #forum-widget-collapse:hover,
+#sidebar-ungrouped:hover, .side-link:hover, .nets-ul li:hover, #forumlist-sidebar li:hover, #forumlist-sidebar-right li:hover,
 .nets-all:hover, .saved-search-li:hover, li.tool:hover, .admin.link:hover, aside h4 a:hover, right_aside h4 a:hover, #message-new:hover {
   /* background-color: #ddd; */
 /*  background-color: #e5e5e5; */
@@ -420,7 +436,7 @@ code {
   font-weight: bold;
 }
 
-#forum-widget-showmore, #sidebar-new-group, #hide-forum-list, #forum-list-right, #sidebar-ungrouped,
+#forum-widget-showmore, #sidebar-new-group, #forum-widget-collapse, #forumlist-rsidebar-right, #sidebar-ungrouped,
 .side-link, #peoplefind-desc, #connect-desc, .nets-all, .admin.link, #message-new {
   padding-left: 10px;
   padding-top: 3px;
@@ -440,6 +456,14 @@ code {
   padding-right: 5px;
 }
 
+#forumlist-sidebar .notify, #forumlist-sidebar-right .notify {
+  display: none;
+}
+
+#forumlist-sidebar .notify.show, #forumlist-sidebar-right .notify.show {
+  display: inline-block;
+}
+
 a.nets-link, .side-link a, #sidebar-new-group a, a.savedsearchterm, a.fileas-link, aside h4 a, right_aside h4 a {
   display: block;
   color: #737373;
@@ -467,11 +491,11 @@ a.sidebar-group-element {
   color: black;
 }
 
-#forumlist-sidebar a, #forum-list-right a, .tool a, .admin.link a {
+#forumlist-sidebar a, #forumlist-sidebar-right a, .tool a, .admin.link a {
   color: #737373;
 }
 
-#forumlist-sidebar, #forum-list-right {
+#forumlist-sidebar, #forumlist-sidebar-right {
   margin-top: 2px;
 }
 
diff --git a/view/theme/vier/templates/widget_forumlist_right.tpl b/view/theme/vier/templates/widget_forumlist_right.tpl
new file mode 100644 (file)
index 0000000..49e7723
--- /dev/null
@@ -0,0 +1,47 @@
+<script>
+
+function showHideForumlist() {
+       if( $("li[id^='forum-widget-entry-extended-']").is(':visible')) {
+               $("li[id^='forum-widget-entry-extended-']").hide();
+               $("li#forum-widget-collapse").html(window.showMore);
+
+       }
+       else {
+               $("li[id^='forum-widget-entry-extended-']").show();
+               $("li#forum-widget-collapse").html(window.showFewer);
+       }
+}
+</script>
+
+<div id="forumlist-sidebar-right" class="widget">
+       <h3 id="forumlist">{{$title}}</h3>
+
+       <ul id="forumlist-sidbar-ul" role="menu">
+               {{foreach $forums as $forum}}
+               {{if $forum.id <= $visible_forums}}
+               <li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-{{$forum.id}}" role="menuitem">
+                       <a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank">
+                               <img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
+                       </a>
+                       <a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}" >{{$forum.name}}</a>
+                       <span class="notify badge pull-right"></span>
+               </li>
+               {{/if}}
+       
+               {{if $forum.id > $visible_forums}}
+               <li class="forum-widget-entry forum-{{$forum.cid}}" id="forum-widget-entry-extended-{{$forum.id}}" role="menuitem" style="display: none;">
+                       <a href="{{$forum.external_url}}" title="{{$forum.link_desc}}" class="label sparkle" target="_blank">
+                               <img class="forumlist-img" src="{{$forum.micro}}" alt="{{$forum.link_desc}}" />
+                       </a>
+                       <a class="forum-widget-link" id="forum-widget-link-{{$forum.id}}" href="{{$forum.url}}" >{{$forum.name}}</a>
+                       <span class="notify padge pull-right"></span>
+               </li>
+               {{/if}}
+               {{/foreach}}
+
+               {{if $total > $visible_forums }}
+               <li onclick="showHideForumlist(); return false;" id="forum-widget-collapse" class="forum-widget-link tool fakelink">{{$showmore}}</li>
+               {{/if}}
+       </ul>
+
+</div>
index 3c808b52af0ec8b97203370296b3cf76df26cf0b..789ba1daf1cabdca0567eced5d4ac5f110a7e5b5 100644 (file)
@@ -220,35 +220,44 @@ function vier_community_info() {
        //Community_Pages at right_aside
        if($show_pages AND local_user()) {
 
-               $pagelist = array();
+               require_once('include/forums.php');
 
-               $contacts = q("SELECT `id`, `url`, `name`, `micro` FROM `contact`
-                               WHERE `network`= '%s' AND `uid` = %d AND (`forum` OR `prv`) AND
-                                       NOT `hidden` AND NOT `blocked` AND
-                                       NOT `archive` AND NOT `pending` AND
-                                       `success_update` > `failure_update`
-                               ORDER BY `name` ASC",
-                               dbesc(NETWORK_DFRN), intval($a->user['uid']));
+               //sort by last updated item
+               $lastitem = true;
 
-               $pageD = array();
+               $contacts = get_forumlist($a->user['uid'],true,$lastitem, true);
+               $total = count($contacts);
+               $visible_forums = 10;
 
-               // Look if the profile is a community page
-               foreach($contacts as $contact) {
-                       $pageD[] = array("url"=>$contact["url"], "name"=>$contact["name"], "id"=>$contact["id"], "micro"=>$contact['micro']);
-               };
+               if(count($contacts)) {
 
-               $contacts = $pageD;
-
-               if ($contacts) {
-                       $page = '
-                               <h3>'.t("Community Pages").'</h3>
-                               <div id="forum-list-right">';
+                       $id = 0;
 
                        foreach($contacts as $contact) {
-                               $page .= '<div role="menuitem"><a href="' . $a->get_baseurl() . '/redir/' . $contact["id"] . '" title="'.t('External link to forum').'" class="label sparkle" target="_blank"><img class="forumlist-img" height="20" width="20" src="' . $contact['micro'] .'" alt="'.t('External link to forum').'" /></a> <a href="' . $a->get_baseurl() . '/network?f=&cid=' . $contact['id'] . '" >' . $contact["name"]."</a></div>";
+
+                               $entry = array(
+                                       'url' => $a->get_baseurl() . '/network?f=&cid=' . $contact['id'],
+                                       'external_url' => $a->get_baseurl() . '/redir/' . $contact['id'],
+                                       'name' => $contact['name'],
+                                       'cid' => $contact['id'],
+                                       'micro' => proxy_url($contact['micro'], false, PROXY_SIZE_MICRO),
+                                       'id' => ++$id,
+                               );
+                               $entries[] = $entry;
                        }
 
-                       $page .= '</div>';
+
+                       $tpl = get_markup_template('widget_forumlist_right.tpl');
+
+                       $page .= replace_macros($tpl,array(
+                               '$title'        => t('Forums'),
+                               '$forums'       => $entries,
+                               '$link_desc'    => t('External link to forum'),
+                               '$total'        => $total,
+                               '$visible_forums' => $visible_forums,
+                               '$showmore'     => t('show more'),
+                       ));
+
                        $aside['$page'] = $page;
                }
        }