2011-07-04 23:57:07 -04:00
< ? php
2018-01-15 14:51:56 -05:00
/**
* @ file mod / community . php
*/
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2018-01-15 14:51:56 -05:00
use Friendica\Content\Nav ;
2017-04-30 00:01:26 -04:00
use Friendica\Core\Config ;
2018-01-04 05:51:49 -05:00
use Friendica\Core\PConfig ;
2017-11-07 22:57:46 -05:00
use Friendica\Database\DBM ;
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-03 08:27:43 -05:00
notice ( 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
if ( $a -> argc > 1 ) {
$content = $a -> argv [ 1 ];
} else {
2018-01-05 15:11:35 -05:00
if ( ! empty ( Config :: get ( 'system' , 'singleuser' ))) {
// 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' ])) {
notice ( 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 ) {
notice ( t ( 'Not available.' ) . EOL );
return ;
}
}
2018-01-03 08:27:43 -05:00
require_once 'include/bbcode.php' ;
require_once 'include/security.php' ;
require_once 'include/conversation.php' ;
2011-07-04 23:57:07 -04:00
2018-01-03 08:27:43 -05:00
if ( ! $update ) {
2018-01-04 09:02:04 -05:00
$tabs = [];
2018-01-05 15:11:35 -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-01-04 19:42:48 -05:00
'label' => t ( 'Community' ),
'url' => 'community/local' ,
'sel' => $content == 'local' ? 'active' : '' ,
'title' => t ( 'Posts from local users on this server' ),
'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-01-04 19:42:48 -05:00
'label' => t ( 'Global Timeline' ),
'url' => 'community/global' ,
'sel' => $content == 'global' ? 'active' : '' ,
'title' => t ( 'Posts from users of the federated network' ),
'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
$tab_tpl = get_markup_template ( 'common_tabs.tpl' );
2018-01-15 08:05:12 -05:00
$o .= replace_macros ( $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' ),
'acl' => populate_acl ( $a -> user , true ),
'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-04 05:51:49 -05:00
if ( Config :: get ( 'system' , 'comment_public' )) {
// check if we serve a mobile device and get the user settings
// accordingly
if ( $a -> is_mobile ) {
2018-01-04 19:42:48 -05:00
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_mobile_network' , 20 );
2018-01-04 05:51:49 -05:00
} else {
2018-01-04 19:42:48 -05:00
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_network' , 40 );
2018-01-04 05:51:49 -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 ;
}
$a -> set_pager_itemspage ( $itemspage_network );
2017-03-26 01:29:24 -04:00
}
2011-07-04 23:57:07 -04:00
2018-01-04 08:04:12 -05:00
$r = community_getitems ( $a -> pager [ 'start' ], $a -> pager [ 'itemspage' ], $content );
2011-07-04 23:57:07 -04:00
2018-01-03 08:27:43 -05:00
if ( ! DBM :: is_result ( $r )) {
info ( 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-01-04 19:42:48 -05:00
if (( $numposts < $maxpostperauthor ) && ( count ( $s ) < $a -> pager [ 'itemspage' ])) {
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-01-04 19:42:48 -05:00
if ( count ( $s ) < $a -> pager [ 'itemspage' ]) {
2018-01-04 08:04:12 -05:00
$r = community_getitems ( $a -> pager [ 'start' ] + ( $count * $a -> pager [ 'itemspage' ]), $a -> pager [ 'itemspage' ], $content );
2017-03-26 01:29:24 -04:00
}
2018-01-04 19:42:48 -05:00
} while (( count ( $s ) < $a -> pager [ 'itemspage' ]) && ( ++ $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
2017-03-13 01:57:37 -04:00
$o .= conversation ( $a , $s , 'community' , $update );
2011-07-04 23:57:07 -04:00
2018-01-04 10:46:56 -05:00
if ( ! $update ) {
$o .= alt_pager ( $a , count ( $r ));
}
2011-07-04 23:57:07 -04:00
2017-11-10 14:57:02 -05:00
$t = get_markup_template ( " community.tpl " );
2018-01-15 08:05:12 -05:00
return replace_macros ( $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' ),
'$global_community_hint' => 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-01-04 19:42:48 -05:00
function community_getitems ( $start , $itemspage , $content )
{
2018-01-04 08:04:12 -05:00
if ( $content == 'local' ) {
2018-01-04 19:42:48 -05:00
$r = dba :: p ( " SELECT " . item_fieldlists () . " FROM `thread`
2018-01-04 08:04:12 -05:00
INNER JOIN `user` ON `user` . `uid` = `thread` . `uid` AND NOT `user` . `hidewall`
INNER JOIN `item` ON `item` . `id` = `thread` . `iid`
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = ''
2018-01-04 19:42:48 -05:00
AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = '' " .
item_joins () . " AND `contact`.`self`
2018-01-04 08:04:12 -05:00
WHERE `thread` . `visible` AND NOT `thread` . `deleted` AND NOT `thread` . `moderated`
AND NOT `thread` . `private` AND `thread` . `wall`
2018-01-07 12:14:43 -05:00
ORDER BY `thread` . `commented` DESC LIMIT " . intval( $start ) . " , " . intval( $itemspage )
2018-01-04 08:04:12 -05:00
);
return dba :: inArray ( $r );
} elseif ( $content == 'global' ) {
2018-01-04 19:42:48 -05:00
$r = dba :: p ( " SELECT " . item_fieldlists () . " FROM `thread`
INNER JOIN `item` ON `item` . `id` = `thread` . `iid` " . item_joins() .
" WHERE `thread`.`uid` = 0 AND `verb` = ?
2018-01-07 12:14:43 -05:00
ORDER BY `thread` . `commented` DESC LIMIT " . intval( $start ) . " , " . intval( $itemspage ),
2018-01-04 08:04:12 -05:00
ACTIVITY_POST
);
return dba :: inArray ( $r );
}
// Should never happen
2018-01-15 08:05:12 -05:00
return [];
2014-07-10 17:13:50 -04:00
}