2011-07-04 23:57:07 -04:00
< ? php
2018-01-15 14:51:56 -05:00
/**
* @ file mod / community . php
*/
2018-02-25 20:03:03 -05:00
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2019-08-06 07:37:48 -04:00
use Friendica\Content\Feature ;
2018-01-15 14:51:56 -05:00
use Friendica\Content\Nav ;
2018-10-24 02:15:24 -04:00
use Friendica\Content\Pager ;
2019-08-06 07:37:48 -04:00
use Friendica\Content\Widget\TrendingTags ;
2018-03-02 18:41:24 -05:00
use Friendica\Core\ACL ;
2017-04-30 00:01:26 -04:00
use Friendica\Core\Config ;
2018-01-21 13:33:59 -05:00
use Friendica\Core\L10n ;
2018-01-04 05:51:49 -05:00
use Friendica\Core\PConfig ;
2018-10-31 10:35:50 -04:00
use Friendica\Core\Renderer ;
2018-07-20 08:19:26 -04:00
use Friendica\Database\DBA ;
2018-08-28 16:44:39 -04:00
use Friendica\Model\Item ;
2019-01-06 17:08:35 -05:00
use Friendica\Model\User ;
2017-03-26 01:29:24 -04:00
2018-01-04 19:42:48 -05:00
function community_init ( App $a )
{
2018-01-03 08:27:43 -05:00
if ( ! local_user ()) {
2011-10-11 22:27:58 -04:00
unset ( $_SESSION [ 'theme' ]);
2012-09-06 19:24:34 -04:00
unset ( $_SESSION [ 'mobile-theme' ]);
}
2016-02-05 15:52:39 -05:00
}
2011-10-11 22:27:58 -04:00
2018-01-04 19:42:48 -05:00
function community_content ( App $a , $update = 0 )
{
2011-07-04 23:57:07 -04:00
$o = '' ;
2018-01-04 19:42:48 -05:00
if ( Config :: get ( 'system' , 'block_public' ) && ! local_user () && ! remote_user ()) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Public access denied.' ) . EOL );
2011-07-04 23:57:07 -04:00
return ;
}
2018-01-04 19:42:48 -05:00
$page_style = Config :: get ( 'system' , 'community_page_style' );
2018-01-04 08:04:12 -05:00
2018-04-23 07:14:25 -04:00
if ( $page_style == CP_NO_INTERNAL_COMMUNITY ) {
notice ( L10n :: t ( 'Access denied.' ) . EOL );
return ;
}
2018-08-21 11:39:49 -04:00
$accounttype = null ;
if ( $a -> argc > 2 ) {
switch ( $a -> argv [ 2 ]) {
case 'person' :
2019-01-06 17:08:35 -05:00
$accounttype = User :: ACCOUNT_TYPE_PERSON ;
2018-08-21 11:39:49 -04:00
break ;
case 'organisation' :
2019-01-06 17:08:35 -05:00
$accounttype = User :: ACCOUNT_TYPE_ORGANISATION ;
2018-08-21 11:39:49 -04:00
break ;
case 'news' :
2019-01-06 17:08:35 -05:00
$accounttype = User :: ACCOUNT_TYPE_NEWS ;
2018-08-21 11:39:49 -04:00
break ;
case 'community' :
2019-01-06 17:08:35 -05:00
$accounttype = User :: ACCOUNT_TYPE_COMMUNITY ;
2018-08-21 11:39:49 -04:00
break ;
}
}
2018-01-04 08:04:12 -05:00
if ( $a -> argc > 1 ) {
$content = $a -> argv [ 1 ];
} else {
2018-01-21 13:33:59 -05:00
if ( ! empty ( Config :: get ( 'system' , 'singleuser' ))) {
2018-01-05 15:11:35 -05:00
// On single user systems only the global page does make sense
$content = 'global' ;
} else {
// When only the global community is allowed, we use this as default
$content = $page_style == CP_GLOBAL_COMMUNITY ? 'global' : 'local' ;
}
2018-01-04 08:04:12 -05:00
}
if ( ! in_array ( $content , [ 'local' , 'global' ])) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Community option not available.' ) . EOL );
2011-07-04 23:57:07 -04:00
return ;
}
2018-01-04 08:04:12 -05:00
// Check if we are allowed to display the content to visitors
if ( ! local_user ()) {
$available = $page_style == CP_USERS_AND_GLOBAL ;
if ( ! $available ) {
$available = ( $page_style == CP_USERS_ON_SERVER ) && ( $content == 'local' );
}
if ( ! $available ) {
$available = ( $page_style == CP_GLOBAL_COMMUNITY ) && ( $content == 'global' );
}
if ( ! $available ) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Not available.' ) . EOL );
2018-01-04 08:04:12 -05:00
return ;
}
}
2018-01-03 08:27:43 -05:00
if ( ! $update ) {
2018-01-04 09:02:04 -05:00
$tabs = [];
2018-01-21 13:33:59 -05:00
if (( local_user () || in_array ( $page_style , [ CP_USERS_AND_GLOBAL , CP_USERS_ON_SERVER ])) && empty ( Config :: get ( 'system' , 'singleuser' ))) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-02-01 01:11:56 -05:00
'label' => L10n :: t ( 'Local Community' ),
2018-01-04 19:42:48 -05:00
'url' => 'community/local' ,
'sel' => $content == 'local' ? 'active' : '' ,
2018-01-21 13:33:59 -05:00
'title' => L10n :: t ( 'Posts from local users on this server' ),
2018-01-04 19:42:48 -05:00
'id' => 'community-local-tab' ,
'accesskey' => 'l'
2018-01-15 08:05:12 -05:00
];
2018-01-04 09:22:04 -05:00
}
if ( local_user () || in_array ( $page_style , [ CP_USERS_AND_GLOBAL , CP_GLOBAL_COMMUNITY ])) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-02-01 01:11:56 -05:00
'label' => L10n :: t ( 'Global Community' ),
2018-01-04 19:42:48 -05:00
'url' => 'community/global' ,
'sel' => $content == 'global' ? 'active' : '' ,
2018-02-01 01:11:56 -05:00
'title' => L10n :: t ( 'Posts from users of the whole federated network' ),
2018-01-04 19:42:48 -05:00
'id' => 'community-global-tab' ,
'accesskey' => 'g'
2018-01-15 08:05:12 -05:00
];
2018-01-04 09:22:04 -05:00
}
2018-01-04 09:02:04 -05:00
2018-10-31 10:44:06 -04:00
$tab_tpl = Renderer :: getMarkupTemplate ( 'common_tabs.tpl' );
2018-10-31 10:35:50 -04:00
$o .= Renderer :: replaceMacros ( $tab_tpl , [ '$tabs' => $tabs ]);
2018-01-04 09:02:04 -05:00
2018-01-15 14:51:56 -05:00
Nav :: setSelected ( 'community' );
2018-01-05 08:48:06 -05:00
// We need the editor here to be able to reshare an item.
if ( local_user ()) {
2018-01-15 08:05:12 -05:00
$x = [
2018-01-05 08:48:06 -05:00
'is_owner' => true ,
'allow_location' => $a -> user [ 'allow_location' ],
'default_location' => $a -> user [ 'default-location' ],
'nickname' => $a -> user [ 'nickname' ],
'lockstate' => ( is_array ( $a -> user ) && ( strlen ( $a -> user [ 'allow_cid' ]) || strlen ( $a -> user [ 'allow_gid' ]) || strlen ( $a -> user [ 'deny_cid' ]) || strlen ( $a -> user [ 'deny_gid' ])) ? 'lock' : 'unlock' ),
2018-03-02 18:41:24 -05:00
'acl' => ACL :: getFullSelectorHTML ( $a -> user , true ),
2018-01-05 08:48:06 -05:00
'bang' => '' ,
'visitor' => 'block' ,
'profile_uid' => local_user (),
2018-01-15 08:05:12 -05:00
];
2018-01-05 08:48:06 -05:00
$o .= status_editor ( $a , $x , 0 , true );
}
2011-07-04 23:57:07 -04:00
}
2018-01-31 18:22:41 -05:00
// check if we serve a mobile device and get the user settings accordingly
if ( $a -> is_mobile ) {
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_mobile_network' , 20 );
} else {
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_network' , 40 );
}
2018-01-04 05:51:49 -05:00
2018-01-31 18:22:41 -05:00
// now that we have the user settings, see if the theme forces
// a maximum item number which is lower then the user choice
if (( $a -> force_max_items > 0 ) && ( $a -> force_max_items < $itemspage_network )) {
$itemspage_network = $a -> force_max_items ;
2017-03-26 01:29:24 -04:00
}
2011-07-04 23:57:07 -04:00
2018-10-24 11:50:37 -04:00
$pager = new Pager ( $a -> query_string , $itemspage_network );
2018-01-31 18:22:41 -05:00
2018-10-24 02:15:24 -04:00
$r = community_getitems ( $pager -> getStart (), $pager -> getItemsPerPage (), $content , $accounttype );
2011-07-04 23:57:07 -04:00
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $r )) {
2018-01-21 13:33:59 -05:00
info ( L10n :: t ( 'No results.' ) . EOL );
2012-07-14 14:21:58 -04:00
return $o ;
}
2018-01-04 19:42:48 -05:00
$maxpostperauthor = ( int ) Config :: get ( 'system' , 'max_author_posts_community_page' );
2014-06-10 14:21:43 -04:00
2018-01-04 08:04:12 -05:00
if (( $maxpostperauthor != 0 ) && ( $content == 'local' )) {
2014-07-10 17:13:50 -04:00
$count = 1 ;
2014-06-10 14:21:43 -04:00
$previousauthor = " " ;
$numposts = 0 ;
2018-01-15 08:05:12 -05:00
$s = [];
2014-06-10 14:21:43 -04:00
2014-07-10 17:13:50 -04:00
do {
2018-01-04 19:42:48 -05:00
foreach ( $r as $item ) {
2017-03-26 01:29:24 -04:00
if ( $previousauthor == $item [ " author-link " ]) {
2014-07-10 17:13:50 -04:00
++ $numposts ;
2017-03-26 01:29:24 -04:00
} else {
2014-07-10 17:13:50 -04:00
$numposts = 0 ;
2017-03-26 01:29:24 -04:00
}
2014-07-10 17:13:50 -04:00
$previousauthor = $item [ " author-link " ];
2014-06-10 14:21:43 -04:00
2018-10-24 02:15:24 -04:00
if (( $numposts < $maxpostperauthor ) && ( count ( $s ) < $pager -> getItemsPerPage ())) {
2014-07-10 17:13:50 -04:00
$s [] = $item ;
2017-03-26 01:29:24 -04:00
}
2014-07-10 17:13:50 -04:00
}
2018-10-24 02:15:24 -04:00
if ( count ( $s ) < $pager -> getItemsPerPage ()) {
$r = community_getitems ( $pager -> getStart () + ( $count * $pager -> getItemsPerPage ()), $pager -> getItemsPerPage (), $content , $accounttype );
2017-03-26 01:29:24 -04:00
}
2018-10-24 02:15:24 -04:00
} while (( count ( $s ) < $pager -> getItemsPerPage ()) && ( ++ $count < 50 ) && ( count ( $r ) > 0 ));
2017-03-26 01:29:24 -04:00
} else {
2014-06-10 14:21:43 -04:00
$s = $r ;
2017-03-26 01:29:24 -04:00
}
2011-07-04 23:57:07 -04:00
2018-10-24 02:15:24 -04:00
$o .= conversation ( $a , $s , $pager , 'community' , $update , false , 'commented' , local_user ());
2011-07-04 23:57:07 -04:00
2018-01-04 10:46:56 -05:00
if ( ! $update ) {
2018-10-24 02:15:24 -04:00
$o .= $pager -> renderMinimal ( count ( $r ));
2018-01-04 10:46:56 -05:00
}
2011-07-04 23:57:07 -04:00
2019-08-05 21:01:04 -04:00
if ( empty ( $a -> page [ 'aside' ])) {
$a -> page [ 'aside' ] = '' ;
}
2019-08-06 07:37:48 -04:00
if ( Feature :: isEnabled ( local_user (), 'trending_tags' )) {
$a -> page [ 'aside' ] .= TrendingTags :: getHTML ( $content );
2019-08-05 21:01:04 -04:00
}
2018-10-31 10:44:06 -04:00
$t = Renderer :: getMarkupTemplate ( " community.tpl " );
2018-10-31 10:35:50 -04:00
return Renderer :: replaceMacros ( $t , [
2017-11-10 14:25:17 -05:00
'$content' => $o ,
2018-01-04 09:02:04 -05:00
'$header' => '' ,
2018-01-04 08:04:12 -05:00
'$show_global_community_hint' => ( $content == 'global' ) && Config :: get ( 'system' , 'show_global_community_hint' ),
2018-01-21 13:33:59 -05:00
'$global_community_hint' => L10n :: t ( " This community stream shows all public posts received by this node. They may not reflect the opinions of this node’ s users. " )
2018-01-15 08:05:12 -05:00
]);
2011-07-04 23:57:07 -04:00
}
2018-08-21 11:39:49 -04:00
function community_getitems ( $start , $itemspage , $content , $accounttype )
2018-01-04 19:42:48 -05:00
{
2018-01-04 08:04:12 -05:00
if ( $content == 'local' ) {
2018-08-21 11:39:49 -04:00
if ( ! is_null ( $accounttype )) {
$sql_accounttype = " AND `user`.`account-type` = ? " ;
$values = [ $accounttype , $start , $itemspage ];
} else {
$sql_accounttype = " " ;
$values = [ $start , $itemspage ];
}
2019-09-18 01:56:06 -04:00
/// @todo Use "unsearchable" here as well (instead of "hidewall")
2018-07-20 08:19:26 -04:00
$r = DBA :: p ( " SELECT `item`.`uri`, `author`.`url` AS `author-link` FROM `thread`
2019-02-10 01:37:31 -05:00
STRAIGHT_JOIN `user` ON `user` . `uid` = `thread` . `uid` AND NOT `user` . `hidewall`
STRAIGHT_JOIN `item` ON `item` . `id` = `thread` . `iid`
STRAIGHT_JOIN `contact` AS `author` ON `author` . `id` = `item` . `author-id`
2018-01-04 08:04:12 -05:00
WHERE `thread` . `visible` AND NOT `thread` . `deleted` AND NOT `thread` . `moderated`
2018-08-21 11:39:49 -04:00
AND NOT `thread` . `private` AND `thread` . `wall` AND `thread` . `origin` $sql_accounttype
ORDER BY `thread` . `commented` DESC LIMIT ? , ? " , $values );
2018-07-20 22:03:40 -04:00
return DBA :: toArray ( $r );
2018-01-04 08:04:12 -05:00
} elseif ( $content == 'global' ) {
2018-08-21 11:39:49 -04:00
if ( ! is_null ( $accounttype )) {
2019-09-18 01:20:33 -04:00
$condition = [ " `uid` = ? AND NOT `author`.`unsearchable` AND NOT `owner`.`unsearchable` AND `owner`.`contact-type` = ? " , 0 , $accounttype ];
2018-08-21 11:39:49 -04:00
} else {
2019-09-18 01:20:33 -04:00
$condition = [ " `uid` = ? AND NOT `author`.`unsearchable` AND NOT `owner`.`unsearchable` " , 0 ];
2018-08-21 11:39:49 -04:00
}
2018-08-28 16:44:39 -04:00
$r = Item :: selectThreadForUser ( 0 , [ 'uri' ], $condition , [ 'order' => [ 'commented' => true ], 'limit' => [ $start , $itemspage ]]);
2018-07-20 22:03:40 -04:00
return DBA :: toArray ( $r );
2018-01-04 08:04:12 -05:00
}
// Should never happen
2018-01-15 08:05:12 -05:00
return [];
2014-07-10 17:13:50 -04:00
}