]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #3921 from MrPetovan/issue/3878-move-Contact-to-src
authorMichael Vogel <icarus@dabo.de>
Mon, 20 Nov 2017 15:53:29 +0000 (16:53 +0100)
committerGitHub <noreply@github.com>
Mon, 20 Nov 2017 15:53:29 +0000 (16:53 +0100)
Move Contact to src

60 files changed:
boot.php
include/Contact.php [deleted file]
include/acl_selectors.php
include/api.php
include/bb2diaspora.php
include/bbcode.php
include/contact_widgets.php
include/conversation.php
include/identity.php
include/items.php
include/like.php
include/post_update.php
include/threads.php
index.php
mod/admin.php
mod/allfriends.php
mod/cal.php
mod/common.php
mod/contacts.php
mod/crepair.php
mod/dfrn_notify.php
mod/directory.php
mod/dirfind.php
mod/display.php
mod/follow.php
mod/hovercard.php
mod/item.php
mod/match.php
mod/message.php
mod/network.php
mod/nogroup.php
mod/photos.php
mod/ping.php
mod/profiles.php
mod/randprof.php
mod/removeme.php
mod/suggest.php
mod/unfollow.php
mod/videos.php
mod/viewcontacts.php
src/BaseObject.php [new file with mode: 0644]
src/Core/BaseObject.php [deleted file]
src/Core/Conversation.php [deleted file]
src/Core/Item.php [deleted file]
src/Core/NotificationsManager.php
src/Model/GlobalContact.php
src/Model/User.php [new file with mode: 0644]
src/Network/Probe.php
src/Object/Contact.php [new file with mode: 0644]
src/Object/Conversation.php [new file with mode: 0644]
src/Object/Item.php [new file with mode: 0644]
src/Object/Profile.php [new file with mode: 0644]
src/Protocol/DFRN.php
src/Protocol/Diaspora.php
src/Protocol/OStatus.php
src/Protocol/PortableContact.php
src/Worker/Delivery.php
src/Worker/Expire.php
src/Worker/Notifier.php
src/Worker/OnePoll.php

index ce96aa5ab18ae8b2d4520437df296f7d4426bcff..9cdaefb2124f11942dce06d58a137d8706bb6559 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -27,6 +27,7 @@ use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Util\Lock;
 
 require_once 'include/network.php';
@@ -983,10 +984,10 @@ function public_contact()
        if (!$public_contact_id && x($_SESSION, 'authenticated')) {
                if (x($_SESSION, 'my_address')) {
                        // Local user
-                       $public_contact_id = intval(get_contact($_SESSION['my_address'], 0));
+                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['my_address'], 0));
                } elseif (x($_SESSION, 'visitor_home')) {
                        // Remote user
-                       $public_contact_id = intval(get_contact($_SESSION['visitor_home'], 0));
+                       $public_contact_id = intval(Contact::getIdForURL($_SESSION['visitor_home'], 0));
                }
        } elseif (!x($_SESSION, 'authenticated')) {
                $public_contact_id = false;
diff --git a/include/Contact.php b/include/Contact.php
deleted file mode 100644 (file)
index cd1696a..0000000
+++ /dev/null
@@ -1,900 +0,0 @@
-<?php
-/**
- * @file include/Contact.php
- */
-use Friendica\App;
-use Friendica\Core\PConfig;
-use Friendica\Core\System;
-use Friendica\Core\Worker;
-use Friendica\Database\DBM;
-use Friendica\Network\Probe;
-use Friendica\Protocol\Diaspora;
-use Friendica\Protocol\DFRN;
-use Friendica\Protocol\OStatus;
-
-// Included here for completeness, but this is a very dangerous operation.
-// It is the caller's responsibility to confirm the requestor's intent and
-// authorisation to do this.
-
-function user_remove($uid) {
-       if (!$uid) {
-               return;
-       }
-
-       logger('Removing user: ' . $uid);
-
-       $r = dba::select('user', array(), array('uid' => $uid), array("limit" => 1));
-
-       call_hooks('remove_user',$r);
-
-       // save username (actually the nickname as it is guaranteed
-       // unique), so it cannot be re-registered in the future.
-
-       dba::insert('userd', array('username' => $r['nickname']));
-
-       // The user and related data will be deleted in "cron_expire_and_remove_users" (cronjobs.php)
-       q("UPDATE `user` SET `account_removed` = 1, `account_expires_on` = UTC_TIMESTAMP() WHERE `uid` = %d", intval($uid));
-       Worker::add(PRIORITY_HIGH, "Notifier", "removeme", $uid);
-
-       // Send an update to the directory
-       Worker::add(PRIORITY_LOW, "Directory", $r['url']);
-
-       if($uid == local_user()) {
-               unset($_SESSION['authenticated']);
-               unset($_SESSION['uid']);
-               goaway(System::baseUrl());
-       }
-}
-
-
-function contact_remove($id) {
-
-       // We want just to make sure that we don't delete our "self" contact
-       $r = q("SELECT `uid` FROM `contact` WHERE `id` = %d AND NOT `self` LIMIT 1",
-               intval($id)
-       );
-       if (!DBM::is_result($r) || !intval($r[0]['uid'])) {
-               return;
-       }
-
-       $archive = PConfig::get($r[0]['uid'], 'system','archive_removed_contacts');
-       if ($archive) {
-               q("update contact set `archive` = 1, `network` = 'none', `writable` = 0 where id = %d",
-                       intval($id)
-               );
-               return;
-       }
-
-       dba::delete('contact', array('id' => $id));
-
-       // Delete the rest in the background
-       Worker::add(PRIORITY_LOW, 'RemoveContact', $id);
-}
-
-
-// sends an unfriend message. Does not remove the contact
-
-function terminate_friendship($user,$self,$contact) {
-
-       /// @TODO Get rid of this, include/datetime.php should care about it by itself
-       $a = get_app();
-
-       require_once 'include/datetime.php';
-
-       if ($contact['network'] === NETWORK_OSTATUS) {
-               // create an unfollow slap
-               $item = array();
-               $item['verb'] = NAMESPACE_OSTATUS."/unfollow";
-               $item['follow'] = $contact["url"];
-               $slap = OStatus::salmon($item, $user);
-
-               if ((x($contact,'notify')) && (strlen($contact['notify']))) {
-                       require_once 'include/salmon.php';
-                       slapper($user,$contact['notify'],$slap);
-               }
-       } elseif ($contact['network'] === NETWORK_DIASPORA) {
-               Diaspora::send_unshare($user,$contact);
-       } elseif ($contact['network'] === NETWORK_DFRN) {
-               DFRN::deliver($user,$contact,'placeholder', 1);
-       }
-
-}
-
-
-// Contact has refused to recognise us as a friend. We will start a countdown.
-// If they still don't recognise us in 32 days, the relationship is over,
-// and we won't waste any more time trying to communicate with them.
-// This provides for the possibility that their database is temporarily messed
-// up or some other transient event and that there's a possibility we could recover from it.
-
-function mark_for_death($contact) {
-
-       if($contact['archive'])
-               return;
-
-       if ($contact['term-date'] <= NULL_DATE) {
-               q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d",
-                               dbesc(datetime_convert()),
-                               intval($contact['id'])
-               );
-
-               if ($contact['url'] != '') {
-                       q("UPDATE `contact` SET `term-date` = '%s'
-                               WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'",
-                                       dbesc(datetime_convert()),
-                                       dbesc(normalise_link($contact['url']))
-                       );
-               }
-       } else {
-
-               /// @todo
-               /// We really should send a notification to the owner after 2-3 weeks
-               /// so they won't be surprised when the contact vanishes and can take
-               /// remedial action if this was a serious mistake or glitch
-
-               /// @todo
-               /// Check for contact vitality via probing
-
-               $expiry = $contact['term-date'] . ' + 32 days ';
-               if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) {
-
-                       // relationship is really truly dead.
-                       // archive them rather than delete
-                       // though if the owner tries to unarchive them we'll start the whole process over again
-
-                       q("UPDATE `contact` SET `archive` = 1 WHERE `id` = %d",
-                               intval($contact['id'])
-                       );
-
-                       if ($contact['url'] != '') {
-                               q("UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'",
-                                       dbesc(normalise_link($contact['url']))
-                               );
-                       }
-               }
-       }
-
-}
-
-function unmark_for_death($contact) {
-
-       $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND (`term-date` > '%s' OR `archive`)",
-               intval($contact['id']),
-               dbesc('1000-00-00 00:00:00')
-       );
-
-       // We don't need to update, we never marked this contact as dead
-       if (!DBM::is_result($r)) {
-               return;
-       }
-
-       // It's a miracle. Our dead contact has inexplicably come back to life.
-       $fields = array('term-date' => NULL_DATE, 'archive' => false);
-       dba::update('contact', $fields, array('id' => $contact['id']));
-
-       if ($contact['url'] != '') {
-               dba::update('contact', $fields, array('nurl' => normalise_link($contact['url'])));
-       }
-}
-
-/**
- * @brief Get contact data for a given profile link
- *
- * The function looks at several places (contact table and gcontact table) for the contact
- * It caches its result for the same script execution to prevent duplicate calls
- *
- * @param string $url The profile link
- * @param int $uid User id
- * @param array $default If not data was found take this data as default value
- *
- * @return array Contact data
- */
-function get_contact_details_by_url($url, $uid = -1, $default = array()) {
-       static $cache = array();
-
-       if ($url == '') {
-               return $default;
-       }
-
-       if ($uid == -1) {
-               $uid = local_user();
-       }
-
-       if (isset($cache[$url][$uid])) {
-               return $cache[$url][$uid];
-       }
-
-       $ssl_url = str_replace('http://', 'https://', $url);
-
-       // Fetch contact data from the contact table for the given user
-       $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
-               FROM `contact` WHERE `nurl` = ? AND `uid` = ?",
-                       normalise_link($url), $uid);
-       $r = dba::inArray($s);
-
-       // Fetch contact data from the contact table for the given user, checking with the alias
-       if (!DBM::is_result($r)) {
-               $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                               `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
-                       FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ?",
-                               normalise_link($url), $url, $ssl_url, $uid);
-               $r = dba::inArray($s);
-       }
-
-       // Fetch the data from the contact table with "uid=0" (which is filled automatically)
-       if (!DBM::is_result($r)) {
-               $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
-                       FROM `contact` WHERE `nurl` = ? AND `uid` = 0",
-                               normalise_link($url));
-               $r = dba::inArray($s);
-       }
-
-       // Fetch the data from the contact table with "uid=0" (which is filled automatically) - checked with the alias
-       if (!DBM::is_result($r)) {
-               $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
-                       FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = 0",
-                               normalise_link($url), $url, $ssl_url);
-               $r = dba::inArray($s);
-       }
-
-       // Fetch the data from the gcontact table
-       if (!DBM::is_result($r)) {
-               $s = dba::p("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `zid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, '' AS `xmpp`,
-                       `keywords`, `gender`, `photo`, `photo` AS `thumb`, `photo` AS `micro`, `community` AS `forum`, 0 AS `prv`, `community`, `contact-type`, `birthday`, 0 AS `self`
-                       FROM `gcontact` WHERE `nurl` = ?",
-                               normalise_link($url));
-               $r = dba::inArray($s);
-       }
-
-       if (DBM::is_result($r)) {
-               // If there is more than one entry we filter out the connector networks
-               if (count($r) > 1) {
-                       foreach ($r AS $id => $result) {
-                               if ($result["network"] == NETWORK_STATUSNET) {
-                                       unset($r[$id]);
-                               }
-                       }
-               }
-
-               $profile = array_shift($r);
-
-               // "bd" always contains the upcoming birthday of a contact.
-               // "birthday" might contain the birthday including the year of birth.
-               if ($profile["birthday"] > '0001-01-01') {
-                       $bd_timestamp = strtotime($profile["birthday"]);
-                       $month = date("m", $bd_timestamp);
-                       $day = date("d", $bd_timestamp);
-
-                       $current_timestamp = time();
-                       $current_year = date("Y", $current_timestamp);
-                       $current_month = date("m", $current_timestamp);
-                       $current_day = date("d", $current_timestamp);
-
-                       $profile["bd"] = $current_year."-".$month."-".$day;
-                       $current = $current_year."-".$current_month."-".$current_day;
-
-                       if ($profile["bd"] < $current) {
-                               $profile["bd"] = (++$current_year)."-".$month."-".$day;
-                       }
-               } else {
-                       $profile["bd"] = '0001-01-01';
-               }
-       } else {
-               $profile = $default;
-       }
-
-       if (($profile["photo"] == "") && isset($default["photo"])) {
-               $profile["photo"] = $default["photo"];
-       }
-
-       if (($profile["name"] == "") && isset($default["name"])) {
-               $profile["name"] = $default["name"];
-       }
-
-       if (($profile["network"] == "") && isset($default["network"])) {
-               $profile["network"] = $default["network"];
-       }
-
-       if (($profile["thumb"] == "") && isset($profile["photo"])) {
-               $profile["thumb"] = $profile["photo"];
-       }
-
-       if (($profile["micro"] == "") && isset($profile["thumb"])) {
-               $profile["micro"] = $profile["thumb"];
-       }
-
-       if ((($profile["addr"] == "") || ($profile["name"] == "")) && ($profile["gid"] != 0) &&
-               in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
-               Worker::add(PRIORITY_LOW, "UpdateGContact", $profile["gid"]);
-       }
-
-       // Show contact details of Diaspora contacts only if connected
-       if (($profile["cid"] == 0) && ($profile["network"] == NETWORK_DIASPORA)) {
-               $profile["location"] = "";
-               $profile["about"] = "";
-               $profile["gender"] = "";
-               $profile["birthday"] = '0001-01-01';
-       }
-
-       $cache[$url][$uid] = $profile;
-
-       return $profile;
-}
-
-/**
- * @brief Get contact data for a given address
- *
- * The function looks at several places (contact table and gcontact table) for the contact
- *
- * @param string $addr The profile link
- * @param int $uid User id
- *
- * @return array Contact data
- */
-function get_contact_details_by_addr($addr, $uid = -1) {
-       static $cache = array();
-
-       if ($addr == '') {
-               return array();
-       }
-
-       if ($uid == -1) {
-               $uid = local_user();
-       }
-
-       // Fetch contact data from the contact table for the given user
-       $r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
-               FROM `contact` WHERE `addr` = '%s' AND `uid` = %d",
-                       dbesc($addr), intval($uid));
-
-       // Fetch the data from the contact table with "uid=0" (which is filled automatically)
-       if (!DBM::is_result($r))
-               $r = q("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
-                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
-                       FROM `contact` WHERE `addr` = '%s' AND `uid` = 0",
-                               dbesc($addr));
-
-       // Fetch the data from the gcontact table
-       if (!DBM::is_result($r))
-               $r = q("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `zid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, '' AS `xmpp`,
-                       `keywords`, `gender`, `photo`, `photo` AS `thumb`, `photo` AS `micro`, `community` AS `forum`, 0 AS `prv`, `community`, `contact-type`, `birthday`, 0 AS `self`
-                       FROM `gcontact` WHERE `addr` = '%s'",
-                               dbesc($addr));
-
-       if (!DBM::is_result($r)) {
-               $data = Probe::uri($addr);
-
-               $profile = get_contact_details_by_url($data['url'], $uid);
-       } else {
-               $profile = $r[0];
-       }
-
-       return $profile;
-}
-
-if (! function_exists('contact_photo_menu')) {
-function contact_photo_menu($contact, $uid = 0)
-{
-       $a = get_app();
-
-       $contact_url = '';
-       $pm_url = '';
-       $status_link = '';
-       $photos_link = '';
-       $posts_link = '';
-       $contact_drop_link = '';
-       $poke_link = '';
-
-       if ($uid == 0) {
-               $uid = local_user();
-       }
-
-       if ($contact['uid'] != $uid) {
-               if ($uid == 0) {
-                       $profile_link = zrl($contact['url']);
-                       $menu = Array('profile' => array(t('View Profile'), $profile_link, true));
-
-                       return $menu;
-               }
-
-               $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `network` = '%s' AND `uid` = %d",
-                       dbesc($contact['nurl']), dbesc($contact['network']), intval($uid));
-               if ($r) {
-                       return contact_photo_menu($r[0], $uid);
-               } else {
-                       $profile_link = zrl($contact['url']);
-                       $connlnk = 'follow/?url='.$contact['url'];
-                       $menu = array(
-                               'profile' => array(t('View Profile'), $profile_link, true),
-                               'follow' => array(t('Connect/Follow'), $connlnk, true)
-                       );
-
-                       return $menu;
-               }
-       }
-
-       $sparkle = false;
-       if ($contact['network'] === NETWORK_DFRN) {
-               $sparkle = true;
-               $profile_link = System::baseUrl() . '/redir/' . $contact['id'];
-       } else {
-               $profile_link = $contact['url'];
-       }
-
-       if ($profile_link === 'mailbox') {
-               $profile_link = '';
-       }
-
-       if ($sparkle) {
-               $status_link = $profile_link . '?url=status';
-               $photos_link = $profile_link . '?url=photos';
-               $profile_link = $profile_link . '?url=profile';
-       }
-
-       if (in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA))) {
-               $pm_url = System::baseUrl() . '/message/new/' . $contact['id'];
-       }
-
-       if ($contact['network'] == NETWORK_DFRN) {
-               $poke_link = System::baseUrl() . '/poke/?f=&c=' . $contact['id'];
-       }
-
-       $contact_url = System::baseUrl() . '/contacts/' . $contact['id'];
-
-       $posts_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/posts';
-       $contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1';
-
-       /**
-        * menu array:
-        * "name" => [ "Label", "link", (bool)Should the link opened in a new tab? ]
-        */
-       $menu = array(
-               'status' => array(t("View Status"), $status_link, true),
-               'profile' => array(t("View Profile"), $profile_link, true),
-               'photos' => array(t("View Photos"), $photos_link, true),
-               'network' => array(t("Network Posts"), $posts_link, false),
-               'edit' => array(t("View Contact"), $contact_url, false),
-               'drop' => array(t("Drop Contact"), $contact_drop_link, false),
-               'pm' => array(t("Send PM"), $pm_url, false),
-               'poke' => array(t("Poke"), $poke_link, false),
-       );
-
-
-       $args = array('contact' => $contact, 'menu' => &$menu);
-
-       call_hooks('contact_photo_menu', $args);
-
-       $menucondensed = array();
-
-       foreach ($menu AS $menuname => $menuitem) {
-               if ($menuitem[1] != '') {
-                       $menucondensed[$menuname] = $menuitem;
-               }
-       }
-
-       return $menucondensed;
-}}
-
-
-function random_profile() {
-       $r = q("SELECT `url` FROM `gcontact` WHERE `network` = '%s'
-                               AND `last_contact` >= `last_failure`
-                               AND `updated` > UTC_TIMESTAMP - INTERVAL 1 MONTH
-                       ORDER BY rand() LIMIT 1",
-               dbesc(NETWORK_DFRN));
-
-       if (DBM::is_result($r))
-               return dirname($r[0]['url']);
-       return '';
-}
-
-
-function contacts_not_grouped($uid,$start = 0,$count = 0) {
-
-       if(! $count) {
-               $r = q("select count(*) as total from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) ",
-                       intval($uid),
-                       intval($uid)
-               );
-
-               return $r;
-
-
-       }
-
-       $r = q("select * from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) and blocked = 0 and pending = 0 limit %d, %d",
-               intval($uid),
-               intval($uid),
-               intval($start),
-               intval($count)
-       );
-
-       return $r;
-}
-
-/**
- * @brief Fetch the contact id for a given url and user
- *
- * First lookup in the contact table to find a record matching either `url`, `nurl`,
- * `addr` or `alias`.
- *
- * If there's no record and we aren't looking for a public contact, we quit.
- * If there's one, we check that it isn't time to update the picture else we
- * directly return the found contact id.
- *
- * Second, we probe the provided $url wether it's http://server.tld/profile or
- * nick@server.tld. We quit if we can't get any info back.
- *
- * Third, we create the contact record if it doesn't exist
- *
- * Fourth, we update the existing record with the new data (avatar, alias, nick)
- * if there's any updates
- *
- * @param string $url Contact URL
- * @param integer $uid The user id for the contact (0 = public contact)
- * @param boolean $no_update Don't update the contact
- *
- * @return integer Contact ID
- */
-function get_contact($url, $uid = 0, $no_update = false) {
-       logger("Get contact data for url ".$url." and user ".$uid." - ".System::callstack(), LOGGER_DEBUG);
-
-       $data = array();
-       $contact_id = 0;
-
-       if ($url == '') {
-               return 0;
-       }
-
-       // We first try the nurl (http://server.tld/nick), most common case
-       $contact = dba::select('contact', array('id', 'avatar-date'), array('nurl' => normalise_link($url), 'uid' => $uid), array('limit' => 1));
-
-       // Then the addr (nick@server.tld)
-       if (!DBM::is_result($contact)) {
-               $contact = dba::select('contact', array('id', 'avatar-date'), array('addr' => $url, 'uid' => $uid), array('limit' => 1));
-       }
-
-       // Then the alias (which could be anything)
-       if (!DBM::is_result($contact)) {
-               // The link could be provided as http although we stored it as https
-               $ssl_url = str_replace('http://', 'https://', $url);
-               $r = dba::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ? LIMIT 1",
-                               $url, normalise_link($url), $ssl_url, $uid);
-               $contact = dba::fetch($r);
-               dba::close($r);
-       }
-
-       if (DBM::is_result($contact)) {
-               $contact_id = $contact["id"];
-
-               // Update the contact every 7 days
-               $update_contact = ($contact['avatar-date'] < datetime_convert('','','now -7 days'));
-
-               // We force the update if the avatar is empty
-               if ($contact['avatar'] == '') {
-                       $update_contact = true;
-               }
-
-               if (!$update_contact || $no_update) {
-                       return $contact_id;
-               }
-       } elseif ($uid != 0) {
-               // Non-existing user-specific contact, exiting
-               return 0;
-       }
-
-       $data = Probe::uri($url, "", $uid);
-
-       // Last try in gcontact for unsupported networks
-       if (!in_array($data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_PUMPIO, NETWORK_MAIL))) {
-               if ($uid != 0) {
-                       return 0;
-               }
-
-               // Get data from the gcontact table
-               $gcontacts = dba::select('gcontact', array('name', 'nick', 'url', 'photo', 'addr', 'alias', 'network'),
-                                               array('nurl' => normalise_link($url)), array('limit' => 1));
-               if (!DBM::is_result($gcontacts)) {
-                       return 0;
-               }
-
-               $data = array_merge($data, $gcontacts);
-       }
-
-       if (!$contact_id && ($data["alias"] != '') && ($data["alias"] != $url)) {
-               $contact_id = get_contact($data["alias"], $uid, true);
-       }
-
-       $url = $data["url"];
-       if (!$contact_id) {
-               dba::insert('contact', array('uid' => $uid, 'created' => datetime_convert(), 'url' => $data["url"],
-                                       'nurl' => normalise_link($data["url"]), 'addr' => $data["addr"],
-                                       'alias' => $data["alias"], 'notify' => $data["notify"], 'poll' => $data["poll"],
-                                       'name' => $data["name"], 'nick' => $data["nick"], 'photo' => $data["photo"],
-                                       'keywords' => $data["keywords"], 'location' => $data["location"], 'about' => $data["about"],
-                                       'network' => $data["network"], 'pubkey' => $data["pubkey"],
-                                       'rel' => CONTACT_IS_SHARING, 'priority' => $data["priority"],
-                                       'batch' => $data["batch"], 'request' => $data["request"],
-                                       'confirm' => $data["confirm"], 'poco' => $data["poco"],
-                                       'name-date' => datetime_convert(), 'uri-date' => datetime_convert(),
-                                       'avatar-date' => datetime_convert(), 'writable' => 1, 'blocked' => 0,
-                                       'readonly' => 0, 'pending' => 0));
-
-               $contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2",
-                               dbesc(normalise_link($data["url"])),
-                               intval($uid));
-               if (!DBM::is_result($contacts)) {
-                       return 0;
-               }
-
-               $contact_id = $contacts[0]["id"];
-
-               // Update the newly created contact from data in the gcontact table
-               $gcontact = dba::select('gcontact', array('location', 'about', 'keywords', 'gender'),
-                                       array('nurl' => normalise_link($data["url"])), array('limit' => 1));
-               if (DBM::is_result($gcontact)) {
-                       // Only use the information when the probing hadn't fetched these values
-                       if ($data['keywords'] != '') {
-                               unset($gcontact['keywords']);
-                       }
-                       if ($data['location'] != '') {
-                               unset($gcontact['location']);
-                       }
-                       if ($data['about'] != '') {
-                               unset($gcontact['about']);
-                       }
-                       dba::update('contact', $gcontact, array('id' => $contact_id));
-               }
-
-               if (count($contacts) > 1 && $uid == 0 && $contact_id != 0 && $data["url"] != "") {
-                       dba::delete('contact', array("`nurl` = ? AND `uid` = 0 AND `id` != ? AND NOT `self`",
-                               normalise_link($data["url"]), $contact_id));
-               }
-       }
-
-       require_once "Photo.php";
-
-       update_contact_avatar($data["photo"], $uid, $contact_id);
-
-       $contact = dba::select('contact', array('url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date'),
-                               array('id' => $contact_id), array('limit' => 1));
-
-       // This condition should always be true
-       if (!DBM::is_result($contact)) {
-               return $contact_id;
-       }
-
-       $updated = array('addr' => $data['addr'],
-                       'alias' => $data['alias'],
-                       'url' => $data['url'],
-                       'nurl' => normalise_link($data['url']),
-                       'name' => $data['name'],
-                       'nick' => $data['nick']);
-
-       if ($data['keywords'] != '') {
-               $updated['keywords'] = $data['keywords'];
-       }
-       if ($data['location'] != '') {
-               $updated['location'] = $data['location'];
-       }
-       if ($data['about'] != '') {
-               $updated['about'] = $data['about'];
-       }
-
-       if (($data["addr"] != $contact["addr"]) || ($data["alias"] != $contact["alias"])) {
-               $updated['uri-date'] = datetime_convert();
-       }
-       if (($data["name"] != $contact["name"]) || ($data["nick"] != $contact["nick"])) {
-               $updated['name-date'] = datetime_convert();
-       }
-
-       $updated['avatar-date'] = datetime_convert();
-
-       dba::update('contact', $updated, array('id' => $contact_id), $contact);
-
-       return $contact_id;
-}
-
-/**
- * @brief Checks if the contact is blocked
- *
- * @param int $cid contact id
- *
- * @return boolean Is the contact blocked?
- */
-function blockedContact($cid) {
-       if ($cid == 0) {
-               return false;
-       }
-
-       $blocked = dba::select('contact', array('blocked'), array('id' => $cid), array('limit' => 1));
-       if (!DBM::is_result($blocked)) {
-               return false;
-       }
-       return (bool)$blocked['blocked'];
-}
-
-/**
- * @brief Checks if the contact is hidden
- *
- * @param int $cid contact id
- *
- * @return boolean Is the contact hidden?
- */
-function hiddenContact($cid) {
-       if ($cid == 0) {
-               return false;
-       }
-
-       $hidden = dba::select('contact', array('hidden'), array('id' => $cid), array('limit' => 1));
-       if (!DBM::is_result($hidden)) {
-               return false;
-       }
-       return (bool)$hidden['hidden'];
-}
-
-/**
- * @brief Returns posts from a given gcontact
- *
- * @param App $a argv application class
- * @param int $gcontact_id Global contact
- *
- * @return string posts in HTML
- */
-function posts_from_gcontact(App $a, $gcontact_id) {
-
-       require_once 'include/conversation.php';
-
-       // There are no posts with "uid = 0" with connector networks
-       // This speeds up the query a lot
-       $r = q("SELECT `network` FROM `gcontact` WHERE `id` = %d", dbesc($gcontact_id));
-       if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, "")))
-               $sql = "(`item`.`uid` = 0 OR  (`item`.`uid` = %d AND `item`.`private`))";
-       else
-               $sql = "`item`.`uid` = %d";
-
-       $r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
-                       `author-name` AS `name`, `owner-avatar` AS `photo`,
-                       `owner-link` AS `url`, `owner-avatar` AS `thumb`
-               FROM `item`
-               WHERE `gcontact-id` = %d AND $sql AND
-                       NOT `deleted` AND NOT `moderated` AND `visible`
-               ORDER BY `item`.`created` DESC LIMIT %d, %d",
-               intval($gcontact_id),
-               intval(local_user()),
-               intval($a->pager['start']),
-               intval($a->pager['itemspage'])
-       );
-
-       $o = conversation($a, $r, 'community', false);
-
-       $o .= alt_pager($a, count($r));
-
-       return $o;
-}
-/**
- * @brief Returns posts from a given contact url
- *
- * @param App $a argv application class
- * @param string $contact_url Contact URL
- *
- * @return string posts in HTML
- */
-function posts_from_contact_url(App $a, $contact_url) {
-
-       require_once 'include/conversation.php';
-
-       // There are no posts with "uid = 0" with connector networks
-       // This speeds up the query a lot
-       $r = q("SELECT `network`, `id` AS `author-id`, `contact-type` FROM `contact`
-               WHERE `contact`.`nurl` = '%s' AND `contact`.`uid` = 0",
-               dbesc(normalise_link($contact_url)));
-
-       if (!DBM::is_result($r)) {
-               return '';
-       }
-
-       if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
-               $sql = "(`item`.`uid` = 0 OR (`item`.`uid` = %d AND NOT `item`.`global`))";
-       } else {
-               $sql = "`item`.`uid` = %d";
-       }
-
-       $author_id = intval($r[0]["author-id"]);
-
-       $contact = ($r[0]["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id');
-
-       $r = q(item_query()." AND `item`.`".$contact."` = %d AND ".$sql.
-               " ORDER BY `item`.`created` DESC LIMIT %d, %d",
-               intval($author_id),
-               intval(local_user()),
-               intval($a->pager['start']),
-               intval($a->pager['itemspage'])
-       );
-
-       $o = conversation($a, $r, 'community', false);
-
-       $o .= alt_pager($a, count($r));
-
-       return $o;
-}
-
-/**
- * @brief Returns a formatted location string from the given profile array
- *
- * @param array $profile Profile array (Generated from the "profile" table)
- *
- * @return string Location string
- */
-function formatted_location($profile) {
-       $location = '';
-
-       if($profile['locality'])
-               $location .= $profile['locality'];
-
-       if($profile['region'] && ($profile['locality'] != $profile['region'])) {
-               if($location)
-                       $location .= ', ';
-
-               $location .= $profile['region'];
-       }
-
-       if($profile['country-name']) {
-               if($location)
-                       $location .= ', ';
-
-               $location .= $profile['country-name'];
-       }
-
-       return $location;
-}
-
-/**
- * @brief Returns the account type name
- *
- * The function can be called with either the user or the contact array
- *
- * @param array $contact contact or user array
- */
-function account_type($contact) {
-
-       // There are several fields that indicate that the contact or user is a forum
-       // "page-flags" is a field in the user table,
-       // "forum" and "prv" are used in the contact table. They stand for PAGE_COMMUNITY and PAGE_PRVGROUP.
-       // "community" is used in the gcontact table and is true if the contact is PAGE_COMMUNITY or PAGE_PRVGROUP.
-       if((isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_COMMUNITY))
-               || (isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_PRVGROUP))
-               || (isset($contact['forum']) && intval($contact['forum']))
-               || (isset($contact['prv']) && intval($contact['prv']))
-               || (isset($contact['community']) && intval($contact['community'])))
-               $type = ACCOUNT_TYPE_COMMUNITY;
-       else
-               $type = ACCOUNT_TYPE_PERSON;
-
-       // The "contact-type" (contact table) and "account-type" (user table) are more general then the chaos from above.
-       if (isset($contact["contact-type"]))
-               $type = $contact["contact-type"];
-       if (isset($contact["account-type"]))
-               $type = $contact["account-type"];
-
-       switch($type) {
-               case ACCOUNT_TYPE_ORGANISATION:
-                       $account_type = t("Organisation");
-                       break;
-               case ACCOUNT_TYPE_NEWS:
-                       $account_type = t('News');
-                       break;
-               case ACCOUNT_TYPE_COMMUNITY:
-                       $account_type = t("Forum");
-                       break;
-               default:
-                       $account_type = "";
-                       break;
-       }
-
-       return $account_type;
-}
index a18a1b33a7a358da820552b54544b18e97969c1f..ef75d416f6f43a45eef554f4fba06450444d7b14 100644 (file)
@@ -8,6 +8,7 @@ use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 
 require_once "include/contact_selectors.php";
 require_once "include/contact_widgets.php";
@@ -691,7 +692,7 @@ function acl_lookup(App $a, $out_type = 'json') {
                );
                if (DBM::is_result($r)) {
                        foreach ($r as $row) {
-                               $contact = get_contact_details_by_url($row['author-link']);
+                               $contact = Contact::getDetailsByURL($row['author-link']);
 
                                if (count($contact) > 0) {
                                        $unknown_contacts[] = array(
index d25aeb8c5e85fea64c36fd500f73c9f89df0cc54..2cfdcf0241d1f12563e9c67b53d8018fc53e76f5 100644 (file)
@@ -12,6 +12,7 @@ use Friendica\Core\Config;
 use Friendica\Core\NotificationsManager;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\Diaspora;
 use Friendica\Util\XML;
 
@@ -649,7 +650,7 @@ function api_get_user(App $a, $contact_id = null, $type = "json")
                                'notifications' => false,
                                'statusnet_profile_url' => $r[0]["url"],
                                'uid' => 0,
-                               'cid' => get_contact($r[0]["url"], api_user(), true),
+                               'cid' => Contact::getIdForURL($r[0]["url"], api_user(), true),
                                'self' => 0,
                                'network' => $r[0]["network"],
                        );
@@ -737,7 +738,7 @@ function api_get_user(App $a, $contact_id = null, $type = "json")
 
        $network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
 
-       $pcontact_id  = get_contact($uinfo[0]['url'], 0, true);
+       $pcontact_id  = Contact::getIdForURL($uinfo[0]['url'], 0, true);
 
        $ret = array(
                'id' => intval($pcontact_id),
index 20309b9d2000591fe3ee86196b39f0d8ca98df85..3b1540473a31d2172218056afe68eafff56accd5 100644 (file)
@@ -3,6 +3,7 @@
 use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 
 use League\HTMLToMarkdown\HtmlConverter;
 
@@ -23,7 +24,7 @@ function diaspora_mention2bb($match) {
                return;
        }
 
-       $data = get_contact_details_by_addr($match[2]);
+       $data = Contact::getDetailsByAddr($match[2]);
 
        $name = $match[1];
 
@@ -96,7 +97,7 @@ function diaspora2bb($s) {
  */
 function diaspora_mentions($match) {
 
-       $contact = get_contact_details_by_url($match[3]);
+       $contact = Contact::getDetailsByURL($match[3]);
 
        if (!x($contact, 'addr')) {
                $contact = Probe::uri($match[3]);
index 89311e7755e75cb92079e6bd2fb6f18e970b3221..83ea3fcfa61d9ef9500c87c4de90cf167efe305e 100644 (file)
@@ -5,12 +5,12 @@ use Friendica\Content\Smilies;
 use Friendica\Core\Cache;
 use Friendica\Core\System;
 use Friendica\Core\Config;
+use Friendica\Object\Contact;
 
 require_once 'include/oembed.php';
 require_once 'include/event.php';
 require_once 'include/map.php';
 require_once 'mod/proxy.php';
-require_once 'include/Contact.php';
 require_once 'include/plaintext.php';
 
 function bb_PictureCacheExt($matches) {
@@ -492,9 +492,9 @@ function bb_ShareAttributes($share, $simplehtml) {
        // We only call this so that a previously unknown contact can be added.
        // This is important for the function "get_contact_details_by_url".
        // This function then can fetch an entry from the contact table.
-       get_contact($profile, 0);
+       Contact::getIdForURL($profile, 0);
 
-       $data = get_contact_details_by_url($profile);
+       $data = Contact::getDetailsByURL($profile);
 
        if (isset($data["name"]) && ($data["name"] != "") && isset($data["addr"]) && ($data["addr"] != ""))
                $userid_compact = $data["name"]." (".$data["addr"].")";
index efb258ecaea215856b4056fe07140c9e8f592d62..5108eaf72390b9fec662031590ec0fba3e78e6da 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 
-use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
@@ -22,8 +21,6 @@ function follow_widget($value = "") {
 }
 
 function findpeople_widget() {
-       require_once 'include/Contact.php';
-
        $a = get_app();
        $global_dir = Config::get('system', 'directory');
 
index 218d7405b59ef66b0f7204e8bcfaf9730f191706..5e764e67069489dd31486ff9e2dc7ae42dd74a6f 100644 (file)
@@ -4,11 +4,12 @@
  */
 use Friendica\App;
 use Friendica\Core\Config;
-use Friendica\Core\Conversation;
-use Friendica\Core\Item;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
+use Friendica\Object\Conversation;
+use Friendica\Object\Item;
 
 require_once "include/bbcode.php";
 require_once "include/acl_selectors.php";
@@ -512,7 +513,6 @@ if (!function_exists('conversation')) {
 function conversation(App $a, $items, $mode, $update, $preview = false) {
 
        require_once 'include/bbcode.php';
-       require_once 'include/Contact.php';
        require_once 'mod/proxy.php';
 
        $ssl_state = ((local_user()) ? true : false);
@@ -733,7 +733,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                }
 
                                if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) {
-                                       $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
+                                       $author_contact = Contact::getDetailsByURL($item['author-link'], $profile_owner);
                                        if ($author_contact["thumb"]) {
                                                $item['author-thumb'] = $author_contact["thumb"];
                                        } else {
@@ -742,7 +742,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                }
 
                                if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
-                                       $owner_contact = get_contact_details_by_url($item['owner-link'], $profile_owner);
+                                       $owner_contact = Contact::getDetailsByURL($item['owner-link'], $profile_owner);
                                        if ($owner_contact["thumb"]) {
                                                $item['owner-thumb'] = $owner_contact["thumb"];
                                        } else {
index 6991a8dcc9e64b0912e8dab0030a2d76853bfbdc..96a97813353fb8411e8ba656034b0d2fd1b4765d 100644 (file)
@@ -10,6 +10,7 @@ use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/ForumManager.php';
 require_once 'include/bbcode.php';
@@ -345,7 +346,7 @@ function profile_sidebar($profile, $block = 0)
        }
 
        // Fetch the account type
-       $account_type = account_type($profile);
+       $account_type = Contact::getAccountType($profile);
 
        if ((x($profile, 'address') == 1)
                || (x($profile, 'location') == 1)
index ed2204f608db4a79197f6a0c783ebf966f742e58..1f5511217404d61b8f1d5b35e6ea05a0fd82e2a6 100644 (file)
@@ -12,6 +12,7 @@ use Friendica\Core\Worker;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 use Friendica\Protocol\DFRN;
 use Friendica\Protocol\OStatus;
 use Friendica\Util\Lock;
@@ -28,7 +29,6 @@ require_once 'include/email.php';
 require_once 'include/threads.php';
 require_once 'include/plaintext.php';
 require_once 'include/feed.php';
-require_once 'include/Contact.php';
 require_once 'mod/share.php';
 require_once 'include/enotify.php';
 require_once 'include/group.php';
@@ -718,12 +718,12 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
                 * This is done only for comments (See below explanation at "gcontact-id")
                 */
                if ($arr['parent-uri'] != $arr['uri']) {
-                       $arr["contact-id"] = get_contact($arr['author-link'], $uid);
+                       $arr["contact-id"] = Contact::getIdForURL($arr['author-link'], $uid);
                }
 
                // If not present then maybe the owner was found
                if ($arr["contact-id"] == 0) {
-                       $arr["contact-id"] = get_contact($arr['owner-link'], $uid);
+                       $arr["contact-id"] = Contact::getIdForURL($arr['owner-link'], $uid);
                }
 
                // Still missing? Then use the "self" contact of the current user
@@ -754,19 +754,19 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
        }
 
        if ($arr["author-id"] == 0) {
-               $arr["author-id"] = get_contact($arr["author-link"], 0);
+               $arr["author-id"] = Contact::getIdForURL($arr["author-link"], 0);
        }
 
-       if (blockedContact($arr["author-id"])) {
+       if (Contact::isBlocked($arr["author-id"])) {
                logger('Contact '.$arr["author-id"].' is blocked, item '.$arr["uri"].' will not be stored');
                return 0;
        }
 
        if ($arr["owner-id"] == 0) {
-               $arr["owner-id"] = get_contact($arr["owner-link"], 0);
+               $arr["owner-id"] = Contact::getIdForURL($arr["owner-link"], 0);
        }
 
-       if (blockedContact($arr["owner-id"])) {
+       if (Contact::isBlocked($arr["owner-id"])) {
                logger('Contact '.$arr["owner-id"].' is blocked, item '.$arr["uri"].' will not be stored');
                return 0;
        }
@@ -1750,7 +1750,7 @@ function lose_follower($importer, $contact, array $datarray = array(), $item = "
        if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) {
                dba::update('contact', array('rel' => CONTACT_IS_SHARING), array('id' => $contact['id']));
        } else {
-               contact_remove($contact['id']);
+               Contact::remove($contact['id']);
        }
 }
 
@@ -1759,7 +1759,7 @@ function lose_sharer($importer, $contact, array $datarray = array(), $item = "")
        if (($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) {
                dba::update('contact', array('rel' => CONTACT_IS_FOLLOWER), array('id' => $contact['id']));
        } else {
-               contact_remove($contact['id']);
+               Contact::remove($contact['id']);
        }
 }
 
index 5e05121f6986f31e88f1cac5308be765fc993804..e6f1aab6de11220ed185c91ed8703b718bcacf78 100644 (file)
@@ -4,6 +4,7 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\Diaspora;
 
 /**
@@ -115,7 +116,7 @@ function do_like($item_id, $verb) {
                $item_contact_id = $owner_self_contact['id'];
                $item_contact = $owner_self_contact;
        } else {
-               $item_contact_id = get_contact($author_contact['url'], $item['uid']);
+               $item_contact_id = Contact::getIdForURL($author_contact['url'], $item['uid']);
 
                $contacts = q("SELECT * FROM `contact` WHERE `id` = %d",
                        intval($item_contact_id)
index 8a346b7a28d11a31a39bc1051743d7c73d80e69b..f67c064daf2f527f21bd9b5aed2e2523b80a9b83 100644 (file)
@@ -6,6 +6,7 @@
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 
 /**
  * @brief Calls the post update functions
@@ -209,8 +210,8 @@ function post_update_1198() {
 
        // Set the "gcontact-id" in the item table and add a new gcontact entry if needed
        foreach ($item_arr AS $item) {
-               $author_id = get_contact($item["author-link"], 0);
-               $owner_id = get_contact($item["owner-link"], 0);
+               $author_id = Contact::getIdForURL($item["author-link"], 0);
+               $owner_id = Contact::getIdForURL($item["owner-link"], 0);
 
                if ($author_id == 0)
                        $author_id = -1;
index 16d4915fdf1fe70923fcf9caf8b4f3f83752a8fd..107f2f76b13e3a79d0b12ce31cf7d7c695bc755d 100644 (file)
@@ -3,6 +3,7 @@
 use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 function add_thread($itemid, $onlyshadow = false) {
        $items = q("SELECT `uid`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`,
@@ -58,7 +59,7 @@ function add_shadow_thread($itemid) {
        }
 
        // Is the public contact configured as hidden?
-        if (hiddenContact($item["owner-id"]) || hiddenContact($item["author-id"])) {
+        if (Contact::isHidden($item["owner-id"]) || Contact::isHidden($item["author-id"])) {
                 return;
         }
 
@@ -98,13 +99,12 @@ function add_shadow_thread($itemid) {
                if (!DBM::is_result($r)) {
                        // Preparing public shadow (removing user specific data)
                        require_once("include/items.php");
-                       require_once("include/Contact.php");
 
                        unset($item[0]['id']);
                        $item[0]['uid'] = 0;
                        $item[0]['origin'] = 0;
                        $item[0]['wall'] = 0;
-                       $item[0]['contact-id'] = get_contact($item[0]['author-link'], 0);
+                       $item[0]['contact-id'] = Contact::getIdForURL($item[0]['author-link'], 0);
 
                        if (in_array($item[0]['type'], array("net-comment", "wall-comment"))) {
                                $item[0]['type'] = 'remote-comment';
@@ -158,13 +158,12 @@ function add_shadow_entry($itemid) {
 
        // Preparing public shadow (removing user specific data)
        require_once("include/items.php");
-       require_once("include/Contact.php");
 
        unset($item['id']);
        $item['uid'] = 0;
        $item['origin'] = 0;
        $item['wall'] = 0;
-       $item['contact-id'] = get_contact($item['author-link'], 0);
+       $item['contact-id'] = Contact::getIdForURL($item['author-link'], 0);
 
        if (in_array($item['type'], array("net-comment", "wall-comment"))) {
                $item['type'] = 'remote-comment';
index 5e8860afd32dc7438f5767eb2b5ea6370df9757d..0290a38be7392666144dd9a4d759915b09ce7ab1 100644 (file)
--- a/index.php
+++ b/index.php
@@ -9,7 +9,7 @@
  */
 
 use Friendica\App;
-use Friendica\Core\BaseObject;
+use Friendica\BaseObject;
 use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
index 7bb683fe8dde68f7c0da6fc8a4ac60a94e1f5c3b..4b3e01b3d4688a07e3910c6104bb049d420a339c 100644 (file)
@@ -11,10 +11,11 @@ use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Model\User;
 
-require_once("include/enotify.php");
-require_once("include/text.php");
-require_once('include/items.php');
+require_once 'include/enotify.php';
+require_once 'include/text.php';
+require_once 'include/items.php';
 
 /**
  * @brief Process send data from the admin panels subpages
@@ -1443,9 +1444,8 @@ function admin_page_users_post(App $a) {
                notice(sprintf(tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)));
        }
        if (x($_POST,'page_users_delete')) {
-               require_once("include/Contact.php");
                foreach ($users as $uid) {
-                       user_remove($uid);
+                       User::remove($uid);
                }
                notice(sprintf(tt("%s user deleted", "%s users deleted", count($users)), count($users)));
        }
@@ -1491,8 +1491,7 @@ function admin_page_users(App $a) {
                        case "delete":
                                check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
                                // delete user
-                               require_once("include/Contact.php");
-                               user_remove($uid);
+                               User::remove($uid);
 
                                notice(sprintf(t("User '%s' deleted"), $user[0]['username']).EOL);
                                break;
index 0a6989e4d01ea9a85b6e88fa887d02483c5f8b5b..3cfe6c0f9efaa164cea1710ad55d02f438bade50 100644 (file)
@@ -6,8 +6,8 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 require_once 'mod/contacts.php';
 
@@ -39,7 +39,7 @@ function allfriends_content(App $a) {
        }
 
        $a->page['aside'] = "";
-       profile_load($a, "", 0, get_contact_details_by_url($c[0]["url"]));
+       profile_load($a, "", 0, Contact::getDetailsByURL($c[0]["url"]));
 
        $total = GlobalContact::countAllFriends(local_user(), $cid);
 
@@ -58,7 +58,7 @@ function allfriends_content(App $a) {
        foreach ($r as $rr) {
 
                //get further details of the contact
-               $contact_details = get_contact_details_by_url($rr['url'], $uid, $rr);
+               $contact_details = Contact::getDetailsByURL($rr['url'], $uid, $rr);
 
                $photo_menu = '';
 
@@ -66,7 +66,7 @@ function allfriends_content(App $a) {
                // If the contact is not common to the user, Connect/Follow' will be added to the photo menu
                if ($rr[cid]) {
                        $rr[id] = $rr[cid];
-                       $photo_menu = contact_photo_menu ($rr);
+                       $photo_menu = Contact::photoMenu ($rr);
                }
                else {
                        $connlnk = System::baseUrl() . '/follow/?url=' . $rr['url'];
@@ -85,7 +85,7 @@ function allfriends_content(App $a) {
                        'details'      => $contact_details['location'],
                        'tags'         => $contact_details['keywords'],
                        'about'        => $contact_details['about'],
-                       'account_type' => account_type($contact_details),
+                       'account_type' => Contact::getAccountType($contact_details),
                        'network'      => network_to_name($contact_details['network'], $contact_details['url']),
                        'photo_menu'   => $photo_menu,
                        'conntxt'      => t('Connect'),
index 1bfc8d95d9560ddd4c7f321f14026ca14bcbea89..170e7ea4c2f44dc55a8383f037b41280bdd1a4be 100644 (file)
@@ -11,9 +11,10 @@ use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
-require_once('include/event.php');
-require_once('include/redir.php');
+require_once 'include/event.php';
+require_once 'include/redir.php';
 
 function cal_init(App $a) {
        if($a->argc > 1)
@@ -46,7 +47,7 @@ function cal_init(App $a) {
 
                $profile = get_profiledata_by_nick($nick, $a->profile_uid);
 
-               $account_type = account_type($profile);
+               $account_type = Contact::getAccountType($profile);
 
                $tpl = get_markup_template("vcard-widget.tpl");
 
index ab5343093aace40cc0b470968ee485c7b60c3279..9933c3f51fc2178a76a47bb9ef52f91d90852307 100644 (file)
@@ -5,8 +5,8 @@
 use Friendica\App;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 require_once 'mod/contacts.php';
 
@@ -39,7 +39,7 @@ function common_content(App $a) {
                );
                /// @TODO Handle $c with DBM::is_result()
                $a->page['aside'] = "";
-               profile_load($a, "", 0, get_contact_details_by_url($c[0]["url"]));
+               profile_load($a, "", 0, Contact::getDetailsByURL($c[0]["url"]));
        } else {
                $c = q("SELECT `name`, `url`, `photo` FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
                        intval($uid)
@@ -114,14 +114,14 @@ function common_content(App $a) {
        foreach ($r as $rr) {
 
                //get further details of the contact
-               $contact_details = get_contact_details_by_url($rr['url'], $uid);
+               $contact_details = Contact::getDetailsByURL($rr['url'], $uid);
 
                // $rr['id'] is needed to use contact_photo_menu()
                /// @TODO Adding '/" here avoids E_NOTICE on missing constants
                $rr['id'] = $rr['cid'];
 
                $photo_menu = '';
-               $photo_menu = contact_photo_menu($rr);
+               $photo_menu = Contact::photoMenu($rr);
 
                $entry = array(
                        'url'          => $rr['url'],
@@ -132,7 +132,7 @@ function common_content(App $a) {
                        'details'      => $contact_details['location'],
                        'tags'         => $contact_details['keywords'],
                        'about'        => $contact_details['about'],
-                       'account_type' => account_type($contact_details),
+                       'account_type' => Contact::getAccountType($contact_details),
                        'network'      => network_to_name($contact_details['network'], $contact_details['url']),
                        'photo_menu'   => $photo_menu,
                        'id'           => ++$id,
index 10a4f6b1b852cf8b1aecabbd23a49568e5e1bf80..1859c2aa60fa4659452b3f3711192dd69e41455a 100644 (file)
@@ -6,8 +6,8 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 require_once 'mod/proxy.php';
 require_once 'include/Photo.php';
@@ -58,7 +58,7 @@ function contacts_init(App $a) {
                        '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""),
                        '$network_name' => $networkname,
                        '$network' => t('Network:'),
-                       '$account_type' => account_type($a->data['contact'])
+                       '$account_type' => Contact::getAccountType($a->data['contact'])
                ));
 
                $finpeople_widget = '';
@@ -131,7 +131,7 @@ function contacts_batch_actions(App $a) {
                        if ($r) $count_actions++;
                }
                if (x($_POST, 'contacts_batch_drop')) {
-                       _contact_drop($contact_id, $orig_record);
+                       _contact_drop($orig_record);
                        $count_actions++;
                }
        }
@@ -346,7 +346,9 @@ function _contact_archive($contact_id, $orig_record) {
        }
        return $r;
 }
-function _contact_drop($contact_id, $orig_record) {
+
+function _contact_drop($orig_record)
+{
        $a = get_app();
 
        $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid`
@@ -357,9 +359,8 @@ function _contact_drop($contact_id, $orig_record) {
                return;
        }
 
-       $self = ""; // Unused parameter
-       terminate_friendship($r[0], $self, $orig_record);
-       contact_remove($orig_record['id']);
+       Contact::terminateFriendship($r[0], $orig_record);
+       Contact::remove($orig_record['id']);
 }
 
 
@@ -479,7 +480,7 @@ function contacts_content(App $a) {
                                }
                        }
 
-                       _contact_drop($contact_id, $orig_record[0]);
+                       _contact_drop($orig_record[0]);
                        info( t('Contact has been removed.') . EOL );
                        if (x($_SESSION,'return_url')) {
                                goaway('' . $_SESSION['return_url']);
@@ -653,7 +654,7 @@ function contacts_content(App $a) {
                        '$url' => $url,
                        '$profileurllabel' => t('Profile URL'),
                        '$profileurl' => $contact['url'],
-                       '$account_type' => account_type($contact),
+                       '$account_type' => Contact::getAccountType($contact),
                        '$location' => bbcode($contact["location"]),
                        '$location_label' => t("Location:"),
                        '$xmpp' => bbcode($contact["xmpp"]),
@@ -916,7 +917,7 @@ function contact_posts($a, $contact_id) {
        if ($r) {
                $contact = $r[0];
                $a->page['aside'] = "";
-               profile_load($a, "", 0, get_contact_details_by_url($contact["url"]));
+               profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
        } else
                $profile = "";
 
@@ -924,7 +925,7 @@ function contact_posts($a, $contact_id) {
 
        $o .= $tab_str;
 
-       $o .= posts_from_contact_url($a, $contact["url"]);
+       $o .= Contact::getPostsFromUrl($contact["url"]);
 
        return $o;
 }
@@ -959,14 +960,14 @@ function _contact_detail_for_template($rr){
        return array(
                'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
                'edit_hover' => t('Edit contact'),
-               'photo_menu' => contact_photo_menu($rr),
+               'photo_menu' => Contact::photoMenu($rr),
                'id' => $rr['id'],
                'alt_text' => $alt_text,
                'dir_icon' => $dir_icon,
                'thumb' => proxy_url($rr['thumb'], false, PROXY_SIZE_THUMB),
                'name' => htmlentities($rr['name']),
                'username' => htmlentities($rr['name']),
-               'account_type' => account_type($rr),
+               'account_type' => Contact::getAccountType($rr),
                'sparkle' => $sparkle,
                'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']),
                'url' => $url,
index a73429e157e3f7b918c983d302a86b89bfb4d586..754078316fba9c0d9c5d99477a14e62348f2cdb5 100644 (file)
@@ -3,9 +3,10 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
-require_once("include/contact_selectors.php");
-require_once("mod/contacts.php");
+require_once 'include/contact_selectors.php';
+require_once 'mod/contacts.php';
 
 function crepair_init(App $a) {
        if (! local_user()) {
@@ -31,7 +32,7 @@ function crepair_init(App $a) {
        if($contact_id) {
                $a->data['contact'] = $r[0];
                $contact = $r[0];
-               profile_load($a, "", 0, get_contact_details_by_url($contact["url"]));
+               profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
        }
 }
 
index 15cda13adf6c43ceb38c281ddf4a2a78909135ae..8e2b18e4963f14bbd131abf8a0983d1f5df69573 100644 (file)
@@ -9,6 +9,7 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\DFRN;
 
 require_once 'include/items.php';
@@ -127,13 +128,8 @@ function dfrn_notify_post(App $a) {
        logger('dfrn_notify: data: ' . $data, LOGGER_DATA);
 
        if ($dissolve == 1) {
-
-               /*
-                * Relationship is dissolved permanently
-                */
-
-               require_once('include/Contact.php');
-               contact_remove($importer['id']);
+               // Relationship is dissolved permanently
+               Contact::remove($importer['id']);
                logger('relationship dissolved : ' . $importer['name'] . ' dissolved ' . $importer['username']);
                xml_status(0, 'relationship dissolved');
        }
index b32a58b359d71fd58617cfed9ca7d5d85b8a88d5..4ce919b08bd40ae46ff8e5dd7143ab0fc70f706b 100644 (file)
@@ -3,6 +3,7 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 function directory_init(App $a) {
        $a->set_pager_itemspage(60);
@@ -161,7 +162,7 @@ function directory_content(App $a) {
                                'img_hover' => $rr['name'],
                                'name' => $rr['name'],
                                'details' => $details,
-                               'account_type' => account_type($rr),
+                               'account_type' => Contact::getAccountType($rr),
                                'profile' => $profile,
                                'location' => $location_e,
                                'tags' => $rr['pub_keywords'],
index 89df7c885f8a506728073f8bcffbd6243404309a..4ba122b566e278f3ac7f72941b2e0f97a09184ca 100644 (file)
@@ -8,10 +8,10 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 use Friendica\Protocol\PortableContact;
 
 require_once 'include/contact_widgets.php';
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 require_once 'mod/contacts.php';
 
@@ -75,7 +75,7 @@ function dirfind_content(App $a, $prefix = "") {
                        $objresult->tags = "";
                        $objresult->network = $user_data["network"];
 
-                       $contact = get_contact_details_by_url($user_data["url"], local_user());
+                       $contact = Contact::getDetailsByURL($user_data["url"], local_user());
                        $objresult->cid = $contact["cid"];
 
                        $j->results[] = $objresult;
@@ -149,7 +149,7 @@ function dirfind_content(App $a, $prefix = "") {
                                        continue;
                                }
 
-                               $result = get_contact_details_by_url($result["url"], local_user(), $result);
+                               $result = Contact::getDetailsByURL($result["url"], local_user(), $result);
 
                                if ($result["name"] == "") {
                                        $urlparts = parse_url($result["url"]);
@@ -193,7 +193,7 @@ function dirfind_content(App $a, $prefix = "") {
 
                                $alt_text = "";
 
-                               $contact_details = get_contact_details_by_url($jj->url, local_user());
+                               $contact_details = Contact::getDetailsByURL($jj->url, local_user());
 
                                $itemurl = (($contact_details["addr"] != "") ? $contact_details["addr"] : $jj->url);
 
@@ -204,7 +204,7 @@ function dirfind_content(App $a, $prefix = "") {
                                        $contact = q("SELECT * FROM `contact` WHERE `id` = %d",
                                                        intval($jj->cid));
                                        if ($contact) {
-                                               $photo_menu = contact_photo_menu($contact[0]);
+                                               $photo_menu = Contact::photoMenu($contact[0]);
                                                $details = _contact_detail_for_template($contact[0]);
                                                $alt_text = $details['alt_text'];
                                        } else {
@@ -234,7 +234,7 @@ function dirfind_content(App $a, $prefix = "") {
                                        'details'       => $contact_details['location'],
                                        'tags'          => $contact_details['keywords'],
                                        'about'         => $contact_details['about'],
-                                       'account_type'  => account_type($contact_details),
+                                       'account_type'  => Contact::getAccountType($contact_details),
                                        'network' => network_to_name($jj->network, $jj->url),
                                        'id' => ++$id,
                                );
index 570582343afb9156c239c881d0f944302b238ed2..e81e654acb5528e2327d9c94a2d5d10c317d01be 100644 (file)
@@ -4,6 +4,7 @@ use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\DFRN;
 
 function display_init(App $a) {
@@ -114,8 +115,6 @@ function display_init(App $a) {
 
 function display_fetchauthor($a, $item) {
 
-       require_once("include/Contact.php");
-
        $profiledata = array();
        $profiledata["uid"] = -1;
        $profiledata["nickname"] = $item["author-name"];
@@ -181,7 +180,7 @@ function display_fetchauthor($a, $item) {
                $profiledata["about"] = "";
        }
 
-       $profiledata = get_contact_details_by_url($profiledata["url"], local_user(), $profiledata);
+       $profiledata = Contact::getDetailsByURL($profiledata["url"], local_user(), $profiledata);
 
        $profiledata["photo"] = System::removedBaseUrl($profiledata["photo"]);
 
index 38ec83dc0f67e5be8954c2c2d8dee1f96e9f9f4b..b5e73ca9a44676be10b9f46d4c820ca4a14891ea 100644 (file)
@@ -4,9 +4,9 @@ use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 
 require_once 'include/follow.php';
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 
 function follow_post(App $a) {
@@ -176,7 +176,7 @@ function follow_content(App $a) {
        ));
 
        $a->page['aside'] = "";
-       profile_load($a, "", 0, get_contact_details_by_url($ret["url"]));
+       profile_load($a, "", 0, Contact::getDetailsByURL($ret["url"]));
 
        if ($gcontact_id <> 0) {
                $o .= replace_macros(get_markup_template('section_title.tpl'),
@@ -184,7 +184,7 @@ function follow_content(App $a) {
                ));
 
                // Show last public posts
-               $o .= posts_from_contact_url($a, $ret["url"]);
+               $o .= Contact::getPostsFromUrl($ret["url"]);
        }
 
        return $o;
index a5a41e26357756b6c0bf9e389fffb436ee5def2a..5542fe5b9837738da8f93fec7b6d525b5c4ae746 100644 (file)
@@ -11,8 +11,7 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Model\GlobalContact;
-
-require_once "include/Contact.php";
+use Friendica\Object\Contact;
 
 function hovercard_init(App $a) {
        // Just for testing purposes
@@ -51,14 +50,14 @@ function hovercard_content() {
        $nurl = normalise_link(GlobalContact::cleanContactUrl($profileurl));
        if($nurl) {
                // Search for contact data
-               $contact = get_contact_details_by_url($nurl);
+               $contact = Contact::getDetailsByURL($nurl);
        }
        if(!is_array($contact))
                return;
 
        // Get the photo_menu - the menu if possible contact actions
        if(local_user())
-               $actions = contact_photo_menu($contact);
+               $actions = Contact::photoMenu($contact);
 
 
        // Move the contact data to the profile array so we can deliver it to
@@ -80,7 +79,7 @@ function hovercard_content() {
 //             'server_url' => $contact["server_url"],
                'bd' => (($contact["birthday"] <= '0001-01-01') ? "" : $contact["birthday"]),
 //             'generation' => $contact["generation"],
-               'account_type' => account_type($contact),
+               'account_type' => Contact::getAccountType($contact),
                'actions' => $actions,
        );
        if($datatype == "html") {
index 2fcaa6c3f23d1cac0a2343b973927eb5a250c91b..8055d63aec2d3e8c82d044871e06807e420c3579 100644 (file)
@@ -22,6 +22,7 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 use Friendica\Protocol\Diaspora;
 
 require_once 'include/crypto.php';
@@ -32,7 +33,6 @@ require_once 'include/files.php';
 require_once 'include/threads.php';
 require_once 'include/text.php';
 require_once 'include/items.php';
-require_once 'include/Contact.php';
 
 function item_post(App $a) {
 
@@ -146,7 +146,7 @@ function item_post(App $a) {
                        $thrparent = q("SELECT `author-link`, `network` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($thr_parent));
                        if (DBM::is_result($thrparent) && ($thrparent[0]["network"] === NETWORK_OSTATUS)
                                && (normalise_link($parent_contact["url"]) != normalise_link($thrparent[0]["author-link"]))) {
-                               $parent_contact = get_contact_details_by_url($thrparent[0]["author-link"]);
+                               $parent_contact = Contact::getDetailsByURL($thrparent[0]["author-link"]);
 
                                if (!isset($parent_contact["nick"])) {
                                        $probed_contact = Probe::uri($thrparent[0]["author-link"]);
@@ -703,11 +703,11 @@ function item_post(App $a) {
        $datarray['owner-name']    = $contact_record['name'];
        $datarray['owner-link']    = $contact_record['url'];
        $datarray['owner-avatar']  = $contact_record['thumb'];
-       $datarray['owner-id']      = get_contact($datarray['owner-link'], 0);
+       $datarray['owner-id']      = Contact::getIdForURL($datarray['owner-link'], 0);
        $datarray['author-name']   = $author['name'];
        $datarray['author-link']   = $author['url'];
        $datarray['author-avatar'] = $author['thumb'];
-       $datarray['author-id']     = get_contact($datarray['author-link'], 0);
+       $datarray['author-id']     = Contact::getIdForURL($datarray['author-link'], 0);
        $datarray['created']       = datetime_convert();
        $datarray['edited']        = datetime_convert();
        $datarray['commented']     = datetime_convert();
index 7258fd9c70d9697d6b5924a8c0e0565353941be8..3a0d10c3191873f05590bdbdf6aece32209bf629 100644 (file)
@@ -6,6 +6,7 @@ use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/text.php';
 require_once 'include/contact_widgets.php';
@@ -86,7 +87,7 @@ function match_content(App $a)
                                                'follow' => array(t("Connect/Follow"), $connlnk)
                                        );
 
-                                       $contact_details = get_contact_details_by_url($jj->url, local_user());
+                                       $contact_details = Contact::getDetailsByURL($jj->url, local_user());
 
                                        $entry = array(
                                                'url' => zrl($jj->url),
@@ -95,7 +96,7 @@ function match_content(App $a)
                                                'details'       => $contact_details['location'],
                                                'tags'          => $contact_details['keywords'],
                                                'about'         => $contact_details['about'],
-                                               'account_type'  => account_type($contact_details),
+                                               'account_type'  => Contact::getAccountType($contact_details),
                                                'thumb' => proxy_url($jj->photo, false, PROXY_SIZE_THUMB),
                                                'inttxt' => ' ' . t('is interested in:'),
                                                'conntxt' => t('Connect'),
index 07145a6bebf51e62c52c23786fd2050819a6b13e..80940c8169767f7008962d069bc7d54390fc8cbf 100644 (file)
@@ -4,6 +4,7 @@ use Friendica\App;
 use Friendica\Content\Smilies;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/acl_selectors.php';
 require_once 'include/message.php';
@@ -461,7 +462,7 @@ function message_content(App $a) {
                                $to_name_e = $message['name'];
                        }
 
-                       $contact = get_contact_details_by_url($message['from-url']);
+                       $contact = Contact::getDetailsByURL($message['from-url']);
                        if (isset($contact["thumb"]))
                                $from_photo = $contact["thumb"];
                        else
@@ -575,7 +576,7 @@ function render_messages(array $msg, $t) {
                        $to_name_e = $rr['name'];
                }
 
-               $contact = get_contact_details_by_url($rr['url']);
+               $contact = Contact::getDetailsByURL($rr['url']);
                if (isset($contact["thumb"]))
                        $from_photo = $contact["thumb"];
                else
index 662c306f597be4df855b44e9bb20d89ac925fac0..ff86e0b9e4b459aa19b37902ffef0d7eac66d71b 100644 (file)
@@ -5,6 +5,7 @@ use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/conversation.php';
 require_once 'include/group.php';
@@ -676,7 +677,7 @@ function networkThreadedView(App $a, $update = 0) {
                                'details' => $r['location'],
                        );
 
-                       $entries[0]["account_type"] = account_type($r);
+                       $entries[0]["account_type"] = Contact::getAccountType($r);
 
                        $o = replace_macros(get_markup_template("viewcontact_template.tpl"),array(
                                'contacts' => $entries,
index e212b30dc16265bd4d00db73c9ba4511d23db0c9..a66a70a1e0cef670d1c3e5ccb425518712bbef18 100644 (file)
@@ -4,8 +4,8 @@
  */
 use Friendica\App;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 
 function nogroup_init(App $a)
@@ -31,20 +31,19 @@ function nogroup_content(App $a)
                return '';
        }
 
-       require_once 'include/Contact.php';
-       $r = contacts_not_grouped(local_user());
+       $r = Contact::getUngroupedList(local_user());
        if (DBM::is_result($r)) {
                $a->set_pager_total($r[0]['total']);
        }
-       $r = contacts_not_grouped(local_user(), $a->pager['start'], $a->pager['itemspage']);
+       $r = Contact::getUngroupedList(local_user(), $a->pager['start'], $a->pager['itemspage']);
        if (DBM::is_result($r)) {
                foreach ($r as $rr) {
-                       $contact_details = get_contact_details_by_url($rr['url'], local_user(), $rr);
+                       $contact_details = Contact::getDetailsByURL($rr['url'], local_user(), $rr);
 
                        $contacts[] = array(
                                'img_hover' => sprintf(t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']),
                                'edit_hover' => t('Edit contact'),
-                               'photo_menu' => contact_photo_menu($rr),
+                               'photo_menu' => Contact::photoMenu($rr),
                                'id' => $rr['id'],
                                'alt_text' => $alt_text,
                                'dir_icon' => $dir_icon,
index 1546bd9a8734715da5758f0e37738cfe7bf38814..6ef256f27a88f9bf1fb297900d6e5adb2a07e3bb 100644 (file)
@@ -6,6 +6,7 @@ use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 
 require_once 'include/Photo.php';
 require_once 'include/photos.php';
@@ -45,7 +46,7 @@ function photos_init(App $a) {
 
                $profile = get_profiledata_by_nick($nick, $a->profile_uid);
 
-               $account_type = account_type($profile);
+               $account_type = Contact::getAccountType($profile);
 
                $tpl = get_markup_template("vcard-widget.tpl");
 
index 00ee848dc419883cd4270074ed2174782598f870..39882d5e39b76f8c8ce27fd2ca5f72c75d704633 100644 (file)
@@ -7,6 +7,7 @@ use Friendica\Core\Cache;
 use Friendica\Core\System;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Util\XML;
 
 require_once 'include/datetime.php';
@@ -349,7 +350,7 @@ function ping_init(App $a)
                                        $notif['message'] = str_replace("{0}", $notif['name'], $notif['message']);
                                }
 
-                               $contact = get_contact_details_by_url($notif['url']);
+                               $contact = Contact::getDetailsByURL($notif['url']);
                                if (isset($contact['micro'])) {
                                        $notif['photo'] = proxy_url($contact['micro'], false, PROXY_SIZE_MICRO);
                                } else {
index bbce17c33b682c1f19b6da559dff9e8087efa6f6..75023beb64180038cc09c15b20cebaa166efba26 100644 (file)
@@ -10,8 +10,7 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
-
-require_once 'include/Contact.php';
+use Friendica\Object\Profile;
 
 function profiles_init(App $a) {
 
@@ -490,7 +489,7 @@ function profiles_post(App $a) {
                }
 
                if ($is_default) {
-                       $location = formatted_location(array("locality" => $locality, "region" => $region, "country-name" => $country_name));
+                       $location = Profile::formatLocation(array("locality" => $locality, "region" => $region, "country-name" => $country_name));
 
                        q("UPDATE `contact` SET `about` = '%s', `location` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `self` AND `uid` = %d",
                                dbesc($about),
index f835780e07146c9c4fac97f7f01bd102a8598e75..38d05c53e4308814b1a85ea28f468afe4dd93646 100644 (file)
@@ -2,11 +2,10 @@
 
 use Friendica\App;
 use Friendica\Core\System;
+use Friendica\Model\GlobalContact;
 
 function randprof_init(App $a) {
-       require_once('include/Contact.php');
-
-       $x = random_profile();
+       $x = GlobalContact::getRandomUrl();
 
        if ($x) {
                goaway(zrl($x));
index 5dcd33e8f57d2f63b8ae01a7648deb1f21bd3e5e..b1ad2e5ca0d2bf8583d403a11e3dff71651b2e7a 100644 (file)
@@ -2,6 +2,7 @@
 
 use Friendica\App;
 use Friendica\Core\System;
+use Friendica\Model\User;
 
 function removeme_post(App $a) {
 
@@ -28,8 +29,7 @@ function removeme_post(App $a) {
        $encrypted = hash('whirlpool',trim($_POST['qxz_password']));
 
        if ((strlen($a->user['password'])) && ($encrypted === $a->user['password'])) {
-               require_once('include/Contact.php');
-               user_remove($a->user['uid']);
+               User::remove($a->user['uid']);
                // NOTREACHED
        }
 
index bb23fc8cba71ae1d26d2de67455e39b7c3a31f66..f05c76cedae20573a43994f4836dc61b68713fc1 100644 (file)
@@ -6,6 +6,7 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
 
 require_once 'include/contact_widgets.php';
 
@@ -87,7 +88,7 @@ function suggest_content(App $a) {
                        'hide' => array(t('Ignore/Hide'), $ignlnk)
                );
 
-               $contact_details = get_contact_details_by_url($rr["url"], local_user(), $rr);
+               $contact_details = Contact::getDetailsByURL($rr["url"], local_user(), $rr);
 
                $entry = array(
                        'url' => zrl($rr['url']),
@@ -98,7 +99,7 @@ function suggest_content(App $a) {
                        'details'       => $contact_details['location'],
                        'tags'          => $contact_details['keywords'],
                        'about'         => $contact_details['about'],
-                       'account_type'  => account_type($contact_details),
+                       'account_type'  => Contact::getAccountType($contact_details),
                        'ignlnk' => $ignlnk,
                        'ignid' => $rr['id'],
                        'conntxt' => t('Connect'),
index 58b4397ca50acfed589024157779101db4a146ac..3f94fb5760eb48ad69986fab4cf162d10019ac21 100644 (file)
@@ -3,9 +3,9 @@
 use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/follow.php';
-require_once 'include/Contact.php';
 require_once 'include/contact_selectors.php';
 
 function unfollow_post(App $a) {
@@ -38,8 +38,7 @@ function unfollow_post(App $a) {
                                intval($uid)
                        );
                        if (DBM::is_result($r)) {
-                               $self = ""; // Unused parameter
-                               terminate_friendship($r[0], $self, $contact);
+                               Contact::terminateFriendship($r[0], $contact);
                        }
                }
                dba::update('contact', array('rel' => CONTACT_IS_FOLLOWER), array('id' => $contact['id']));
@@ -127,14 +126,14 @@ function unfollow_content(App $a) {
        ));
 
        $a->page['aside'] = "";
-       profile_load($a, "", 0, get_contact_details_by_url($contact["url"]));
+       profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
 
        $o .= replace_macros(get_markup_template('section_title.tpl'),
                                        array('$title' => t('Status Messages and Posts')
        ));
 
        // Show last public posts
-       $o .= posts_from_contact_url($a, $contact["url"]);
+       $o .= Contact::getPostsFromUrl($contact["url"]);
 
        return $o;
 }
index a46f5de1ab7758ad99eda638ce43649992f26e12..9f02441020b1aacd438b69805fc655e1dd89c883 100644 (file)
@@ -5,6 +5,7 @@ use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once('include/items.php');
 require_once('include/acl_selectors.php');
@@ -39,7 +40,7 @@ function videos_init(App $a) {
 
                $profile = get_profiledata_by_nick($nick, $a->profile_uid);
 
-               $account_type = account_type($profile);
+               $account_type = Contact::getAccountType($profile);
 
                $tpl = get_markup_template("vcard-widget.tpl");
 
index 8c35be77d89bdf85a6a802c0890ee116e159bcdb..30ae92f8e32e7d2a6a5c530bc380b2109cc56a1b 100644 (file)
@@ -3,8 +3,8 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
-require_once('include/Contact.php');
 require_once('include/contact_selectors.php');
 
 function viewcontacts_init(App $a) {
@@ -100,19 +100,19 @@ function viewcontacts_content(App $a) {
                else
                        $url = zrl($url);
 
-               $contact_details = get_contact_details_by_url($rr['url'], $a->profile['uid'], $rr);
+               $contact_details = Contact::getDetailsByURL($rr['url'], $a->profile['uid'], $rr);
 
                $contacts[] = array(
                        'id' => $rr['id'],
                        'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']),
-                       'photo_menu' => contact_photo_menu($rr),
+                       'photo_menu' => Contact::photoMenu($rr),
                        'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
                        'name' => htmlentities(substr($contact_details['name'],0,20)),
                        'username' => htmlentities($contact_details['name']),
                        'details'       => $contact_details['location'],
                        'tags'          => $contact_details['keywords'],
                        'about'         => $contact_details['about'],
-                       'account_type'  => account_type($contact_details),
+                       'account_type'  => Contact::getAccountType($contact_details),
                        'url' => $url,
                        'sparkle' => '',
                        'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
diff --git a/src/BaseObject.php b/src/BaseObject.php
new file mode 100644 (file)
index 0000000..0195716
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @file src/BaseObject.php
+ */
+namespace Friendica;
+
+require_once 'boot.php';
+
+/**
+ * Basic object
+ *
+ * Contains what is useful to any object
+ */
+class BaseObject
+{
+       private static $app = null;
+
+       /**
+        * Get the app
+        *
+        * Same as get_app from boot.php
+        *
+        * @return object
+        */
+       public static function getApp()
+       {
+               if (self::$app) {
+                       return self::$app;
+               }
+
+               self::$app = get_app();
+
+               return self::$app;
+       }
+
+       /**
+        * Set the app
+        *
+        * @param object $app App
+        *
+        * @return void
+        */
+       public static function setApp($app)
+       {
+               self::$app = $app;
+       }
+}
diff --git a/src/Core/BaseObject.php b/src/Core/BaseObject.php
deleted file mode 100644 (file)
index d6ea17f..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * @file src/Core/BaseObject.php
- */
-namespace Friendica\Core;
-
-require_once 'boot.php';
-
-/**
- * Basic object
- *
- * Contains what is useful to any object
- */
-class BaseObject
-{
-       private static $app = null;
-
-       /**
-        * Get the app
-        *
-        * Same as get_app from boot.php
-        *
-        * @return object
-        */
-       public function getApp()
-       {
-               if (self::$app) {
-                       return self::$app;
-               }
-
-               self::$app = boot::get_app();
-
-               return self::$app;
-       }
-
-       /**
-        * Set the app
-        *
-        * @param object $app App
-        *
-        * @return void
-        */
-       public static function setApp($app)
-       {
-               self::$app = $app;
-       }
-}
diff --git a/src/Core/Conversation.php b/src/Core/Conversation.php
deleted file mode 100644 (file)
index ba3302d..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-/**
- * @file src/Core/Conversation.php
- */
-namespace Friendica\Core;
-
-use Friendica\Core\BaseObject;
-use Friendica\Core\Item;
-
-require_once 'boot.php';
-require_once 'include/text.php';
-
-/**
- * A list of threads
- *
- * We should think about making this a SPL Iterator
- */
-class Conversation extends BaseObject
-{
-       private $threads = array();
-       private $mode = null;
-       private $writable = false;
-       private $profile_owner = 0;
-       private $preview = false;
-
-       /**
-        * Constructor
-        *
-        * @param string  $mode    The mode
-        * @param boolean $preview boolean value
-        */
-       public function __construct($mode, $preview)
-       {
-               $this->setMode($mode);
-               $this->preview = $preview;
-       }
-
-       /**
-        * Set the mode we'll be displayed on
-        *
-        * @param string $mode The mode to set
-        *
-        * @return void
-        */
-       private function setMode($mode)
-       {
-               if ($this->getMode() == $mode) {
-                       return;
-               }
-
-               $a = $this->getApp();
-
-               switch ($mode) {
-                       case 'network':
-                       case 'notes':
-                               $this->profile_owner = local_user();
-                               $this->writable = true;
-                               break;
-                       case 'profile':
-                               $this->profile_owner = $a->profile['profile_uid'];
-                               $this->writable = can_write_wall($a, $this->profile_owner);
-                               break;
-                       case 'display':
-                               $this->profile_owner = $a->profile['uid'];
-                               $this->writable = can_write_wall($a, $this->profile_owner);
-                               break;
-                       default:
-                               logger('[ERROR] Conversation::setMode : Unhandled mode ('. $mode .').', LOGGER_DEBUG);
-                               return false;
-                               break;
-               }
-               $this->mode = $mode;
-       }
-
-       /**
-        * Get mode
-        *
-        * @return string
-        */
-       public function getMode()
-       {
-               return $this->mode;
-       }
-
-       /**
-        * Check if page is writable
-        *
-        * @return boolean
-        */
-       public function isWritable()
-       {
-               return $this->writable;
-       }
-
-       /**
-        * Check if page is a preview
-        *
-        * @return boolean
-        */
-       public function isPreview()
-       {
-               return $this->preview;
-       }
-
-       /**
-        * Get profile owner
-        *
-        * @return integer
-        */
-       public function getProfileOwner()
-       {
-               return $this->profile_owner;
-       }
-
-       /**
-        * Add a thread to the conversation
-        *
-        * @param object $item The item to insert
-        *
-        * @return mixed The inserted item on success
-        *               false on failure
-        */
-       public function addThread($item)
-       {
-               $item_id = $item->getId();
-
-               if (!$item_id) {
-                       logger('[ERROR] Conversation::addThread : Item has no ID!!', LOGGER_DEBUG);
-                       return false;
-               }
-
-               if ($this->getThread($item->getId())) {
-                       logger('[WARN] Conversation::addThread : Thread already exists ('. $item->getId() .').', LOGGER_DEBUG);
-                       return false;
-               }
-
-               /*
-                * Only add will be displayed
-                */
-               if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
-                       logger('[WARN] Conversation::addThread : Thread is a mail ('. $item->getId() .').', LOGGER_DEBUG);
-                       return false;
-               }
-
-               if ($item->getDataValue('verb') === ACTIVITY_LIKE || $item->getDataValue('verb') === ACTIVITY_DISLIKE) {
-                       logger('[WARN] Conversation::addThread : Thread is a (dis)like ('. $item->getId() .').', LOGGER_DEBUG);
-                       return false;
-               }
-
-               $item->setConversation($this);
-               $this->threads[] = $item;
-
-               return end($this->threads);
-       }
-
-       /**
-        * Get data in a form usable by a conversation template
-        *
-        * We should find a way to avoid using those arguments (at least most of them)
-        *
-        * @param object $conv_responses data
-        *
-        * @return mixed The data requested on success
-        *               false on failure
-        */
-       public function getTemplateData($conv_responses)
-       {
-               $a = get_app();
-               $result = array();
-               $i = 0;
-
-               foreach ($this->threads as $item) {
-                       if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
-                               continue;
-                       }
-
-                       $item_data = $item->getTemplateData($conv_responses);
-
-                       if (!$item_data) {
-                               logger('[ERROR] Conversation::getTemplateData : Failed to get item template data ('. $item->getId() .').', LOGGER_DEBUG);
-                               return false;
-                       }
-                       $result[] = $item_data;
-               }
-
-               return $result;
-       }
-
-       /**
-        * Get a thread based on its item id
-        *
-        * @param integer $id Item id
-        *
-        * @return mixed The found item on success
-        *               false on failure
-        */
-       private function getThread($id)
-       {
-               foreach ($this->threads as $item) {
-                       if ($item->getId() == $id) {
-                               return $item;
-                       }
-               }
-
-               return false;
-       }
-}
diff --git a/src/Core/Item.php b/src/Core/Item.php
deleted file mode 100644 (file)
index 24e524d..0000000
+++ /dev/null
@@ -1,925 +0,0 @@
-<?php
-/**
- * @file src/Core/Item.php
- */
-namespace Friendica\Core;
-
-use Friendica\Core\BaseObject;
-use Friendica\Core\Config;
-use Friendica\Core\PConfig;
-use Friendica\Database\DBM;
-use Friendica\Protocol\Diaspora;
-use dba;
-
-require_once 'include/text.php';
-require_once 'boot.php';
-
-/**
- * An item
- */
-class Item extends BaseObject
-{
-       private $data = array();
-       private $template = null;
-       private $available_templates = array(
-               'wall' => 'wall_thread.tpl',
-               'wall2wall' => 'wallwall_thread.tpl'
-       );
-       private $comment_box_template = 'comment_item.tpl';
-       private $toplevel = false;
-       private $writable = false;
-       private $children = array();
-       private $parent = null;
-       private $conversation = null;
-       private $redirect_url = null;
-       private $owner_url = '';
-       private $owner_photo = '';
-       private $owner_name = '';
-       private $wall_to_wall = false;
-       private $threaded = false;
-       private $visiting = false;
-
-       /**
-        * Constructor
-        *
-        * @param array $data data array
-        */
-       public function __construct($data)
-       {
-               $a = $this->getApp();
-
-               $this->data = $data;
-               $this->setTemplate('wall');
-               $this->toplevel = ($this->getId() == $this->getDataValue('parent'));
-
-               if (is_array($_SESSION['remote'])) {
-                       foreach ($_SESSION['remote'] as $visitor) {
-                               if ($visitor['cid'] == $this->getDataValue('contact-id')) {
-                                       $this->visiting = true;
-                                       break;
-                               }
-                       }
-               }
-
-               $this->writable = ($this->getDataValue('writable') || $this->getDataValue('self'));
-
-               $ssl_state = ((local_user()) ? true : false);
-               $this->redirect_url = 'redir/' . $this->getDataValue('cid');
-
-               if (Config::get('system', 'thread_allow') && $a->theme_thread_allow && !$this->isToplevel()) {
-                       $this->threaded = true;
-               }
-
-               // Prepare the children
-               if (count($data['children'])) {
-                       foreach ($data['children'] as $item) {
-                               /*
-                                * Only add will be displayed
-                                */
-                               if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
-                                       continue;
-                               } elseif (! visible_activity($item)) {
-                                       continue;
-                               }
-
-                               // You can always comment on Diaspora items
-                               if (($item['network'] == NETWORK_DIASPORA) && (local_user() == $item['uid'])) {
-                                       $item['writable'] = true;
-                               }
-
-                               $item['pagedrop'] = $data['pagedrop'];
-                               $child = new Item($item);
-                               $this->addChild($child);
-                       }
-               }
-       }
-
-       /**
-        * Get data in a form usable by a conversation template
-        *
-        * @param object  $conv_responses conversation responses
-        * @param integer $thread_level   default = 1
-        *
-        * @return mixed The data requested on success
-        *               false on failure
-        */
-       public function getTemplateData($conv_responses, $thread_level = 1)
-       {
-               require_once "mod/proxy.php";
-
-               $result = array();
-
-               $a = $this->getApp();
-
-               $item = $this->getData();
-               $edited = false;
-               // If the time between "created" and "edited" differs we add
-               // a notice that the post was edited.
-               // Note: In some networks reshared items seem to have (sometimes) a difference
-               // between creation time and edit time of a second. Thats why we add the notice
-               // only if the difference is more than 1 second.
-               if (strtotime($item['edited']) - strtotime($item['created']) > 1) {
-                       $edited = array(
-                               'label'    => t('This entry was edited'),
-                               'date'     => datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r'),
-                               'relative' => relative_date($item['edited'])
-                       );
-               }
-               $commentww = '';
-               $sparkle = '';
-               $buttons = '';
-               $dropping = false;
-               $star = false;
-               $ignore = false;
-               $isstarred = "unstarred";
-               $indent = '';
-               $shiny = '';
-               $osparkle = '';
-               $total_children = $this->countDescendants();
-
-               $conv = $this->getConversation();
-
-               $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
-                       || strlen($item['deny_cid']) || strlen($item['deny_gid']))))
-                       ? t('Private Message')
-                       : false);
-               $shareable = ((($conv->getProfileOwner() == local_user()) && ($item['private'] != 1)) ? true : false);
-               if (local_user() && link_compare($a->contact['url'], $item['author-link'])) {
-                       if ($item["event-id"] != 0) {
-                               $edpost = array("events/event/".$item['event-id'], t("Edit"));
-                       } else {
-                               $edpost = array("editpost/".$item['id'], t("Edit"));
-                       }
-               } else {
-                       $edpost = false;
-               }
-
-               if (($this->getDataValue('uid') == local_user()) || $this->isVisiting()) {
-                       $dropping = true;
-               }
-
-               $drop = array(
-                       'dropping' => $dropping,
-                       'pagedrop' => ((feature_enabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''),
-                       'select'   => t('Select'),
-                       'delete'   => t('Delete'),
-               );
-
-               $filer = (($conv->getProfileOwner() == local_user()) ? t("save to folder") : false);
-
-               $diff_author    = ((link_compare($item['url'], $item['author-link'])) ? false : true);
-               $profile_name   = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
-               if ($item['author-link'] && (! $item['author-name'])) {
-                       $profile_name = $item['author-link'];
-               }
-
-               $sp = false;
-               $profile_link = best_link_url($item, $sp);
-               if ($profile_link === 'mailbox') {
-                       $profile_link = '';
-               }
-
-               if ($sp) {
-                       $sparkle = ' sparkle';
-               } else {
-                       $profile_link = zrl($profile_link);
-               }
-
-               if (!isset($item['author-thumb']) || ($item['author-thumb'] == "")) {
-                       $author_contact = get_contact_details_by_url($item['author-link'], $conv->getProfileOwner());
-                       if ($author_contact["thumb"]) {
-                               $item['author-thumb'] = $author_contact["thumb"];
-                       } else {
-                               $item['author-thumb'] = $item['author-avatar'];
-                       }
-               }
-
-               if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
-                       $owner_contact = get_contact_details_by_url($item['owner-link'], $conv->getProfileOwner());
-                       if ($owner_contact["thumb"]) {
-                               $item['owner-thumb'] = $owner_contact["thumb"];
-                       } else {
-                               $item['owner-thumb'] = $item['owner-avatar'];
-                       }
-               }
-
-               $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
-               call_hooks('render_location', $locate);
-               $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
-
-               $tags=array();
-               $hashtags = array();
-               $mentions = array();
-
-               /*foreach(explode(',',$item['tag']) as $tag){
-                       $tag = trim($tag);
-                       if ($tag!="") {
-                               $t = bbcode($tag);
-                               $tags[] = $t;
-                               if($t[0] == '#')
-                                       $hashtags[] = $t;
-                               elseif($t[0] == '@')
-                                       $mentions[] = $t;
-                       }
-               }*/
-
-               // process action responses - e.g. like/dislike/attend/agree/whatever
-               $response_verbs = array('like', 'dislike');
-
-               if ($item['object-type'] === ACTIVITY_OBJ_EVENT) {
-                       $response_verbs[] = 'attendyes';
-                       $response_verbs[] = 'attendno';
-                       $response_verbs[] = 'attendmaybe';
-                       if ($conv->isWritable()) {
-                               $isevent = true;
-                               $attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
-                       }
-               }
-
-               $responses = get_responses($conv_responses, $response_verbs, $this, $item);
-
-               foreach ($response_verbs as $value => $verbs) {
-                       $responses[$verbs]['output']  = ((x($conv_responses[$verbs], $item['uri'])) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : '');
-               }
-
-               /*
-                * We should avoid doing this all the time, but it depends on the conversation mode
-                * And the conv mode may change when we change the conv, or it changes its mode
-                * Maybe we should establish a way to be notified about conversation changes
-                */
-               $this->checkWallToWall();
-
-               if ($this->isWallToWall() && ($this->getOwnerUrl() == $this->getRedirectUrl())) {
-                       $osparkle = ' sparkle';
-               }
-
-               if ($this->isToplevel()) {
-                       if ($conv->getProfileOwner() == local_user()) {
-                               $isstarred = (($item['starred']) ? "starred" : "unstarred");
-
-                               $star = array(
-                                       'do'        => t("add star"),
-                                       'undo'      => t("remove star"),
-                                       'toggle'    => t("toggle star status"),
-                                       'classdo'   => (($item['starred']) ? "hidden" : ""),
-                                       'classundo' => (($item['starred']) ? "" : "hidden"),
-                                       'starred'   =>  t('starred'),
-                               );
-                               $r = dba::select('thread', array('ignored'), array('uid' => $item['uid'], 'iid' => $item['id']), array('limit' => 1));
-                               if (DBM::is_result($r)) {
-                                       $ignore = array(
-                                               'do'        => t("ignore thread"),
-                                               'undo'      => t("unignore thread"),
-                                               'toggle'    => t("toggle ignore status"),
-                                               'classdo'   => (($r['ignored']) ? "hidden" : ""),
-                                               'classundo' => (($r['ignored']) ? "" : "hidden"),
-                                               'ignored'   =>  t('ignored'),
-                                       );
-                               }
-
-                               $tagger = '';
-                               if (feature_enabled($conv->getProfileOwner(), 'commtag')) {
-                                       $tagger = array(
-                                               'add'   => t("add tag"),
-                                               'class' => "",
-                                       );
-                               }
-                       }
-               } else {
-                       $indent = 'comment';
-               }
-
-               if ($conv->isWritable()) {
-                       $buttons = array(
-                               'like' => array( t("I like this \x28toggle\x29"), t("like")),
-                               'dislike' => ((feature_enabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''),
-                       );
-                       if ($shareable) {
-                               $buttons['share'] = array( t('Share this'), t('share'));
-                       }
-               }
-
-               $comment = $this->getCommentBox($indent);
-
-               if (strcmp(datetime_convert('UTC', 'UTC', $item['created']), datetime_convert('UTC', 'UTC', 'now - 12 hours')) > 0) {
-                       $shiny = 'shiny';
-               }
-
-               localize_item($item);
-
-               $body = prepare_body($item, true);
-
-               list($categories, $folders) = get_cats_and_terms($item);
-
-               if ($a->theme['template_engine'] === 'internal') {
-                       $body_e       = template_escape($body);
-                       $text_e       = strip_tags(template_escape($body));
-                       $name_e       = template_escape($profile_name);
-                       $title_e      = template_escape($item['title']);
-                       $location_e   = template_escape($location);
-                       $owner_name_e = template_escape($this->getOwnerName());
-               } else {
-                       $body_e       = $body;
-                       $text_e       = strip_tags($body);
-                       $name_e       = $profile_name;
-                       $title_e      = $item['title'];
-                       $location_e   = $location;
-                       $owner_name_e = $this->getOwnerName();
-               }
-
-               // Disable features that aren't available in several networks
-
-               /// @todo Add NETWORK_DIASPORA when it will pass this information
-               if (!in_array($item["item_network"], array(NETWORK_DFRN)) && isset($buttons["dislike"])) {
-                       unset($buttons["dislike"], $isevent);
-                       $tagger = '';
-               }
-
-               if (($item["item_network"] == NETWORK_FEED) && isset($buttons["like"])) {
-                       unset($buttons["like"]);
-               }
-
-               if (($item["item_network"] == NETWORK_MAIL) && isset($buttons["like"])) {
-                       unset($buttons["like"]);
-               }
-
-               $tmp_item = array(
-                       'template'        => $this->getTemplate(),
-                       'type'            => implode("", array_slice(explode("/", $item['verb']), -1)),
-                       'tags'            => $item['tags'],
-                       'hashtags'        => $item['hashtags'],
-                       'mentions'        => $item['mentions'],
-                       'txt_cats'        => t('Categories:'),
-                       'txt_folders'     => t('Filed under:'),
-                       'has_cats'        => ((count($categories)) ? 'true' : ''),
-                       'has_folders'     => ((count($folders)) ? 'true' : ''),
-                       'categories'      => $categories,
-                       'folders'         => $folders,
-                       'body'            => $body_e,
-                       'text'            => $text_e,
-                       'id'              => $this->getId(),
-                       'guid'            => urlencode($item['guid']),
-                       'isevent'         => $isevent,
-                       'attend'          => $attend,
-                       'linktitle'       => sprintf(t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
-                       'olinktitle'      => sprintf(t('View %s\'s profile @ %s'), htmlentities($this->getOwnerName()), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
-                       'to'              => t('to'),
-                       'via'             => t('via'),
-                       'wall'            => t('Wall-to-Wall'),
-                       'vwall'           => t('via Wall-To-Wall:'),
-                       'profile_url'     => $profile_link,
-                       'item_photo_menu' => item_photo_menu($item),
-                       'name'            => $name_e,
-                       'thumb'           => $a->remove_baseurl(proxy_url($item['author-thumb'], false, PROXY_SIZE_THUMB)),
-                       'osparkle'        => $osparkle,
-                       'sparkle'         => $sparkle,
-                       'title'           => $title_e,
-                       'localtime'       => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
-                       'ago'             => (($item['app']) ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created'])),
-                       'app'             => $item['app'],
-                       'created'         => relative_date($item['created']),
-                       'lock'            => $lock,
-                       'location'        => $location_e,
-                       'indent'          => $indent,
-                       'shiny'           => $shiny,
-                       'owner_url'       => $this->getOwnerUrl(),
-                       'owner_photo'     => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)),
-                       'owner_name'      => htmlentities($owner_name_e),
-                       'plink'           => get_plink($item),
-                       'edpost'          => ((feature_enabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''),
-                       'isstarred'       => $isstarred,
-                       'star'            => ((feature_enabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''),
-                       'ignore'          => ((feature_enabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''),
-                       'tagger'          => $tagger,
-                       'filer'           => ((feature_enabled($conv->getProfileOwner(), 'filing')) ? $filer : ''),
-                       'drop'            => $drop,
-                       'vote'            => $buttons,
-                       'like'            => $responses['like']['output'],
-                       'dislike'         => $responses['dislike']['output'],
-                       'responses'       => $responses,
-                       'switchcomment'   => t('Comment'),
-                       'comment'         => $comment,
-                       'previewing'      => ($conv->isPreview() ? ' preview ' : ''),
-                       'wait'            => t('Please wait'),
-                       'thread_level'    => $thread_level,
-                       'edited'          => $edited,
-                       'network'         => $item["item_network"],
-                       'network_name'    => network_to_name($item['item_network'], $profile_link),
-                       'received'        => $item['received'],
-                       'commented'       => $item['commented'],
-                       'created_date'    => $item['created'],
-               );
-
-               $arr = array('item' => $item, 'output' => $tmp_item);
-               call_hooks('display_item', $arr);
-
-               $result = $arr['output'];
-
-               $result['children'] = array();
-               $children = $this->getChildren();
-               $nb_children = count($children);
-               if ($nb_children > 0) {
-                       foreach ($children as $child) {
-                               $result['children'][] = $child->getTemplateData($conv_responses, $thread_level + 1);
-                       }
-                       // Collapse
-                       if (($nb_children > 2) || ($thread_level > 1)) {
-                               $result['children'][0]['comment_firstcollapsed'] = true;
-                               $result['children'][0]['num_comments'] = sprintf(tt('%d comment', '%d comments', $total_children), $total_children);
-                               $result['children'][0]['hidden_comments_num'] = $total_children;
-                               $result['children'][0]['hidden_comments_text'] = tt('comment', 'comments', $total_children);
-                               $result['children'][0]['hide_text'] = t('show more');
-                               if ($thread_level > 1) {
-                                       $result['children'][$nb_children - 1]['comment_lastcollapsed'] = true;
-                               } else {
-                                       $result['children'][$nb_children - 3]['comment_lastcollapsed'] = true;
-                               }
-                       }
-               }
-
-               if ($this->isToplevel()) {
-                       $result['total_comments_num'] = "$total_children";
-                       $result['total_comments_text'] = tt('comment', 'comments', $total_children);
-               }
-
-               $result['private'] = $item['private'];
-               $result['toplevel'] = ($this->isToplevel() ? 'toplevel_item' : '');
-
-               if ($this->isThreaded()) {
-                       $result['flatten'] = false;
-                       $result['threaded'] = true;
-               } else {
-                       $result['flatten'] = true;
-                       $result['threaded'] = false;
-               }
-
-               return $result;
-       }
-
-       /**
-        * @return integer
-        */
-       public function getId()
-       {
-               return $this->getDataValue('id');
-       }
-
-       /**
-        * @return boolean
-        */
-       public function isThreaded()
-       {
-               return $this->threaded;
-       }
-
-       /**
-        * Add a child item
-        *
-        * @param object $item The child item to add
-        *
-        * @return mixed
-        */
-       public function addChild(Item $item)
-       {
-               $item_id = $item->getId();
-               if (!$item_id) {
-                       logger('[ERROR] Item::addChild : Item has no ID!!', LOGGER_DEBUG);
-                       return false;
-               } elseif ($this->getChild($item->getId())) {
-                       logger('[WARN] Item::addChild : Item already exists ('. $item->getId() .').', LOGGER_DEBUG);
-                       return false;
-               }
-               /*
-                * Only add what will be displayed
-                */
-               if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
-                       return false;
-               } elseif (activity_match($item->getDataValue('verb'), ACTIVITY_LIKE) || activity_match($item->getDataValue('verb'), ACTIVITY_DISLIKE)) {
-                       return false;
-               }
-
-               $item->setParent($this);
-               $this->children[] = $item;
-
-               return end($this->children);
-       }
-
-       /**
-        * Get a child by its ID
-        *
-        * @param integer $id The child id
-        *
-        * @return mixed
-        */
-       public function getChild($id)
-       {
-               foreach ($this->getChildren() as $child) {
-                       if ($child->getId() == $id) {
-                               return $child;
-                       }
-               }
-
-               return null;
-       }
-
-       /**
-        * Get all our children
-        *
-        * @return object
-        */
-       public function getChildren()
-       {
-               return $this->children;
-       }
-
-       /**
-        * Set our parent
-        *
-        * @param object $item The item to set as parent
-        *
-        * @return void
-        */
-       protected function setParent($item)
-       {
-               $parent = $this->getParent();
-               if ($parent) {
-                       $parent->removeChild($this);
-               }
-
-               $this->parent = $item;
-               $this->setConversation($item->getConversation());
-       }
-
-       /**
-        * Remove our parent
-        *
-        * @return void
-        */
-       protected function removeParent()
-       {
-               $this->parent = null;
-               $this->conversation = null;
-       }
-
-       /**
-        * Remove a child
-        *
-        * @param object $item The child to be removed
-        *
-        * @return boolean Success or failure
-        */
-       public function removeChild($item)
-       {
-               $id = $item->getId();
-               foreach ($this->getChildren() as $key => $child) {
-                       if ($child->getId() == $id) {
-                               $child->removeParent();
-                               unset($this->children[$key]);
-                               // Reindex the array, in order to make sure there won't be any trouble on loops using count()
-                               $this->children = array_values($this->children);
-                               return true;
-                       }
-               }
-               logger('[WARN] Item::removeChild : Item is not a child ('. $id .').', LOGGER_DEBUG);
-               return false;
-       }
-
-       /**
-        * Get parent item
-        *
-        * @return object
-        */
-       protected function getParent()
-       {
-               return $this->parent;
-       }
-
-       /**
-        * Set conversation
-        *
-        * @param object $conv The conversation
-        *
-        * @return void
-        */
-       public function setConversation($conv)
-       {
-               $previous_mode = ($this->conversation ? $this->conversation->getMode() : '');
-
-               $this->conversation = $conv;
-
-               // Set it on our children too
-               foreach ($this->getChildren() as $child) {
-                       $child->setConversation($conv);
-               }
-       }
-
-       /**
-        * Get conversation
-        *
-        * @return object
-        */
-       public function getConversation()
-       {
-               return $this->conversation;
-       }
-
-       /**
-        * Get raw data
-        *
-        * We shouldn't need this
-        *
-        * @return array
-        */
-       public function getData()
-       {
-               return $this->data;
-       }
-
-       /**
-        * Get a data value
-        *
-        * @param object $name key
-        *
-        * @return mixed value on success
-        *               false on failure
-        */
-       public function getDataValue($name)
-       {
-               if (!isset($this->data[$name])) {
-                       // logger('[ERROR] Item::getDataValue : Item has no value name "'. $name .'".', LOGGER_DEBUG);
-                       return false;
-               }
-
-               return $this->data[$name];
-       }
-
-       /**
-        * Set template
-        *
-        * @param object $name template name
-        *
-        * @return void
-        */
-       private function setTemplate($name)
-       {
-               if (!x($this->available_templates, $name)) {
-                       logger('[ERROR] Item::setTemplate : Template not available ("'. $name .'").', LOGGER_DEBUG);
-                       return false;
-               }
-
-               $this->template = $this->available_templates[$name];
-       }
-
-       /**
-        * Get template
-        *
-        * @return object
-        */
-       private function getTemplate()
-       {
-               return $this->template;
-       }
-
-       /**
-        * Check if this is a toplevel post
-        *
-        * @return boolean
-        */
-       private function isToplevel()
-       {
-               return $this->toplevel;
-       }
-
-       /**
-        * Check if this is writable
-        *
-        * @return boolean
-        */
-       private function isWritable()
-       {
-               $conv = $this->getConversation();
-
-               if ($conv) {
-                       // This will allow us to comment on wall-to-wall items owned by our friends
-                       // and community forums even if somebody else wrote the post.
-
-                       // bug #517 - this fixes for conversation owner
-                       if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) {
-                               return true;
-                       }
-
-                       // this fixes for visitors
-                       return ($this->writable || ($this->isVisiting() && $conv->getMode() == 'profile'));
-               }
-               return $this->writable;
-       }
-
-       /**
-        * Count the total of our descendants
-        *
-        * @return integer
-        */
-       private function countDescendants()
-       {
-               $children = $this->getChildren();
-               $total = count($children);
-               if ($total > 0) {
-                       foreach ($children as $child) {
-                               $total += $child->countDescendants();
-                       }
-               }
-
-               return $total;
-       }
-
-       /**
-        * Get the template for the comment box
-        *
-        * @return string
-        */
-       private function getCommentBoxTemplate()
-       {
-               return $this->comment_box_template;
-       }
-
-       /**
-        * Get the comment box
-        *
-        * @param string $indent Indent value
-        *
-        * @return mixed The comment box string (empty if no comment box)
-        *               false on failure
-        */
-       private function getCommentBox($indent)
-       {
-               $a = $this->getApp();
-               if (!$this->isToplevel() && !(Config::get('system', 'thread_allow') && $a->theme_thread_allow)) {
-                       return '';
-               }
-
-               $comment_box = '';
-               $conv = $this->getConversation();
-               $template = get_markup_template($this->getCommentBoxTemplate());
-               $ww = '';
-               if (($conv->getMode() === 'network') && $this->isWallToWall()) {
-                       $ww = 'ww';
-               }
-
-               if ($conv->isWritable() && $this->isWritable()) {
-                       $qc = $qcomment =  null;
-
-                       /*
-                        * Hmmm, code depending on the presence of a particular plugin?
-                        * This should be better if done by a hook
-                        */
-                       if (in_array('qcomment', $a->plugins)) {
-                               $qc = ((local_user()) ? PConfig::get(local_user(), 'qcomment', 'words') : null);
-                               $qcomment = (($qc) ? explode("\n", $qc) : null);
-                       }
-
-                       $comment_box = replace_macros(
-                               $template,
-                               array(
-                               '$return_path' => $a->query_string,
-                               '$threaded'    => $this->isThreaded(),
-                               // '$jsreload'    => (($conv->getMode() === 'display') ? $_SESSION['return_url'] : ''),
-                               '$jsreload'    => '',
-                               '$type'        => (($conv->getMode() === 'profile') ? 'wall-comment' : 'net-comment'),
-                               '$id'          => $this->getId(),
-                               '$parent'      => $this->getId(),
-                               '$qcomment'    => $qcomment,
-                               '$profile_uid' =>  $conv->getProfileOwner(),
-                               '$mylink'      => $a->remove_baseurl($a->contact['url']),
-                               '$mytitle'     => t('This is you'),
-                               '$myphoto'     => $a->remove_baseurl($a->contact['thumb']),
-                               '$comment'     => t('Comment'),
-                               '$submit'      => t('Submit'),
-                               '$edbold'      => t('Bold'),
-                               '$editalic'    => t('Italic'),
-                               '$eduline'     => t('Underline'),
-                               '$edquote'     => t('Quote'),
-                               '$edcode'      => t('Code'),
-                               '$edimg'       => t('Image'),
-                               '$edurl'       => t('Link'),
-                               '$edvideo'     => t('Video'),
-                               '$preview'     => ((feature_enabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''),
-                               '$indent'      => $indent,
-                               '$sourceapp'   => t($a->sourcename),
-                               '$ww'          => (($conv->getMode() === 'network') ? $ww : ''),
-                               '$rand_num'    => random_digits(12))
-                       );
-               }
-
-               return $comment_box;
-       }
-
-       /**
-        * @return string
-        */
-       private function getRedirectUrl()
-       {
-               return $this->redirect_url;
-       }
-
-       /**
-        * Check if we are a wall to wall item and set the relevant properties
-        *
-        * @return void
-        */
-       protected function checkWallToWall()
-       {
-               $a = $this->getApp();
-               $conv = $this->getConversation();
-               $this->wall_to_wall = false;
-
-               if ($this->isToplevel()) {
-                       if ($conv->getMode() !== 'profile') {
-                               if ($this->getDataValue('wall') && !$this->getDataValue('self')) {
-                                       // On the network page, I am the owner. On the display page it will be the profile owner.
-                                       // This will have been stored in $a->page_contact by our calling page.
-                                       // Put this person as the wall owner of the wall-to-wall notice.
-
-                                       $this->owner_url = zrl($a->page_contact['url']);
-                                       $this->owner_photo = $a->page_contact['thumb'];
-                                       $this->owner_name = $a->page_contact['name'];
-                                       $this->wall_to_wall = true;
-                               } elseif ($this->getDataValue('owner-link')) {
-                                       $owner_linkmatch = (($this->getDataValue('owner-link')) && link_compare($this->getDataValue('owner-link'), $this->getDataValue('author-link')));
-                                       $alias_linkmatch = (($this->getDataValue('alias')) && link_compare($this->getDataValue('alias'), $this->getDataValue('author-link')));
-                                       $owner_namematch = (($this->getDataValue('owner-name')) && $this->getDataValue('owner-name') == $this->getDataValue('author-name'));
-
-                                       if ((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
-                                               // The author url doesn't match the owner (typically the contact)
-                                               // and also doesn't match the contact alias.
-                                               // The name match is a hack to catch several weird cases where URLs are
-                                               // all over the park. It can be tricked, but this prevents you from
-                                               // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
-                                               // well that it's the same Bob Smith.
-
-                                               // But it could be somebody else with the same name. It just isn't highly likely.
-
-
-                                               $this->owner_photo = $this->getDataValue('owner-avatar');
-                                               $this->owner_name = $this->getDataValue('owner-name');
-                                               $this->wall_to_wall = true;
-                                               // If it is our contact, use a friendly redirect link
-                                               if ((link_compare($this->getDataValue('owner-link'), $this->getDataValue('url')))
-                                                       && ($this->getDataValue('network') === NETWORK_DFRN)
-                                               ) {
-                                                       $this->owner_url = $this->getRedirectUrl();
-                                               } else {
-                                                       $this->owner_url = zrl($this->getDataValue('owner-link'));
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               if (!$this->wall_to_wall) {
-                       $this->setTemplate('wall');
-                       $this->owner_url = '';
-                       $this->owner_photo = '';
-                       $this->owner_name = '';
-               }
-       }
-
-       /**
-        * @return boolean
-        */
-       private function isWallToWall()
-       {
-               return $this->wall_to_wall;
-       }
-
-       /**
-        * @return string
-        */
-       private function getOwnerUrl()
-       {
-               return $this->owner_url;
-       }
-
-       /**
-        * @return string
-        */
-       private function getOwnerPhoto()
-       {
-               return $this->owner_photo;
-       }
-
-       /**
-        * @return string
-        */
-       private function getOwnerName()
-       {
-               return $this->owner_name;
-       }
-
-       /**
-        * @return boolean
-        */
-       private function isVisiting()
-       {
-               return $this->visiting;
-       }
-}
index 318d5a8e809fedc9f39a7fe31c069fcdac499cab..42d514e618eb227aa0dadd59c10f3de1e9bd600a 100644 (file)
@@ -9,11 +9,11 @@ namespace Friendica\Core;
 use Friendica\Core\Pconfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 require_once 'include/html2plain.php';
 require_once 'include/datetime.php';
 require_once 'include/bbcode.php';
-require_once 'include/Contact.php';
 
 /**
  * @brief Methods for read and write notifications from/to database
@@ -774,7 +774,7 @@ class NotificationsManager
                        $sql_extra = " AND `ignore` = 0 ";
                }
 
-               /// @todo Fetch contact details by "get_contact_details_by_url" instead of queries to contact, fcontact and gcontact
+               /// @todo Fetch contact details by "Contact::getDetailsByUrl" 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`,
@@ -903,7 +903,7 @@ class NotificationsManager
                // If the network and addr is still not available
                // get the missing data data from other sources
                if ($arr['gnetwork'] == "" || $arr['gaddr'] == "") {
-                       $ret = get_contact_details_by_url($arr['url']);
+                       $ret = Contact::getDetailsByURL($arr['url']);
 
                        if ($arr['gnetwork'] == "" && $ret['network'] != "") {
                                $arr['gnetwork'] = $ret['network'];
index 1ca814789b4d59058ca8b0fe9c0e9374ef202544..67fe27e8e5e1c29ec4de10819e97be52f57ee317 100644 (file)
@@ -10,6 +10,7 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Network\Probe;
+use Friendica\Object\Profile;
 use Friendica\Protocol\PortableContact;
 use dba;
 use Exception;
@@ -17,7 +18,6 @@ use Exception;
 require_once 'include/datetime.php';
 require_once 'include/network.php';
 require_once 'include/html2bbcode.php';
-require_once 'include/Contact.php';
 require_once 'include/Photo.php';
 
 /**
@@ -381,7 +381,7 @@ class GlobalContact
                if (DBM::is_result($r)) {
                        return $r[0]['total'];
                }
-               
+
                return 0;
        }
 
@@ -894,7 +894,7 @@ class GlobalContact
                        intval($uid)
                );
 
-               $location = formatted_location(
+               $location = Profile::formatLocation(
                        array("locality" => $r[0]["locality"], "region" => $r[0]["region"], "country-name" => $r[0]["country-name"])
                );
 
@@ -1001,4 +1001,16 @@ class GlobalContact
                        q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
                }
        }
+
+       public static function getRandomUrl() {
+               $r = q("SELECT `url` FROM `gcontact` WHERE `network` = '%s'
+                                       AND `last_contact` >= `last_failure`
+                                       AND `updated` > UTC_TIMESTAMP - INTERVAL 1 MONTH
+                               ORDER BY rand() LIMIT 1",
+                       dbesc(NETWORK_DFRN));
+
+               if (DBM::is_result($r))
+                       return dirname($r[0]['url']);
+               return '';
+       }
 }
diff --git a/src/Model/User.php b/src/Model/User.php
new file mode 100644 (file)
index 0000000..ec4d101
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * @file src/Model/User.php
+ * @brief This file includes the User class with user related database functions
+ */
+namespace Friendica\Model;
+
+use Friendica\Core\System;
+use Friendica\Core\Worker;
+use dba;
+
+require_once 'boot.php';
+require_once 'plugin.php';
+
+/**
+ * @brief This class handles User related functions
+ */
+class User
+{
+       public static function remove($uid)
+       {
+               if (!$uid) {
+                       return;
+               }
+
+               logger('Removing user: ' . $uid);
+
+               $r = dba::select('user', array(), array('uid' => $uid), array("limit" => 1));
+
+               call_hooks('remove_user', $r);
+
+               // save username (actually the nickname as it is guaranteed
+               // unique), so it cannot be re-registered in the future.
+
+               dba::insert('userd', array('username' => $r['nickname']));
+
+               // The user and related data will be deleted in "cron_expire_and_remove_users" (cronjobs.php)
+               q("UPDATE `user` SET `account_removed` = 1, `account_expires_on` = UTC_TIMESTAMP() WHERE `uid` = %d", intval($uid));
+               Worker::add(PRIORITY_HIGH, "Notifier", "removeme", $uid);
+
+               // Send an update to the directory
+               Worker::add(PRIORITY_LOW, "Directory", $r['url']);
+
+               if ($uid == local_user()) {
+                       unset($_SESSION['authenticated']);
+                       unset($_SESSION['uid']);
+                       goaway(System::baseUrl());
+               }
+       }
+}
index 37ca51d8ab8462f766098a95a87be7f474a6f7fc..c6bf46f7927517116e68f946eb1baa3977d8222e 100644 (file)
@@ -13,6 +13,7 @@ use Friendica\Core\System;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Profile;
 use Friendica\Util\XML;
 
 use dba;
@@ -792,7 +793,7 @@ class Probe {
                        }
                }
 
-               $location = formatted_location($json);
+               $location = Profile::formatLocation($json);
                if ($location) {
                        $data["location"] = $location;
                }
diff --git a/src/Object/Contact.php b/src/Object/Contact.php
new file mode 100644 (file)
index 0000000..8760839
--- /dev/null
@@ -0,0 +1,830 @@
+<?php
+
+/**
+ * @file src/Object/Contact.php
+ */
+
+namespace Friendica\Object;
+
+use Friendica\App;
+use Friendica\BaseObject;
+use Friendica\Core\PConfig;
+use Friendica\Core\System;
+use Friendica\Core\Worker;
+use Friendica\Database\DBM;
+use Friendica\Network\Probe;
+use Friendica\Protocol\Diaspora;
+use Friendica\Protocol\DFRN;
+use Friendica\Protocol\OStatus;
+use dba;
+
+require_once 'boot.php';
+require_once 'include/text.php';
+
+class Contact extends BaseObject
+{
+       /**
+        * @brief Marks a contact for removal
+        *
+        * @param int $id
+        * @return null
+        */
+       public static function remove($id)
+       {
+               // We want just to make sure that we don't delete our "self" contact
+               $r = q(
+                       "SELECT `uid` FROM `contact` WHERE `id` = %d AND NOT `self` LIMIT 1", intval($id)
+               );
+               if (!DBM::is_result($r) || !intval($r[0]['uid'])) {
+                       return;
+               }
+
+               $archive = PConfig::get($r[0]['uid'], 'system', 'archive_removed_contacts');
+               if ($archive) {
+                       q(
+                               "UPDATE `contact` SET `archive` = 1, `network` = 'none', `writable` = 0 WHERE id = %d", intval($id)
+                       );
+                       return;
+               }
+
+               dba::delete('contact', array('id' => $id));
+
+               // Delete the rest in the background
+               Worker::add(PRIORITY_LOW, 'RemoveContact', $id);
+       }
+
+       /**
+        * @brief Sends an unfriend message. Does not remove the contact
+        *
+        * @param array $user User unfriending
+        * @param array $contact Contact unfriended
+        */
+       public static function terminateFriendship(array $user, array $contact)
+       {
+               if ($contact['network'] === NETWORK_OSTATUS) {
+                       // create an unfollow slap
+                       $item = array();
+                       $item['verb'] = NAMESPACE_OSTATUS . "/unfollow";
+                       $item['follow'] = $contact["url"];
+                       $slap = OStatus::salmon($item, $user);
+
+                       if ((x($contact, 'notify')) && (strlen($contact['notify']))) {
+                               require_once 'include/salmon.php';
+                               slapper($user, $contact['notify'], $slap);
+                       }
+               } elseif ($contact['network'] === NETWORK_DIASPORA) {
+                       Diaspora::sendUnshare($user, $contact);
+               } elseif ($contact['network'] === NETWORK_DFRN) {
+                       DFRN::deliver($user, $contact, 'placeholder', 1);
+               }
+       }
+
+       /**
+        * @brief Marks a contact for archival after a communication issue delay
+        *
+        * Contact has refused to recognise us as a friend. We will start a countdown.
+        * If they still don't recognise us in 32 days, the relationship is over,
+        * and we won't waste any more time trying to communicate with them.
+        * This provides for the possibility that their database is temporarily messed
+        * up or some other transient event and that there's a possibility we could recover from it.
+        *
+        * @param array $contact
+        * @return type
+        */
+       public static function markForArchival(array $contact)
+       {
+               // Contact already archived, nothing to do
+               if ($contact['archive']) {
+                       return;
+               }
+
+               if ($contact['term-date'] <= NULL_DATE) {
+                       q(
+                               "UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", dbesc(datetime_convert()), intval($contact['id'])
+                       );
+
+                       if ($contact['url'] != '') {
+                               q(
+                                       "UPDATE `contact` SET `term-date` = '%s'
+                               WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'", dbesc(datetime_convert()), dbesc(normalise_link($contact['url']))
+                               );
+                       }
+               } else {
+
+                       /* @todo
+                        * We really should send a notification to the owner after 2-3 weeks
+                        * so they won't be surprised when the contact vanishes and can take
+                        * remedial action if this was a serious mistake or glitch
+                        */
+
+                       /// @todo Check for contact vitality via probing
+                       $expiry = $contact['term-date'] . ' + 32 days ';
+                       if (datetime_convert() > datetime_convert('UTC', 'UTC', $expiry)) {
+
+                               /* Relationship is really truly dead. archive them rather than
+                                * delete, though if the owner tries to unarchive them we'll start
+                                * the whole process over again.
+                                */
+                               q(
+                                       "UPDATE `contact` SET `archive` = 1 WHERE `id` = %d", intval($contact['id'])
+                               );
+
+                               if ($contact['url'] != '') {
+                                       q(
+                                               "UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'", dbesc(normalise_link($contact['url']))
+                                       );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @brief Cancels the archival countdown
+        *
+        * @see Contact::markForArchival()
+        *
+        * @param array $contact
+        * @return null
+        */
+       public static function unmarkForArchival(array $contact)
+       {
+               $r = q(
+                       "SELECT `term-date` FROM `contact` WHERE `id` = %d AND (`term-date` > '%s' OR `archive`)", intval($contact['id']), dbesc('1000-00-00 00:00:00')
+               );
+
+               // We don't need to update, we never marked this contact for archival
+               if (!DBM::is_result($r)) {
+                       return;
+               }
+
+               // It's a miracle. Our dead contact has inexplicably come back to life.
+               $fields = array('term-date' => NULL_DATE, 'archive' => false);
+               dba::update('contact', $fields, array('id' => $contact['id']));
+
+               if ($contact['url'] != '') {
+                       dba::update('contact', $fields, array('nurl' => normalise_link($contact['url'])));
+               }
+       }
+
+       /**
+        * @brief Get contact data for a given profile link
+        *
+        * The function looks at several places (contact table and gcontact table) for the contact
+        * It caches its result for the same script execution to prevent duplicate calls
+        *
+        * @param string $url The profile link
+        * @param int $uid User id
+        * @param array $default If not data was found take this data as default value
+        *
+        * @return array Contact data
+        */
+       public static function getDetailsByURL($url, $uid = -1, array $default = [])
+       {
+               static $cache = array();
+
+               if ($url == '') {
+                       return $default;
+               }
+
+               if ($uid == -1) {
+                       $uid = local_user();
+               }
+
+               if (isset($cache[$url][$uid])) {
+                       return $cache[$url][$uid];
+               }
+
+               $ssl_url = str_replace('http://', 'https://', $url);
+
+               // Fetch contact data from the contact table for the given user
+               $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
+               FROM `contact` WHERE `nurl` = ? AND `uid` = ?", normalise_link($url), $uid);
+               $r = dba::inArray($s);
+
+               // Fetch contact data from the contact table for the given user, checking with the alias
+               if (!DBM::is_result($r)) {
+                       $s = dba::p("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                               `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
+                       FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ?", normalise_link($url), $url, $ssl_url, $uid);
+                       $r = dba::inArray($s);
+               }
+
+               // Fetch the data from the contact table with "uid=0" (which is filled automatically)
+               if (!DBM::is_result($r)) {
+                       $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
+                       FROM `contact` WHERE `nurl` = ? AND `uid` = 0", normalise_link($url));
+                       $r = dba::inArray($s);
+               }
+
+               // Fetch the data from the contact table with "uid=0" (which is filled automatically) - checked with the alias
+               if (!DBM::is_result($r)) {
+                       $s = dba::p("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
+                       FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = 0", normalise_link($url), $url, $ssl_url);
+                       $r = dba::inArray($s);
+               }
+
+               // Fetch the data from the gcontact table
+               if (!DBM::is_result($r)) {
+                       $s = dba::p("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `zid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, '' AS `xmpp`,
+                       `keywords`, `gender`, `photo`, `photo` AS `thumb`, `photo` AS `micro`, `community` AS `forum`, 0 AS `prv`, `community`, `contact-type`, `birthday`, 0 AS `self`
+                       FROM `gcontact` WHERE `nurl` = ?", normalise_link($url));
+                       $r = dba::inArray($s);
+               }
+
+               if (DBM::is_result($r)) {
+                       // If there is more than one entry we filter out the connector networks
+                       if (count($r) > 1) {
+                               foreach ($r AS $id => $result) {
+                                       if ($result["network"] == NETWORK_STATUSNET) {
+                                               unset($r[$id]);
+                                       }
+                               }
+                       }
+
+                       $profile = array_shift($r);
+
+                       // "bd" always contains the upcoming birthday of a contact.
+                       // "birthday" might contain the birthday including the year of birth.
+                       if ($profile["birthday"] > '0001-01-01') {
+                               $bd_timestamp = strtotime($profile["birthday"]);
+                               $month = date("m", $bd_timestamp);
+                               $day = date("d", $bd_timestamp);
+
+                               $current_timestamp = time();
+                               $current_year = date("Y", $current_timestamp);
+                               $current_month = date("m", $current_timestamp);
+                               $current_day = date("d", $current_timestamp);
+
+                               $profile["bd"] = $current_year . "-" . $month . "-" . $day;
+                               $current = $current_year . "-" . $current_month . "-" . $current_day;
+
+                               if ($profile["bd"] < $current) {
+                                       $profile["bd"] = ( ++$current_year) . "-" . $month . "-" . $day;
+                               }
+                       } else {
+                               $profile["bd"] = '0001-01-01';
+                       }
+               } else {
+                       $profile = $default;
+               }
+
+               if (($profile["photo"] == "") && isset($default["photo"])) {
+                       $profile["photo"] = $default["photo"];
+               }
+
+               if (($profile["name"] == "") && isset($default["name"])) {
+                       $profile["name"] = $default["name"];
+               }
+
+               if (($profile["network"] == "") && isset($default["network"])) {
+                       $profile["network"] = $default["network"];
+               }
+
+               if (($profile["thumb"] == "") && isset($profile["photo"])) {
+                       $profile["thumb"] = $profile["photo"];
+               }
+
+               if (($profile["micro"] == "") && isset($profile["thumb"])) {
+                       $profile["micro"] = $profile["thumb"];
+               }
+
+               if ((($profile["addr"] == "") || ($profile["name"] == "")) && ($profile["gid"] != 0) &&
+                       in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
+                       Worker::add(PRIORITY_LOW, "UpdateGContact", $profile["gid"]);
+               }
+
+               // Show contact details of Diaspora contacts only if connected
+               if (($profile["cid"] == 0) && ($profile["network"] == NETWORK_DIASPORA)) {
+                       $profile["location"] = "";
+                       $profile["about"] = "";
+                       $profile["gender"] = "";
+                       $profile["birthday"] = '0001-01-01';
+               }
+
+               $cache[$url][$uid] = $profile;
+
+               return $profile;
+       }
+
+       /**
+        * @brief Get contact data for a given address
+        *
+        * The function looks at several places (contact table and gcontact table) for the contact
+        *
+        * @param string $addr The profile link
+        * @param int $uid User id
+        *
+        * @return array Contact data
+        */
+       public static function getDetailsByAddr($addr, $uid = -1)
+       {
+               static $cache = array();
+
+               if ($addr == '') {
+                       return array();
+               }
+
+               if ($uid == -1) {
+                       $uid = local_user();
+               }
+
+               // Fetch contact data from the contact table for the given user
+               $r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, `self`
+               FROM `contact` WHERE `addr` = '%s' AND `uid` = %d", dbesc($addr), intval($uid));
+
+               // Fetch the data from the contact table with "uid=0" (which is filled automatically)
+               if (!DBM::is_result($r))
+                       $r = q("SELECT `id`, 0 AS `cid`, `id` AS `zid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`,
+                       `keywords`, `gender`, `photo`, `thumb`, `micro`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `contact-type`, `bd` AS `birthday`, 0 AS `self`
+                       FROM `contact` WHERE `addr` = '%s' AND `uid` = 0", dbesc($addr));
+
+               // Fetch the data from the gcontact table
+               if (!DBM::is_result($r))
+                       $r = q("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `zid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, '' AS `xmpp`,
+                       `keywords`, `gender`, `photo`, `photo` AS `thumb`, `photo` AS `micro`, `community` AS `forum`, 0 AS `prv`, `community`, `contact-type`, `birthday`, 0 AS `self`
+                       FROM `gcontact` WHERE `addr` = '%s'", dbesc($addr));
+
+               if (!DBM::is_result($r)) {
+                       $data = Probe::uri($addr);
+
+                       $profile = self::getDetailsByURL($data['url'], $uid);
+               } else {
+                       $profile = $r[0];
+               }
+
+               return $profile;
+       }
+
+       /**
+        * @brief Returns the data array for the photo menu of a given contact
+        *
+        * @param array $contact
+        * @param int $uid
+        * @return array
+        */
+       public static function photoMenu(array $contact, $uid = 0)
+       {
+               // @todo Unused, to be removed
+               $a = get_app();
+
+               $contact_url = '';
+               $pm_url = '';
+               $status_link = '';
+               $photos_link = '';
+               $posts_link = '';
+               $contact_drop_link = '';
+               $poke_link = '';
+
+               if ($uid == 0) {
+                       $uid = local_user();
+               }
+
+               if ($contact['uid'] != $uid) {
+                       if ($uid == 0) {
+                               $profile_link = zrl($contact['url']);
+                               $menu = Array('profile' => array(t('View Profile'), $profile_link, true));
+
+                               return $menu;
+                       }
+
+                       $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `network` = '%s' AND `uid` = %d", dbesc($contact['nurl']), dbesc($contact['network']), intval($uid));
+                       if ($r) {
+                               return self::photoMenu($r[0], $uid);
+                       } else {
+                               $profile_link = zrl($contact['url']);
+                               $connlnk = 'follow/?url=' . $contact['url'];
+                               $menu = array(
+                                       'profile' => array(t('View Profile'), $profile_link, true),
+                                       'follow' => array(t('Connect/Follow'), $connlnk, true)
+                               );
+
+                               return $menu;
+                       }
+               }
+
+               $sparkle = false;
+               if ($contact['network'] === NETWORK_DFRN) {
+                       $sparkle = true;
+                       $profile_link = System::baseUrl() . '/redir/' . $contact['id'];
+               } else {
+                       $profile_link = $contact['url'];
+               }
+
+               if ($profile_link === 'mailbox') {
+                       $profile_link = '';
+               }
+
+               if ($sparkle) {
+                       $status_link = $profile_link . '?url=status';
+                       $photos_link = $profile_link . '?url=photos';
+                       $profile_link = $profile_link . '?url=profile';
+               }
+
+               if (in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA))) {
+                       $pm_url = System::baseUrl() . '/message/new/' . $contact['id'];
+               }
+
+               if ($contact['network'] == NETWORK_DFRN) {
+                       $poke_link = System::baseUrl() . '/poke/?f=&c=' . $contact['id'];
+               }
+
+               $contact_url = System::baseUrl() . '/contacts/' . $contact['id'];
+
+               $posts_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/posts';
+               $contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1';
+
+               /**
+                * menu array:
+                * "name" => [ "Label", "link", (bool)Should the link opened in a new tab? ]
+                */
+               $menu = array(
+                       'status' => array(t("View Status"), $status_link, true),
+                       'profile' => array(t("View Profile"), $profile_link, true),
+                       'photos' => array(t("View Photos"), $photos_link, true),
+                       'network' => array(t("Network Posts"), $posts_link, false),
+                       'edit' => array(t("View Contact"), $contact_url, false),
+                       'drop' => array(t("Drop Contact"), $contact_drop_link, false),
+                       'pm' => array(t("Send PM"), $pm_url, false),
+                       'poke' => array(t("Poke"), $poke_link, false),
+               );
+
+
+               $args = array('contact' => $contact, 'menu' => &$menu);
+
+               call_hooks('contact_photo_menu', $args);
+
+               $menucondensed = array();
+
+               foreach ($menu AS $menuname => $menuitem) {
+                       if ($menuitem[1] != '') {
+                               $menucondensed[$menuname] = $menuitem;
+                       }
+               }
+
+               return $menucondensed;
+       }
+
+       /**
+        * Returns either the total number of ungrouped contacts for the given user
+        * id or a paginated list of ungrouped contacts.
+        *
+        * @brief Returns ungrouped contact count or list for user
+        *
+        * @param int $uid
+        * @param int $start
+        * @param int $count
+        * @return array
+        */
+       public static function getUngroupedList($uid, $start = 0, $count = 0)
+       {
+               if (!$count) {
+                       $r = q(
+                               "SELECT COUNT(*) AS `total`
+                                FROM `contact`
+                                WHERE `uid` = %d
+                                AND `self` = 0
+                                AND `id` NOT IN (
+                                       SELECT DISTINCT(`contact-id`)
+                                       FROM `group_member`
+                                       WHERE `uid` = %d
+                               ) ", intval($uid), intval($uid)
+                       );
+
+                       return $r;
+               }
+
+               $r = q(
+                       "SELECT *
+                       FROM `contact`
+                       WHERE `uid` = %d
+                       AND `self` = 0
+                       AND `id` NOT IN (
+                               SELECT DISTINCT(`contact-id`)
+                               FROM `group_member` WHERE `uid` = %d
+                       )
+                       AND `blocked` = 0
+                       AND `pending` = 0
+                       LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count)
+               );
+
+               return $r;
+       }
+
+       /**
+        * @brief Fetch the contact id for a given url and user
+        *
+        * First lookup in the contact table to find a record matching either `url`, `nurl`,
+        * `addr` or `alias`.
+        *
+        * If there's no record and we aren't looking for a public contact, we quit.
+        * If there's one, we check that it isn't time to update the picture else we
+        * directly return the found contact id.
+        *
+        * Second, we probe the provided $url wether it's http://server.tld/profile or
+        * nick@server.tld. We quit if we can't get any info back.
+        *
+        * Third, we create the contact record if it doesn't exist
+        *
+        * Fourth, we update the existing record with the new data (avatar, alias, nick)
+        * if there's any updates
+        *
+        * @param string $url Contact URL
+        * @param integer $uid The user id for the contact (0 = public contact)
+        * @param boolean $no_update Don't update the contact
+        *
+        * @return integer Contact ID
+        */
+       public static function getIdForURL($url, $uid = 0, $no_update = false)
+       {
+               logger("Get contact data for url " . $url . " and user " . $uid . " - " . System::callstack(), LOGGER_DEBUG);
+
+               $contact_id = 0;
+
+               if ($url == '') {
+                       return 0;
+               }
+
+               /// @todo Verify if we can't use Contact::getDetailsByUrl instead of the following
+               // We first try the nurl (http://server.tld/nick), most common case
+               $contact = dba::select('contact', array('id', 'avatar-date'), array('nurl' => normalise_link($url), 'uid' => $uid), array('limit' => 1));
+
+               // Then the addr (nick@server.tld)
+               if (!DBM::is_result($contact)) {
+                       $contact = dba::select('contact', array('id', 'avatar-date'), array('addr' => $url, 'uid' => $uid), array('limit' => 1));
+               }
+
+               // Then the alias (which could be anything)
+               if (!DBM::is_result($contact)) {
+                       // The link could be provided as http although we stored it as https
+                       $ssl_url = str_replace('http://', 'https://', $url);
+                       $r = dba::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ? LIMIT 1", $url, normalise_link($url), $ssl_url, $uid);
+                       $contact = dba::fetch($r);
+                       dba::close($r);
+               }
+
+               if (DBM::is_result($contact)) {
+                       $contact_id = $contact["id"];
+
+                       // Update the contact every 7 days
+                       $update_contact = ($contact['avatar-date'] < datetime_convert('', '', 'now -7 days'));
+
+                       // We force the update if the avatar is empty
+                       if ($contact['avatar'] == '') {
+                               $update_contact = true;
+                       }
+
+                       if (!$update_contact || $no_update) {
+                               return $contact_id;
+                       }
+               } elseif ($uid != 0) {
+                       // Non-existing user-specific contact, exiting
+                       return 0;
+               }
+
+               $data = Probe::uri($url, "", $uid);
+
+               // Last try in gcontact for unsupported networks
+               if (!in_array($data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_PUMPIO, NETWORK_MAIL))) {
+                       if ($uid != 0) {
+                               return 0;
+                       }
+
+                       // Get data from the gcontact table
+                       $gcontacts = dba::select('gcontact', array('name', 'nick', 'url', 'photo', 'addr', 'alias', 'network'), array('nurl' => normalise_link($url)), array('limit' => 1));
+                       if (!DBM::is_result($gcontacts)) {
+                               return 0;
+                       }
+
+                       $data = array_merge($data, $gcontacts);
+               }
+
+               if (!$contact_id && ($data["alias"] != '') && ($data["alias"] != $url)) {
+                       $contact_id = self::getIdForURL($data["alias"], $uid, true);
+               }
+
+               $url = $data["url"];
+               if (!$contact_id) {
+                       dba::insert('contact', array('uid' => $uid, 'created' => datetime_convert(), 'url' => $data["url"],
+                               'nurl' => normalise_link($data["url"]), 'addr' => $data["addr"],
+                               'alias' => $data["alias"], 'notify' => $data["notify"], 'poll' => $data["poll"],
+                               'name' => $data["name"], 'nick' => $data["nick"], 'photo' => $data["photo"],
+                               'keywords' => $data["keywords"], 'location' => $data["location"], 'about' => $data["about"],
+                               'network' => $data["network"], 'pubkey' => $data["pubkey"],
+                               'rel' => CONTACT_IS_SHARING, 'priority' => $data["priority"],
+                               'batch' => $data["batch"], 'request' => $data["request"],
+                               'confirm' => $data["confirm"], 'poco' => $data["poco"],
+                               'name-date' => datetime_convert(), 'uri-date' => datetime_convert(),
+                               'avatar-date' => datetime_convert(), 'writable' => 1, 'blocked' => 0,
+                               'readonly' => 0, 'pending' => 0));
+
+                       $contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2", dbesc(normalise_link($data["url"])), intval($uid));
+                       if (!DBM::is_result($contacts)) {
+                               return 0;
+                       }
+
+                       $contact_id = $contacts[0]["id"];
+
+                       // Update the newly created contact from data in the gcontact table
+                       $gcontact = dba::select('gcontact', array('location', 'about', 'keywords', 'gender'), array('nurl' => normalise_link($data["url"])), array('limit' => 1));
+                       if (DBM::is_result($gcontact)) {
+                               // Only use the information when the probing hadn't fetched these values
+                               if ($data['keywords'] != '') {
+                                       unset($gcontact['keywords']);
+                               }
+                               if ($data['location'] != '') {
+                                       unset($gcontact['location']);
+                               }
+                               if ($data['about'] != '') {
+                                       unset($gcontact['about']);
+                               }
+                               dba::update('contact', $gcontact, array('id' => $contact_id));
+                       }
+
+                       if (count($contacts) > 1 && $uid == 0 && $contact_id != 0 && $data["url"] != "") {
+                               dba::delete('contact', array("`nurl` = ? AND `uid` = 0 AND `id` != ? AND NOT `self`",
+                                       normalise_link($data["url"]), $contact_id));
+                       }
+               }
+
+               require_once 'include/Photo.php';
+
+               update_contact_avatar($data["photo"], $uid, $contact_id);
+
+               $contact = dba::select('contact', array('url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date'), array('id' => $contact_id), array('limit' => 1));
+
+               // This condition should always be true
+               if (!DBM::is_result($contact)) {
+                       return $contact_id;
+               }
+
+               $updated = array('addr' => $data['addr'],
+                       'alias' => $data['alias'],
+                       'url' => $data['url'],
+                       'nurl' => normalise_link($data['url']),
+                       'name' => $data['name'],
+                       'nick' => $data['nick']);
+
+               if ($data['keywords'] != '') {
+                       $updated['keywords'] = $data['keywords'];
+               }
+               if ($data['location'] != '') {
+                       $updated['location'] = $data['location'];
+               }
+               if ($data['about'] != '') {
+                       $updated['about'] = $data['about'];
+               }
+
+               if (($data["addr"] != $contact["addr"]) || ($data["alias"] != $contact["alias"])) {
+                       $updated['uri-date'] = datetime_convert();
+               }
+               if (($data["name"] != $contact["name"]) || ($data["nick"] != $contact["nick"])) {
+                       $updated['name-date'] = datetime_convert();
+               }
+
+               $updated['avatar-date'] = datetime_convert();
+
+               dba::update('contact', $updated, array('id' => $contact_id), $contact);
+
+               return $contact_id;
+       }
+
+       /**
+        * @brief Checks if the contact is blocked
+        *
+        * @param int $cid contact id
+        *
+        * @return boolean Is the contact blocked?
+        */
+       public static function isBlocked($cid)
+       {
+               if ($cid == 0) {
+                       return false;
+               }
+
+               $blocked = dba::select('contact', array('blocked'), array('id' => $cid), array('limit' => 1));
+               if (!DBM::is_result($blocked)) {
+                       return false;
+               }
+               return (bool) $blocked['blocked'];
+       }
+
+       /**
+        * @brief Checks if the contact is hidden
+        *
+        * @param int $cid contact id
+        *
+        * @return boolean Is the contact hidden?
+        */
+       public static function isHidden($cid)
+       {
+               if ($cid == 0) {
+                       return false;
+               }
+
+               $hidden = dba::select('contact', array('hidden'), array('id' => $cid), array('limit' => 1));
+               if (!DBM::is_result($hidden)) {
+                       return false;
+               }
+               return (bool) $hidden['hidden'];
+       }
+
+       /**
+        * @brief Returns posts from a given contact url
+        *
+        * @param App $a argv application class
+        * @param string $contact_url Contact URL
+        *
+        * @return string posts in HTML
+        */
+       public static function getPostsFromUrl($contact_url)
+       {
+               require_once 'include/conversation.php';
+
+               // There are no posts with "uid = 0" with connector networks
+               // This speeds up the query a lot
+               $r = q("SELECT `network`, `id` AS `author-id`, `contact-type` FROM `contact`
+               WHERE `contact`.`nurl` = '%s' AND `contact`.`uid` = 0", dbesc(normalise_link($contact_url)));
+
+               if (!DBM::is_result($r)) {
+                       return '';
+               }
+
+               if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
+                       $sql = "(`item`.`uid` = 0 OR (`item`.`uid` = %d AND NOT `item`.`global`))";
+               } else {
+                       $sql = "`item`.`uid` = %d";
+               }
+
+               $author_id = intval($r[0]["author-id"]);
+
+               $contact = ($r[0]["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id');
+
+               $r = q(item_query() . " AND `item`.`" . $contact . "` = %d AND " . $sql .
+                       " ORDER BY `item`.`created` DESC LIMIT %d, %d", intval($author_id), intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage'])
+               );
+
+               $a = self::getApp();
+
+               $o = conversation($a, $r, 'community', false);
+
+               $o .= alt_pager($a, count($r));
+
+               return $o;
+       }
+
+       /**
+        * @brief Returns the account type name
+        *
+        * The function can be called with either the user or the contact array
+        *
+        * @param array $contact contact or user array
+        * @return string
+        */
+       public static function getAccountType(array $contact)
+       {
+               // There are several fields that indicate that the contact or user is a forum
+               // "page-flags" is a field in the user table,
+               // "forum" and "prv" are used in the contact table. They stand for PAGE_COMMUNITY and PAGE_PRVGROUP.
+               // "community" is used in the gcontact table and is true if the contact is PAGE_COMMUNITY or PAGE_PRVGROUP.
+               if (
+                       (isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_COMMUNITY))
+                       || (isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_PRVGROUP))
+                       || (isset($contact['forum']) && intval($contact['forum']))
+                       || (isset($contact['prv']) && intval($contact['prv']))
+                       || (isset($contact['community']) && intval($contact['community']))
+               ) {
+                       $type = ACCOUNT_TYPE_COMMUNITY;
+               } else {
+                       $type = ACCOUNT_TYPE_PERSON;
+               }
+
+               // The "contact-type" (contact table) and "account-type" (user table) are more general then the chaos from above.
+               if (isset($contact["contact-type"])) {
+                       $type = $contact["contact-type"];
+               }
+               if (isset($contact["account-type"])) {
+                       $type = $contact["account-type"];
+               }
+
+               switch ($type) {
+                       case ACCOUNT_TYPE_ORGANISATION:
+                               $account_type = t("Organisation");
+                               break;
+                       case ACCOUNT_TYPE_NEWS:
+                               $account_type = t('News');
+                               break;
+                       case ACCOUNT_TYPE_COMMUNITY:
+                               $account_type = t("Forum");
+                               break;
+                       default:
+                               $account_type = "";
+                               break;
+               }
+
+               return $account_type;
+       }
+}
diff --git a/src/Object/Conversation.php b/src/Object/Conversation.php
new file mode 100644 (file)
index 0000000..3721086
--- /dev/null
@@ -0,0 +1,207 @@
+<?php
+/**
+ * @file src/Object/Conversation.php
+ */
+namespace Friendica\Object;
+
+use Friendica\BaseObject;
+use Friendica\Object\Item;
+
+require_once 'boot.php';
+require_once 'include/text.php';
+
+/**
+ * A list of threads
+ *
+ * We should think about making this a SPL Iterator
+ */
+class Conversation extends BaseObject
+{
+       private $threads = array();
+       private $mode = null;
+       private $writable = false;
+       private $profile_owner = 0;
+       private $preview = false;
+
+       /**
+        * Constructor
+        *
+        * @param string  $mode    The mode
+        * @param boolean $preview boolean value
+        */
+       public function __construct($mode, $preview)
+       {
+               $this->setMode($mode);
+               $this->preview = $preview;
+       }
+
+       /**
+        * Set the mode we'll be displayed on
+        *
+        * @param string $mode The mode to set
+        *
+        * @return void
+        */
+       private function setMode($mode)
+       {
+               if ($this->getMode() == $mode) {
+                       return;
+               }
+
+               $a = self::getApp();
+
+               switch ($mode) {
+                       case 'network':
+                       case 'notes':
+                               $this->profile_owner = local_user();
+                               $this->writable = true;
+                               break;
+                       case 'profile':
+                               $this->profile_owner = $a->profile['profile_uid'];
+                               $this->writable = can_write_wall($a, $this->profile_owner);
+                               break;
+                       case 'display':
+                               $this->profile_owner = $a->profile['uid'];
+                               $this->writable = can_write_wall($a, $this->profile_owner);
+                               break;
+                       default:
+                               logger('[ERROR] Conversation::setMode : Unhandled mode ('. $mode .').', LOGGER_DEBUG);
+                               return false;
+                               break;
+               }
+               $this->mode = $mode;
+       }
+
+       /**
+        * Get mode
+        *
+        * @return string
+        */
+       public function getMode()
+       {
+               return $this->mode;
+       }
+
+       /**
+        * Check if page is writable
+        *
+        * @return boolean
+        */
+       public function isWritable()
+       {
+               return $this->writable;
+       }
+
+       /**
+        * Check if page is a preview
+        *
+        * @return boolean
+        */
+       public function isPreview()
+       {
+               return $this->preview;
+       }
+
+       /**
+        * Get profile owner
+        *
+        * @return integer
+        */
+       public function getProfileOwner()
+       {
+               return $this->profile_owner;
+       }
+
+       /**
+        * Add a thread to the conversation
+        *
+        * @param object $item The item to insert
+        *
+        * @return mixed The inserted item on success
+        *               false on failure
+        */
+       public function addThread($item)
+       {
+               $item_id = $item->getId();
+
+               if (!$item_id) {
+                       logger('[ERROR] Conversation::addThread : Item has no ID!!', LOGGER_DEBUG);
+                       return false;
+               }
+
+               if ($this->getThread($item->getId())) {
+                       logger('[WARN] Conversation::addThread : Thread already exists ('. $item->getId() .').', LOGGER_DEBUG);
+                       return false;
+               }
+
+               /*
+                * Only add will be displayed
+                */
+               if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
+                       logger('[WARN] Conversation::addThread : Thread is a mail ('. $item->getId() .').', LOGGER_DEBUG);
+                       return false;
+               }
+
+               if ($item->getDataValue('verb') === ACTIVITY_LIKE || $item->getDataValue('verb') === ACTIVITY_DISLIKE) {
+                       logger('[WARN] Conversation::addThread : Thread is a (dis)like ('. $item->getId() .').', LOGGER_DEBUG);
+                       return false;
+               }
+
+               $item->setConversation($this);
+               $this->threads[] = $item;
+
+               return end($this->threads);
+       }
+
+       /**
+        * Get data in a form usable by a conversation template
+        *
+        * We should find a way to avoid using those arguments (at least most of them)
+        *
+        * @param object $conv_responses data
+        *
+        * @return mixed The data requested on success
+        *               false on failure
+        */
+       public function getTemplateData($conv_responses)
+       {
+               $a = self::getApp();
+               $result = array();
+               $i = 0;
+
+               foreach ($this->threads as $item) {
+                       if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
+                               continue;
+                       }
+
+                       $item_data = $item->getTemplateData($conv_responses);
+
+                       if (!$item_data) {
+                               logger('[ERROR] Conversation::getTemplateData : Failed to get item template data ('. $item->getId() .').', LOGGER_DEBUG);
+                               return false;
+                       }
+                       $result[] = $item_data;
+               }
+
+               return $result;
+       }
+
+       /**
+        * Get a thread based on its item id
+        *
+        * @param integer $id Item id
+        *
+        * @return mixed The found item on success
+        *               false on failure
+        */
+       private function getThread($id)
+       {
+               foreach ($this->threads as $item) {
+                       if ($item->getId() == $id) {
+                               return $item;
+                       }
+               }
+
+               return false;
+       }
+}
diff --git a/src/Object/Item.php b/src/Object/Item.php
new file mode 100644 (file)
index 0000000..082ecae
--- /dev/null
@@ -0,0 +1,925 @@
+<?php
+/**
+ * @file src/Object/Item.php
+ */
+namespace Friendica\Object;
+
+use Friendica\BaseObject;
+use Friendica\Core\Config;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+use Friendica\Object\Contact;
+use dba;
+
+require_once 'include/text.php';
+require_once 'boot.php';
+
+/**
+ * An item
+ */
+class Item extends BaseObject
+{
+       private $data = array();
+       private $template = null;
+       private $available_templates = array(
+               'wall' => 'wall_thread.tpl',
+               'wall2wall' => 'wallwall_thread.tpl'
+       );
+       private $comment_box_template = 'comment_item.tpl';
+       private $toplevel = false;
+       private $writable = false;
+       private $children = array();
+       private $parent = null;
+       private $conversation = null;
+       private $redirect_url = null;
+       private $owner_url = '';
+       private $owner_photo = '';
+       private $owner_name = '';
+       private $wall_to_wall = false;
+       private $threaded = false;
+       private $visiting = false;
+
+       /**
+        * Constructor
+        *
+        * @param array $data data array
+        */
+       public function __construct($data)
+       {
+               $a = self::getApp();
+
+               $this->data = $data;
+               $this->setTemplate('wall');
+               $this->toplevel = ($this->getId() == $this->getDataValue('parent'));
+
+               if (is_array($_SESSION['remote'])) {
+                       foreach ($_SESSION['remote'] as $visitor) {
+                               if ($visitor['cid'] == $this->getDataValue('contact-id')) {
+                                       $this->visiting = true;
+                                       break;
+                               }
+                       }
+               }
+
+               $this->writable = ($this->getDataValue('writable') || $this->getDataValue('self'));
+
+               $ssl_state = ((local_user()) ? true : false);
+               $this->redirect_url = 'redir/' . $this->getDataValue('cid');
+
+               if (Config::get('system', 'thread_allow') && $a->theme_thread_allow && !$this->isToplevel()) {
+                       $this->threaded = true;
+               }
+
+               // Prepare the children
+               if (count($data['children'])) {
+                       foreach ($data['children'] as $item) {
+                               /*
+                                * Only add will be displayed
+                                */
+                               if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
+                                       continue;
+                               } elseif (! visible_activity($item)) {
+                                       continue;
+                               }
+
+                               // You can always comment on Diaspora items
+                               if (($item['network'] == NETWORK_DIASPORA) && (local_user() == $item['uid'])) {
+                                       $item['writable'] = true;
+                               }
+
+                               $item['pagedrop'] = $data['pagedrop'];
+                               $child = new Item($item);
+                               $this->addChild($child);
+                       }
+               }
+       }
+
+       /**
+        * Get data in a form usable by a conversation template
+        *
+        * @param object  $conv_responses conversation responses
+        * @param integer $thread_level   default = 1
+        *
+        * @return mixed The data requested on success
+        *               false on failure
+        */
+       public function getTemplateData($conv_responses, $thread_level = 1)
+       {
+               require_once "mod/proxy.php";
+
+               $result = array();
+
+               $a = self::getApp();
+
+               $item = $this->getData();
+               $edited = false;
+               // If the time between "created" and "edited" differs we add
+               // a notice that the post was edited.
+               // Note: In some networks reshared items seem to have (sometimes) a difference
+               // between creation time and edit time of a second. Thats why we add the notice
+               // only if the difference is more than 1 second.
+               if (strtotime($item['edited']) - strtotime($item['created']) > 1) {
+                       $edited = array(
+                               'label'    => t('This entry was edited'),
+                               'date'     => datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r'),
+                               'relative' => relative_date($item['edited'])
+                       );
+               }
+               $commentww = '';
+               $sparkle = '';
+               $buttons = '';
+               $dropping = false;
+               $star = false;
+               $ignore = false;
+               $isstarred = "unstarred";
+               $indent = '';
+               $shiny = '';
+               $osparkle = '';
+               $total_children = $this->countDescendants();
+
+               $conv = $this->getConversation();
+
+               $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
+                       || strlen($item['deny_cid']) || strlen($item['deny_gid']))))
+                       ? t('Private Message')
+                       : false);
+               $shareable = ((($conv->getProfileOwner() == local_user()) && ($item['private'] != 1)) ? true : false);
+               if (local_user() && link_compare($a->contact['url'], $item['author-link'])) {
+                       if ($item["event-id"] != 0) {
+                               $edpost = array("events/event/".$item['event-id'], t("Edit"));
+                       } else {
+                               $edpost = array("editpost/".$item['id'], t("Edit"));
+                       }
+               } else {
+                       $edpost = false;
+               }
+
+               if (($this->getDataValue('uid') == local_user()) || $this->isVisiting()) {
+                       $dropping = true;
+               }
+
+               $drop = array(
+                       'dropping' => $dropping,
+                       'pagedrop' => ((feature_enabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''),
+                       'select'   => t('Select'),
+                       'delete'   => t('Delete'),
+               );
+
+               $filer = (($conv->getProfileOwner() == local_user()) ? t("save to folder") : false);
+
+               $diff_author    = ((link_compare($item['url'], $item['author-link'])) ? false : true);
+               $profile_name   = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
+               if ($item['author-link'] && (! $item['author-name'])) {
+                       $profile_name = $item['author-link'];
+               }
+
+               $sp = false;
+               $profile_link = best_link_url($item, $sp);
+               if ($profile_link === 'mailbox') {
+                       $profile_link = '';
+               }
+
+               if ($sp) {
+                       $sparkle = ' sparkle';
+               } else {
+                       $profile_link = zrl($profile_link);
+               }
+
+               if (!isset($item['author-thumb']) || ($item['author-thumb'] == "")) {
+                       $author_contact = Contact::getDetailsByURL($item['author-link'], $conv->getProfileOwner());
+                       if ($author_contact["thumb"]) {
+                               $item['author-thumb'] = $author_contact["thumb"];
+                       } else {
+                               $item['author-thumb'] = $item['author-avatar'];
+                       }
+               }
+
+               if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
+                       $owner_contact = Contact::getDetailsByURL($item['owner-link'], $conv->getProfileOwner());
+                       if ($owner_contact["thumb"]) {
+                               $item['owner-thumb'] = $owner_contact["thumb"];
+                       } else {
+                               $item['owner-thumb'] = $item['owner-avatar'];
+                       }
+               }
+
+               $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+               call_hooks('render_location', $locate);
+               $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
+
+               $tags=array();
+               $hashtags = array();
+               $mentions = array();
+
+               /*foreach(explode(',',$item['tag']) as $tag){
+                       $tag = trim($tag);
+                       if ($tag!="") {
+                               $t = bbcode($tag);
+                               $tags[] = $t;
+                               if($t[0] == '#')
+                                       $hashtags[] = $t;
+                               elseif($t[0] == '@')
+                                       $mentions[] = $t;
+                       }
+               }*/
+
+               // process action responses - e.g. like/dislike/attend/agree/whatever
+               $response_verbs = array('like', 'dislike');
+
+               if ($item['object-type'] === ACTIVITY_OBJ_EVENT) {
+                       $response_verbs[] = 'attendyes';
+                       $response_verbs[] = 'attendno';
+                       $response_verbs[] = 'attendmaybe';
+                       if ($conv->isWritable()) {
+                               $isevent = true;
+                               $attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
+                       }
+               }
+
+               $responses = get_responses($conv_responses, $response_verbs, $this, $item);
+
+               foreach ($response_verbs as $value => $verbs) {
+                       $responses[$verbs]['output']  = ((x($conv_responses[$verbs], $item['uri'])) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : '');
+               }
+
+               /*
+                * We should avoid doing this all the time, but it depends on the conversation mode
+                * And the conv mode may change when we change the conv, or it changes its mode
+                * Maybe we should establish a way to be notified about conversation changes
+                */
+               $this->checkWallToWall();
+
+               if ($this->isWallToWall() && ($this->getOwnerUrl() == $this->getRedirectUrl())) {
+                       $osparkle = ' sparkle';
+               }
+
+               if ($this->isToplevel()) {
+                       if ($conv->getProfileOwner() == local_user()) {
+                               $isstarred = (($item['starred']) ? "starred" : "unstarred");
+
+                               $star = array(
+                                       'do'        => t("add star"),
+                                       'undo'      => t("remove star"),
+                                       'toggle'    => t("toggle star status"),
+                                       'classdo'   => (($item['starred']) ? "hidden" : ""),
+                                       'classundo' => (($item['starred']) ? "" : "hidden"),
+                                       'starred'   =>  t('starred'),
+                               );
+                               $r = dba::select('thread', array('ignored'), array('uid' => $item['uid'], 'iid' => $item['id']), array('limit' => 1));
+                               if (DBM::is_result($r)) {
+                                       $ignore = array(
+                                               'do'        => t("ignore thread"),
+                                               'undo'      => t("unignore thread"),
+                                               'toggle'    => t("toggle ignore status"),
+                                               'classdo'   => (($r['ignored']) ? "hidden" : ""),
+                                               'classundo' => (($r['ignored']) ? "" : "hidden"),
+                                               'ignored'   =>  t('ignored'),
+                                       );
+                               }
+
+                               $tagger = '';
+                               if (feature_enabled($conv->getProfileOwner(), 'commtag')) {
+                                       $tagger = array(
+                                               'add'   => t("add tag"),
+                                               'class' => "",
+                                       );
+                               }
+                       }
+               } else {
+                       $indent = 'comment';
+               }
+
+               if ($conv->isWritable()) {
+                       $buttons = array(
+                               'like' => array( t("I like this \x28toggle\x29"), t("like")),
+                               'dislike' => ((feature_enabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''),
+                       );
+                       if ($shareable) {
+                               $buttons['share'] = array( t('Share this'), t('share'));
+                       }
+               }
+
+               $comment = $this->getCommentBox($indent);
+
+               if (strcmp(datetime_convert('UTC', 'UTC', $item['created']), datetime_convert('UTC', 'UTC', 'now - 12 hours')) > 0) {
+                       $shiny = 'shiny';
+               }
+
+               localize_item($item);
+
+               $body = prepare_body($item, true);
+
+               list($categories, $folders) = get_cats_and_terms($item);
+
+               if ($a->theme['template_engine'] === 'internal') {
+                       $body_e       = template_escape($body);
+                       $text_e       = strip_tags(template_escape($body));
+                       $name_e       = template_escape($profile_name);
+                       $title_e      = template_escape($item['title']);
+                       $location_e   = template_escape($location);
+                       $owner_name_e = template_escape($this->getOwnerName());
+               } else {
+                       $body_e       = $body;
+                       $text_e       = strip_tags($body);
+                       $name_e       = $profile_name;
+                       $title_e      = $item['title'];
+                       $location_e   = $location;
+                       $owner_name_e = $this->getOwnerName();
+               }
+
+               // Disable features that aren't available in several networks
+
+               /// @todo Add NETWORK_DIASPORA when it will pass this information
+               if (!in_array($item["item_network"], array(NETWORK_DFRN)) && isset($buttons["dislike"])) {
+                       unset($buttons["dislike"], $isevent);
+                       $tagger = '';
+               }
+
+               if (($item["item_network"] == NETWORK_FEED) && isset($buttons["like"])) {
+                       unset($buttons["like"]);
+               }
+
+               if (($item["item_network"] == NETWORK_MAIL) && isset($buttons["like"])) {
+                       unset($buttons["like"]);
+               }
+
+               $tmp_item = array(
+                       'template'        => $this->getTemplate(),
+                       'type'            => implode("", array_slice(explode("/", $item['verb']), -1)),
+                       'tags'            => $item['tags'],
+                       'hashtags'        => $item['hashtags'],
+                       'mentions'        => $item['mentions'],
+                       'txt_cats'        => t('Categories:'),
+                       'txt_folders'     => t('Filed under:'),
+                       'has_cats'        => ((count($categories)) ? 'true' : ''),
+                       'has_folders'     => ((count($folders)) ? 'true' : ''),
+                       'categories'      => $categories,
+                       'folders'         => $folders,
+                       'body'            => $body_e,
+                       'text'            => $text_e,
+                       'id'              => $this->getId(),
+                       'guid'            => urlencode($item['guid']),
+                       'isevent'         => $isevent,
+                       'attend'          => $attend,
+                       'linktitle'       => sprintf(t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
+                       'olinktitle'      => sprintf(t('View %s\'s profile @ %s'), htmlentities($this->getOwnerName()), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
+                       'to'              => t('to'),
+                       'via'             => t('via'),
+                       'wall'            => t('Wall-to-Wall'),
+                       'vwall'           => t('via Wall-To-Wall:'),
+                       'profile_url'     => $profile_link,
+                       'item_photo_menu' => item_photo_menu($item),
+                       'name'            => $name_e,
+                       'thumb'           => $a->remove_baseurl(proxy_url($item['author-thumb'], false, PROXY_SIZE_THUMB)),
+                       'osparkle'        => $osparkle,
+                       'sparkle'         => $sparkle,
+                       'title'           => $title_e,
+                       'localtime'       => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
+                       'ago'             => (($item['app']) ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created'])),
+                       'app'             => $item['app'],
+                       'created'         => relative_date($item['created']),
+                       'lock'            => $lock,
+                       'location'        => $location_e,
+                       'indent'          => $indent,
+                       'shiny'           => $shiny,
+                       'owner_url'       => $this->getOwnerUrl(),
+                       'owner_photo'     => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)),
+                       'owner_name'      => htmlentities($owner_name_e),
+                       'plink'           => get_plink($item),
+                       'edpost'          => ((feature_enabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''),
+                       'isstarred'       => $isstarred,
+                       'star'            => ((feature_enabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''),
+                       'ignore'          => ((feature_enabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''),
+                       'tagger'          => $tagger,
+                       'filer'           => ((feature_enabled($conv->getProfileOwner(), 'filing')) ? $filer : ''),
+                       'drop'            => $drop,
+                       'vote'            => $buttons,
+                       'like'            => $responses['like']['output'],
+                       'dislike'         => $responses['dislike']['output'],
+                       'responses'       => $responses,
+                       'switchcomment'   => t('Comment'),
+                       'comment'         => $comment,
+                       'previewing'      => ($conv->isPreview() ? ' preview ' : ''),
+                       'wait'            => t('Please wait'),
+                       'thread_level'    => $thread_level,
+                       'edited'          => $edited,
+                       'network'         => $item["item_network"],
+                       'network_name'    => network_to_name($item['item_network'], $profile_link),
+                       'received'        => $item['received'],
+                       'commented'       => $item['commented'],
+                       'created_date'    => $item['created'],
+               );
+
+               $arr = array('item' => $item, 'output' => $tmp_item);
+               call_hooks('display_item', $arr);
+
+               $result = $arr['output'];
+
+               $result['children'] = array();
+               $children = $this->getChildren();
+               $nb_children = count($children);
+               if ($nb_children > 0) {
+                       foreach ($children as $child) {
+                               $result['children'][] = $child->getTemplateData($conv_responses, $thread_level + 1);
+                       }
+                       // Collapse
+                       if (($nb_children > 2) || ($thread_level > 1)) {
+                               $result['children'][0]['comment_firstcollapsed'] = true;
+                               $result['children'][0]['num_comments'] = sprintf(tt('%d comment', '%d comments', $total_children), $total_children);
+                               $result['children'][0]['hidden_comments_num'] = $total_children;
+                               $result['children'][0]['hidden_comments_text'] = tt('comment', 'comments', $total_children);
+                               $result['children'][0]['hide_text'] = t('show more');
+                               if ($thread_level > 1) {
+                                       $result['children'][$nb_children - 1]['comment_lastcollapsed'] = true;
+                               } else {
+                                       $result['children'][$nb_children - 3]['comment_lastcollapsed'] = true;
+                               }
+                       }
+               }
+
+               if ($this->isToplevel()) {
+                       $result['total_comments_num'] = "$total_children";
+                       $result['total_comments_text'] = tt('comment', 'comments', $total_children);
+               }
+
+               $result['private'] = $item['private'];
+               $result['toplevel'] = ($this->isToplevel() ? 'toplevel_item' : '');
+
+               if ($this->isThreaded()) {
+                       $result['flatten'] = false;
+                       $result['threaded'] = true;
+               } else {
+                       $result['flatten'] = true;
+                       $result['threaded'] = false;
+               }
+
+               return $result;
+       }
+
+       /**
+        * @return integer
+        */
+       public function getId()
+       {
+               return $this->getDataValue('id');
+       }
+
+       /**
+        * @return boolean
+        */
+       public function isThreaded()
+       {
+               return $this->threaded;
+       }
+
+       /**
+        * Add a child item
+        *
+        * @param object $item The child item to add
+        *
+        * @return mixed
+        */
+       public function addChild(Item $item)
+       {
+               $item_id = $item->getId();
+               if (!$item_id) {
+                       logger('[ERROR] Item::addChild : Item has no ID!!', LOGGER_DEBUG);
+                       return false;
+               } elseif ($this->getChild($item->getId())) {
+                       logger('[WARN] Item::addChild : Item already exists ('. $item->getId() .').', LOGGER_DEBUG);
+                       return false;
+               }
+               /*
+                * Only add what will be displayed
+                */
+               if ($item->getDataValue('network') === NETWORK_MAIL && local_user() != $item->getDataValue('uid')) {
+                       return false;
+               } elseif (activity_match($item->getDataValue('verb'), ACTIVITY_LIKE) || activity_match($item->getDataValue('verb'), ACTIVITY_DISLIKE)) {
+                       return false;
+               }
+
+               $item->setParent($this);
+               $this->children[] = $item;
+
+               return end($this->children);
+       }
+
+       /**
+        * Get a child by its ID
+        *
+        * @param integer $id The child id
+        *
+        * @return mixed
+        */
+       public function getChild($id)
+       {
+               foreach ($this->getChildren() as $child) {
+                       if ($child->getId() == $id) {
+                               return $child;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * Get all our children
+        *
+        * @return object
+        */
+       public function getChildren()
+       {
+               return $this->children;
+       }
+
+       /**
+        * Set our parent
+        *
+        * @param object $item The item to set as parent
+        *
+        * @return void
+        */
+       protected function setParent($item)
+       {
+               $parent = $this->getParent();
+               if ($parent) {
+                       $parent->removeChild($this);
+               }
+
+               $this->parent = $item;
+               $this->setConversation($item->getConversation());
+       }
+
+       /**
+        * Remove our parent
+        *
+        * @return void
+        */
+       protected function removeParent()
+       {
+               $this->parent = null;
+               $this->conversation = null;
+       }
+
+       /**
+        * Remove a child
+        *
+        * @param object $item The child to be removed
+        *
+        * @return boolean Success or failure
+        */
+       public function removeChild($item)
+       {
+               $id = $item->getId();
+               foreach ($this->getChildren() as $key => $child) {
+                       if ($child->getId() == $id) {
+                               $child->removeParent();
+                               unset($this->children[$key]);
+                               // Reindex the array, in order to make sure there won't be any trouble on loops using count()
+                               $this->children = array_values($this->children);
+                               return true;
+                       }
+               }
+               logger('[WARN] Item::removeChild : Item is not a child ('. $id .').', LOGGER_DEBUG);
+               return false;
+       }
+
+       /**
+        * Get parent item
+        *
+        * @return object
+        */
+       protected function getParent()
+       {
+               return $this->parent;
+       }
+
+       /**
+        * Set conversation
+        *
+        * @param object $conv The conversation
+        *
+        * @return void
+        */
+       public function setConversation($conv)
+       {
+               $previous_mode = ($this->conversation ? $this->conversation->getMode() : '');
+
+               $this->conversation = $conv;
+
+               // Set it on our children too
+               foreach ($this->getChildren() as $child) {
+                       $child->setConversation($conv);
+               }
+       }
+
+       /**
+        * Get conversation
+        *
+        * @return object
+        */
+       public function getConversation()
+       {
+               return $this->conversation;
+       }
+
+       /**
+        * Get raw data
+        *
+        * We shouldn't need this
+        *
+        * @return array
+        */
+       public function getData()
+       {
+               return $this->data;
+       }
+
+       /**
+        * Get a data value
+        *
+        * @param object $name key
+        *
+        * @return mixed value on success
+        *               false on failure
+        */
+       public function getDataValue($name)
+       {
+               if (!isset($this->data[$name])) {
+                       // logger('[ERROR] Item::getDataValue : Item has no value name "'. $name .'".', LOGGER_DEBUG);
+                       return false;
+               }
+
+               return $this->data[$name];
+       }
+
+       /**
+        * Set template
+        *
+        * @param object $name template name
+        *
+        * @return void
+        */
+       private function setTemplate($name)
+       {
+               if (!x($this->available_templates, $name)) {
+                       logger('[ERROR] Item::setTemplate : Template not available ("'. $name .'").', LOGGER_DEBUG);
+                       return false;
+               }
+
+               $this->template = $this->available_templates[$name];
+       }
+
+       /**
+        * Get template
+        *
+        * @return object
+        */
+       private function getTemplate()
+       {
+               return $this->template;
+       }
+
+       /**
+        * Check if this is a toplevel post
+        *
+        * @return boolean
+        */
+       private function isToplevel()
+       {
+               return $this->toplevel;
+       }
+
+       /**
+        * Check if this is writable
+        *
+        * @return boolean
+        */
+       private function isWritable()
+       {
+               $conv = $this->getConversation();
+
+               if ($conv) {
+                       // This will allow us to comment on wall-to-wall items owned by our friends
+                       // and community forums even if somebody else wrote the post.
+
+                       // bug #517 - this fixes for conversation owner
+                       if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) {
+                               return true;
+                       }
+
+                       // this fixes for visitors
+                       return ($this->writable || ($this->isVisiting() && $conv->getMode() == 'profile'));
+               }
+               return $this->writable;
+       }
+
+       /**
+        * Count the total of our descendants
+        *
+        * @return integer
+        */
+       private function countDescendants()
+       {
+               $children = $this->getChildren();
+               $total = count($children);
+               if ($total > 0) {
+                       foreach ($children as $child) {
+                               $total += $child->countDescendants();
+                       }
+               }
+
+               return $total;
+       }
+
+       /**
+        * Get the template for the comment box
+        *
+        * @return string
+        */
+       private function getCommentBoxTemplate()
+       {
+               return $this->comment_box_template;
+       }
+
+       /**
+        * Get the comment box
+        *
+        * @param string $indent Indent value
+        *
+        * @return mixed The comment box string (empty if no comment box)
+        *               false on failure
+        */
+       private function getCommentBox($indent)
+       {
+               $a = self::getApp();
+               if (!$this->isToplevel() && !(Config::get('system', 'thread_allow') && $a->theme_thread_allow)) {
+                       return '';
+               }
+
+               $comment_box = '';
+               $conv = $this->getConversation();
+               $template = get_markup_template($this->getCommentBoxTemplate());
+               $ww = '';
+               if (($conv->getMode() === 'network') && $this->isWallToWall()) {
+                       $ww = 'ww';
+               }
+
+               if ($conv->isWritable() && $this->isWritable()) {
+                       $qc = $qcomment =  null;
+
+                       /*
+                        * Hmmm, code depending on the presence of a particular plugin?
+                        * This should be better if done by a hook
+                        */
+                       if (in_array('qcomment', $a->plugins)) {
+                               $qc = ((local_user()) ? PConfig::get(local_user(), 'qcomment', 'words') : null);
+                               $qcomment = (($qc) ? explode("\n", $qc) : null);
+                       }
+
+                       $comment_box = replace_macros(
+                               $template,
+                               array(
+                               '$return_path' => $a->query_string,
+                               '$threaded'    => $this->isThreaded(),
+                               // '$jsreload'    => (($conv->getMode() === 'display') ? $_SESSION['return_url'] : ''),
+                               '$jsreload'    => '',
+                               '$type'        => (($conv->getMode() === 'profile') ? 'wall-comment' : 'net-comment'),
+                               '$id'          => $this->getId(),
+                               '$parent'      => $this->getId(),
+                               '$qcomment'    => $qcomment,
+                               '$profile_uid' =>  $conv->getProfileOwner(),
+                               '$mylink'      => $a->remove_baseurl($a->contact['url']),
+                               '$mytitle'     => t('This is you'),
+                               '$myphoto'     => $a->remove_baseurl($a->contact['thumb']),
+                               '$comment'     => t('Comment'),
+                               '$submit'      => t('Submit'),
+                               '$edbold'      => t('Bold'),
+                               '$editalic'    => t('Italic'),
+                               '$eduline'     => t('Underline'),
+                               '$edquote'     => t('Quote'),
+                               '$edcode'      => t('Code'),
+                               '$edimg'       => t('Image'),
+                               '$edurl'       => t('Link'),
+                               '$edvideo'     => t('Video'),
+                               '$preview'     => ((feature_enabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''),
+                               '$indent'      => $indent,
+                               '$sourceapp'   => t($a->sourcename),
+                               '$ww'          => (($conv->getMode() === 'network') ? $ww : ''),
+                               '$rand_num'    => random_digits(12))
+                       );
+               }
+
+               return $comment_box;
+       }
+
+       /**
+        * @return string
+        */
+       private function getRedirectUrl()
+       {
+               return $this->redirect_url;
+       }
+
+       /**
+        * Check if we are a wall to wall item and set the relevant properties
+        *
+        * @return void
+        */
+       protected function checkWallToWall()
+       {
+               $a = self::getApp();
+               $conv = $this->getConversation();
+               $this->wall_to_wall = false;
+
+               if ($this->isToplevel()) {
+                       if ($conv->getMode() !== 'profile') {
+                               if ($this->getDataValue('wall') && !$this->getDataValue('self')) {
+                                       // On the network page, I am the owner. On the display page it will be the profile owner.
+                                       // This will have been stored in $a->page_contact by our calling page.
+                                       // Put this person as the wall owner of the wall-to-wall notice.
+
+                                       $this->owner_url = zrl($a->page_contact['url']);
+                                       $this->owner_photo = $a->page_contact['thumb'];
+                                       $this->owner_name = $a->page_contact['name'];
+                                       $this->wall_to_wall = true;
+                               } elseif ($this->getDataValue('owner-link')) {
+                                       $owner_linkmatch = (($this->getDataValue('owner-link')) && link_compare($this->getDataValue('owner-link'), $this->getDataValue('author-link')));
+                                       $alias_linkmatch = (($this->getDataValue('alias')) && link_compare($this->getDataValue('alias'), $this->getDataValue('author-link')));
+                                       $owner_namematch = (($this->getDataValue('owner-name')) && $this->getDataValue('owner-name') == $this->getDataValue('author-name'));
+
+                                       if ((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
+                                               // The author url doesn't match the owner (typically the contact)
+                                               // and also doesn't match the contact alias.
+                                               // The name match is a hack to catch several weird cases where URLs are
+                                               // all over the park. It can be tricked, but this prevents you from
+                                               // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
+                                               // well that it's the same Bob Smith.
+
+                                               // But it could be somebody else with the same name. It just isn't highly likely.
+
+
+                                               $this->owner_photo = $this->getDataValue('owner-avatar');
+                                               $this->owner_name = $this->getDataValue('owner-name');
+                                               $this->wall_to_wall = true;
+                                               // If it is our contact, use a friendly redirect link
+                                               if ((link_compare($this->getDataValue('owner-link'), $this->getDataValue('url')))
+                                                       && ($this->getDataValue('network') === NETWORK_DFRN)
+                                               ) {
+                                                       $this->owner_url = $this->getRedirectUrl();
+                                               } else {
+                                                       $this->owner_url = zrl($this->getDataValue('owner-link'));
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               if (!$this->wall_to_wall) {
+                       $this->setTemplate('wall');
+                       $this->owner_url = '';
+                       $this->owner_photo = '';
+                       $this->owner_name = '';
+               }
+       }
+
+       /**
+        * @return boolean
+        */
+       private function isWallToWall()
+       {
+               return $this->wall_to_wall;
+       }
+
+       /**
+        * @return string
+        */
+       private function getOwnerUrl()
+       {
+               return $this->owner_url;
+       }
+
+       /**
+        * @return string
+        */
+       private function getOwnerPhoto()
+       {
+               return $this->owner_photo;
+       }
+
+       /**
+        * @return string
+        */
+       private function getOwnerName()
+       {
+               return $this->owner_name;
+       }
+
+       /**
+        * @return boolean
+        */
+       private function isVisiting()
+       {
+               return $this->visiting;
+       }
+}
diff --git a/src/Object/Profile.php b/src/Object/Profile.php
new file mode 100644 (file)
index 0000000..29925a9
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file src/Object/Profile.php
+ */
+
+namespace Friendica\Object;
+
+use Friendica\BaseObject;
+
+class Profile extends BaseObject
+{
+       /**
+        * @brief Returns a formatted location string from the given profile array
+        *
+        * @param array $profile Profile array (Generated from the "profile" table)
+        *
+        * @return string Location string
+        */
+       public static function formatLocation(array $profile)
+       {
+               $location = '';
+
+               if ($profile['locality']) {
+                       $location .= $profile['locality'];
+               }
+
+               if ($profile['region'] && ($profile['locality'] != $profile['region'])) {
+                       if ($location) {
+                               $location .= ', ';
+                       }
+
+                       $location .= $profile['region'];
+               }
+
+               if ($profile['country-name']) {
+                       if ($location) {
+                               $location .= ', ';
+                       }
+
+                       $location .= $profile['country-name'];
+               }
+
+               return $location;
+       }
+}
index d4a5efe8d920ff25a6bfc0109d3f8ce638eba923..592bca83c470334f4655762330309ed699504fbb 100644 (file)
@@ -12,8 +12,10 @@ use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
-use Friendica\Model\GlobalContact;
 use Friendica\Database\DBM;
+use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
+use Friendica\Object\Profile;
 use Friendica\Protocol\OStatus;
 use Friendica\Util\XML;
 
@@ -21,7 +23,6 @@ use dba;
 use DOMDocument;
 use DomXPath;
 
-require_once "include/Contact.php";
 require_once "include/enotify.php";
 require_once "include/threads.php";
 require_once "include/items.php";
@@ -706,7 +707,7 @@ class DFRN
                        if (trim($profile["locality"].$profile["region"].$profile["country-name"]) != "") {
                                $element = $doc->createElement("poco:address");
 
-                               XML::add_element($doc, $element, "poco:formatted", formatted_location($profile));
+                               XML::add_element($doc, $element, "poco:formatted", Profile::formatLocation($profile));
 
                                if (trim($profile["locality"]) != "") {
                                        XML::add_element($doc, $element, "poco:locality", $profile["locality"]);
@@ -740,8 +741,7 @@ class DFRN
         */
        private static function add_entry_author($doc, $element, $contact_url, $item)
        {
-
-               $contact = get_contact_details_by_url($contact_url, $item["uid"]);
+               $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
 
                $author = $doc->createElement($element);
                XML::add_element($doc, $author, "name", $contact["name"]);
@@ -1371,8 +1371,7 @@ class DFRN
 
                if ($contact['term-date'] > NULL_DATE) {
                        logger("dfrn_deliver: $url back from the dead - removing mark for death");
-                       include_once 'include/Contact.php';
-                       unmark_for_death($contact);
+                       Contact::unmarkForArchival($contact);
                }
 
                $res = parse_xml_string($xml);
index bf58f23e9b32c356075fa7c8d2f0b6db15753f22..ccd1ec594b6ce518914cf6063b5927e1ff082478 100644 (file)
@@ -18,6 +18,8 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
+use Friendica\Object\Profile;
 use Friendica\Util\XML;
 
 use dba;
@@ -25,7 +27,6 @@ use SimpleXMLElement;
 
 require_once 'include/items.php';
 require_once 'include/bb2diaspora.php';
-require_once 'include/Contact.php';
 require_once 'include/Photo.php';
 require_once 'include/group.php';
 require_once 'include/datetime.php';
@@ -948,7 +949,7 @@ class Diaspora
                         * We haven't found it?
                         * We use another function for it that will possibly create a contact entry.
                         */
-                       $cid = get_contact($handle, $uid);
+                       $cid = Contact::getIdForURL($handle, $uid);
 
                        if ($cid > 0) {
                                /// @TODO Contact retrieval should be encapsulated into an "entity" class like `Contact`
@@ -1340,7 +1341,7 @@ class Diaspora
 
                        // We are receiving content from a user that possibly is about to be terminated
                        // This means the user is vital, so we remove a possible termination date.
-                       unmark_for_death($r[0]);
+                       Contact::unmarkForArchival($r[0]);
                } else {
                        $cid = $contact["id"];
                        $network = NETWORK_DIASPORA;
@@ -1519,7 +1520,7 @@ class Diaspora
                }
 
                // We now remove the contact
-               contact_remove($contact["id"]);
+               Contact::remove($contact["id"]);
                return true;
        }
 
@@ -2808,7 +2809,7 @@ class Diaspora
                        case "Person":
                                /// @todo What should we do with an "unshare"?
                                // Removing the contact isn't correct since we still can read the public items
-                               contact_remove($contact["id"]);
+                               Contact::remove($contact["id"]);
                                return true;
 
                        default:
@@ -3149,11 +3150,11 @@ class Diaspora
                                add_to_queue($contact["id"], NETWORK_DIASPORA, $envelope, $public_batch);
 
                                // The message could not be delivered. We mark the contact as "dead"
-                               mark_for_death($contact);
+                               Contact::markForArchival($contact);
                        }
                } elseif (($return_code >= 200) && ($return_code <= 299)) {
                        // We successfully delivered a message, the contact is alive
-                       unmark_for_death($contact);
+                       Contact::unmarkForArchival($contact);
                }
 
                return(($return_code) ? $return_code : (-1));
@@ -3289,7 +3290,7 @@ class Diaspora
         *
         * @return int The result of the transmission
         */
-       public static function send_unshare($owner, $contact)
+       public static function sendUnshare($owner, $contact)
        {
                $message = array("author" => self::my_handle($owner),
                                "recipient" => $contact["addr"],
@@ -4005,7 +4006,7 @@ class Diaspora
                        $about = $profile['about'];
                        $about = strip_tags(bbcode($about));
 
-                       $location = formatted_location($profile);
+                       $location = Profile::formatLocation($profile);
                        $tags = '';
                        if ($profile['pub_keywords']) {
                                $kw = str_replace(',', ' ', $profile['pub_keywords']);
index 4ae9020f47b91494385d4a2c050437ace4bb3124..dfdc75498d6899877cd8f706cb9c7f70ab2408dd 100644 (file)
@@ -11,13 +11,13 @@ use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 use Friendica\Util\Lock;
 use Friendica\Util\XML;
 use dba;
 use DOMDocument;
 use DomXPath;
 
-require_once 'include/Contact.php';
 require_once 'include/threads.php';
 require_once 'include/html2bbcode.php';
 require_once 'include/bbcode.php';
@@ -152,7 +152,7 @@ class OStatus
                // Only update the contacts if it is an OStatus contact
                if ($r && ($r['id'] > 0) && !$onlyfetch && ($contact["network"] == NETWORK_OSTATUS)) {
                        // This contact is vital, so we awake it from the dead
-                       unmark_for_death($contact);
+                       Contact::unmarkForArchival($contact);
 
                        // Update contact data
 
@@ -207,7 +207,7 @@ class OStatus
                        }
 
                        // Ensure that we are having this contact (with uid=0)
-                       $cid = get_contact($aliaslink, 0);
+                       $cid = Contact::getIdForURL($aliaslink, 0);
 
                        if ($cid) {
                                $fields = array('url', 'nurl', 'name', 'nick', 'alias', 'about', 'location');
@@ -2097,7 +2097,7 @@ class OStatus
                }
 
                $check_date = datetime_convert('UTC', 'UTC', $last_update, 'Y-m-d H:i:s');
-               $authorid = get_contact($owner["url"], 0);
+               $authorid = Contact::getIdForURL($owner["url"], 0);
 
                $items = q(
                        "SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`)
index 1c0ce15a8fff33cf174557d2c924ea5f86cc8d07..59b3ad4325d7b10c6e8f94c81d5a9de53b7de88e 100644 (file)
@@ -9,14 +9,12 @@
 
 namespace Friendica\Protocol;
 
-use Friendica\App;
-use Friendica\Core\System;
-use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GlobalContact;
 use Friendica\Network\Probe;
+use Friendica\Object\Profile;
 use dba;
 use DOMDocument;
 use DomXPath;
@@ -25,7 +23,6 @@ use Exception;
 require_once 'include/datetime.php';
 require_once 'include/network.php';
 require_once 'include/html2bbcode.php';
-require_once 'include/Contact.php';
 require_once 'include/Photo.php';
 
 class PortableContact
@@ -400,7 +397,7 @@ class PortableContact
                                                        }
                                                }
 
-                                               $location = formatted_location($noscrape);
+                                               $location = Profile::formatLocation($noscrape);
                                                if ($location) {
                                                        $contact["location"] = $location;
                                                }
index e450deed109241e80e7853497bffc845a28307d7..14fe3027fc162c7d8ef800f321ed072674e0ad50 100644 (file)
@@ -9,6 +9,7 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\DFRN;
 
@@ -353,10 +354,10 @@ class Delivery {
                                        add_to_queue($contact['id'],NETWORK_DFRN,$atom);
 
                                        // The message could not be delivered. We mark the contact as "dead"
-                                       mark_for_death($contact);
+                                       Contact::markForArchival($contact);
                                } else {
                                        // We successfully delivered a message, the contact is alive
-                                       unmark_for_death($contact);
+                                       Contact::unmarkForArchival($contact);
                                }
 
                                break;
index 11f12df0305af858ee52899c094812c610b43ed7..61326fa88e552d66e673022ecb1fca70247b2e00 100644 (file)
@@ -15,9 +15,8 @@ class Expire {
        public static function execute($param = '', $hook_name = '') {
                global $a;
 
-               require_once('include/datetime.php');
-               require_once('include/items.php');
-               require_once('include/Contact.php');
+               require_once 'include/datetime.php';
+               require_once 'include/items.php';
 
                load_hooks();
 
index 40b2910a13b932eaba6f35d9d19e249b3d12c090..f3096e41a1ec0e8764667c1fdd26b347682fa773 100644 (file)
@@ -4,11 +4,11 @@
  */
 namespace Friendica\Worker;
 
-use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Network\Probe;
+use Friendica\Object\Contact;
 use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\OStatus;
 use dba;
@@ -119,19 +119,12 @@ class Notifier {
 
                        $user = $r[0];
 
-                       $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($item_id));
-                       if (!$r)
-                               return;
-
-                       $self = $r[0];
-
                        $r = q("SELECT * FROM `contact` WHERE NOT `self` AND `uid` = %d", intval($item_id));
                        if (!$r) {
                                return;
                        }
-                       require_once 'include/Contact.php';
                        foreach ($r as $contact) {
-                               terminate_friendship($user, $self, $contact);
+                               Contact::terminateFriendship($user, $contact);
                        }
                        return;
                } elseif ($cmd === 'relocate') {
index 374c69f13f1cd519194b2981b6440afe1a3a004f..356fce4337ff2a708c0c28185a0051b8cae39f4c 100644 (file)
@@ -7,6 +7,7 @@ namespace Friendica\Worker;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 use Friendica\Protocol\PortableContact;
 use dba;
 
@@ -19,7 +20,6 @@ Class OnePoll
 
                require_once 'include/datetime.php';
                require_once 'include/items.php';
-               require_once 'include/Contact.php';
                require_once 'include/email.php';
                require_once 'include/queue_fn.php';
 
@@ -126,11 +126,11 @@ Class OnePoll
                        }
 
                        if (!update_contact($contact["id"])) {
-                               mark_for_death($contact);
+                               Contact::markForArchival($contact);
                                logger('Contact is marked dead');
                                return;
                        } else {
-                               unmark_for_death($contact);
+                               Contact::unmarkForArchival($contact);
                        }
                }
 
@@ -196,7 +196,7 @@ Class OnePoll
                                // mean the software was uninstalled or the domain expired.
                                // Will keep trying for one month.
 
-                               mark_for_death($contact);
+                               Contact::markForArchival($contact);
 
                                // set the last-update so we don't keep polling
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
@@ -208,7 +208,7 @@ Class OnePoll
                        if (!strstr($handshake_xml, '<')) {
                                logger('response from ' . $url . ' did not contain XML.');
 
-                               mark_for_death($contact);
+                               Contact::markForArchival($contact);
 
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
                                dba::update('contact', $fields, array('id' => $contact['id']));
@@ -227,10 +227,10 @@ Class OnePoll
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
                                dba::update('contact', $fields, array('id' => $contact['id']));
 
-                               mark_for_death($contact);
+                               Contact::markForArchival($contact);
                        } elseif ($contact['term-date'] > NULL_DATE) {
                                logger("$url back from the dead - removing mark for death");
-                               unmark_for_death($contact);
+                               Contact::unmarkForArchival($contact);
                        }
 
                        if ((intval($res->status) != 0) || !strlen($res->challenge) || !strlen($res->dfrn_id)) {