2019-05-19 00:50:14 +00:00
< ? php
2020-02-09 14:45:36 +00:00
/**
2023-01-01 14:36:24 +00:00
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
2020-02-09 14:45:36 +00: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 />.
*
*/
2019-05-19 00:50:14 +00:00
namespace Friendica\Module ;
use Friendica\BaseModule ;
use Friendica\Content\Pager ;
2023-05-17 02:23:56 +00:00
use Friendica\Core\Logger ;
2019-05-19 00:50:14 +00:00
use Friendica\Core\Renderer ;
2019-05-20 16:42:27 +00:00
use Friendica\Core\Search ;
2019-12-15 21:34:11 +00:00
use Friendica\DI ;
2019-05-20 17:13:37 +00:00
use Friendica\Model ;
use Friendica\Network\HTTPException ;
2019-05-20 16:42:27 +00:00
use Friendica\Object\Search\ContactResult ;
use Friendica\Object\Search\ResultList ;
2022-05-11 06:34:25 +00:00
use Friendica\Util\Network ;
2019-05-19 00:50:14 +00:00
2019-05-19 02:43:09 +00:00
/**
2019-05-19 03:01:46 +00:00
* Base class for search modules
2019-05-19 02:43:09 +00:00
*/
2020-01-23 04:14:14 +00:00
class BaseSearch extends BaseModule
2019-05-19 00:50:14 +00:00
{
2019-05-19 03:06:02 +00:00
/**
2019-12-24 22:15:41 +00:00
* Performs a contact search with an optional prefix
2019-05-19 03:06:02 +00:00
*
2019-10-07 18:27:20 +00:00
* @ param string $search Search query
2019-05-19 03:06:02 +00:00
* @ param string $prefix A optional prefix ( e . g . @ or ! ) for searching
*
* @ return string
2019-05-20 16:42:27 +00:00
* @ throws HTTPException\InternalServerErrorException
2019-05-19 03:06:02 +00:00
* @ throws \ImagickException
*/
2022-07-19 14:27:32 +00:00
public static function performContactSearch ( string $search , string $prefix = '' ) : string
2019-05-19 03:06:02 +00:00
{
2019-12-15 22:44:33 +00:00
$config = DI :: config ();
2019-05-19 03:06:02 +00:00
2019-05-20 17:13:37 +00:00
$type = Search :: TYPE_ALL ;
2019-05-19 03:06:02 +00:00
$localSearch = $config -> get ( 'system' , 'poco_local_search' );
2019-10-07 18:27:20 +00:00
$search = $prefix . $search ;
2019-05-19 03:06:02 +00:00
if ( ! $search ) {
return '' ;
}
$header = '' ;
2023-05-17 02:23:56 +00:00
$results = new ResultList ();
2019-05-19 03:06:02 +00:00
if ( strpos ( $search , '@' ) === 0 ) {
2022-10-03 13:53:19 +00:00
$search = trim ( substr ( $search , 1 ));
2019-05-20 17:19:57 +00:00
$type = Search :: TYPE_PEOPLE ;
2020-01-18 19:52:34 +00:00
$header = DI :: l10n () -> t ( 'People Search - %s' , $search );
2023-05-17 02:23:56 +00:00
} elseif ( strpos ( $search , '!' ) === 0 ) {
2022-10-03 13:53:19 +00:00
$search = trim ( substr ( $search , 1 ));
2023-05-30 13:15:17 +00:00
$type = Search :: TYPE_GROUP ;
$header = DI :: l10n () -> t ( 'Group Search - %s' , $search );
2019-05-19 03:06:02 +00:00
}
2022-05-11 06:34:25 +00:00
$search = Network :: convertToIdn ( $search );
2020-02-16 18:04:26 +00:00
if ( DI :: mode () -> isMobile ()) {
2022-10-20 20:59:12 +00:00
$itemsPerPage = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'itemspage_mobile_network' ,
2020-02-16 18:04:26 +00:00
DI :: config () -> get ( 'system' , 'itemspage_network_mobile' ));
} else {
2022-10-20 20:59:12 +00:00
$itemsPerPage = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'itemspage_network' ,
2020-02-16 18:04:26 +00:00
DI :: config () -> get ( 'system' , 'itemspage_network' ));
}
$pager = new Pager ( DI :: l10n (), DI :: args () -> getQueryString (), $itemsPerPage );
2019-05-19 03:06:02 +00:00
2023-05-17 02:23:56 +00:00
if ( ! $results -> getTotal () && ! $localSearch && Search :: getGlobalDirectory ()) {
$results = Search :: getContactsFromGlobalDirectory ( $search , $type , $pager -> getPage ());
$pager -> setItemsPerPage ( $results -> getItemsPage ());
}
if ( ! $results -> getTotal ()) {
$pager -> setItemsPerPage ( 80 );
$results = Search :: getContactsFromLocalDirectory ( $search , $type , $pager -> getStart (), $pager -> getItemsPerPage ());
}
if ( ! $results -> getTotal ()) {
2023-05-30 13:15:17 +00:00
$results = Search :: getContactsFromProbe ( Network :: convertToIdn ( $search ), $type == Search :: TYPE_GROUP );
2019-05-19 03:06:02 +00:00
}
return self :: printResult ( $results , $pager , $header );
}
2019-05-19 03:01:46 +00:00
/**
* Prints a human readable search result
*
2019-05-20 16:42:27 +00:00
* @ param ResultList $results
2019-05-20 17:19:57 +00:00
* @ param Pager $pager
* @ param string $header
2019-05-19 03:01:46 +00:00
*
* @ return string The result
2019-05-20 16:42:27 +00:00
* @ throws HTTPException\InternalServerErrorException
2019-05-19 03:01:46 +00:00
* @ throws \ImagickException
*/
2022-07-19 14:27:32 +00:00
protected static function printResult ( ResultList $results , Pager $pager , string $header = '' ) : string
2019-05-19 00:50:14 +00:00
{
2019-05-24 12:13:36 +00:00
if ( $results -> getTotal () == 0 ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'No matches' ));
2019-05-19 00:50:14 +00:00
return '' ;
}
2023-03-27 13:55:39 +00:00
$filtered = 0 ;
2019-05-19 00:50:14 +00:00
$entries = [];
foreach ( $results -> getResults () as $result ) {
2019-05-20 16:42:27 +00:00
// in case the result is a contact result, add a contact-specific entry
if ( $result instanceof ContactResult ) {
2023-03-27 13:55:39 +00:00
if ( Network :: isUriBlocked ( $result -> getUrl ())) {
$filtered ++ ;
continue ;
}
2022-10-20 20:59:12 +00:00
$contact = Model\Contact :: getByURLForUser ( $result -> getUrl (), DI :: userSession () -> getLocalUserId ());
2020-07-30 21:16:15 +00:00
if ( ! empty ( $contact )) {
2020-07-31 04:28:26 +00:00
$entries [] = Contact :: getContactTemplateVars ( $contact );
2020-07-30 21:16:15 +00:00
}
2019-05-19 00:50:14 +00:00
}
}
2022-11-04 11:03:55 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'contact/list.tpl' );
2019-05-19 00:50:14 +00:00
return Renderer :: replaceMacros ( $tpl , [
2023-03-27 13:55:39 +00:00
'$title' => $header ,
'$filtered' => $filtered ? DI :: l10n () -> tt (
'%d result was filtered out because your node blocks the domain it is registered on. You can review the list of domains your node is currently blocking in the <a href="/friendica">About page</a>.' ,
'%d results were filtered out because your node blocks the domain they are registered on. You can review the list of domains your node is currently blocking in the <a href="/friendica">About page</a>.' ,
$filtered ) : '' ,
2019-05-19 00:50:14 +00:00
'$contacts' => $entries ,
'$paginate' => $pager -> renderFull ( $results -> getTotal ()),
]);
}
2023-05-30 13:15:17 +00:00
}