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';
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;
+++ /dev/null
-<?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;
-}
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";
);
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(
use Friendica\Core\NotificationsManager;
use Friendica\Core\Worker;
use Friendica\Database\DBM;
+use Friendica\Object\Contact;
use Friendica\Protocol\Diaspora;
use Friendica\Util\XML;
'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"],
);
$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),
use Friendica\App;
use Friendica\Core\System;
use Friendica\Network\Probe;
+use Friendica\Object\Contact;
use League\HTMLToMarkdown\HtmlConverter;
return;
}
- $data = get_contact_details_by_addr($match[2]);
+ $data = Contact::getDetailsByAddr($match[2]);
$name = $match[1];
*/
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]);
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) {
// 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"].")";
<?php
-use Friendica\App;
use Friendica\Core\System;
use Friendica\Core\Config;
use Friendica\Core\PConfig;
}
function findpeople_widget() {
- require_once 'include/Contact.php';
-
$a = get_app();
$global_dir = Config::get('system', 'directory');
*/
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";
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);
}
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 {
}
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 {
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';
}
// Fetch the account type
- $account_type = account_type($profile);
+ $account_type = Contact::getAccountType($profile);
if ((x($profile, 'address') == 1)
|| (x($profile, 'location') == 1)
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;
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';
* 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
}
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;
}
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']);
}
}
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']);
}
}
use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBM;
+use Friendica\Object\Contact;
use Friendica\Protocol\Diaspora;
/**
$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)
use Friendica\Core\Config;
use Friendica\Database\DBM;
use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
/**
* @brief Calls the post update functions
// 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;
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`,
}
// 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;
}
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';
// 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';
*/
use Friendica\App;
-use Friendica\Core\BaseObject;
+use Friendica\BaseObject;
use Friendica\Core\System;
use Friendica\Core\Config;
use Friendica\Core\Worker;
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
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)));
}
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;
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';
}
$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);
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 = '';
// 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'];
'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'),
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)
$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");
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';
);
/// @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)
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'],
'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,
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';
'$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 = '';
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_drop')) {
- _contact_drop($contact_id, $orig_record);
+ _contact_drop($orig_record);
$count_actions++;
}
}
}
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`
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']);
}
}
}
- _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']);
'$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"]),
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 = "";
$o .= $tab_str;
- $o .= posts_from_contact_url($a, $contact["url"]);
+ $o .= Contact::getPostsFromUrl($contact["url"]);
return $o;
}
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,
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()) {
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"]));
}
}
use Friendica\App;
use Friendica\Core\Config;
use Friendica\Database\DBM;
+use Friendica\Object\Contact;
use Friendica\Protocol\DFRN;
require_once 'include/items.php';
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');
}
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);
'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'],
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';
$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;
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"]);
$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);
$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 {
'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,
);
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) {
function display_fetchauthor($a, $item) {
- require_once("include/Contact.php");
-
$profiledata = array();
$profiledata["uid"] = -1;
$profiledata["nickname"] = $item["author-name"];
$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"]);
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) {
));
$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'),
));
// Show last public posts
- $o .= posts_from_contact_url($a, $ret["url"]);
+ $o .= Contact::getPostsFromUrl($ret["url"]);
}
return $o;
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
$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
// '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") {
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';
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) {
$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"]);
$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();
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';
'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),
'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'),
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';
$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
$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
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';
'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,
*/
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)
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,
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';
$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");
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';
$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 {
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) {
}
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),
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));
use Friendica\App;
use Friendica\Core\System;
+use Friendica\Model\User;
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
}
use Friendica\Core\System;
use Friendica\Database\DBM;
use Friendica\Model\GlobalContact;
+use Friendica\Object\Contact;
require_once 'include/contact_widgets.php';
'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']),
'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'),
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) {
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']));
));
$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;
}
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');
$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");
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) {
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']),
--- /dev/null
+<?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;
+ }
+}
+++ /dev/null
-<?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;
- }
-}
+++ /dev/null
-<?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;
- }
-}
+++ /dev/null
-<?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;
- }
-}
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
$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`,
// 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'];
use Friendica\Core\Worker;
use Friendica\Database\DBM;
use Friendica\Network\Probe;
+use Friendica\Object\Profile;
use Friendica\Protocol\PortableContact;
use dba;
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';
/**
if (DBM::is_result($r)) {
return $r[0]['total'];
}
-
+
return 0;
}
intval($uid)
);
- $location = formatted_location(
+ $location = Profile::formatLocation(
array("locality" => $r[0]["locality"], "region" => $r[0]["region"], "country-name" => $r[0]["country-name"])
);
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 '';
+ }
}
--- /dev/null
+<?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());
+ }
+ }
+}
use Friendica\Core\Cache;
use Friendica\Core\Config;
use Friendica\Database\DBM;
+use Friendica\Object\Profile;
use Friendica\Util\XML;
use dba;
}
}
- $location = formatted_location($json);
+ $location = Profile::formatLocation($json);
if ($location) {
$data["location"] = $location;
}
--- /dev/null
+<?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;
+ }
+}
--- /dev/null
+<?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;
+ }
+}
--- /dev/null
+<?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;
+ }
+}
--- /dev/null
+<?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;
+ }
+}
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;
use DOMDocument;
use DomXPath;
-require_once "include/Contact.php";
require_once "include/enotify.php";
require_once "include/threads.php";
require_once "include/items.php";
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"]);
*/
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"]);
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);
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;
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';
* 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`
// 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;
}
// We now remove the contact
- contact_remove($contact["id"]);
+ Contact::remove($contact["id"]);
return true;
}
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:
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));
*
* @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"],
$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']);
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';
// 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
}
// 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');
}
$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`)
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;
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
}
}
- $location = formatted_location($noscrape);
+ $location = Profile::formatLocation($noscrape);
if ($location) {
$contact["location"] = $location;
}
use Friendica\Core\System;
use Friendica\Core\Config;
use Friendica\Database\DBM;
+use Friendica\Object\Contact;
use Friendica\Protocol\Diaspora;
use Friendica\Protocol\DFRN;
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;
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();
*/
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;
$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') {
use Friendica\Core\Config;
use Friendica\Core\PConfig;
use Friendica\Database\DBM;
+use Friendica\Object\Contact;
use Friendica\Protocol\PortableContact;
use dba;
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';
}
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);
}
}
// 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());
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']));
$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)) {