2012-06-14 20:46:58 -04:00
< ? php
2018-01-21 10:26:05 -05:00
2017-11-21 07:20:22 -05:00
/**
* @ file mod / network . php
*/
2018-01-24 21:08:45 -05:00
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2017-12-04 09:04:36 -05:00
use Friendica\Content\Feature ;
2017-11-21 07:20:22 -05:00
use Friendica\Content\ForumManager ;
2018-01-15 14:51:56 -05:00
use Friendica\Content\Nav ;
2018-01-15 09:50:06 -05:00
use Friendica\Content\Widget ;
2018-03-02 18:41:24 -05:00
use Friendica\Core\ACL ;
2018-01-17 13:42:40 -05:00
use Friendica\Core\Addon ;
2017-09-13 02:43:43 -04:00
use Friendica\Core\Config ;
2018-01-24 21:08:45 -05:00
use Friendica\Core\L10n ;
2017-09-13 02:43:43 -04:00
use Friendica\Core\PConfig ;
2018-01-21 10:26:05 -05:00
use Friendica\Core\System ;
2017-11-07 22:57:46 -05:00
use Friendica\Database\DBM ;
2017-12-07 09:04:24 -05:00
use Friendica\Model\Contact ;
2017-12-09 13:45:17 -05:00
use Friendica\Model\Group ;
2018-02-06 07:40:22 -05:00
use Friendica\Model\Item ;
2018-01-14 21:22:39 -05:00
use Friendica\Model\Profile ;
2017-12-17 11:40:59 -05:00
use Friendica\Module\Login ;
2018-01-26 21:38:34 -05:00
use Friendica\Util\DateTimeFormat ;
2017-09-13 02:43:43 -04:00
require_once 'include/conversation.php' ;
require_once 'include/items.php' ;
2017-04-30 00:07:00 -04:00
2018-01-21 10:26:05 -05:00
function network_init ( App $a )
{
2017-09-13 02:43:43 -04:00
if ( ! local_user ()) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2012-06-14 20:46:58 -04:00
return ;
}
2013-01-13 11:13:01 -05:00
2017-09-13 02:43:43 -04:00
$search = ( x ( $_GET , 'search' ) ? escape_tags ( $_GET [ 'search' ]) : '' );
if (( $search != '' ) && ! empty ( $_GET [ 'submit' ])) {
2018-01-21 10:26:05 -05:00
goaway ( 'search?search=' . urlencode ( $search ));
2017-09-13 02:43:43 -04:00
}
if ( x ( $_GET , 'save' )) {
2018-01-15 08:05:12 -05:00
$exists = dba :: exists ( 'search' , [ 'uid' => local_user (), 'term' => $search ]);
2017-09-13 02:43:43 -04:00
if ( ! $exists ) {
2018-01-15 08:05:12 -05:00
dba :: insert ( 'search' , [ 'uid' => local_user (), 'term' => $search ]);
2017-09-13 02:43:43 -04:00
}
}
if ( x ( $_GET , 'remove' )) {
2018-01-15 08:05:12 -05:00
dba :: delete ( 'search' , [ 'uid' => local_user (), 'term' => $search ]);
2017-09-13 02:43:43 -04:00
}
2012-06-14 20:46:58 -04:00
$is_a_date_query = false ;
2017-11-26 11:17:32 -05:00
$group_id = (( $a -> argc > 1 && is_numeric ( $a -> argv [ 1 ])) ? intval ( $a -> argv [ 1 ]) : 0 );
2017-12-01 08:32:21 -05:00
$cid = 0 ;
2017-03-30 15:36:34 -04:00
if ( x ( $_GET , 'cid' ) && intval ( $_GET [ 'cid' ]) != 0 ) {
2015-11-28 17:52:12 -05:00
$cid = $_GET [ 'cid' ];
2017-10-18 14:54:06 -04:00
$_GET [ 'nets' ] = 'all' ;
2017-11-26 11:17:32 -05:00
$group_id = 0 ;
2016-12-22 05:37:23 -05:00
}
2012-06-14 20:46:58 -04:00
2016-12-22 05:37:23 -05:00
if ( $a -> argc > 1 ) {
for ( $x = 1 ; $x < $a -> argc ; $x ++ ) {
if ( is_a_date_arg ( $a -> argv [ $x ])) {
2012-06-14 20:46:58 -04:00
$is_a_date_query = true ;
break ;
}
}
}
2013-01-13 11:13:01 -05:00
2014-11-10 09:07:35 -05:00
// convert query string to array. remove friendica args
2018-01-15 08:05:12 -05:00
$query_array = [];
2018-01-21 10:48:15 -05:00
$query_string = str_replace ( $a -> cmd . '?' , '' , $a -> query_string );
2014-11-10 09:07:35 -05:00
parse_str ( $query_string , $query_array );
array_shift ( $query_array );
2013-01-13 11:13:01 -05:00
2012-09-29 19:56:50 -04:00
// fetch last used network view and redirect if needed
2017-09-13 02:43:43 -04:00
if ( ! $is_a_date_query ) {
2018-01-21 10:49:05 -05:00
$sel_nets = defaults ( $_GET , 'nets' , false );
2012-09-29 19:56:50 -04:00
$sel_tabs = network_query_get_sel_tab ( $a );
$sel_groups = network_query_get_sel_group ( $a );
2018-01-21 10:26:05 -05:00
$last_sel_tabs = PConfig :: get ( local_user (), 'network.view' , 'tab.selected' );
2012-09-29 19:56:50 -04:00
$remember_tab = ( $sel_tabs [ 0 ] === 'active' && is_array ( $last_sel_tabs ) && $last_sel_tabs [ 0 ] !== 'active' );
$net_baseurl = '/network' ;
2018-01-15 08:05:12 -05:00
$net_args = [];
2012-09-29 19:56:50 -04:00
2018-01-21 10:49:05 -05:00
if ( $sel_groups !== false ) {
2012-09-29 19:56:50 -04:00
$net_baseurl .= '/' . $sel_groups ;
}
2015-08-11 14:16:53 -04:00
2017-04-04 01:35:04 -04:00
if ( $remember_tab ) {
2012-09-29 19:56:50 -04:00
// redirect if current selected tab is '/network' and
2014-03-09 04:19:14 -04:00
// last selected tab is _not_ '/network?f=&order=comment'.
2012-09-29 19:56:50 -04:00
// and this isn't a date query
2018-01-15 08:05:12 -05:00
$tab_baseurls = [
2018-01-21 10:26:05 -05:00
'' , //all
'' , //postord
'' , //conv
'/new' , //new
'' , //starred
'' , //bookmarked
'' , //spam
2018-01-15 08:05:12 -05:00
];
$tab_args = [
2018-01-21 10:26:05 -05:00
'f=&order=comment' , //all
'f=&order=post' , //postord
'f=&conv=1' , //conv
'' , //new
'f=&star=1' , //starred
'f=&bmark=1' , //bookmarked
'f=&spam=1' , //spam
2018-01-15 08:05:12 -05:00
];
2012-09-29 19:56:50 -04:00
$k = array_search ( 'active' , $last_sel_tabs );
2017-04-04 01:35:04 -04:00
if ( $k != 3 ) {
$net_baseurl .= $tab_baseurls [ $k ];
2012-09-29 19:56:50 -04:00
2017-04-04 01:35:04 -04:00
// parse out tab queries
2018-01-15 08:05:12 -05:00
$dest_qa = [];
2017-04-04 01:35:04 -04:00
$dest_qs = $tab_args [ $k ];
parse_str ( $dest_qs , $dest_qa );
$net_args = array_merge ( $net_args , $dest_qa );
} else {
$remember_tab = false ;
}
2012-09-29 19:56:50 -04:00
}
2018-01-21 10:49:05 -05:00
if ( $sel_nets !== false ) {
2014-11-10 09:37:52 -05:00
$net_args [ 'nets' ] = $sel_nets ;
}
2015-08-11 14:16:53 -04:00
2018-01-21 10:49:05 -05:00
if ( $remember_tab ) {
2014-03-09 04:19:14 -04:00
$net_args = array_merge ( $query_array , $net_args );
$net_queries = build_querystring ( $net_args );
2015-08-11 14:16:53 -04:00
2018-01-21 10:48:15 -05:00
$redir_url = ( $net_queries ? $net_baseurl . '?' . $net_queries : $net_baseurl );
2015-08-11 14:16:53 -04:00
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . $redir_url );
2012-09-29 19:56:50 -04:00
}
}
2015-08-11 14:16:53 -04:00
2017-03-30 15:36:34 -04:00
// If nets is set to all, unset it
if ( x ( $_GET , 'nets' ) && $_GET [ 'nets' ] === 'all' ) {
2012-09-29 19:56:50 -04:00
unset ( $_GET [ 'nets' ]);
2017-03-30 15:36:34 -04:00
}
2013-01-13 11:13:01 -05:00
2017-09-13 02:43:43 -04:00
if ( ! x ( $a -> page , 'aside' )) {
2012-06-14 20:46:58 -04:00
$a -> page [ 'aside' ] = '' ;
2017-03-30 15:36:34 -04:00
}
2012-06-14 20:46:58 -04:00
2018-01-21 10:26:05 -05:00
$a -> page [ 'aside' ] .= ( Feature :: isEnabled ( local_user (), 'groups' ) ?
Group :: sidebarWidget ( 'network/0' , 'network' , 'standard' , $group_id ) : '' );
2017-12-04 09:01:27 -05:00
$a -> page [ 'aside' ] .= ( Feature :: isEnabled ( local_user (), 'forumlist_widget' ) ? ForumManager :: widget ( local_user (), $cid ) : '' );
2018-01-21 10:26:05 -05:00
$a -> page [ 'aside' ] .= posted_date_widget ( 'network' , local_user (), false );
2018-01-15 09:50:06 -05:00
$a -> page [ 'aside' ] .= Widget :: networks ( 'network' , ( x ( $_GET , 'nets' ) ? $_GET [ 'nets' ] : '' ));
2012-06-14 20:46:58 -04:00
$a -> page [ 'aside' ] .= saved_searches ( $search );
2018-01-15 09:50:06 -05:00
$a -> page [ 'aside' ] .= Widget :: fileAs ( 'network' , ( x ( $_GET , 'file' ) ? $_GET [ 'file' ] : '' ));
2012-06-14 20:46:58 -04:00
}
2018-01-21 10:26:05 -05:00
function saved_searches ( $search )
{
if ( ! Feature :: isEnabled ( local_user (), 'savedsearch' )) {
2012-11-22 11:14:22 -05:00
return '' ;
2017-03-30 15:36:34 -04:00
}
2012-11-22 11:14:22 -05:00
2012-06-14 20:46:58 -04:00
$a = get_app ();
2013-12-09 18:13:19 -05:00
$srchurl = '/network?f='
2018-01-21 10:48:15 -05:00
. (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' )
. (( x ( $_GET , 'star' )) ? '&star=' . $_GET [ 'star' ] : '' )
. (( x ( $_GET , 'bmark' )) ? '&bmark=' . $_GET [ 'bmark' ] : '' )
. (( x ( $_GET , 'conv' )) ? '&conv=' . $_GET [ 'conv' ] : '' )
. (( x ( $_GET , 'nets' )) ? '&nets=' . $_GET [ 'nets' ] : '' )
. (( x ( $_GET , 'cmin' )) ? '&cmin=' . $_GET [ 'cmin' ] : '' )
. (( x ( $_GET , 'cmax' )) ? '&cmax=' . $_GET [ 'cmax' ] : '' )
. (( x ( $_GET , 'file' )) ? '&file=' . $_GET [ 'file' ] : '' );
2012-06-14 20:46:58 -04:00
;
2013-12-09 18:13:19 -05:00
2012-06-14 20:46:58 -04:00
$o = '' ;
2018-01-15 08:05:12 -05:00
$terms = dba :: select ( 'search' , [ 'id' , 'term' ], [ 'uid' => local_user ()]);
$saved = [];
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
while ( $rr = dba :: fetch ( $terms )) {
2018-01-15 08:05:12 -05:00
$saved [] = [
2017-09-13 02:43:43 -04:00
'id' => $rr [ 'id' ],
'term' => $rr [ 'term' ],
'encodedterm' => urlencode ( $rr [ 'term' ]),
2018-01-22 09:16:25 -05:00
'delete' => L10n :: t ( 'Remove term' ),
2018-01-21 10:26:05 -05:00
'selected' => ( $search == $rr [ 'term' ]),
2018-01-15 08:05:12 -05:00
];
2013-10-14 18:49:13 -04:00
}
2018-01-21 10:48:15 -05:00
$tpl = get_markup_template ( 'saved_searches_aside.tpl' );
2018-01-15 08:05:12 -05:00
$o = replace_macros ( $tpl , [
2018-01-22 09:16:25 -05:00
'$title' => L10n :: t ( 'Saved Searches' ),
'$add' => L10n :: t ( 'add' ),
2018-01-21 10:26:05 -05:00
'$searchbox' => search ( $search , 'netsearch-box' , $srchurl , true ),
2016-12-20 15:15:53 -05:00
'$saved' => $saved ,
2018-01-15 08:05:12 -05:00
]);
2013-10-14 18:49:13 -04:00
2012-06-14 20:46:58 -04:00
return $o ;
}
/**
* Return selected tab from query
2014-03-09 04:19:14 -04:00
*
2012-06-14 20:46:58 -04:00
* urls -> returns
* '/network' => $no_active = 'active'
* '/network?f=&order=comment' => $comment_active = 'active'
* '/network?f=&order=post' => $postord_active = 'active'
* '/network?f=&conv=1' , => $conv_active = 'active'
* '/network/new' , => $new_active = 'active'
* '/network?f=&star=1' , => $starred_active = 'active'
* '/network?f=&bmark=1' , => $bookmarked_active = 'active'
* '/network?f=&spam=1' , => $spam_active = 'active'
2014-03-09 04:19:14 -04:00
*
2017-09-13 02:43:43 -04:00
* @ return Array ( $no_active , $comment_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active );
2012-06-14 20:46:58 -04:00
*/
2018-01-21 10:26:05 -05:00
function network_query_get_sel_tab ( App $a )
{
$no_active = '' ;
2012-06-14 20:46:58 -04:00
$starred_active = '' ;
$new_active = '' ;
$bookmarked_active = '' ;
$all_active = '' ;
$conv_active = '' ;
$spam_active = '' ;
$postord_active = '' ;
2018-01-21 10:26:05 -05:00
if (( $a -> argc > 1 && $a -> argv [ 1 ] === 'new' ) || ( $a -> argc > 2 && $a -> argv [ 2 ] === 'new' )) {
$new_active = 'active' ;
2012-06-14 20:46:58 -04:00
}
2013-10-14 18:49:13 -04:00
2018-01-21 10:26:05 -05:00
if ( x ( $_GET , 'star' )) {
2012-06-14 20:46:58 -04:00
$starred_active = 'active' ;
}
2013-10-14 18:49:13 -04:00
2018-01-21 10:26:05 -05:00
if ( x ( $_GET , 'bmark' )) {
2012-06-14 20:46:58 -04:00
$bookmarked_active = 'active' ;
}
2018-01-21 10:26:05 -05:00
if ( x ( $_GET , 'conv' )) {
2012-06-14 20:46:58 -04:00
$conv_active = 'active' ;
}
2018-01-21 10:26:05 -05:00
if ( x ( $_GET , 'spam' )) {
2012-06-14 20:46:58 -04:00
$spam_active = 'active' ;
}
2018-01-21 10:26:05 -05:00
if (( $new_active == '' ) && ( $starred_active == '' ) && ( $bookmarked_active == '' ) && ( $conv_active == '' ) && ( $spam_active == '' )) {
$no_active = 'active' ;
2012-06-14 20:46:58 -04:00
}
2018-01-21 10:26:05 -05:00
if ( $no_active == 'active' && x ( $_GET , 'order' )) {
switch ( $_GET [ 'order' ]) {
case 'post' : $postord_active = 'active' ; $no_active = '' ; break ;
case 'comment' : $all_active = 'active' ; $no_active = '' ; break ;
2012-06-14 20:46:58 -04:00
}
}
2013-10-14 18:49:13 -04:00
2018-01-15 08:05:12 -05:00
return [ $no_active , $all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active ];
2012-06-14 20:46:58 -04:00
}
2018-01-21 10:26:05 -05:00
function network_query_get_sel_group ( App $a )
{
2012-09-29 19:56:50 -04:00
$group = false ;
2017-09-13 02:43:43 -04:00
if ( $a -> argc >= 2 && is_numeric ( $a -> argv [ 1 ])) {
2012-09-29 19:56:50 -04:00
$group = $a -> argv [ 1 ];
}
return $group ;
}
2017-09-14 02:10:33 -04:00
/**
* @ brief Sets the pager data and returns SQL
*
* @ param App $a The global App
* @ param integer $update Used for the automatic reloading
* @ return string SQL with the appropriate LIMIT clause
*/
2018-01-21 10:26:05 -05:00
function networkPager ( $a , $update )
{
2017-09-13 02:43:43 -04:00
if ( $update ) {
// only setup pagination on initial page view
return ' LIMIT 100' ;
}
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
// check if we serve a mobile device and get the user settings
// accordingly
if ( $a -> is_mobile ) {
2018-01-21 10:26:05 -05:00
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_mobile_network' );
2017-09-13 02:43:43 -04:00
$itemspage_network = (( intval ( $itemspage_network )) ? $itemspage_network : 20 );
} else {
2018-01-21 10:26:05 -05:00
$itemspage_network = PConfig :: get ( local_user (), 'system' , 'itemspage_network' );
2017-09-13 02:43:43 -04:00
$itemspage_network = (( intval ( $itemspage_network )) ? $itemspage_network : 40 );
}
// 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 );
2018-01-21 10:26:05 -05:00
return sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2017-09-13 02:43:43 -04:00
}
2017-09-14 02:10:33 -04:00
/**
* @ brief Sets items as seen
*
* @ param array $condition The array with the SQL condition
*/
2018-01-21 10:26:05 -05:00
function networkSetSeen ( $condition )
{
2017-09-13 02:43:43 -04:00
if ( empty ( $condition )) {
return ;
}
$unseen = dba :: exists ( 'item' , $condition );
if ( $unseen ) {
2018-02-06 07:40:22 -05:00
$r = Item :: update ([ 'unseen' => false ], $condition );
2017-09-13 02:43:43 -04:00
}
}
2017-09-14 02:10:33 -04:00
/**
* @ brief Create the conversation HTML
*
* @ param App $a The global App
* @ param array $items Items of the conversation
* @ param string $mode Display mode for the conversation
* @ param integer $update Used for the automatic reloading
* @ return string HTML of the conversation
*/
2018-02-25 16:33:15 -05:00
function networkConversation ( $a , $items , $mode , $update , $ordering = '' )
2018-01-21 10:26:05 -05:00
{
2017-09-13 02:43:43 -04:00
// Set this so that the conversation function can find out contact info for our wall-wall items
$a -> page_contact = $a -> contact ;
2018-02-28 15:21:31 -05:00
$o = conversation ( $a , $items , $mode , $update , false , $ordering );
2017-09-13 02:43:43 -04:00
if ( ! $update ) {
if ( PConfig :: get ( local_user (), 'system' , 'infinite_scroll' )) {
$o .= scroll_loader ();
} else {
$o .= alt_pager ( $a , count ( $items ));
}
}
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
return $o ;
}
2018-02-27 16:10:05 -05:00
function network_content ( App $a , $update = 0 , $parent = 0 )
2018-01-21 10:26:05 -05:00
{
2017-09-13 02:43:43 -04:00
if ( ! local_user ()) {
2017-12-17 11:40:59 -05:00
return Login :: form ();
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
/// @TODO Is this really necessary? $a is already available to hooks
2018-01-15 08:05:12 -05:00
$arr = [ 'query' => $a -> query_string ];
2018-01-17 13:42:40 -05:00
Addon :: callHooks ( 'network_content_init' , $arr );
2017-09-13 02:43:43 -04:00
$nouveau = false ;
if ( $a -> argc > 1 ) {
for ( $x = 1 ; $x < $a -> argc ; $x ++ ) {
if ( $a -> argv [ $x ] === 'new' ) {
$nouveau = true ;
}
}
}
2018-01-21 10:26:05 -05:00
if ( x ( $_GET , 'file' )) {
2017-09-13 02:43:43 -04:00
$nouveau = true ;
}
if ( $nouveau ) {
$o = networkFlatView ( $a , $update );
} else {
2018-02-27 16:10:05 -05:00
$o = networkThreadedView ( $a , $update , $parent );
2017-09-13 02:43:43 -04:00
}
return $o ;
}
/**
* @ brief Get the network content in flat view
*
* @ param App $a The global App
* @ param integer $update Used for the automatic reloading
* @ return string HTML of the network content in flat view
*/
2018-01-21 10:26:05 -05:00
function networkFlatView ( App $a , $update = 0 )
{
2017-09-13 02:43:43 -04:00
// Rawmode is used for fetching new content at the end of the page
2018-01-21 10:48:15 -05:00
$rawmode = ( isset ( $_GET [ 'mode' ]) AND ( $_GET [ 'mode' ] == 'raw' ));
2017-09-13 02:43:43 -04:00
2018-01-21 10:48:15 -05:00
if ( isset ( $_GET [ 'last_id' ])) {
$last_id = intval ( $_GET [ 'last_id' ]);
2017-09-13 02:43:43 -04:00
} else {
$last_id = 0 ;
}
$o = '' ;
2018-01-21 10:26:05 -05:00
$file = (( x ( $_GET , 'file' )) ? $_GET [ 'file' ] : '' );
2017-09-13 02:43:43 -04:00
if ( ! $update && ! $rawmode ) {
$tabs = network_tabs ( $a );
$o .= $tabs ;
2018-01-15 14:51:56 -05:00
Nav :: setSelected ( 'network' );
2017-09-13 02:43:43 -04:00
2018-01-15 08:05:12 -05:00
$x = [
2017-09-13 02:43:43 -04:00
'is_owner' => true ,
'allow_location' => $a -> user [ 'allow_location' ],
'default_location' => $a -> user [ 'default-location' ],
'nickname' => $a -> user [ 'nickname' ],
2018-01-21 10:26:05 -05:00
'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
'default_perms' => ACL :: getDefaultUserPermissions ( $a -> user ),
'acl' => ACL :: getFullSelectorHTML ( $a -> user , true ),
2018-01-21 10:26:05 -05:00
'bang' => '' ,
2017-09-13 02:43:43 -04:00
'visitor' => 'block' ,
'profile_uid' => local_user (),
'content' => '' ,
2018-01-15 08:05:12 -05:00
];
2017-09-13 02:43:43 -04:00
2018-01-03 19:29:52 -05:00
$o .= status_editor ( $a , $x );
2017-09-13 02:43:43 -04:00
2018-01-14 21:22:39 -05:00
if ( ! Config :: get ( 'theme' , 'hide_eventlist' )) {
$o .= Profile :: getBirthdays ();
2018-02-27 20:47:18 -05:00
$o .= Profile :: getEventsReminderHTML ();
2017-09-13 02:43:43 -04:00
}
}
if ( strlen ( $file )) {
2018-02-11 21:25:09 -05:00
$sql_post_table = sprintf ( " INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` " ,
2018-01-21 10:26:05 -05:00
dbesc ( protect_sprintf ( $file )), intval ( TERM_OBJ_POST ), intval ( TERM_FILE ), intval ( local_user ()));
2017-09-13 02:43:43 -04:00
} else {
$sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` " ;
}
2017-09-13 05:20:08 -04:00
$pager_sql = networkPager ( $a , $update );
2017-09-13 02:43:43 -04:00
// show all items unthreaded in reverse created date order
$items = q ( " SELECT %s FROM `item` $sql_post_table %s
WHERE % s AND `item` . `uid` = % d
ORDER BY `item` . `id` DESC $pager_sql " ,
item_fieldlists (), item_joins (), item_condition (),
intval ( $_SESSION [ 'uid' ])
);
2018-01-15 08:05:12 -05:00
$condition = [ 'unseen' => true , 'uid' => local_user ()];
2017-09-13 02:43:43 -04:00
networkSetSeen ( $condition );
$mode = 'network-new' ;
$o .= networkConversation ( $a , $items , $mode , $update );
return $o ;
}
/**
* @ brief Get the network content in threaded view
*
* @ param App $a The global App
* @ param integer $update Used for the automatic reloading
* @ return string HTML of the network content in flat view
*/
2018-02-27 16:10:05 -05:00
function networkThreadedView ( App $a , $update , $parent )
2018-01-21 10:26:05 -05:00
{
2016-01-10 03:19:00 -05:00
// Rawmode is used for fetching new content at the end of the page
2018-01-21 10:48:15 -05:00
$rawmode = ( isset ( $_GET [ 'mode' ]) AND ( $_GET [ 'mode' ] == 'raw' ));
2016-01-10 03:19:00 -05:00
2018-01-21 10:48:15 -05:00
if ( isset ( $_GET [ 'last_received' ]) && isset ( $_GET [ 'last_commented' ]) && isset ( $_GET [ 'last_created' ]) && isset ( $_GET [ 'last_id' ])) {
$last_received = DBM :: date ( $_GET [ 'last_received' ]);
$last_commented = DBM :: date ( $_GET [ 'last_commented' ]);
$last_created = DBM :: date ( $_GET [ 'last_created' ]);
$last_id = intval ( $_GET [ 'last_id' ]);
2017-07-31 02:04:37 -04:00
} else {
$last_received = '' ;
$last_commented = '' ;
$last_created = '' ;
$last_id = 0 ;
}
2012-06-14 20:46:58 -04:00
$datequery = $datequery2 = '' ;
2018-01-11 03:26:30 -05:00
$gid = 0 ;
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
if ( $a -> argc > 1 ) {
for ( $x = 1 ; $x < $a -> argc ; $x ++ ) {
if ( is_a_date_arg ( $a -> argv [ $x ])) {
if ( $datequery ) {
2012-06-14 20:46:58 -04:00
$datequery2 = escape_tags ( $a -> argv [ $x ]);
2017-09-13 02:43:43 -04:00
} else {
2012-06-14 20:46:58 -04:00
$datequery = escape_tags ( $a -> argv [ $x ]);
$_GET [ 'order' ] = 'post' ;
}
2017-09-13 02:43:43 -04:00
} elseif ( intval ( $a -> argv [ $x ])) {
2018-01-11 03:26:30 -05:00
$gid = intval ( $a -> argv [ $x ]);
2018-01-15 08:05:12 -05:00
$def_acl = [ 'allow_gid' => '<' . $gid . '>' ];
2012-06-14 20:46:58 -04:00
}
}
}
$o = '' ;
2018-01-21 10:48:15 -05:00
$cid = intval ( defaults ( $_GET , 'cid' , 0 ));
$star = intval ( defaults ( $_GET , 'star' , 0 ));
$bmark = intval ( defaults ( $_GET , 'bmark' , 0 ));
$conv = intval ( defaults ( $_GET , 'conv' , 0 ));
$order = notags ( defaults ( $_GET , 'order' , 'comment' ));
$nets = defaults ( $_GET , 'nets' , '' );
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
if ( $cid ) {
2018-01-15 08:05:12 -05:00
$def_acl = [ 'allow_cid' => '<' . intval ( $cid ) . '>' ];
2017-09-13 02:43:43 -04:00
}
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
if ( $nets ) {
2018-01-15 08:05:12 -05:00
$r = dba :: select ( 'contact' , [ 'id' ], [ 'uid' => local_user (), 'network' => $nets ], [ 'self' => false ]);
2012-06-14 20:46:58 -04:00
$str = '' ;
2017-09-13 02:43:43 -04:00
while ( $rr = dba :: fetch ( $r )) {
$str .= '<' . $rr [ 'id' ] . '>' ;
}
if ( strlen ( $str )) {
2018-01-15 08:05:12 -05:00
$def_acl = [ 'allow_cid' => $str ];
2017-09-13 02:43:43 -04:00
}
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
if ( ! $update && ! $rawmode ) {
2016-06-23 18:33:31 -04:00
$tabs = network_tabs ( $a );
$o .= $tabs ;
2018-01-11 03:26:30 -05:00
if ( $gid ) {
if (( $t = Contact :: getOStatusCountByGroupId ( $gid )) && ! PConfig :: get ( local_user (), 'system' , 'nowarn_insecure' )) {
2018-01-21 17:15:52 -05:00
notice ( L10n :: tt ( " Warning: This group contains %s member from a network that doesn't allow non public messages. " ,
2018-01-21 13:33:59 -05:00
" Warning: This group contains %s members from a network that doesn't allow non public messages. " ,
$t ) . EOL );
notice ( L10n :: t ( " Messages in this group won't be send to these receivers. " ) . EOL );
2012-06-14 20:46:58 -04:00
}
}
2018-01-15 14:51:56 -05:00
Nav :: setSelected ( 'network' );
2012-06-14 20:46:58 -04:00
2018-01-21 10:48:15 -05:00
$content = '' ;
2015-04-09 18:42:03 -04:00
if ( $cid ) {
2015-10-30 07:47:48 -04:00
// If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor
2018-01-09 22:20:33 -05:00
$condition = [ " `id` = ? AND (`forum` OR `prv`) " , $cid ];
2018-01-10 08:36:02 -05:00
$contact = dba :: selectFirst ( 'contact' , [ 'addr' , 'nick' ], $condition );
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $contact )) {
2018-01-21 10:48:15 -05:00
if ( $contact [ 'addr' ] != '' ) {
$content = '!' . $contact [ 'addr' ];
2017-09-13 02:43:43 -04:00
} else {
2018-01-21 10:48:15 -05:00
$content = '!' . $contact [ 'nick' ] . '+' . $cid ;
2017-09-13 02:43:43 -04:00
}
}
2015-04-09 18:42:03 -04:00
}
2018-01-15 08:05:12 -05:00
$x = [
2012-06-14 20:46:58 -04:00
'is_owner' => true ,
'allow_location' => $a -> user [ 'allow_location' ],
'default_location' => $a -> user [ 'default-location' ],
'nickname' => $a -> user [ 'nickname' ],
2018-01-21 10:26:05 -05:00
'lockstate' => ((( $gid ) || ( $cid ) || ( $nets ) || ( 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
'default_perms' => ACL :: getDefaultUserPermissions ( $a -> user ),
'acl' => ACL :: getFullSelectorHTML ((( $gid || $cid || $nets ) ? $def_acl : $a -> user ), true ),
2018-01-21 10:26:05 -05:00
'bang' => (( $gid || $cid || $nets ) ? '!' : '' ),
2012-06-14 20:46:58 -04:00
'visitor' => 'block' ,
2013-01-26 14:52:21 -05:00
'profile_uid' => local_user (),
2015-04-09 18:42:03 -04:00
'content' => $content ,
2018-01-15 08:05:12 -05:00
];
2012-06-14 20:46:58 -04:00
2018-01-03 19:29:52 -05:00
$o .= status_editor ( $a , $x );
2012-06-14 20:46:58 -04:00
}
2013-01-27 07:57:44 -05:00
// We don't have to deal with ACLs on this page. You're looking at everything
2012-06-14 20:46:58 -04:00
// that belongs to you, hence you can see all of it. We will filter by group if
2014-03-09 04:19:14 -04:00
// desired.
2012-06-14 20:46:58 -04:00
2018-01-21 10:48:15 -05:00
$sql_post_table = '' ;
2018-01-21 10:26:05 -05:00
$sql_options = (( $star ) ? " AND `thread`.`starred` " : '' );
2016-12-11 02:09:48 -05:00
$sql_options .= (( $bmark ) ? " AND `thread`.`bookmark` " : '' );
2014-03-09 04:19:14 -04:00
$sql_extra = $sql_options ;
2018-01-21 10:48:15 -05:00
$sql_extra2 = '' ;
$sql_extra3 = '' ;
$sql_table = '`thread`' ;
$sql_parent = '`iid`' ;
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
if ( $update ) {
2018-01-21 10:48:15 -05:00
$sql_table = '`item`' ;
$sql_parent = '`parent`' ;
2016-11-20 04:24:56 -05:00
$sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent` " ;
2014-03-09 04:19:14 -04:00
}
2012-06-14 20:46:58 -04:00
2018-01-11 19:14:58 -05:00
$sql_nets = (( $nets ) ? sprintf ( " AND $sql_table .`network` = '%s' " , dbesc ( $nets )) : '' );
$sql_tag_nets = (( $nets ) ? sprintf ( " AND `item`.`network` = '%s' " , dbesc ( $nets )) : '' );
2012-06-14 20:46:58 -04:00
2018-01-11 03:26:30 -05:00
if ( $gid ) {
$group = dba :: selectFirst ( 'group' , [ 'name' ], [ 'id' => $gid , 'uid' => $_SESSION [ 'uid' ]]);
if ( ! DBM :: is_result ( $group )) {
if ( $update ) {
2012-06-14 20:46:58 -04:00
killme ();
2018-01-11 03:26:30 -05:00
}
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'No such group' ) . EOL );
2016-02-16 18:01:24 -05:00
goaway ( 'network/0' );
2012-06-14 20:46:58 -04:00
// NOTREACHED
}
2018-01-15 08:05:12 -05:00
$contacts = Group :: expand ([ $gid ]);
2014-03-09 04:19:14 -04:00
2017-09-13 02:43:43 -04:00
if (( is_array ( $contacts )) && count ( $contacts )) {
2018-01-21 10:48:15 -05:00
$contact_str_self = '' ;
2016-01-10 03:19:00 -05:00
2018-01-21 10:26:05 -05:00
$contact_str = implode ( ',' , $contacts );
2018-01-10 08:36:02 -05:00
$self = dba :: selectFirst ( 'contact' , [ 'id' ], [ 'uid' => $_SESSION [ 'uid' ], 'self' => true ]);
2017-11-07 22:57:46 -05:00
if ( DBM :: is_result ( $self )) {
2018-01-21 10:48:15 -05:00
$contact_str_self = $self [ 'id' ];
2016-01-10 03:19:00 -05:00
}
2018-01-21 10:26:05 -05:00
$sql_post_table .= " INNER JOIN `item` AS `temp1` ON `temp1`.`id` = " . $sql_table . " . " . $sql_parent ;
2016-11-20 04:24:56 -05:00
$sql_extra3 .= " AND (`thread`.`contact-id` IN ( $contact_str ) " ;
2018-01-21 10:26:05 -05:00
$sql_extra3 .= " OR (`thread`.`contact-id` = ' $contact_str_self ' AND `temp1`.`allow_gid` LIKE ' " . protect_sprintf ( '%<' . intval ( $gid ) . '>%' ) . " ' AND `temp1`.`private`)) " ;
2016-01-10 03:19:00 -05:00
} else {
$sql_extra3 .= " AND false " ;
2018-01-22 09:16:25 -05:00
info ( L10n :: t ( 'Group is empty' ));
2012-06-14 20:46:58 -04:00
}
2018-01-21 10:48:15 -05:00
$o = replace_macros ( get_markup_template ( 'section_title.tpl' ), [
2018-01-22 09:16:25 -05:00
'$title' => L10n :: t ( 'Group: %s' , $group [ 'name' ])
2018-01-15 08:05:12 -05:00
]) . $o ;
2017-09-13 02:43:43 -04:00
} elseif ( $cid ) {
2018-01-09 22:20:33 -05:00
$fields = [ 'id' , 'name' , 'network' , 'writable' , 'nurl' ,
2018-01-21 10:26:05 -05:00
'forum' , 'prv' , 'contact-type' , 'addr' , 'thumb' , 'location' ];
2018-01-09 22:20:33 -05:00
$condition = [ " `id` = ? AND (NOT `blocked` OR `pending`) " , $cid ];
2018-01-11 03:26:30 -05:00
$contact = dba :: selectFirst ( 'contact' , $fields , $condition );
if ( DBM :: is_result ( $contact )) {
2018-01-21 10:26:05 -05:00
$sql_extra = " AND " . $sql_table . " .`contact-id` = " . intval ( $cid );
2015-05-29 20:21:30 -04:00
2018-01-15 08:05:12 -05:00
$entries [ 0 ] = [
2015-11-28 22:57:42 -05:00
'id' => 'network' ,
2018-01-11 03:26:30 -05:00
'name' => htmlentities ( $contact [ 'name' ]),
'itemurl' => defaults ( $contact , 'addr' , $contact [ 'nurl' ]),
'thumb' => proxy_url ( $contact [ 'thumb' ], false , PROXY_SIZE_THUMB ),
'details' => $contact [ 'location' ],
2018-01-15 08:05:12 -05:00
];
2015-11-28 22:57:42 -05:00
2018-01-21 10:48:15 -05:00
$entries [ 0 ][ 'account_type' ] = Contact :: getAccountType ( $contact );
2016-10-01 16:03:27 -04:00
2018-01-21 10:48:15 -05:00
$o = replace_macros ( get_markup_template ( 'viewcontact_template.tpl' ), [
2015-11-28 22:57:42 -05:00
'contacts' => $entries ,
2015-11-29 19:24:22 -05:00
'id' => 'network' ,
2018-01-15 08:05:12 -05:00
]) . $o ;
2015-05-29 20:21:30 -04:00
2018-01-21 13:33:59 -05:00
if ( $contact [ 'network' ] === NETWORK_OSTATUS && $contact [ 'writable' ] && ! PConfig :: get ( local_user (), 'system' , 'nowarn_insecure' )) {
notice ( L10n :: t ( 'Private messages to this person are at risk of public disclosure.' ) . EOL );
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
} else {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Invalid contact.' ) . EOL );
2016-02-16 18:01:24 -05:00
goaway ( 'network' );
2012-06-14 20:46:58 -04:00
// NOTREACHED
}
}
2018-01-14 21:22:39 -05:00
if ( ! $gid && ! $cid && ! $update && ! Config :: get ( 'theme' , 'hide_eventlist' )) {
$o .= Profile :: getBirthdays ();
2018-02-27 20:47:18 -05:00
$o .= Profile :: getEventsReminderHTML ();
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
if ( $datequery ) {
2018-01-21 10:26:05 -05:00
$sql_extra3 .= protect_sprintf ( sprintf ( " AND $sql_table .created <= '%s' " ,
2018-01-26 21:38:34 -05:00
dbesc ( DateTimeFormat :: convert ( $datequery , 'UTC' , date_default_timezone_get ()))));
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
if ( $datequery2 ) {
2018-01-21 10:26:05 -05:00
$sql_extra3 .= protect_sprintf ( sprintf ( " AND $sql_table .created >= '%s' " ,
2018-01-26 21:38:34 -05:00
dbesc ( DateTimeFormat :: convert ( $datequery2 , 'UTC' , date_default_timezone_get ()))));
2012-06-14 20:46:58 -04:00
}
2017-07-31 02:04:37 -04:00
if ( $conv ) {
2016-01-10 11:10:56 -05:00
$sql_extra3 .= " AND $sql_table .`mention` " ;
2017-07-31 02:04:37 -04:00
}
2017-09-13 02:43:43 -04:00
// Normal conversation view
if ( $order === 'post' ) {
2018-01-21 10:48:15 -05:00
$ordering = '`created`' ;
2018-02-28 15:21:31 -05:00
$order_mode = 'created' ;
2016-07-26 16:10:13 -04:00
} else {
2018-01-21 10:48:15 -05:00
$ordering = '`commented`' ;
2018-02-28 15:21:31 -05:00
$order_mode = 'commented' ;
2017-09-13 02:43:43 -04:00
}
2015-10-29 20:59:17 -04:00
2018-01-21 10:48:15 -05:00
if ( $sql_order == '' ) {
2017-09-13 02:43:43 -04:00
$sql_order = " $sql_table . $ordering " ;
2012-06-14 20:46:58 -04:00
}
2018-01-01 16:33:21 -05:00
if ( x ( $_GET , 'offset' )) {
2018-01-21 10:48:15 -05:00
$sql_range = sprintf ( " AND $sql_order <= '%s' " , dbesc ( $_GET [ 'offset' ]));
2018-01-08 01:57:51 -05:00
} else {
$sql_range = '' ;
2017-09-13 02:43:43 -04:00
}
2012-06-14 20:46:58 -04:00
2017-09-13 05:20:08 -04:00
$pager_sql = networkPager ( $a , $update );
2018-01-07 17:07:16 -05:00
$last_date = '' ;
2017-09-13 02:43:43 -04:00
switch ( $order_mode ) {
case 'received' :
if ( $last_received != '' ) {
2018-01-07 17:07:16 -05:00
$last_date = $last_received ;
2018-01-08 01:57:51 -05:00
$sql_range .= sprintf ( " AND $sql_table .`received` < '%s' " , dbesc ( $last_received ));
2017-09-13 02:43:43 -04:00
$a -> set_pager_page ( 1 );
2018-01-21 10:26:05 -05:00
$pager_sql = sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2017-09-13 02:43:43 -04:00
}
break ;
case 'commented' :
if ( $last_commented != '' ) {
2018-01-07 17:07:16 -05:00
$last_date = $last_commented ;
2018-01-08 01:57:51 -05:00
$sql_range .= sprintf ( " AND $sql_table .`commented` < '%s' " , dbesc ( $last_commented ));
2017-09-13 02:43:43 -04:00
$a -> set_pager_page ( 1 );
2018-01-21 10:26:05 -05:00
$pager_sql = sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2017-09-13 02:43:43 -04:00
}
break ;
case 'created' :
if ( $last_created != '' ) {
2018-01-07 17:07:16 -05:00
$last_date = $last_created ;
2018-01-08 01:57:51 -05:00
$sql_range .= sprintf ( " AND $sql_table .`created` < '%s' " , dbesc ( $last_created ));
2017-09-13 02:43:43 -04:00
$a -> set_pager_page ( 1 );
2018-01-21 10:26:05 -05:00
$pager_sql = sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2017-09-13 02:43:43 -04:00
}
break ;
case 'id' :
2018-01-21 10:48:15 -05:00
if (( $last_id > 0 ) && ( $sql_table == '`thread`' )) {
2018-01-08 01:57:51 -05:00
$sql_range .= sprintf ( " AND $sql_table .`iid` < '%s' " , dbesc ( $last_id ));
2017-09-13 02:43:43 -04:00
$a -> set_pager_page ( 1 );
2018-01-21 10:26:05 -05:00
$pager_sql = sprintf ( " LIMIT %d, %d " , intval ( $a -> pager [ 'start' ]), intval ( $a -> pager [ 'itemspage' ]));
2017-09-13 02:43:43 -04:00
}
break ;
}
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
// Fetch a page full of parent items for this page
if ( $update ) {
2018-02-27 16:10:05 -05:00
if ( ! empty ( $parent )) {
2018-02-27 18:25:29 -05:00
// Load only a single thread
2018-02-27 16:10:05 -05:00
$sql_extra4 = " `item`.`id` = " . intval ( $parent );
2013-12-09 18:13:19 -05:00
} else {
2018-02-27 18:25:29 -05:00
// Load all unseen items
2018-02-27 16:10:05 -05:00
$sql_extra4 = " `item`.`unseen` " ;
2018-02-27 17:37:11 -05:00
if ( Config :: get ( " system " , " like_no_comment " )) {
$sql_extra4 .= " AND `item`.`verb` = ' " . ACTIVITY_POST . " ' " ;
}
2018-02-28 01:36:41 -05:00
if ( $order === 'post' ) {
// Only show toplevel posts when updating posts in this order mode
$sql_extra4 .= " AND `item`.`id` = `item`.`parent` " ;
}
2018-02-27 18:25:29 -05:00
}
2018-02-27 01:28:53 -05:00
$r = q ( " SELECT `item`.`parent-uri` AS `uri`, `item`.`parent` AS `item_id`, $sql_order AS `order_date`
2018-02-25 16:33:15 -05:00
FROM `item` $sql_post_table
STRAIGHT_JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
AND ( NOT `contact` . `blocked` OR `contact` . `pending` )
2018-04-08 20:47:16 -04:00
AND ( `item` . `parent-uri` != `item` . `uri` OR `contact` . `rel` IN ( % d , % d ) AND NOT `contact` . `readonly` )
2018-02-27 16:10:05 -05:00
WHERE `item` . `uid` = % d AND `item` . `visible` AND NOT `item` . `deleted`
AND NOT `item` . `moderated` AND $sql_extra4
2018-01-08 01:57:51 -05:00
$sql_extra3 $sql_extra $sql_range $sql_nets
ORDER BY `order_date` DESC LIMIT 100 " ,
2018-04-08 20:47:16 -04:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND ),
2017-09-13 02:43:43 -04:00
intval ( local_user ())
);
} else {
2018-02-25 16:33:15 -05:00
$r = q ( " SELECT `item`.`uri`, `thread`.`iid` AS `item_id`, $sql_order AS `order_date`
FROM `thread` $sql_post_table
STRAIGHT_JOIN `contact` ON `contact` . `id` = `thread` . `contact-id`
AND ( NOT `contact` . `blocked` OR `contact` . `pending` )
STRAIGHT_JOIN `item` ON `item` . `id` = `thread` . `iid`
2018-04-08 20:47:16 -04:00
AND ( `item` . `parent-uri` != `item` . `uri` OR `contact` . `rel` IN ( % d , % d ) AND NOT `contact` . `readonly` )
2017-09-13 02:43:43 -04:00
WHERE `thread` . `uid` = % d AND `thread` . `visible` AND NOT `thread` . `deleted`
AND NOT `thread` . `moderated`
2018-01-08 01:57:51 -05:00
$sql_extra2 $sql_extra3 $sql_range $sql_extra $sql_nets
2018-02-25 16:33:15 -05:00
ORDER BY `order_date` DESC $pager_sql " ,
2018-04-08 20:47:16 -04:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND ),
2017-09-13 02:43:43 -04:00
intval ( local_user ())
);
}
2013-10-14 18:49:13 -04:00
2018-01-08 01:57:51 -05:00
// Only show it when unfiltered (no groups, no networks, ...)
2018-01-31 18:22:41 -05:00
if ( in_array ( $nets , [ '' , NETWORK_DFRN , NETWORK_DIASPORA , NETWORK_OSTATUS ]) && ( strlen ( $sql_extra . $sql_extra2 . $sql_extra3 ) == 0 )) {
2018-01-15 09:02:34 -05:00
if ( DBM :: is_result ( $r )) {
2018-01-15 01:59:20 -05:00
$top_limit = current ( $r )[ 'order_date' ];
$bottom_limit = end ( $r )[ 'order_date' ];
2018-02-25 16:33:15 -05:00
if ( empty ( $_SESSION [ 'network_last_top_limit' ]) || ( $_SESSION [ 'network_last_top_limit' ] < $top_limit )) {
$_SESSION [ 'network_last_top_limit' ] = $top_limit ;
}
2018-01-15 01:59:20 -05:00
} else {
2018-02-26 05:44:54 -05:00
$top_limit = $bottom_limit = DateTimeFormat :: utcNow ();
2018-01-15 01:59:20 -05:00
}
2018-01-07 17:07:16 -05:00
2018-01-08 01:57:51 -05:00
// When checking for updates we need to fetch from the newest date to the newest date before
2018-02-26 02:41:58 -05:00
// Only do this, when the last stored date isn't too long ago (10 times the update interval)
$browser_update = PConfig :: get ( local_user (), 'system' , 'update_interval' , 40000 ) / 1000 ;
if (( $browser_update > 0 ) && $update && ! empty ( $_SESSION [ 'network_last_date' ]) &&
2018-02-26 05:44:54 -05:00
(( $bottom_limit < $_SESSION [ 'network_last_date' ]) || ( $top_limit == $bottom_limit )) &&
2018-02-26 02:41:58 -05:00
(( time () - $_SESSION [ 'network_last_date_timestamp' ]) < ( $browser_update * 10 ))) {
2018-01-08 01:57:51 -05:00
$bottom_limit = $_SESSION [ 'network_last_date' ];
}
2018-02-25 16:33:15 -05:00
$_SESSION [ 'network_last_date' ] = defaults ( $_SESSION , 'network_last_top_limit' , $top_limit );
$_SESSION [ 'network_last_date_timestamp' ] = time ();
2018-01-08 01:57:51 -05:00
2018-01-07 17:07:16 -05:00
if ( $last_date > $top_limit ) {
$top_limit = $last_date ;
2018-01-15 01:59:20 -05:00
} elseif ( $a -> pager [ 'page' ] == 1 ) {
// Highest possible top limit when we are on the first page
2018-01-26 21:38:34 -05:00
$top_limit = DateTimeFormat :: utcNow ();
2018-01-07 17:07:16 -05:00
}
2018-02-27 08:23:25 -05:00
$items = dba :: p ( " SELECT `item`.`parent-uri` AS `uri`, 0 AS `item_id`, `item`. $ordering AS `order_date` FROM `item`
2018-02-26 01:59:32 -05:00
STRAIGHT_JOIN ( SELECT `oid` FROM `term` WHERE `term` IN
2018-01-07 17:07:16 -05:00
( SELECT SUBSTR ( `term` , 2 ) FROM `search` WHERE `uid` = ? AND `term` LIKE '#%' ) AND `otype` = ? AND `type` = ? AND `uid` = 0 ) AS `term`
ON `item` . `id` = `term` . `oid`
2018-02-25 16:33:15 -05:00
STRAIGHT_JOIN `contact` ON `contact` . `id` = `item` . `author-id`
2018-04-08 20:47:16 -04:00
AND ( `item` . `parent-uri` != `item` . `uri` OR `contact` . `rel` IN ( ? , ? ) AND NOT `contact` . `readonly` )
2018-02-10 07:34:10 -05:00
WHERE `item` . `uid` = 0 AND `item` . $ordering < ? AND `item` . $ordering > ?
2018-02-25 16:33:15 -05:00
AND NOT `contact` . `hidden` AND NOT `contact` . `blocked` " . $sql_tag_nets ,
2018-04-08 20:47:16 -04:00
local_user (), TERM_OBJ_POST , TERM_HASHTAG ,
2018-04-09 09:19:49 -04:00
CONTACT_IS_SHARING , CONTACT_IS_FRIEND ,
2018-04-08 20:47:16 -04:00
$top_limit , $bottom_limit );
2018-02-25 16:58:21 -05:00
2018-01-07 17:07:16 -05:00
$data = dba :: inArray ( $items );
if ( count ( $data ) > 0 ) {
2018-02-25 16:33:15 -05:00
$tag_top_limit = current ( $data )[ 'order_date' ];
if ( $_SESSION [ 'network_last_date' ] < $tag_top_limit ) {
$_SESSION [ 'network_last_date' ] = $tag_top_limit ;
}
logger ( 'Tagged items: ' . count ( $data ) . ' - ' . $bottom_limit . ' - ' . $top_limit . ' - ' . local_user () . ' - ' . ( int ) $update );
$s = [];
foreach ( $r as $item ) {
$s [ $item [ 'uri' ]] = $item ;
}
foreach ( $data as $item ) {
$s [ $item [ 'uri' ]] = $item ;
}
$r = $s ;
2018-01-07 17:07:16 -05:00
}
}
2017-09-13 02:43:43 -04:00
$parents_str = '' ;
2018-01-21 10:48:15 -05:00
$date_offset = '' ;
2017-09-13 02:43:43 -04:00
2018-02-25 16:33:15 -05:00
$items = $r ;
2017-07-31 02:04:37 -04:00
2018-02-25 16:33:15 -05:00
if ( DBM :: is_result ( $items )) {
$parents_arr = [];
2012-06-14 20:46:58 -04:00
2018-02-25 16:33:15 -05:00
foreach ( $items as $item ) {
2018-02-26 17:15:57 -05:00
if ( $date_offset < $item [ 'order_date' ]) {
$date_offset = $item [ 'order_date' ];
}
2018-02-27 08:23:25 -05:00
if ( ! in_array ( $item [ 'item_id' ], $parents_arr ) && ( $item [ 'item_id' ] > 0 )) {
2018-02-25 16:33:15 -05:00
$parents_arr [] = $item [ 'item_id' ];
2013-12-08 08:49:24 -05:00
}
2012-06-14 20:46:58 -04:00
}
2018-02-25 16:33:15 -05:00
$parents_str = implode ( ', ' , $parents_arr );
2017-09-13 02:43:43 -04:00
}
2012-09-29 19:56:50 -04:00
2018-01-01 16:33:21 -05:00
if ( x ( $_GET , 'offset' )) {
2018-01-21 10:48:15 -05:00
$date_offset = $_GET [ 'offset' ];
2012-06-14 20:46:58 -04:00
}
2017-09-13 02:43:43 -04:00
$a -> page_offset = $date_offset ;
2012-06-14 20:46:58 -04:00
// We aren't going to try and figure out at the item, group, and page
// level which items you've seen and which you haven't. If you're looking
2014-03-09 04:19:14 -04:00
// at the top level network page just mark everything seen.
2013-01-13 11:13:01 -05:00
2018-01-11 03:26:30 -05:00
if ( ! $gid && ! $cid && ! $star ) {
2018-01-15 08:05:12 -05:00
$condition = [ 'unseen' => true , 'uid' => local_user ()];
2017-10-07 17:51:03 -04:00
networkSetSeen ( $condition );
2017-09-13 02:43:43 -04:00
} elseif ( $parents_str ) {
2018-01-15 08:05:12 -05:00
$condition = [ " `uid` = ? AND `unseen` AND `parent` IN ( " . dbesc ( $parents_str ) . " ) " , local_user ()];
2017-10-07 17:51:03 -04:00
networkSetSeen ( $condition );
2012-11-13 05:30:43 -05:00
}
2012-06-14 20:46:58 -04:00
2017-09-13 02:43:43 -04:00
$mode = 'network' ;
2018-02-25 16:33:15 -05:00
$o .= networkConversation ( $a , $items , $mode , $update , $ordering );
2012-06-14 20:46:58 -04:00
return $o ;
}
2016-02-07 09:11:34 -05:00
2016-06-23 18:33:31 -04:00
/**
* @ brief Get the network tabs menu
2017-01-09 07:14:25 -05:00
*
2017-04-30 00:17:49 -04:00
* @ param App $a The global App
2016-06-23 18:33:31 -04:00
* @ return string Html of the networktab
*/
2017-12-01 08:32:21 -05:00
function network_tabs ( App $a )
{
2016-06-23 18:33:31 -04:00
// item filter tabs
/// @TODO fix this logic, reduce duplication
/// $a->page['content'] .= '<div class="tabs-wrapper">';
list ( $no_active , $all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active ) = network_query_get_sel_tab ( $a );
2017-12-01 08:32:21 -05:00
2016-06-23 18:33:31 -04:00
// if no tabs are selected, defaults to comments
2017-12-01 08:32:21 -05:00
if ( $no_active == 'active' ) {
$all_active = 'active' ;
}
2016-06-23 18:33:31 -04:00
2017-12-01 08:32:21 -05:00
$cmd = $a -> cmd ;
2016-06-23 18:33:31 -04:00
// tabs
2018-01-15 08:05:12 -05:00
$tabs = [
[
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'Commented Order' ),
2016-06-23 18:33:31 -04:00
'url' => str_replace ( '/new' , '' , $cmd ) . '?f=&order=comment' . (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' ),
'sel' => $all_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Sort by Comment Date' ),
2016-06-23 18:33:31 -04:00
'id' => 'commented-order-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 'e' ,
2018-01-15 08:05:12 -05:00
],
[
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'Posted Order' ),
2016-06-23 18:33:31 -04:00
'url' => str_replace ( '/new' , '' , $cmd ) . '?f=&order=post' . (( x ( $_GET , 'cid' )) ? '&cid=' . $_GET [ 'cid' ] : '' ),
'sel' => $postord_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Sort by Post Date' ),
2016-06-23 18:33:31 -04:00
'id' => 'posted-order-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 't' ,
2018-01-15 08:05:12 -05:00
],
];
2016-06-23 18:33:31 -04:00
2018-01-21 10:26:05 -05:00
if ( Feature :: isEnabled ( local_user (), 'personal_tab' )) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'Personal' ),
2016-06-23 18:33:31 -04:00
'url' => str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&conv=1' ,
'sel' => $conv_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Posts that mention or involve you' ),
2016-06-23 18:33:31 -04:00
'id' => 'personal-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 'r' ,
2018-01-15 08:05:12 -05:00
];
2016-06-23 18:33:31 -04:00
}
2018-01-21 10:26:05 -05:00
if ( Feature :: isEnabled ( local_user (), 'new_tab' )) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'New' ),
2017-04-04 01:35:04 -04:00
'url' => 'network/new' . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '' ),
2016-06-23 18:33:31 -04:00
'sel' => $new_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Activity Stream - by date' ),
2016-06-23 18:33:31 -04:00
'id' => 'activitiy-by-date-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 'w' ,
2018-01-15 08:05:12 -05:00
];
2016-06-23 18:33:31 -04:00
}
2018-01-21 10:26:05 -05:00
if ( Feature :: isEnabled ( local_user (), 'link_tab' )) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'Shared Links' ),
2016-06-23 18:33:31 -04:00
'url' => str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&bmark=1' ,
'sel' => $bookmarked_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Interesting Links' ),
2016-06-23 18:33:31 -04:00
'id' => 'shared-links-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 'b' ,
2018-01-15 08:05:12 -05:00
];
2016-06-23 18:33:31 -04:00
}
2018-01-21 10:26:05 -05:00
if ( Feature :: isEnabled ( local_user (), 'star_posts' )) {
2018-01-15 08:05:12 -05:00
$tabs [] = [
2018-01-22 09:16:25 -05:00
'label' => L10n :: t ( 'Starred' ),
2016-06-23 18:33:31 -04:00
'url' => str_replace ( '/new' , '' , $cmd ) . (( x ( $_GET , 'cid' )) ? '/?f=&cid=' . $_GET [ 'cid' ] : '/?f=' ) . '&star=1' ,
'sel' => $starred_active ,
2018-01-22 09:16:25 -05:00
'title' => L10n :: t ( 'Favourite Posts' ),
2016-06-23 18:33:31 -04:00
'id' => 'starred-posts-tab' ,
2018-01-21 10:48:15 -05:00
'accesskey' => 'm' ,
2018-01-15 08:05:12 -05:00
];
2016-06-23 18:33:31 -04:00
}
2017-09-13 02:43:43 -04:00
// save selected tab, but only if not in file mode
2018-01-21 10:26:05 -05:00
if ( ! x ( $_GET , 'file' )) {
PConfig :: set ( local_user (), 'network.view' , 'tab.selected' , [
$all_active , $postord_active , $conv_active , $new_active , $starred_active , $bookmarked_active , $spam_active
]);
2016-06-23 18:33:31 -04:00
}
2018-01-15 08:05:12 -05:00
$arr = [ 'tabs' => $tabs ];
2018-01-17 13:42:40 -05:00
Addon :: callHooks ( 'network_tabs' , $arr );
2017-01-09 07:14:25 -05:00
2016-06-23 18:33:31 -04:00
$tpl = get_markup_template ( 'common_tabs.tpl' );
2018-01-15 08:05:12 -05:00
return replace_macros ( $tpl , [ '$tabs' => $arr [ 'tabs' ]]);
2016-06-23 18:33:31 -04:00
// --- end item filter tabs
}