2011-07-05 05:57:07 +02:00
< ? php
2018-01-15 20:51:56 +01:00
/**
* @ file mod / community . php
*/
2018-02-26 02:03:03 +01:00
2017-04-30 06:07:00 +02:00
use Friendica\App ;
2018-01-15 20:51:56 +01:00
use Friendica\Content\Nav ;
2018-03-03 00:41:24 +01:00
use Friendica\Core\ACL ;
2017-04-30 06:01:26 +02:00
use Friendica\Core\Config ;
2018-01-21 19:33:59 +01:00
use Friendica\Core\L10n ;
2018-01-04 11:51:49 +01:00
use Friendica\Core\PConfig ;
2018-07-20 14:19:26 +02:00
use Friendica\Database\DBA ;
2018-08-21 17:39:49 +02:00
use Friendica\Model\Contact ;
2017-03-26 07:29:24 +02:00
2018-01-05 01:42:48 +01:00
function community_init ( App $a )
{
2018-01-03 14:27:43 +01:00
if ( ! local_user ()) {
2011-10-12 04:27:58 +02:00
unset ( $_SESSION [ 'theme' ]);
2012-09-07 01:24:34 +02:00
unset ( $_SESSION [ 'mobile-theme' ]);
}
2016-02-05 21:52:39 +01:00
}
2011-10-12 04:27:58 +02:00
2018-01-05 01:42:48 +01:00
function community_content ( App $a , $update = 0 )
{
2011-07-05 05:57:07 +02:00
$o = '' ;
2018-01-05 01:42:48 +01:00
if ( Config :: get ( 'system' , 'block_public' ) && ! local_user () && ! remote_user ()) {
2018-01-21 19:33:59 +01:00
notice ( L10n :: t ( 'Public access denied.' ) . EOL );
2011-07-05 05:57:07 +02:00
return ;
}
2018-01-05 01:42:48 +01:00
$page_style = Config :: get ( 'system' , 'community_page_style' );
2018-01-04 14:04:12 +01:00
2018-04-23 13:14:25 +02:00
if ( $page_style == CP_NO_INTERNAL_COMMUNITY ) {
notice ( L10n :: t ( 'Access denied.' ) . EOL );
return ;
}
2018-08-21 17:39:49 +02:00
$accounttype = null ;
if ( $a -> argc > 2 ) {
switch ( $a -> argv [ 2 ]) {
case 'person' :
$accounttype = Contact :: ACCOUNT_TYPE_PERSON ;
break ;
case 'organisation' :
$accounttype = Contact :: ACCOUNT_TYPE_ORGANISATION ;
break ;
case 'news' :
$accounttype = Contact :: ACCOUNT_TYPE_NEWS ;
break ;
case 'community' :
$accounttype = Contact :: ACCOUNT_TYPE_COMMUNITY ;
break ;
}
}
2018-01-04 14:04:12 +01:00
if ( $a -> argc > 1 ) {
$content = $a -> argv [ 1 ];
} else {
2018-01-21 19:33:59 +01:00
if ( ! empty ( Config :: get ( 'system' , 'singleuser' ))) {
2018-01-05 21:11:35 +01: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 14:04:12 +01:00
}
if ( ! in_array ( $content , [ 'local' , 'global' ])) {
2018-01-21 19:33:59 +01:00
notice ( L10n :: t ( 'Community option not available.' ) . EOL );
2011-07-05 05:57:07 +02:00
return ;
}
2018-01-04 14:04:12 +01: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 19:33:59 +01:00
notice ( L10n :: t ( 'Not available.' ) . EOL );
2018-01-04 14:04:12 +01:00
return ;
}
}
2018-01-03 14:27:43 +01:00
require_once 'include/conversation.php' ;
2011-07-05 05:57:07 +02:00
2018-01-03 14:27:43 +01:00
if ( ! $update ) {
2018-01-04 15:02:04 +01:00
$tabs = [];
2018-01-21 19:33:59 +01:00
if (( local_user () || in_array ( $page_style , [ CP_USERS_AND_GLOBAL , CP_USERS_ON_SERVER ])) && empty ( Config :: get ( 'system' , 'singleuser' ))) {
2018-01-15 14:05:12 +01:00
$tabs [] = [
2018-02-01 07:11:56 +01:00
'label' => L10n :: t ( 'Local Community' ),
2018-01-05 01:42:48 +01:00
'url' => 'community/local' ,
'sel' => $content == 'local' ? 'active' : '' ,
2018-01-21 19:33:59 +01:00
'title' => L10n :: t ( 'Posts from local users on this server' ),
2018-01-05 01:42:48 +01:00
'id' => 'community-local-tab' ,
'accesskey' => 'l'
2018-01-15 14:05:12 +01:00
];
2018-01-04 15:22:04 +01:00
}
if ( local_user () || in_array ( $page_style , [ CP_USERS_AND_GLOBAL , CP_GLOBAL_COMMUNITY ])) {
2018-01-15 14:05:12 +01:00
$tabs [] = [
2018-02-01 07:11:56 +01:00
'label' => L10n :: t ( 'Global Community' ),
2018-01-05 01:42:48 +01:00
'url' => 'community/global' ,
'sel' => $content == 'global' ? 'active' : '' ,
2018-02-01 07:11:56 +01:00
'title' => L10n :: t ( 'Posts from users of the whole federated network' ),
2018-01-05 01:42:48 +01:00
'id' => 'community-global-tab' ,
'accesskey' => 'g'
2018-01-15 14:05:12 +01:00
];
2018-01-04 15:22:04 +01:00
}
2018-01-04 15:02:04 +01:00
$tab_tpl = get_markup_template ( 'common_tabs.tpl' );
2018-01-15 14:05:12 +01:00
$o .= replace_macros ( $tab_tpl , [ '$tabs' => $tabs ]);
2018-01-04 15:02:04 +01:00
2018-01-15 20:51:56 +01:00
Nav :: setSelected ( 'community' );
2018-01-05 14:48:06 +01:00
// We need the editor here to be able to reshare an item.
if ( local_user ()) {
2018-01-15 14:05:12 +01:00
$x = [
2018-01-05 14:48:06 +01: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-03 00:41:24 +01:00
'acl' => ACL :: getFullSelectorHTML ( $a -> user , true ),
2018-01-05 14:48:06 +01:00
'bang' => '' ,
'visitor' => 'block' ,
'profile_uid' => local_user (),
2018-01-15 14:05:12 +01:00
];
2018-01-05 14:48:06 +01:00
$o .= status_editor ( $a , $x , 0 , true );
}
2011-07-05 05:57:07 +02:00
}
2018-02-01 00:22:41 +01: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 11:51:49 +01:00
2018-02-01 00:22:41 +01: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 07:29:24 +02:00
}
2011-07-05 05:57:07 +02:00
2018-10-09 19:58:58 +02:00
$a -> setPagerItemsPage ( $itemspage_network );
2018-02-01 00:22:41 +01:00
2018-08-21 17:39:49 +02:00
$r = community_getitems ( $a -> pager [ 'start' ], $a -> pager [ 'itemspage' ], $content , $accounttype );
2011-07-05 05:57:07 +02:00
2018-07-21 14:46:04 +02:00
if ( ! DBA :: isResult ( $r )) {
2018-01-21 19:33:59 +01:00
info ( L10n :: t ( 'No results.' ) . EOL );
2012-07-14 20:21:58 +02:00
return $o ;
}
2018-01-05 01:42:48 +01:00
$maxpostperauthor = ( int ) Config :: get ( 'system' , 'max_author_posts_community_page' );
2014-06-10 20:21:43 +02:00
2018-01-04 14:04:12 +01:00
if (( $maxpostperauthor != 0 ) && ( $content == 'local' )) {
2014-07-10 23:13:50 +02:00
$count = 1 ;
2014-06-10 20:21:43 +02:00
$previousauthor = " " ;
$numposts = 0 ;
2018-01-15 14:05:12 +01:00
$s = [];
2014-06-10 20:21:43 +02:00
2014-07-10 23:13:50 +02:00
do {
2018-01-05 01:42:48 +01:00
foreach ( $r as $item ) {
2017-03-26 07:29:24 +02:00
if ( $previousauthor == $item [ " author-link " ]) {
2014-07-10 23:13:50 +02:00
++ $numposts ;
2017-03-26 07:29:24 +02:00
} else {
2014-07-10 23:13:50 +02:00
$numposts = 0 ;
2017-03-26 07:29:24 +02:00
}
2014-07-10 23:13:50 +02:00
$previousauthor = $item [ " author-link " ];
2014-06-10 20:21:43 +02:00
2018-01-05 01:42:48 +01:00
if (( $numposts < $maxpostperauthor ) && ( count ( $s ) < $a -> pager [ 'itemspage' ])) {
2014-07-10 23:13:50 +02:00
$s [] = $item ;
2017-03-26 07:29:24 +02:00
}
2014-07-10 23:13:50 +02:00
}
2018-01-05 01:42:48 +01:00
if ( count ( $s ) < $a -> pager [ 'itemspage' ]) {
2018-08-21 17:39:49 +02:00
$r = community_getitems ( $a -> pager [ 'start' ] + ( $count * $a -> pager [ 'itemspage' ]), $a -> pager [ 'itemspage' ], $content , $accounttype );
2017-03-26 07:29:24 +02:00
}
2018-01-05 01:42:48 +01:00
} while (( count ( $s ) < $a -> pager [ 'itemspage' ]) && ( ++ $count < 50 ) && ( count ( $r ) > 0 ));
2017-03-26 07:29:24 +02:00
} else {
2014-06-10 20:21:43 +02:00
$s = $r ;
2017-03-26 07:29:24 +02:00
}
2011-07-05 05:57:07 +02:00
2018-05-26 22:03:30 +02:00
$o .= conversation ( $a , $s , 'community' , $update , false , 'commented' , local_user ());
2011-07-05 05:57:07 +02:00
2018-01-04 16:46:56 +01:00
if ( ! $update ) {
$o .= alt_pager ( $a , count ( $r ));
}
2011-07-05 05:57:07 +02:00
2017-11-10 20:57:02 +01:00
$t = get_markup_template ( " community.tpl " );
2018-01-15 14:05:12 +01:00
return replace_macros ( $t , [
2017-11-10 20:25:17 +01:00
'$content' => $o ,
2018-01-04 15:02:04 +01:00
'$header' => '' ,
2018-01-04 14:04:12 +01:00
'$show_global_community_hint' => ( $content == 'global' ) && Config :: get ( 'system' , 'show_global_community_hint' ),
2018-01-21 19:33:59 +01: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 14:05:12 +01:00
]);
2011-07-05 05:57:07 +02:00
}
2018-08-21 17:39:49 +02:00
function community_getitems ( $start , $itemspage , $content , $accounttype )
2018-01-05 01:42:48 +01:00
{
2018-01-04 14:04:12 +01:00
if ( $content == 'local' ) {
2018-08-21 17:39:49 +02:00
if ( ! is_null ( $accounttype )) {
$sql_accounttype = " AND `user`.`account-type` = ? " ;
$values = [ $accounttype , $start , $itemspage ];
} else {
$sql_accounttype = " " ;
$values = [ $start , $itemspage ];
}
2018-07-20 14:19:26 +02:00
$r = DBA :: p ( " SELECT `item`.`uri`, `author`.`url` AS `author-link` FROM `thread`
2018-01-04 14:04:12 +01:00
INNER JOIN `user` ON `user` . `uid` = `thread` . `uid` AND NOT `user` . `hidewall`
INNER JOIN `item` ON `item` . `id` = `thread` . `iid`
2018-06-25 08:45:05 +02:00
INNER JOIN `contact` AS `author` ON `author` . `id` = `item` . `author-id`
2018-01-04 14:04:12 +01:00
WHERE `thread` . `visible` AND NOT `thread` . `deleted` AND NOT `thread` . `moderated`
2018-08-21 17:39:49 +02:00
AND NOT `thread` . `private` AND `thread` . `wall` AND `thread` . `origin` $sql_accounttype
ORDER BY `thread` . `commented` DESC LIMIT ? , ? " , $values );
2018-07-21 04:03:40 +02:00
return DBA :: toArray ( $r );
2018-01-04 14:04:12 +01:00
} elseif ( $content == 'global' ) {
2018-08-21 17:39:49 +02:00
if ( ! is_null ( $accounttype )) {
$sql_accounttype = " AND `owner`.`contact-type` = ? " ;
$values = [ $accounttype , $start , $itemspage ];
} else {
$sql_accounttype = " " ;
$values = [ $start , $itemspage ];
}
2018-07-20 14:19:26 +02:00
$r = DBA :: p ( " SELECT `uri` FROM `thread`
2018-02-01 00:22:41 +01:00
INNER JOIN `item` ON `item` . `id` = `thread` . `iid`
2018-06-25 08:45:05 +02:00
INNER JOIN `contact` AS `author` ON `author` . `id` = `item` . `author-id`
2018-08-21 17:39:49 +02:00
INNER JOIN `contact` AS `owner` ON `owner` . `id` = `item` . `owner-id`
WHERE `thread` . `uid` = 0 AND NOT `author` . `hidden` AND NOT `author` . `blocked` $sql_accounttype
ORDER BY `thread` . `commented` DESC LIMIT ? , ? " , $values );
2018-07-21 04:03:40 +02:00
return DBA :: toArray ( $r );
2018-01-04 14:04:12 +01:00
}
// Should never happen
2018-01-15 14:05:12 +01:00
return [];
2014-07-10 23:13:50 +02:00
}