2010-09-08 23:14:17 -04:00
< ? php
2017-11-15 23:09:11 -05:00
/**
* @ file include / Contact . php
*/
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2017-11-06 21:22:52 -05:00
use Friendica\Core\PConfig ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2017-11-05 07:15:53 -05:00
use Friendica\Core\Worker ;
2017-11-07 22:57:46 -05:00
use Friendica\Database\DBM ;
2017-05-07 14:44:30 -04:00
use Friendica\Network\Probe ;
2017-11-07 19:37:53 -05:00
use Friendica\Protocol\Diaspora ;
2017-11-07 22:57:46 -05:00
use Friendica\Protocol\DFRN ;
2017-11-15 23:09:11 -05:00
use Friendica\Protocol\OStatus ;
2017-04-30 00:07:00 -04:00
2010-10-06 20:40:58 -04:00
// 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 ) {
2017-09-15 15:41:30 -04:00
if ( ! $uid ) {
2011-02-03 06:58:47 -05:00
return ;
2017-09-15 15:41:30 -04:00
}
2011-02-03 06:58:47 -05:00
logger ( 'Removing user: ' . $uid );
2012-01-18 19:21:30 -05:00
2017-09-15 15:41:30 -04:00
$r = dba :: select ( 'user' , array (), array ( 'uid' => $uid ), array ( " limit " => 1 ));
2012-01-18 19:21:30 -05:00
2017-09-15 15:41:30 -04:00
call_hooks ( 'remove_user' , $r );
2012-01-18 19:21:30 -05:00
2015-02-01 07:32:05 -05:00
// save username (actually the nickname as it is guaranteed
2012-03-22 04:46:52 -04:00
// unique), so it cannot be re-registered in the future.
2017-09-15 15:41:30 -04:00
dba :: insert ( 'userd' , array ( 'username' => $r [ 'nickname' ]));
2012-01-18 19:21:30 -05:00
2017-05-13 00:04:17 -04:00
// The user and related data will be deleted in "cron_expire_and_remove_users" (cronjobs.php)
2012-11-02 16:43:47 -04:00
q ( " UPDATE `user` SET `account_removed` = 1, `account_expires_on` = UTC_TIMESTAMP() WHERE `uid` = %d " , intval ( $uid ));
2017-11-05 07:15:53 -05:00
Worker :: add ( PRIORITY_HIGH , " notifier " , " removeme " , $uid );
2015-03-30 16:22:11 -04:00
// Send an update to the directory
2017-11-05 07:15:53 -05:00
Worker :: add ( PRIORITY_LOW , " directory " , $r [ 'url' ]);
2015-03-30 16:22:11 -04:00
2017-03-21 12:02:59 -04:00
if ( $uid == local_user ()) {
2010-10-06 20:40:58 -04:00
unset ( $_SESSION [ 'authenticated' ]);
unset ( $_SESSION [ 'uid' ]);
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl ());
2010-10-06 20:40:58 -04:00
}
}
2010-09-08 23:14:17 -04:00
function contact_remove ( $id ) {
2012-04-29 00:56:17 -04:00
2017-01-29 08:57:03 -05:00
// 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 " ,
2012-04-29 00:56:17 -04:00
intval ( $id )
);
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r ) || ! intval ( $r [ 0 ][ 'uid' ])) {
2012-04-29 00:56:17 -04:00
return ;
2017-01-29 08:57:03 -05:00
}
2012-04-29 00:56:17 -04:00
2017-11-06 21:22:52 -05:00
$archive = PConfig :: get ( $r [ 0 ][ 'uid' ], 'system' , 'archive_removed_contacts' );
2017-01-29 09:00:44 -05:00
if ( $archive ) {
2014-03-11 18:52:32 -04:00
q ( " update contact set `archive` = 1, `network` = 'none', `writable` = 0 where id = %d " ,
2012-04-29 00:56:17 -04:00
intval ( $id )
);
return ;
}
2017-08-12 18:15:16 -04:00
dba :: delete ( 'contact' , array ( 'id' => $id ));
2011-10-13 18:39:05 -04:00
2016-11-28 16:44:04 -05:00
// Delete the rest in the background
2017-11-17 17:16:34 -05:00
Worker :: add ( PRIORITY_LOW , 'RemoveContact' , $id );
2010-09-08 23:14:17 -04:00
}
2012-04-23 22:42:57 -04:00
// sends an unfriend message. Does not remove the contact
function terminate_friendship ( $user , $self , $contact ) {
2016-12-19 08:26:13 -05:00
/// @TODO Get rid of this, include/datetime.php should care about it by itself
2012-04-23 22:42:57 -04:00
$a = get_app ();
2017-05-07 14:40:23 -04:00
require_once 'include/datetime.php' ;
2012-04-23 22:42:57 -04:00
2016-12-22 09:30:23 -05:00
if ( $contact [ 'network' ] === NETWORK_OSTATUS ) {
2016-12-18 12:10:38 -05:00
// create an unfollow slap
$item = array ();
$item [ 'verb' ] = NAMESPACE_OSTATUS . " /unfollow " ;
$item [ 'follow' ] = $contact [ " url " ];
2017-11-15 23:09:11 -05:00
$slap = OStatus :: salmon ( $item , $user );
2012-04-23 22:42:57 -04:00
2016-12-22 09:30:23 -05:00
if (( x ( $contact , 'notify' )) && ( strlen ( $contact [ 'notify' ]))) {
2017-05-07 14:40:23 -04:00
require_once 'include/salmon.php' ;
2012-04-23 22:42:57 -04:00
slapper ( $user , $contact [ 'notify' ], $slap );
}
2016-12-22 09:30:23 -05:00
} elseif ( $contact [ 'network' ] === NETWORK_DIASPORA ) {
2016-12-20 12:44:15 -05:00
Diaspora :: send_unshare ( $user , $contact );
2016-12-22 09:30:23 -05:00
} elseif ( $contact [ 'network' ] === NETWORK_DFRN ) {
2017-11-07 22:57:46 -05:00
DFRN :: deliver ( $user , $contact , 'placeholder' , 1 );
2012-04-23 22:42:57 -04:00
}
}
2010-09-08 23:14:17 -04:00
// 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.
2015-11-07 12:25:35 -05:00
2017-03-21 12:02:59 -04:00
function mark_for_death ( $contact ) {
2012-06-14 19:56:46 -04:00
2017-03-21 12:02:59 -04:00
if ( $contact [ 'archive' ])
2012-06-14 19:56:46 -04:00
return ;
2017-03-18 08:13:43 -04:00
if ( $contact [ 'term-date' ] <= NULL_DATE ) {
2014-03-11 18:52:32 -04:00
q ( " UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d " ,
2010-09-08 23:14:17 -04:00
dbesc ( datetime_convert ()),
intval ( $contact [ 'id' ])
);
2016-11-19 15:10:29 -05:00
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 {
2012-06-13 22:59:20 -04:00
2016-10-22 22:49:12 -04:00
/// @todo
2015-12-25 17:17:34 -05:00
/// 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
2012-06-13 22:59:20 -04:00
2016-11-19 15:10:29 -05:00
/// @todo
/// Check for contact vitality via probing
2010-09-08 23:14:17 -04:00
$expiry = $contact [ 'term-date' ] . ' + 32 days ' ;
2017-03-21 12:02:59 -04:00
if ( datetime_convert () > datetime_convert ( 'UTC' , 'UTC' , $expiry )) {
2010-09-08 23:14:17 -04:00
2015-11-07 12:25:35 -05:00
// relationship is really truly dead.
2012-06-13 22:59:20 -04:00
// archive them rather than delete
// though if the owner tries to unarchive them we'll start the whole process over again
2016-11-19 15:10:29 -05:00
q ( " UPDATE `contact` SET `archive` = 1 WHERE `id` = %d " ,
2012-06-13 22:59:20 -04:00
intval ( $contact [ 'id' ])
);
2010-09-08 23:14:17 -04:00
2016-11-19 15:10:29 -05:00
if ( $contact [ 'url' ] != '' ) {
q ( " UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s' " ,
dbesc ( normalise_link ( $contact [ 'url' ]))
);
}
2010-09-08 23:14:17 -04:00
}
}
2016-11-19 15:10:29 -05:00
}
2010-09-08 23:14:17 -04:00
function unmark_for_death ( $contact ) {
2016-11-19 15:10:29 -05:00
2017-10-15 15:34:15 -04:00
$r = q ( " SELECT `term-date` FROM `contact` WHERE `id` = %d AND (`term-date` > '%s' OR `archive`) " ,
2016-11-19 15:10:29 -05:00
intval ( $contact [ 'id' ]),
dbesc ( '1000-00-00 00:00:00' )
);
// We don't need to update, we never marked this contact as dead
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2016-11-19 15:10:29 -05:00
return ;
}
2010-09-08 23:14:17 -04:00
// It's a miracle. Our dead contact has inexplicably come back to life.
2017-10-15 15:34:15 -04:00
$fields = array ( 'term-date' => NULL_DATE , 'archive' => false );
dba :: update ( 'contact' , $fields , array ( 'id' => $contact [ 'id' ]));
2016-11-19 15:10:29 -05:00
if ( $contact [ 'url' ] != '' ) {
2017-10-15 15:34:15 -04:00
dba :: update ( 'contact' , $fields , array ( 'nurl' => normalise_link ( $contact [ 'url' ])));
2016-11-19 15:10:29 -05:00
}
}
2010-09-08 23:14:17 -04:00
2016-06-05 09:03:04 -04:00
/**
* @ brief Get contact data for a given profile link
*
* The function looks at several places ( contact table and gcontact table ) for the contact
2016-11-06 00:51:23 -04:00
* It caches its result for the same script execution to prevent duplicate calls
2016-06-05 09:03:04 -04:00
*
* @ 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
*/
2016-06-05 07:57:11 -04:00
function get_contact_details_by_url ( $url , $uid = - 1 , $default = array ()) {
2016-11-06 00:51:23 -04:00
static $cache = array ();
2017-04-18 14:50:01 -04:00
if ( $url == '' ) {
return $default ;
}
2016-11-06 00:51:23 -04:00
if ( $uid == - 1 ) {
2015-10-29 20:30:42 -04:00
$uid = local_user ();
2016-11-06 00:51:23 -04:00
}
if ( isset ( $cache [ $url ][ $uid ])) {
return $cache [ $url ][ $uid ];
}
2015-10-29 20:30:42 -04:00
2017-09-17 04:01:22 -04:00
$ssl_url = str_replace ( 'http://' , 'https://' , $url );
2016-06-12 04:46:15 -04:00
// Fetch contact data from the contact table for the given user
2017-08-11 04:04:01 -04:00
$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`,
2016-10-01 16:03:27 -04:00
`keywords` , `gender` , `photo` , `thumb` , `micro` , `forum` , `prv` , ( `forum` | `prv` ) AS `community` , `contact-type` , `bd` AS `birthday` , `self`
2017-08-11 04:04:01 -04:00
FROM `contact` WHERE `nurl` = ? AND `uid` = ? " ,
normalise_link ( $url ), $uid );
2017-08-14 16:17:17 -04:00
$r = dba :: inArray ( $s );
2015-10-29 20:30:42 -04:00
2017-09-17 04:01:22 -04:00
// Fetch contact data from the contact table for the given user, checking with the alias
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-09-17 04:01:22 -04:00
$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 );
}
2016-06-05 07:57:11 -04:00
// Fetch the data from the contact table with "uid=0" (which is filled automatically)
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-08-11 04:04:01 -04:00
$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`,
2016-10-01 16:03:27 -04:00
`keywords` , `gender` , `photo` , `thumb` , `micro` , `forum` , `prv` , ( `forum` | `prv` ) AS `community` , `contact-type` , `bd` AS `birthday` , 0 AS `self`
2017-08-11 04:04:01 -04:00
FROM `contact` WHERE `nurl` = ? AND `uid` = 0 " ,
normalise_link ( $url ));
2017-08-14 16:58:02 -04:00
$r = dba :: inArray ( $s );
}
2015-10-29 20:30:42 -04:00
2017-09-17 04:01:22 -04:00
// Fetch the data from the contact table with "uid=0" (which is filled automatically) - checked with the alias
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-09-17 04:01:22 -04:00
$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 );
}
2016-06-05 07:57:11 -04:00
// Fetch the data from the gcontact table
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-08-11 04:04:01 -04:00
$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`,
2016-10-03 23:58:47 -04:00
`keywords` , `gender` , `photo` , `photo` AS `thumb` , `photo` AS `micro` , `community` AS `forum` , 0 AS `prv` , `community` , `contact-type` , `birthday` , 0 AS `self`
2017-08-11 04:04:01 -04:00
FROM `gcontact` WHERE `nurl` = ? " ,
normalise_link ( $url ));
2017-08-14 16:58:02 -04:00
$r = dba :: inArray ( $s );
}
2016-06-05 07:57:11 -04:00
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $r )) {
2016-06-12 04:46:15 -04:00
// If there is more than one entry we filter out the connector networks
2016-11-06 00:51:23 -04:00
if ( count ( $r ) > 1 ) {
foreach ( $r AS $id => $result ) {
if ( $result [ " network " ] == NETWORK_STATUSNET ) {
2016-06-12 04:46:15 -04:00
unset ( $r [ $id ]);
2016-11-06 00:51:23 -04:00
}
}
}
2016-06-12 04:46:15 -04:00
$profile = array_shift ( $r );
2016-06-05 09:09:40 -04:00
// "bd" always contains the upcoming birthday of a contact.
// "birthday" might contain the birthday including the year of birth.
2017-04-11 17:00:45 -04:00
if ( $profile [ " birthday " ] > '0001-01-01' ) {
2016-06-05 09:09:40 -04:00
$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 ;
2016-11-06 00:51:23 -04:00
if ( $profile [ " bd " ] < $current ) {
2016-06-05 09:09:40 -04:00
$profile [ " bd " ] = ( ++ $current_year ) . " - " . $month . " - " . $day ;
2016-11-06 00:51:23 -04:00
}
} else {
2017-04-11 17:00:45 -04:00
$profile [ " bd " ] = '0001-01-01' ;
2016-11-06 00:51:23 -04:00
}
} else {
2016-06-05 07:57:11 -04:00
$profile = $default ;
2016-11-06 00:51:23 -04:00
}
2016-06-18 19:22:32 -04:00
2017-06-07 22:00:59 -04:00
if (( $profile [ " photo " ] == " " ) && isset ( $default [ " photo " ])) {
2016-06-18 19:22:32 -04:00
$profile [ " photo " ] = $default [ " photo " ];
2016-11-06 00:51:23 -04:00
}
2016-06-18 19:22:32 -04:00
2017-06-07 22:00:59 -04:00
if (( $profile [ " name " ] == " " ) && isset ( $default [ " name " ])) {
2016-06-18 19:22:32 -04:00
$profile [ " name " ] = $default [ " name " ];
2016-11-06 00:51:23 -04:00
}
2016-06-18 19:22:32 -04:00
2017-06-07 22:00:59 -04:00
if (( $profile [ " network " ] == " " ) && isset ( $default [ " network " ])) {
2016-06-18 19:22:32 -04:00
$profile [ " network " ] = $default [ " network " ];
2016-11-06 00:51:23 -04:00
}
2016-06-18 19:22:32 -04:00
2017-06-07 22:00:59 -04:00
if (( $profile [ " thumb " ] == " " ) && isset ( $profile [ " photo " ])) {
2016-06-18 19:22:32 -04:00
$profile [ " thumb " ] = $profile [ " photo " ];
2016-11-06 00:51:23 -04:00
}
2016-06-05 07:57:11 -04:00
2017-06-07 22:00:59 -04:00
if (( $profile [ " micro " ] == " " ) && isset ( $profile [ " thumb " ])) {
2016-06-25 07:56:55 -04:00
$profile [ " micro " ] = $profile [ " thumb " ];
2016-11-06 00:51:23 -04:00
}
2016-06-25 07:56:55 -04:00
2017-06-07 22:00:59 -04:00
if ((( $profile [ " addr " ] == " " ) || ( $profile [ " name " ] == " " )) && ( $profile [ " gid " ] != 0 ) &&
2016-11-06 00:51:23 -04:00
in_array ( $profile [ " network " ], array ( NETWORK_DFRN , NETWORK_DIASPORA , NETWORK_OSTATUS ))) {
2017-11-15 16:12:33 -05:00
Worker :: add ( PRIORITY_LOW , " UpdateGContact " , $profile [ " gid " ]);
2016-11-06 00:51:23 -04:00
}
2015-10-29 20:30:42 -04:00
2016-06-05 07:57:11 -04:00
// Show contact details of Diaspora contacts only if connected
2017-06-07 22:00:59 -04:00
if (( $profile [ " cid " ] == 0 ) && ( $profile [ " network " ] == NETWORK_DIASPORA )) {
2015-10-29 20:30:42 -04:00
$profile [ " location " ] = " " ;
$profile [ " about " ] = " " ;
2016-06-05 07:57:11 -04:00
$profile [ " gender " ] = " " ;
2017-04-11 17:00:45 -04:00
$profile [ " birthday " ] = '0001-01-01' ;
2015-10-29 20:30:42 -04:00
}
2016-11-06 00:51:23 -04:00
$cache [ $url ][ $uid ] = $profile ;
2015-10-29 20:30:42 -04:00
2016-11-06 00:51:23 -04:00
return $profile ;
2015-10-29 20:30:42 -04:00
}
2011-08-25 01:40:26 -04:00
2017-02-04 17:22:12 -05:00
/**
* @ 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 ();
2017-04-18 14:50:01 -04:00
if ( $addr == '' ) {
return array ();
}
2017-02-04 17:22:12 -05:00
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)
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r ))
2017-02-04 17:22:12 -05:00
$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
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r ))
2017-02-04 17:22:12 -05:00
$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 ));
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-02-04 17:22:12 -05:00
$data = Probe :: uri ( $addr );
$profile = get_contact_details_by_url ( $data [ 'url' ], $uid );
} else {
$profile = $r [ 0 ];
}
return $profile ;
}
2016-10-22 22:49:12 -04:00
if ( ! function_exists ( 'contact_photo_menu' )) {
function contact_photo_menu ( $contact , $uid = 0 )
{
2011-08-25 01:40:26 -04:00
$a = get_app ();
2015-02-01 07:32:05 -05:00
2016-10-22 22:49:12 -04:00
$contact_url = '' ;
$pm_url = '' ;
$status_link = '' ;
$photos_link = '' ;
$posts_link = '' ;
$contact_drop_link = '' ;
$poke_link = '' ;
2011-08-25 01:40:26 -04:00
2016-10-22 22:49:12 -04:00
if ( $uid == 0 ) {
2015-11-29 03:35:35 -05:00
$uid = local_user ();
2016-10-22 22:49:12 -04:00
}
2015-11-29 03:35:35 -05:00
2016-10-22 22:49:12 -04:00
if ( $contact [ 'uid' ] != $uid ) {
2015-11-29 03:35:35 -05:00
if ( $uid == 0 ) {
$profile_link = zrl ( $contact [ 'url' ]);
2016-10-22 22:49:12 -04:00
$menu = Array ( 'profile' => array ( t ( 'View Profile' ), $profile_link , true ));
2015-11-29 03:35:35 -05:00
return $menu ;
}
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `network` = '%s' AND `uid` = %d " ,
2016-10-22 22:49:12 -04:00
dbesc ( $contact [ 'nurl' ]), dbesc ( $contact [ 'network' ]), intval ( $uid ));
if ( $r ) {
2015-11-29 03:35:35 -05:00
return contact_photo_menu ( $r [ 0 ], $uid );
2016-10-22 22:49:12 -04:00
} else {
2015-11-29 03:35:35 -05:00
$profile_link = zrl ( $contact [ 'url' ]);
$connlnk = 'follow/?url=' . $contact [ 'url' ];
2016-10-22 22:49:12 -04:00
$menu = array (
'profile' => array ( t ( 'View Profile' ), $profile_link , true ),
'follow' => array ( t ( 'Connect/Follow' ), $connlnk , true )
);
2015-11-29 03:35:35 -05:00
return $menu ;
}
}
2011-08-25 01:40:26 -04:00
$sparkle = false ;
2016-10-22 22:49:12 -04:00
if ( $contact [ 'network' ] === NETWORK_DFRN ) {
2011-08-25 01:40:26 -04:00
$sparkle = true ;
2017-08-26 03:32:10 -04:00
$profile_link = System :: baseUrl () . '/redir/' . $contact [ 'id' ];
2016-10-22 22:49:12 -04:00
} else {
2011-08-25 01:40:26 -04:00
$profile_link = $contact [ 'url' ];
2016-10-22 22:49:12 -04:00
}
2011-08-25 01:40:26 -04:00
2016-10-22 22:49:12 -04:00
if ( $profile_link === 'mailbox' ) {
2011-08-25 01:40:26 -04:00
$profile_link = '' ;
2016-10-22 22:49:12 -04:00
}
2011-08-25 01:40:26 -04:00
2016-10-22 22:49:12 -04:00
if ( $sparkle ) {
$status_link = $profile_link . '?url=status' ;
$photos_link = $profile_link . '?url=photos' ;
$profile_link = $profile_link . '?url=profile' ;
2011-08-25 01:40:26 -04:00
}
2016-10-22 22:49:12 -04:00
if ( in_array ( $contact [ 'network' ], array ( NETWORK_DFRN , NETWORK_DIASPORA ))) {
2017-08-26 03:32:10 -04:00
$pm_url = System :: baseUrl () . '/message/new/' . $contact [ 'id' ];
2016-10-22 22:49:12 -04:00
}
2015-10-04 18:14:39 -04:00
2016-10-22 22:49:12 -04:00
if ( $contact [ 'network' ] == NETWORK_DFRN ) {
2017-08-26 03:32:10 -04:00
$poke_link = System :: baseUrl () . '/poke/?f=&c=' . $contact [ 'id' ];
2016-10-22 22:49:12 -04:00
}
2015-10-04 18:14:39 -04:00
2017-08-26 03:32:10 -04:00
$contact_url = System :: baseUrl () . '/contacts/' . $contact [ 'id' ];
2015-02-01 07:32:05 -05:00
2017-08-26 03:32:10 -04:00
$posts_link = System :: baseUrl () . '/contacts/' . $contact [ 'id' ] . '/posts' ;
$contact_drop_link = System :: baseUrl () . '/contacts/' . $contact [ 'id' ] . '/drop?confirm=1' ;
2011-08-25 01:40:26 -04:00
2015-11-07 12:25:35 -05:00
/**
* menu array :
* " name " => [ " Label " , " link " , ( bool ) Should the link opened in a new tab ? ]
*/
2016-10-22 22:49:12 -04:00
$menu = array (
2015-11-07 12:25:35 -05:00
'status' => array ( t ( " View Status " ), $status_link , true ),
'profile' => array ( t ( " View Profile " ), $profile_link , true ),
2016-10-22 22:49:12 -04:00
'photos' => array ( t ( " View Photos " ), $photos_link , true ),
'network' => array ( t ( " Network Posts " ), $posts_link , false ),
'edit' => array ( t ( " View Contact " ), $contact_url , false ),
2015-11-07 12:25:35 -05:00
'drop' => array ( t ( " Drop Contact " ), $contact_drop_link , false ),
'pm' => array ( t ( " Send PM " ), $pm_url , false ),
'poke' => array ( t ( " Poke " ), $poke_link , false ),
2011-08-25 01:40:26 -04:00
);
2015-02-01 07:32:05 -05:00
2012-05-13 04:15:54 -04:00
$args = array ( 'contact' => $contact , 'menu' => & $menu );
2015-02-01 07:32:05 -05:00
2011-08-25 01:40:26 -04:00
call_hooks ( 'contact_photo_menu' , $args );
2015-02-01 07:32:05 -05:00
2015-10-04 18:14:39 -04:00
$menucondensed = array ();
2016-10-22 22:49:12 -04:00
foreach ( $menu AS $menuname => $menuitem ) {
if ( $menuitem [ 1 ] != '' ) {
2015-11-07 12:25:35 -05:00
$menucondensed [ $menuname ] = $menuitem ;
2016-10-22 22:49:12 -04:00
}
}
2015-10-04 18:14:39 -04:00
return $menucondensed ;
2011-08-25 01:40:26 -04:00
}}
2012-04-10 23:50:31 -04:00
function random_profile () {
2015-07-29 01:32:00 -04:00
$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 ));
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $r ))
2012-04-10 23:50:31 -04:00
return dirname ( $r [ 0 ][ 'url' ]);
return '' ;
2012-04-12 10:48:28 -04:00
}
2012-04-13 02:06:41 -04:00
function contacts_not_grouped ( $uid , $start = 0 , $count = 0 ) {
2012-04-13 02:14:41 -04:00
2017-03-21 12:02:59 -04:00
if ( ! $count ) {
2012-04-13 02:06:41 -04:00
$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 )
);
2012-04-13 02:14:41 -04:00
2012-04-13 02:06:41 -04:00
return $r ;
}
2012-04-13 02:14:41 -04:00
$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 " ,
2012-04-13 02:06:41 -04:00
intval ( $uid ),
2012-04-12 10:48:28 -04:00
intval ( $uid ),
2012-04-13 02:06:41 -04:00
intval ( $start ),
intval ( $count )
2012-04-12 10:48:28 -04:00
);
2012-04-13 02:14:41 -04:00
2012-04-12 10:48:28 -04:00
return $r ;
}
2016-11-04 18:45:20 -04:00
/**
* @ brief Fetch the contact id for a given url and user
*
2017-03-06 05:37:01 -05:00
* 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
*
2016-11-04 18:45:20 -04:00
* @ param string $url Contact URL
2017-03-06 05:37:01 -05:00
* @ param integer $uid The user id for the contact ( 0 = public contact )
2016-11-04 18:45:20 -04:00
* @ param boolean $no_update Don ' t update the contact
*
* @ return integer Contact ID
*/
function get_contact ( $url , $uid = 0 , $no_update = false ) {
2017-08-26 06:01:50 -04:00
logger ( " Get contact data for url " . $url . " and user " . $uid . " - " . System :: callstack (), LOGGER_DEBUG );
2016-11-04 18:45:20 -04:00
2015-02-01 04:26:35 -05:00
$data = array ();
2017-03-06 05:37:01 -05:00
$contact_id = 0 ;
2015-02-01 04:26:35 -05:00
2017-04-18 14:50:01 -04:00
if ( $url == '' ) {
return 0 ;
}
2017-03-06 16:26:04 -05:00
// We first try the nurl (http://server.tld/nick), most common case
2017-07-11 14:32:35 -04:00
$contact = dba :: select ( 'contact' , array ( 'id' , 'avatar-date' ), array ( 'nurl' => normalise_link ( $url ), 'uid' => $uid ), array ( 'limit' => 1 ));
2015-02-01 07:32:05 -05:00
2017-03-06 16:26:04 -05:00
// Then the addr (nick@server.tld)
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $contact )) {
2017-07-11 14:32:35 -04:00
$contact = dba :: select ( 'contact' , array ( 'id' , 'avatar-date' ), array ( 'addr' => $url , 'uid' => $uid ), array ( 'limit' => 1 ));
2017-03-06 16:19:12 -05:00
}
// Then the alias (which could be anything)
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $contact )) {
2017-09-17 04:01:22 -04:00
// 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 );
2017-07-11 14:32:35 -04:00
$contact = dba :: fetch ( $r );
dba :: close ( $r );
2017-03-06 16:19:12 -05:00
}
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $contact )) {
2017-07-11 14:32:35 -04:00
$contact_id = $contact [ " id " ];
2015-02-01 07:32:05 -05:00
2015-02-01 10:32:58 -05:00
// Update the contact every 7 days
2017-07-11 14:32:35 -04:00
$update_contact = ( $contact [ 'avatar-date' ] < datetime_convert ( '' , '' , 'now -7 days' ));
2015-02-01 07:32:05 -05:00
2017-09-28 02:01:31 -04:00
// We force the update if the avatar is empty
if ( $contact [ 'avatar' ] == '' ) {
$update_contact = true ;
}
2017-07-11 14:32:35 -04:00
if ( ! $update_contact || $no_update ) {
2017-03-06 05:37:01 -05:00
return $contact_id ;
2016-11-04 18:45:20 -04:00
}
2017-03-06 05:37:01 -05:00
} elseif ( $uid != 0 ) {
2017-03-06 16:19:12 -05:00
// Non-existing user-specific contact, exiting
2015-05-09 13:39:47 -04:00
return 0 ;
2017-03-06 05:37:01 -05:00
}
2015-02-01 04:26:35 -05:00
2017-09-23 18:53:44 -04:00
$data = Probe :: uri ( $url , " " , $uid );
2015-02-01 04:26:35 -05:00
2017-03-07 16:43:22 -05:00
// Last try in gcontact for unsupported networks
2017-09-23 18:53:44 -04:00
if ( ! in_array ( $data [ " network " ], array ( NETWORK_DFRN , NETWORK_OSTATUS , NETWORK_DIASPORA , NETWORK_PUMPIO , NETWORK_MAIL ))) {
2017-03-06 05:37:01 -05:00
if ( $uid != 0 ) {
2016-06-18 19:07:20 -04:00
return 0 ;
2017-03-06 05:37:01 -05:00
}
2016-06-18 19:07:20 -04:00
// Get data from the gcontact table
2017-07-11 14:32:35 -04:00
$gcontacts = dba :: select ( 'gcontact' , array ( 'name' , 'nick' , 'url' , 'photo' , 'addr' , 'alias' , 'network' ),
array ( 'nurl' => normalise_link ( $url )), array ( 'limit' => 1 ));
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $gcontacts )) {
2016-06-18 19:07:20 -04:00
return 0 ;
2017-03-06 05:37:01 -05:00
}
2016-06-18 19:07:20 -04:00
2017-07-12 01:56:35 -04:00
$data = array_merge ( $data , $gcontacts );
2016-06-18 19:07:20 -04:00
}
2015-02-01 04:26:35 -05:00
2017-10-10 05:13:37 -04:00
if ( ! $contact_id && ( $data [ " alias " ] != '' ) && ( $data [ " alias " ] != $url )) {
$contact_id = get_contact ( $data [ " alias " ], $uid , true );
}
2016-01-24 11:40:31 -05:00
$url = $data [ " url " ];
2017-03-06 05:37:01 -05:00
if ( ! $contact_id ) {
2017-07-11 14:32:35 -04:00
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 " ],
2017-07-12 01:56:35 -04:00
'keywords' => $data [ " keywords " ], 'location' => $data [ " location " ], 'about' => $data [ " about " ],
2017-07-11 14:32:35 -04:00
'network' => $data [ " network " ], 'pubkey' => $data [ " pubkey " ],
'rel' => CONTACT_IS_SHARING , 'priority' => $data [ " priority " ],
2017-07-11 15:14:49 -04:00
'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 ));
2015-02-01 07:32:05 -05:00
2017-03-06 05:37:01 -05:00
$contacts = q ( " SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2 " ,
2015-02-01 07:32:05 -05:00
dbesc ( normalise_link ( $data [ " url " ])),
intval ( $uid ));
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $contacts )) {
2015-02-01 07:32:05 -05:00
return 0 ;
2017-03-06 05:37:01 -05:00
}
2015-02-01 07:32:05 -05:00
2017-03-06 05:37:01 -05:00
$contact_id = $contacts [ 0 ][ " id " ];
2016-06-18 19:07:20 -04:00
// Update the newly created contact from data in the gcontact table
2017-07-11 14:32:35 -04:00
$gcontact = dba :: select ( 'gcontact' , array ( 'location' , 'about' , 'keywords' , 'gender' ),
array ( 'nurl' => normalise_link ( $data [ " url " ])), array ( 'limit' => 1 ));
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $gcontact )) {
2017-07-12 01:56:35 -04:00
// 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' ]);
}
2017-07-11 14:32:35 -04:00
dba :: update ( 'contact' , $gcontact , array ( 'id' => $contact_id ));
2016-06-18 19:07:20 -04:00
}
2015-02-01 04:26:35 -05:00
2017-07-11 14:32:35 -04:00
if ( count ( $contacts ) > 1 && $uid == 0 && $contact_id != 0 && $data [ " url " ] != " " ) {
2017-08-12 18:15:16 -04:00
dba :: delete ( 'contact' , array ( " `nurl` = ? AND `uid` = 0 AND `id` != ? AND NOT `self` " ,
normalise_link ( $data [ " url " ]), $contact_id ));
2017-07-11 14:32:35 -04:00
}
2017-03-06 05:37:01 -05:00
}
2016-01-24 11:40:31 -05:00
2017-03-06 05:37:01 -05:00
require_once " Photo.php " ;
2015-02-01 04:26:35 -05:00
2017-03-06 05:37:01 -05:00
update_contact_avatar ( $data [ " photo " ], $uid , $contact_id );
2016-01-28 05:09:08 -05:00
2017-10-10 05:13:37 -04:00
$contact = dba :: select ( 'contact' , array ( 'url' , 'nurl' , 'addr' , 'alias' , 'name' , 'nick' , 'keywords' , 'location' , 'about' , 'avatar-date' ),
2017-07-11 14:32:35 -04:00
array ( 'id' => $contact_id ), array ( 'limit' => 1 ));
2016-10-17 14:38:51 -04:00
// This condition should always be true
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $contact )) {
2017-03-06 05:37:01 -05:00
return $contact_id ;
}
2016-10-17 14:38:51 -04:00
2017-07-11 14:32:35 -04:00
$updated = array ( 'addr' => $data [ 'addr' ],
'alias' => $data [ 'alias' ],
2017-10-10 05:13:37 -04:00
'url' => $data [ 'url' ],
'nurl' => normalise_link ( $data [ 'url' ]),
2017-07-11 14:32:35 -04:00
'name' => $data [ 'name' ],
'nick' => $data [ 'nick' ]);
2017-07-12 02:07:22 -04:00
if ( $data [ 'keywords' ] != '' ) {
$updated [ 'keywords' ] = $data [ 'keywords' ];
}
if ( $data [ 'location' ] != '' ) {
$updated [ 'location' ] = $data [ 'location' ];
}
if ( $data [ 'about' ] != '' ) {
$updated [ 'about' ] = $data [ 'about' ];
}
2017-07-11 14:32:35 -04:00
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 ();
2017-03-06 05:37:01 -05:00
}
2015-02-01 04:26:35 -05:00
2017-07-11 14:32:35 -04:00
$updated [ 'avatar-date' ] = datetime_convert ();
dba :: update ( 'contact' , $updated , array ( 'id' => $contact_id ), $contact );
2017-03-06 05:37:01 -05:00
return $contact_id ;
2015-02-01 04:26:35 -05:00
}
2016-01-10 03:19:00 -05:00
2017-10-07 05:52:43 -04:00
/**
* @ 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 ));
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $blocked )) {
2017-10-07 05:52:43 -04:00
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 ));
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $hidden )) {
2017-10-07 05:52:43 -04:00
return false ;
}
return ( bool ) $hidden [ 'hidden' ];
}
2016-01-10 03:19:00 -05:00
/**
* @ brief Returns posts from a given gcontact
*
* @ param App $a argv application class
* @ param int $gcontact_id Global contact
*
* @ return string posts in HTML
*/
2017-01-09 07:09:01 -05:00
function posts_from_gcontact ( App $a , $gcontact_id ) {
2016-01-10 03:19:00 -05:00
2017-05-07 14:40:23 -04:00
require_once 'include/conversation.php' ;
2016-01-10 03:19:00 -05:00
// 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`
2017-01-06 01:37:27 -05:00
FROM `item`
2016-01-10 03:19:00 -05:00
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' ])
);
2017-03-13 01:57:37 -04:00
$o = conversation ( $a , $r , 'community' , false );
2016-01-10 03:19:00 -05:00
2017-03-12 20:09:32 -04:00
$o .= alt_pager ( $a , count ( $r ));
2016-01-10 03:19:00 -05:00
return $o ;
}
/**
2016-07-26 16:10:13 -04:00
* @ brief Returns posts from a given contact url
2016-01-10 03:19:00 -05:00
*
* @ param App $a argv application class
2016-12-11 12:37:12 -05:00
* @ param string $contact_url Contact URL
2016-01-10 03:19:00 -05:00
*
* @ return string posts in HTML
*/
2017-01-09 07:09:01 -05:00
function posts_from_contact_url ( App $a , $contact_url ) {
2016-01-10 03:19:00 -05:00
2017-05-07 14:40:23 -04:00
require_once 'include/conversation.php' ;
2016-01-10 03:19:00 -05:00
2016-07-26 16:10:13 -04:00
// There are no posts with "uid = 0" with connector networks
// This speeds up the query a lot
2017-10-08 01:20:09 -04:00
$r = q ( " SELECT `network`, `id` AS `author-id`, `contact-type` FROM `contact`
2016-07-26 16:10:13 -04:00
WHERE `contact` . `nurl` = '%s' AND `contact` . `uid` = 0 " ,
dbesc ( normalise_link ( $contact_url )));
2017-10-08 01:20:09 -04:00
2017-11-07 22:57:46 -05:00
if ( ! DBM :: is_result ( $r )) {
2017-10-08 01:20:09 -04:00
return '' ;
}
2016-12-10 07:28:49 -05:00
if ( in_array ( $r [ 0 ][ " network " ], array ( NETWORK_DFRN , NETWORK_DIASPORA , NETWORK_OSTATUS , " " ))) {
2017-09-28 02:01:31 -04:00
$sql = " (`item`.`uid` = 0 OR (`item`.`uid` = %d AND NOT `item`.`global`)) " ;
2016-12-10 07:28:49 -05:00
} else {
2016-07-26 16:10:13 -04:00
$sql = " `item`.`uid` = %d " ;
2016-12-10 07:28:49 -05:00
}
2016-01-10 03:19:00 -05:00
2016-07-26 16:10:13 -04:00
$author_id = intval ( $r [ 0 ][ " author-id " ]);
2016-01-10 03:19:00 -05:00
2017-10-22 05:02:54 -04:00
$contact = ( $r [ 0 ][ " contact-type " ] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id' );
2017-10-08 01:20:09 -04:00
$r = q ( item_query () . " AND `item`.` " . $contact . " ` = %d AND " . $sql .
2016-07-26 16:10:13 -04:00
" ORDER BY `item`.`created` DESC LIMIT %d, %d " ,
intval ( $author_id ),
2016-01-10 03:19:00 -05:00
intval ( local_user ()),
intval ( $a -> pager [ 'start' ]),
intval ( $a -> pager [ 'itemspage' ])
);
2017-03-13 01:57:37 -04:00
$o = conversation ( $a , $r , 'community' , false );
2016-01-10 03:19:00 -05:00
2017-03-12 20:09:32 -04:00
$o .= alt_pager ( $a , count ( $r ));
2016-01-10 03:19:00 -05:00
return $o ;
}
2016-01-24 08:30:57 -05:00
/**
* @ 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 = '' ;
2017-03-21 12:02:59 -04:00
if ( $profile [ 'locality' ])
2016-01-24 08:30:57 -05:00
$location .= $profile [ 'locality' ];
2017-06-07 22:00:59 -04:00
if ( $profile [ 'region' ] && ( $profile [ 'locality' ] != $profile [ 'region' ])) {
2017-03-21 12:02:59 -04:00
if ( $location )
2016-01-24 08:30:57 -05:00
$location .= ', ' ;
$location .= $profile [ 'region' ];
}
2017-03-21 12:02:59 -04:00
if ( $profile [ 'country-name' ]) {
if ( $location )
2016-01-24 08:30:57 -05:00
$location .= ', ' ;
$location .= $profile [ 'country-name' ];
}
return $location ;
}
2016-10-01 16:03:27 -04:00
/**
* @ brief Returns the account type name
*
2016-10-01 16:20:27 -04:00
* The function can be called with either the user or the contact array
2016-10-01 16:03:27 -04:00
*
2016-10-01 16:20:27 -04:00
* @ param array $contact contact or user array
2016-10-01 16:03:27 -04:00
*/
function account_type ( $contact ) {
2016-10-01 16:20:27 -04:00
// There are several fields that indicate that the contact or user is a forum
2016-10-02 02:40:08 -04:00
// "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.
2017-03-21 12:02:59 -04:00
if (( isset ( $contact [ 'page-flags' ]) && ( intval ( $contact [ 'page-flags' ]) == PAGE_COMMUNITY ))
2016-10-01 16:03:27 -04:00
|| ( 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 ;
2016-10-02 02:40:08 -04:00
// The "contact-type" (contact table) and "account-type" (user table) are more general then the chaos from above.
2016-10-01 16:03:27 -04:00
if ( isset ( $contact [ " contact-type " ]))
$type = $contact [ " contact-type " ];
if ( isset ( $contact [ " account-type " ]))
$type = $contact [ " account-type " ];
2016-10-01 16:20:27 -04:00
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 ;
}
2016-10-01 16:03:27 -04:00
return $account_type ;
}