2018-10-13 05:35:51 -04:00
< ? php
2020-02-09 09:45:36 -05:00
/**
2021-03-29 02:40:20 -04:00
* @ copyright Copyright ( C ) 2010 - 2021 , the Friendica project
2020-02-09 09:45:36 -05:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
2018-10-13 05:35:51 -04:00
namespace Friendica\Module ;
use Friendica\BaseModule ;
use Friendica\Content\ContactSelector ;
use Friendica\Content\Nav ;
2018-10-24 02:15:24 -04:00
use Friendica\Content\Pager ;
2018-10-13 05:35:51 -04:00
use Friendica\Content\Text\BBCode ;
use Friendica\Content\Widget ;
2018-12-26 01:06:24 -05:00
use Friendica\Core\Hook ;
2018-10-13 05:35:51 -04:00
use Friendica\Core\Protocol ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2020-09-03 10:03:36 -04:00
use Friendica\Core\Theme ;
2018-10-13 05:35:51 -04:00
use Friendica\Core\Worker ;
use Friendica\Database\DBA ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2018-10-13 07:29:56 -04:00
use Friendica\Model ;
2020-10-09 15:08:50 -04:00
use Friendica\Model\User ;
2019-12-27 16:19:28 -05:00
use Friendica\Module\Security\Login ;
2019-05-18 11:33:35 -04:00
use Friendica\Network\HTTPException\BadRequestException ;
use Friendica\Network\HTTPException\NotFoundException ;
2018-10-13 05:35:51 -04:00
use Friendica\Util\DateTimeFormat ;
2018-11-08 10:14:37 -05:00
use Friendica\Util\Strings ;
2018-10-13 05:35:51 -04:00
/**
* Manages and show Contacts and their content
*/
2018-10-14 18:30:02 -04:00
class Contact extends BaseModule
2018-10-13 05:35:51 -04:00
{
2020-08-06 22:49:21 -04:00
const TAB_CONVERSATIONS = 1 ;
const TAB_POSTS = 2 ;
const TAB_PROFILE = 3 ;
const TAB_CONTACTS = 4 ;
const TAB_ADVANCED = 5 ;
2021-10-02 11:09:43 -04:00
const TAB_MEDIA = 6 ;
2020-08-06 22:49:21 -04:00
2019-12-15 18:28:31 -05:00
private static function batchActions ()
2018-10-13 05:35:51 -04:00
{
if ( empty ( $_POST [ 'contact_batch' ]) || ! is_array ( $_POST [ 'contact_batch' ])) {
return ;
}
2021-09-06 12:23:15 -04:00
$redirectUrl = $_POST [ 'redirect_url' ] ? ? 'contact' ;
self :: checkFormSecurityTokenRedirectOnError ( $redirectUrl , 'contact_batch_actions' );
2021-09-05 14:52:04 -04:00
$orig_records = Model\Contact :: selectToArray ([ 'id' , 'uid' ], [ 'id' => $_POST [ 'contact_batch' ], 'uid' => [ 0 , local_user ()], 'self' => false , 'deleted' => false ]);
2018-10-14 18:30:02 -04:00
2018-10-13 05:35:51 -04:00
$count_actions = 0 ;
foreach ( $orig_records as $orig_record ) {
2021-09-05 14:52:04 -04:00
$cdata = Model\Contact :: getPublicAndUserContactID ( $orig_record [ 'id' ], local_user ());
2021-10-02 15:48:20 -04:00
if ( empty ( $cdata ) || public_contact () === $cdata [ 'public' ]) {
// No action available on your own contact
2021-09-05 14:52:04 -04:00
continue ;
}
if ( ! empty ( $_POST [ 'contacts_batch_update' ]) && $cdata [ 'user' ]) {
self :: updateContactFromPoll ( $cdata [ 'user' ]);
2018-10-13 05:35:51 -04:00
$count_actions ++ ;
}
2021-09-05 14:52:04 -04:00
2018-10-14 18:17:22 -04:00
if ( ! empty ( $_POST [ 'contacts_batch_block' ])) {
2021-10-02 15:48:20 -04:00
self :: toggleBlockContact ( $cdata [ 'public' ], local_user ());
2018-10-13 05:35:51 -04:00
$count_actions ++ ;
}
2021-09-05 14:52:04 -04:00
2018-10-14 18:17:22 -04:00
if ( ! empty ( $_POST [ 'contacts_batch_ignore' ])) {
2021-09-05 14:52:04 -04:00
self :: toggleIgnoreContact ( $cdata [ 'public' ]);
2018-10-13 05:35:51 -04:00
$count_actions ++ ;
}
}
if ( $count_actions > 0 ) {
2020-01-18 14:53:01 -05:00
info ( DI :: l10n () -> tt ( '%d contact edited.' , '%d contacts edited.' , $count_actions ));
2018-10-13 05:35:51 -04:00
}
2021-09-06 12:23:15 -04:00
DI :: baseUrl () -> redirect ( $redirectUrl );
2018-10-13 05:35:51 -04:00
}
2021-11-14 17:13:47 -05:00
public function post ()
2018-10-13 05:35:51 -04:00
{
if ( ! local_user ()) {
return ;
}
2019-05-07 15:15:22 -04:00
// @TODO: Replace with parameter from router
2021-07-25 11:23:37 -04:00
if ( DI :: args () -> getArgv ()[ 1 ] === 'batch' ) {
2019-12-15 18:28:31 -05:00
self :: batchActions ();
2018-10-13 05:35:51 -04:00
}
}
/* contact actions */
2021-09-05 14:52:04 -04:00
/**
* @ param int $contact_id Id of contact with uid != 0
* @ throws NotFoundException
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
* @ throws \ImagickException
*/
private static function updateContactFromPoll ( int $contact_id )
2018-10-13 05:35:51 -04:00
{
2019-01-09 08:23:11 -05:00
$contact = DBA :: selectFirst ( 'contact' , [ 'uid' , 'url' , 'network' ], [ 'id' => $contact_id , 'uid' => local_user (), 'deleted' => false ]);
2018-10-13 05:35:51 -04:00
if ( ! DBA :: isResult ( $contact )) {
return ;
}
2018-10-14 18:30:02 -04:00
if ( $contact [ 'network' ] == Protocol :: OSTATUS ) {
2021-08-09 11:29:07 -04:00
$result = Model\Contact :: createFromProbeForUser ( $contact [ 'uid' ], $contact [ 'url' ], $contact [ 'network' ]);
2018-10-13 05:35:51 -04:00
if ( $result [ 'success' ]) {
2021-09-10 14:21:19 -04:00
Model\Contact :: update ([ 'subhub' => 1 ], [ 'id' => $contact_id ]);
2018-10-13 05:35:51 -04:00
}
2020-12-04 00:53:11 -05:00
2018-10-13 05:35:51 -04:00
// pull feed and consume it, which should subscribe to the hub.
2018-10-14 18:30:02 -04:00
Worker :: add ( PRIORITY_HIGH , 'OnePoll' , $contact_id , 'force' );
2020-12-04 00:53:11 -05:00
} else {
Worker :: add ( PRIORITY_HIGH , 'UpdateContact' , $contact_id );
2018-10-13 05:35:51 -04:00
}
}
2021-09-05 14:52:04 -04:00
/**
* @ param int $contact_id Id of the contact with uid != 0
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
* @ throws \ImagickException
*/
private static function updateContactFromProbe ( int $contact_id )
2018-10-13 05:35:51 -04:00
{
2021-09-05 14:52:04 -04:00
$contact = DBA :: selectFirst ( 'contact' , [ 'url' ], [ 'id' => $contact_id , 'uid' => local_user (), 'deleted' => false ]);
2018-10-13 05:35:51 -04:00
if ( ! DBA :: isResult ( $contact )) {
return ;
}
// Update the entry in the contact table
2020-08-06 15:04:00 -04:00
Model\Contact :: updateFromProbe ( $contact_id );
2018-10-13 05:35:51 -04:00
}
2019-10-15 09:20:32 -04:00
/**
* Toggles the blocked status of a contact identified by id .
*
2021-09-05 14:52:04 -04:00
* @ param int $contact_id Id of the contact with uid = 0
2021-10-02 15:48:20 -04:00
* @ param int $owner_id Id of the user we want to block the contact for
2019-10-15 09:20:32 -04:00
* @ throws \Exception
*/
2021-10-02 15:48:20 -04:00
private static function toggleBlockContact ( int $contact_id , int $owner_id )
2018-10-13 05:35:51 -04:00
{
2021-10-02 15:48:20 -04:00
$blocked = ! Model\Contact\User :: isBlocked ( $contact_id , $owner_id );
Model\Contact\User :: setBlocked ( $contact_id , $owner_id , $blocked );
2018-10-13 05:35:51 -04:00
}
2019-10-15 09:20:32 -04:00
/**
* Toggles the ignored status of a contact identified by id .
*
2021-09-05 14:52:04 -04:00
* @ param int $contact_id Id of the contact with uid = 0
2019-10-15 09:20:32 -04:00
* @ throws \Exception
*/
2021-09-05 14:52:04 -04:00
private static function toggleIgnoreContact ( int $contact_id )
2018-10-13 05:35:51 -04:00
{
2020-08-04 00:47:02 -04:00
$ignored = ! Model\Contact\User :: isIgnored ( $contact_id , local_user ());
Model\Contact\User :: setIgnored ( $contact_id , local_user (), $ignored );
2018-10-13 05:35:51 -04:00
}
2021-11-14 17:13:47 -05:00
public function content ( $update = 0 ) : string
2018-10-13 05:35:51 -04:00
{
2019-05-18 11:33:35 -04:00
if ( ! local_user ()) {
2019-05-23 13:01:40 -04:00
return Login :: form ( $_SERVER [ 'REQUEST_URI' ]);
2019-05-18 11:33:35 -04:00
}
2021-11-06 16:25:21 -04:00
$search = trim ( $_GET [ 'search' ] ? ? '' );
$nets = trim ( $_GET [ 'nets' ] ? ? '' );
$rel = trim ( $_GET [ 'rel' ] ? ? '' );
$group = trim ( $_GET [ 'group' ] ? ? '' );
2019-05-18 11:33:35 -04:00
2020-10-09 15:08:50 -04:00
$accounttype = $_GET [ 'accounttype' ] ? ? '' ;
$accounttypeid = User :: getAccountTypeByString ( $accounttype );
2020-09-03 10:03:36 -04:00
$page = DI :: page ();
$page -> registerFooterScript ( Theme :: getPathForFile ( 'asset/typeahead.js/dist/typeahead.bundle.js' ));
$page -> registerFooterScript ( Theme :: getPathForFile ( 'js/friendica-tagsinput/friendica-tagsinput.js' ));
$page -> registerStylesheet ( Theme :: getPathForFile ( 'js/friendica-tagsinput/friendica-tagsinput.css' ));
$page -> registerStylesheet ( Theme :: getPathForFile ( 'js/friendica-tagsinput/friendica-tagsinput-typeahead.css' ));
2019-05-18 11:33:35 -04:00
$contact = null ;
// @TODO: Replace with parameter from router
2021-11-08 06:24:39 -05:00
if ( DI :: args () -> getArgc () == 2 && intval ( DI :: args () -> getArgv ()[ 1 ])) {
2021-07-25 11:23:37 -04:00
$contact_id = intval ( DI :: args () -> getArgv ()[ 1 ]);
2019-05-18 11:33:35 -04:00
2020-08-02 09:34:49 -04:00
// Ensure to use the user contact when the public contact was provided
2021-07-11 05:39:34 -04:00
$data = Model\Contact :: getPublicAndUserContactID ( $contact_id , local_user ());
2020-08-02 09:34:49 -04:00
if ( ! empty ( $data [ 'user' ]) && ( $contact_id == $data [ 'public' ])) {
$contact_id = $data [ 'user' ];
2019-05-18 11:33:35 -04:00
}
2021-09-18 06:55:17 -04:00
if ( ! empty ( $data )) {
2021-09-14 18:31:33 -04:00
$contact = DBA :: selectFirst ( 'contact' , [], [
'id' => $contact_id ,
'uid' => [ 0 , local_user ()],
'deleted' => false
]);
// Don't display contacts that are about to be deleted
if ( DBA :: isResult ( $contact ) && ! empty ( $contact [ 'network' ]) && $contact [ 'network' ] == Protocol :: PHANTOM ) {
$contact = false ;
}
2019-05-18 11:33:35 -04:00
}
}
if ( DBA :: isResult ( $contact )) {
if ( $contact [ 'self' ]) {
2021-11-08 06:24:39 -05:00
DI :: baseUrl () -> redirect ( 'profile/' . $contact [ 'nick' ] . '/profile' );
2019-05-18 11:33:35 -04:00
}
2021-07-23 08:39:37 -04:00
$vcard_widget = Widget\VCard :: getHTML ( $contact );
2019-05-18 11:33:35 -04:00
$findpeople_widget = '' ;
$follow_widget = '' ;
2020-10-09 15:08:50 -04:00
$account_widget = '' ;
2019-05-18 11:33:35 -04:00
$networks_widget = '' ;
2019-05-18 11:44:04 -04:00
$rel_widget = '' ;
2020-01-23 17:49:55 -05:00
if ( $contact [ 'uid' ] != 0 ) {
$groups_widget = Model\Group :: sidebarWidget ( 'contact' , 'group' , 'full' , 'everyone' , $contact_id );
} else {
$groups_widget = '' ;
}
2019-05-18 11:33:35 -04:00
} else {
$vcard_widget = '' ;
$findpeople_widget = Widget :: findPeople ();
if ( isset ( $_GET [ 'add' ])) {
$follow_widget = Widget :: follow ( $_GET [ 'add' ]);
} else {
$follow_widget = Widget :: follow ();
}
2020-10-09 15:08:50 -04:00
$account_widget = Widget :: accounttypes ( $_SERVER [ 'REQUEST_URI' ], $accounttype );
2019-05-18 11:33:35 -04:00
$networks_widget = Widget :: networks ( $_SERVER [ 'REQUEST_URI' ], $nets );
2019-05-18 11:44:04 -04:00
$rel_widget = Widget :: contactRels ( $_SERVER [ 'REQUEST_URI' ], $rel );
2020-01-23 17:49:55 -05:00
$groups_widget = Widget :: groups ( $_SERVER [ 'REQUEST_URI' ], $group );
2019-05-18 11:33:35 -04:00
}
2020-10-09 15:08:50 -04:00
DI :: page ()[ 'aside' ] .= $vcard_widget . $findpeople_widget . $follow_widget . $account_widget . $groups_widget . $networks_widget . $rel_widget ;
2019-05-18 11:33:35 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'contacts-head.tpl' );
2019-12-30 14:02:09 -05:00
DI :: page ()[ 'htmlhead' ] .= Renderer :: replaceMacros ( $tpl , [
2019-12-15 19:05:15 -05:00
'$baseurl' => DI :: baseUrl () -> get ( true ),
2019-05-18 11:33:35 -04:00
]);
2018-10-13 05:35:51 -04:00
$o = '' ;
2018-10-14 14:03:22 -04:00
Nav :: setSelected ( 'contact' );
2018-10-13 05:35:51 -04:00
2021-07-25 11:23:37 -04:00
if ( DI :: args () -> getArgc () == 3 ) {
$contact_id = intval ( DI :: args () -> getArgv ()[ 1 ]);
2018-10-13 05:35:51 -04:00
if ( ! $contact_id ) {
2019-05-18 11:33:35 -04:00
throw new BadRequestException ();
2018-10-13 05:35:51 -04:00
}
2019-05-06 12:57:50 -04:00
// @TODO: Replace with parameter from router
2021-07-25 11:23:37 -04:00
$cmd = DI :: args () -> getArgv ()[ 2 ];
2018-10-13 05:35:51 -04:00
2019-01-09 08:23:11 -05:00
$orig_record = DBA :: selectFirst ( 'contact' , [], [ 'id' => $contact_id , 'uid' => [ 0 , local_user ()], 'self' => false , 'deleted' => false ]);
2018-10-13 05:35:51 -04:00
if ( ! DBA :: isResult ( $orig_record )) {
2020-01-18 14:52:34 -05:00
throw new NotFoundException ( DI :: l10n () -> t ( 'Contact not found' ));
2018-10-13 05:35:51 -04:00
}
2021-09-06 12:23:15 -04:00
self :: checkFormSecurityTokenRedirectOnError ( 'contact/' . $contact_id , 'contact_action' , 't' );
2021-09-05 14:52:04 -04:00
$cdata = Model\Contact :: getPublicAndUserContactID ( $orig_record [ 'id' ], local_user ());
if ( empty ( $cdata )) {
throw new NotFoundException ( DI :: l10n () -> t ( 'Contact not found' ));
}
if ( $cmd === 'update' && $cdata [ 'user' ]) {
self :: updateContactFromPoll ( $cdata [ 'user' ]);
2018-10-13 05:35:51 -04:00
}
2021-09-05 14:52:04 -04:00
if ( $cmd === 'updateprofile' && $cdata [ 'user' ]) {
self :: updateContactFromProbe ( $cdata [ 'user' ]);
2018-10-13 05:35:51 -04:00
}
if ( $cmd === 'block' ) {
2021-09-05 14:52:04 -04:00
if ( public_contact () === $cdata [ 'public' ]) {
2021-05-04 08:59:13 -04:00
throw new BadRequestException ( DI :: l10n () -> t ( 'You can\'t block yourself' ));
}
2021-10-02 15:48:20 -04:00
self :: toggleBlockContact ( $cdata [ 'public' ], local_user ());
2018-10-13 05:35:51 -04:00
2020-08-04 00:47:02 -04:00
$blocked = Model\Contact\User :: isBlocked ( $contact_id , local_user ());
2020-07-23 02:25:01 -04:00
info (( $blocked ? DI :: l10n () -> t ( 'Contact has been blocked' ) : DI :: l10n () -> t ( 'Contact has been unblocked' )));
2018-10-13 05:35:51 -04:00
}
if ( $cmd === 'ignore' ) {
2021-09-05 14:52:04 -04:00
if ( public_contact () === $cdata [ 'public' ]) {
2021-05-04 08:59:13 -04:00
throw new BadRequestException ( DI :: l10n () -> t ( 'You can\'t ignore yourself' ));
}
2021-09-05 14:52:04 -04:00
self :: toggleIgnoreContact ( $cdata [ 'public' ]);
2018-10-13 05:35:51 -04:00
2021-09-05 14:52:04 -04:00
$ignored = Model\Contact\User :: isIgnored ( $cdata [ 'public' ], local_user ());
2020-07-23 02:25:01 -04:00
info (( $ignored ? DI :: l10n () -> t ( 'Contact has been ignored' ) : DI :: l10n () -> t ( 'Contact has been unignored' )));
2018-10-13 05:35:51 -04:00
}
2021-11-10 08:58:14 -05:00
DI :: baseUrl () -> redirect ( 'contact/' . $contact_id );
// NOTREACHED
2018-10-13 05:35:51 -04:00
}
2019-12-15 19:30:34 -05:00
$_SESSION [ 'return_path' ] = DI :: args () -> getQueryString ();
2018-10-13 05:35:51 -04:00
2020-01-23 14:52:22 -05:00
$sql_values = [ local_user ()];
2019-12-12 06:58:57 -05:00
2019-05-06 12:57:50 -04:00
// @TODO: Replace with parameter from router
2021-07-25 11:23:37 -04:00
$type = DI :: args () -> getArgv ()[ 1 ] ? ? '' ;
2019-05-18 11:33:35 -04:00
switch ( $type ) {
case 'blocked' :
2020-01-23 14:52:22 -05:00
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`blocked`) " ;
// This makes the query look for contact.uid = 0
array_unshift ( $sql_values , 0 );
2019-05-18 11:33:35 -04:00
break ;
case 'hidden' :
2019-12-12 06:58:57 -05:00
$sql_extra = " AND `hidden` AND NOT `blocked` AND NOT `pending` " ;
2019-05-18 11:33:35 -04:00
break ;
case 'ignored' :
2020-01-23 14:52:22 -05:00
$sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`ignored`) " ;
// This makes the query look for contact.uid = 0
array_unshift ( $sql_values , 0 );
2019-05-18 11:33:35 -04:00
break ;
case 'archived' :
2020-11-22 09:42:24 -05:00
$sql_extra = " AND `archive` AND NOT `blocked` AND NOT `pending` " ;
2019-05-18 11:33:35 -04:00
break ;
2019-09-08 15:18:56 -04:00
case 'pending' :
2020-10-07 16:06:15 -04:00
$sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?)
2020-01-23 14:52:22 -05:00
OR EXISTS ( SELECT `id` FROM `intro` WHERE `contact-id` = `contact` . `id` AND NOT `ignore` )) " ;
$sql_values [] = Model\Contact :: SHARING ;
2019-09-08 15:18:56 -04:00
break ;
2019-05-18 11:33:35 -04:00
default :
2020-11-22 09:42:24 -05:00
$sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending` " ;
2020-01-23 14:52:22 -05:00
break ;
}
2020-10-09 15:08:50 -04:00
if ( isset ( $accounttypeid )) {
$sql_extra .= " AND `contact-type` = ? " ;
$sql_values [] = $accounttypeid ;
}
2020-01-23 14:52:22 -05:00
$searching = false ;
$search_hdr = null ;
if ( $search ) {
$searching = true ;
$search_hdr = $search ;
$search_txt = preg_quote ( $search );
$sql_extra .= " AND (name REGEXP ? OR url REGEXP ? OR nick REGEXP ?) " ;
$sql_values [] = $search_txt ;
$sql_values [] = $search_txt ;
$sql_values [] = $search_txt ;
2018-10-13 05:35:51 -04:00
}
2020-01-23 14:52:22 -05:00
if ( $nets ) {
$sql_extra .= " AND network = ? " ;
$sql_values [] = $nets ;
}
2018-10-13 05:35:51 -04:00
2020-01-23 14:52:22 -05:00
switch ( $rel ) {
case 'followers' :
$sql_extra .= " AND `rel` IN (?, ?) " ;
$sql_values [] = Model\Contact :: FOLLOWER ;
$sql_values [] = Model\Contact :: FRIEND ;
break ;
case 'following' :
$sql_extra .= " AND `rel` IN (?, ?) " ;
$sql_values [] = Model\Contact :: SHARING ;
$sql_values [] = Model\Contact :: FRIEND ;
break ;
case 'mutuals' :
$sql_extra .= " AND `rel` = ? " ;
$sql_values [] = Model\Contact :: FRIEND ;
break ;
}
2020-01-23 17:49:55 -05:00
if ( $group ) {
2021-10-11 00:33:10 -04:00
$sql_extra .= " AND EXISTS(SELECT `id` FROM `group_member` WHERE `gid` = ? AND `contact`.`id` = `contact-id`) " ;
2020-01-23 17:49:55 -05:00
$sql_values [] = $group ;
}
2021-10-11 00:33:10 -04:00
$networks = Widget :: unavailableNetworks ();
$sql_extra .= " AND NOT `network` IN ( " . substr ( str_repeat ( " ?, " , count ( $networks )), 0 , - 2 ) . " ) " ;
$sql_values = array_merge ( $sql_values , $networks );
2020-01-23 14:52:22 -05:00
2021-10-11 00:33:10 -04:00
$condition = [ " `uid` = ? AND NOT `self` AND NOT `deleted` " . $sql_extra ];
$condition = array_merge ( $condition , $sql_values );
2020-01-23 14:52:22 -05:00
2021-10-11 00:33:10 -04:00
$total = DBA :: count ( 'contact' , $condition );
$pager = new Pager ( DI :: l10n (), DI :: args () -> getQueryString ());
2020-01-23 14:52:22 -05:00
$contacts = [];
2021-10-11 00:33:10 -04:00
$stmt = DBA :: select ( 'contact' , [], $condition , [ 'order' => [ 'name' ], 'limit' => [ $pager -> getStart (), $pager -> getItemsPerPage ()]]);
2020-01-23 14:52:22 -05:00
while ( $contact = DBA :: fetch ( $stmt )) {
2020-08-04 00:47:02 -04:00
$contact [ 'blocked' ] = Model\Contact\User :: isBlocked ( $contact [ 'id' ], local_user ());
$contact [ 'readonly' ] = Model\Contact\User :: isIgnored ( $contact [ 'id' ], local_user ());
2020-01-23 14:52:22 -05:00
$contacts [] = self :: getContactTemplateVars ( $contact );
}
DBA :: close ( $stmt );
2018-10-13 05:35:51 -04:00
$tabs = [
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'All Contacts' ),
2019-05-18 11:33:35 -04:00
'url' => 'contact' ,
'sel' => ! $type ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Show all contacts' ),
2018-10-13 05:35:51 -04:00
'id' => 'showall-tab' ,
'accesskey' => 'l' ,
],
2019-09-08 15:18:56 -04:00
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Pending' ),
2019-09-08 15:18:56 -04:00
'url' => 'contact/pending' ,
'sel' => $type == 'pending' ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Only show pending contacts' ),
2019-09-08 15:18:56 -04:00
'id' => 'showpending-tab' ,
'accesskey' => 'p' ,
],
2018-10-13 05:35:51 -04:00
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Blocked' ),
2018-10-13 07:29:56 -04:00
'url' => 'contact/blocked' ,
2019-05-18 11:33:35 -04:00
'sel' => $type == 'blocked' ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Only show blocked contacts' ),
2018-10-13 05:35:51 -04:00
'id' => 'showblocked-tab' ,
'accesskey' => 'b' ,
],
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Ignored' ),
2018-10-13 07:29:56 -04:00
'url' => 'contact/ignored' ,
2019-05-18 11:33:35 -04:00
'sel' => $type == 'ignored' ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Only show ignored contacts' ),
2018-10-13 05:35:51 -04:00
'id' => 'showignored-tab' ,
'accesskey' => 'i' ,
],
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Archived' ),
2018-10-13 07:29:56 -04:00
'url' => 'contact/archived' ,
2019-05-18 11:33:35 -04:00
'sel' => $type == 'archived' ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Only show archived contacts' ),
2018-10-13 05:35:51 -04:00
'id' => 'showarchived-tab' ,
'accesskey' => 'y' ,
],
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Hidden' ),
2018-10-13 07:29:56 -04:00
'url' => 'contact/hidden' ,
2019-05-18 11:33:35 -04:00
'sel' => $type == 'hidden' ? 'active' : '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Only show hidden contacts' ),
2018-10-13 05:35:51 -04:00
'id' => 'showhidden-tab' ,
'accesskey' => 'h' ,
],
2018-11-17 12:33:12 -05:00
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Groups' ),
2018-11-17 12:33:12 -05:00
'url' => 'group' ,
2019-05-18 11:33:35 -04:00
'sel' => '' ,
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Organize your contact groups' ),
2018-11-17 12:33:12 -05:00
'id' => 'contactgroups-tab' ,
'accesskey' => 'e' ,
],
2018-10-13 05:35:51 -04:00
];
2020-01-23 14:52:22 -05:00
$tabs_tpl = Renderer :: getMarkupTemplate ( 'common_tabs.tpl' );
$tabs_html = Renderer :: replaceMacros ( $tabs_tpl , [ '$tabs' => $tabs ]);
2018-10-13 05:35:51 -04:00
2019-05-18 11:44:04 -04:00
switch ( $rel ) {
2020-01-18 14:52:34 -05:00
case 'followers' : $header = DI :: l10n () -> t ( 'Followers' ); break ;
case 'following' : $header = DI :: l10n () -> t ( 'Following' ); break ;
case 'mutuals' : $header = DI :: l10n () -> t ( 'Mutual friends' ); break ;
default : $header = DI :: l10n () -> t ( 'Contacts' );
2019-05-18 11:44:04 -04:00
}
2019-05-18 11:33:35 -04:00
switch ( $type ) {
2020-01-18 14:52:34 -05:00
case 'pending' : $header .= ' - ' . DI :: l10n () -> t ( 'Pending' ); break ;
case 'blocked' : $header .= ' - ' . DI :: l10n () -> t ( 'Blocked' ); break ;
case 'hidden' : $header .= ' - ' . DI :: l10n () -> t ( 'Hidden' ); break ;
case 'ignored' : $header .= ' - ' . DI :: l10n () -> t ( 'Ignored' ); break ;
case 'archived' : $header .= ' - ' . DI :: l10n () -> t ( 'Archived' ); break ;
2019-05-18 11:33:35 -04:00
}
$header .= $nets ? ' - ' . ContactSelector :: networkToName ( $nets ) : '' ;
2018-10-31 10:44:06 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'contacts-template.tpl' );
2018-10-31 10:35:50 -04:00
$o .= Renderer :: replaceMacros ( $tpl , [
2019-05-18 11:33:35 -04:00
'$header' => $header ,
2020-01-23 14:52:22 -05:00
'$tabs' => $tabs_html ,
2018-10-14 18:30:02 -04:00
'$total' => $total ,
'$search' => $search_hdr ,
2020-01-18 14:52:34 -05:00
'$desc' => DI :: l10n () -> t ( 'Search your contacts' ),
'$finding' => $searching ? DI :: l10n () -> t ( 'Results for: %s' , $search ) : '' ,
'$submit' => DI :: l10n () -> t ( 'Find' ),
2019-12-15 19:33:13 -05:00
'$cmd' => DI :: args () -> getCommand (),
2018-10-14 18:30:02 -04:00
'$contacts' => $contacts ,
2021-09-06 12:23:15 -04:00
'$form_security_token' => BaseModule :: getFormSecurityToken ( 'contact_batch_actions' ),
2018-10-13 05:35:51 -04:00
'multiselect' => 1 ,
'$batch_actions' => [
2020-01-18 14:52:34 -05:00
'contacts_batch_update' => DI :: l10n () -> t ( 'Update' ),
'contacts_batch_block' => DI :: l10n () -> t ( 'Block' ) . '/' . DI :: l10n () -> t ( 'Unblock' ),
'contacts_batch_ignore' => DI :: l10n () -> t ( 'Ignore' ) . '/' . DI :: l10n () -> t ( 'Unignore' ),
2018-10-13 05:35:51 -04:00
],
2020-01-18 14:52:34 -05:00
'$h_batch_actions' => DI :: l10n () -> t ( 'Batch Actions' ),
2018-10-24 11:42:59 -04:00
'$paginate' => $pager -> renderFull ( $total ),
2018-10-13 05:35:51 -04:00
]);
return $o ;
}
/**
2020-01-19 01:05:23 -05:00
* List of pages for the Contact TabBar
2018-10-13 05:35:51 -04:00
*
* Available Pages are 'Status' , 'Profile' , 'Contacts' and 'Common Friends'
*
2019-01-06 16:06:53 -05:00
* @ param array $contact The contact array
* @ param int $active_tab 1 if tab should be marked as active
2018-10-13 05:35:51 -04:00
*
2019-01-06 16:06:53 -05:00
* @ return string HTML string of the contact page tabs buttons .
* @ throws \Friendica\Network\HTTPException\InternalServerErrorException
2020-08-06 10:31:40 -04:00
* @ throws \ImagickException
2018-10-13 05:35:51 -04:00
*/
2020-08-06 10:31:40 -04:00
public static function getTabsHTML ( array $contact , int $active_tab )
2018-10-13 05:35:51 -04:00
{
2020-08-02 09:34:49 -04:00
$cid = $pcid = $contact [ 'id' ];
2021-07-11 05:39:34 -04:00
$data = Model\Contact :: getPublicAndUserContactID ( $contact [ 'id' ], local_user ());
2020-08-02 09:34:49 -04:00
if ( ! empty ( $data [ 'user' ]) && ( $contact [ 'id' ] == $data [ 'public' ])) {
$cid = $data [ 'user' ];
} elseif ( ! empty ( $data [ 'public' ])) {
$pcid = $data [ 'public' ];
}
2018-10-13 05:35:51 -04:00
// tabs
$tabs = [
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Status' ),
2020-08-06 22:49:21 -04:00
'url' => 'contact/' . $pcid . '/conversations' ,
'sel' => (( $active_tab == self :: TAB_CONVERSATIONS ) ? 'active' : '' ),
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Conversations started by this contact' ),
2018-10-13 05:35:51 -04:00
'id' => 'status-tab' ,
'accesskey' => 'm' ,
],
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Posts and Comments' ),
2020-08-06 22:49:21 -04:00
'url' => 'contact/' . $pcid . '/posts' ,
'sel' => (( $active_tab == self :: TAB_POSTS ) ? 'active' : '' ),
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Status Messages and Posts' ),
2018-10-13 05:35:51 -04:00
'id' => 'posts-tab' ,
'accesskey' => 'p' ,
],
2021-10-02 11:09:43 -04:00
[
'label' => DI :: l10n () -> t ( 'Media' ),
'url' => 'contact/' . $pcid . '/media' ,
'sel' => (( $active_tab == self :: TAB_MEDIA ) ? 'active' : '' ),
'title' => DI :: l10n () -> t ( 'Posts containing media objects' ),
'id' => 'media-tab' ,
'accesskey' => 'd' ,
],
2018-10-13 05:35:51 -04:00
[
2020-01-18 14:52:34 -05:00
'label' => DI :: l10n () -> t ( 'Profile' ),
2020-08-06 22:49:21 -04:00
'url' => 'contact/' . $cid ,
'sel' => (( $active_tab == self :: TAB_PROFILE ) ? 'active' : '' ),
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Profile Details' ),
2018-10-13 05:35:51 -04:00
'id' => 'profile-tab' ,
'accesskey' => 'o' ,
2020-08-06 22:49:21 -04:00
],
[ 'label' => DI :: l10n () -> t ( 'Contacts' ),
'url' => 'contact/' . $pcid . '/contacts' ,
'sel' => (( $active_tab == self :: TAB_CONTACTS ) ? 'active' : '' ),
'title' => DI :: l10n () -> t ( 'View all known contacts' ),
'id' => 'contacts-tab' ,
'accesskey' => 't'
],
2018-10-13 05:35:51 -04:00
];
2020-10-29 09:28:27 -04:00
if ( ! empty ( $contact [ 'network' ]) && in_array ( $contact [ 'network' ], [ Protocol :: FEED , Protocol :: MAIL ]) && ( $cid != $pcid )) {
2020-01-18 14:52:34 -05:00
$tabs [] = [ 'label' => DI :: l10n () -> t ( 'Advanced' ),
2020-08-02 09:34:49 -04:00
'url' => 'contact/' . $cid . '/advanced/' ,
2020-08-06 22:49:21 -04:00
'sel' => (( $active_tab == self :: TAB_ADVANCED ) ? 'active' : '' ),
2020-01-18 14:52:34 -05:00
'title' => DI :: l10n () -> t ( 'Advanced Contact Settings' ),
2018-10-13 05:35:51 -04:00
'id' => 'advanced-tab' ,
'accesskey' => 'r'
];
}
2018-10-31 10:44:06 -04:00
$tab_tpl = Renderer :: getMarkupTemplate ( 'common_tabs.tpl' );
2018-10-31 10:35:50 -04:00
$tab_str = Renderer :: replaceMacros ( $tab_tpl , [ '$tabs' => $tabs ]);
2018-10-13 05:35:51 -04:00
return $tab_str ;
}
2020-07-30 23:55:01 -04:00
/**
* Return the fields for the contact template
*
2020-07-31 02:00:43 -04:00
* @ param array $contact Contact array
2020-07-30 23:55:01 -04:00
* @ return array Template fields
*/
2020-07-31 02:00:43 -04:00
public static function getContactTemplateVars ( array $contact )
2018-10-13 05:35:51 -04:00
{
$alt_text = '' ;
2020-08-02 09:34:49 -04:00
if ( ! empty ( $contact [ 'url' ]) && isset ( $contact [ 'uid' ]) && ( $contact [ 'uid' ] == 0 ) && local_user ()) {
$personal = Model\Contact :: getByURL ( $contact [ 'url' ], false , [ 'uid' , 'rel' , 'self' ], local_user ());
if ( ! empty ( $personal )) {
$contact [ 'uid' ] = $personal [ 'uid' ];
$contact [ 'rel' ] = $personal [ 'rel' ];
$contact [ 'self' ] = $personal [ 'self' ];
}
}
2020-08-04 22:45:33 -04:00
if ( ! empty ( $contact [ 'uid' ]) && ! empty ( $contact [ 'rel' ]) && local_user () == $contact [ 'uid' ]) {
2020-07-31 02:00:43 -04:00
switch ( $contact [ 'rel' ]) {
2019-08-15 21:24:33 -04:00
case Model\Contact :: FRIEND :
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'Mutual Friendship' );
2019-08-15 21:24:33 -04:00
break ;
2018-10-13 05:35:51 -04:00
2019-08-15 21:24:33 -04:00
case Model\Contact :: FOLLOWER ;
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'is a fan of yours' );
2019-08-15 21:24:33 -04:00
break ;
2018-10-13 05:35:51 -04:00
2019-08-15 21:24:33 -04:00
case Model\Contact :: SHARING ;
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'you are a fan of' );
2019-08-15 21:24:33 -04:00
break ;
2018-10-13 05:35:51 -04:00
2019-08-15 21:24:33 -04:00
default :
break ;
}
2018-10-13 05:35:51 -04:00
}
2021-02-17 13:59:19 -05:00
$url = Model\Contact :: magicLinkByContact ( $contact );
2018-10-13 05:35:51 -04:00
if ( strpos ( $url , 'redir/' ) === 0 ) {
$sparkle = ' class="sparkle" ' ;
} else {
$sparkle = '' ;
}
2020-07-31 02:00:43 -04:00
if ( $contact [ 'pending' ]) {
if ( in_array ( $contact [ 'rel' ], [ Model\Contact :: FRIEND , Model\Contact :: SHARING ])) {
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'Pending outgoing contact request' );
2019-09-08 15:18:56 -04:00
} else {
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'Pending incoming contact request' );
2019-09-08 15:18:56 -04:00
}
}
2020-07-31 02:00:43 -04:00
if ( $contact [ 'self' ]) {
2020-01-18 14:52:34 -05:00
$alt_text = DI :: l10n () -> t ( 'This is you' );
2020-07-31 02:00:43 -04:00
$url = $contact [ 'url' ];
2018-10-13 05:35:51 -04:00
$sparkle = '' ;
}
return [
2020-07-31 02:00:43 -04:00
'id' => $contact [ 'id' ],
'url' => $url ,
'img_hover' => DI :: l10n () -> t ( 'Visit %s\'s profile [%s]' , $contact [ 'name' ], $contact [ 'url' ]),
'photo_menu' => Model\Contact :: photoMenu ( $contact ),
2021-07-06 06:36:00 -04:00
'thumb' => Model\Contact :: getThumb ( $contact , true ),
2020-07-31 02:00:43 -04:00
'alt_text' => $alt_text ,
'name' => $contact [ 'name' ],
'nick' => $contact [ 'nick' ],
2021-07-23 08:39:37 -04:00
'details' => $contact [ 'location' ],
2020-07-31 02:00:43 -04:00
'tags' => $contact [ 'keywords' ],
'about' => $contact [ 'about' ],
'account_type' => Model\Contact :: getAccountType ( $contact ),
'sparkle' => $sparkle ,
'itemurl' => ( $contact [ 'addr' ] ? ? '' ) ? : $contact [ 'url' ],
2021-03-07 15:15:25 -05:00
'network' => ContactSelector :: networkToName ( $contact [ 'network' ], $contact [ 'url' ], $contact [ 'protocol' ], $contact [ 'gsid' ]),
2018-10-13 05:35:51 -04:00
];
}
}