2013-02-26 01:09:40 +00:00
< ? php /** @file */
2016-05-21 05:52:47 +00:00
namespace Zotlabs\Lib ;
2012-09-11 05:00:56 +00:00
2019-07-08 03:11:37 +00:00
use App ;
2012-09-11 05:00:56 +00:00
require_once ( 'include/text.php' );
/**
2016-05-21 05:52:47 +00:00
* A thread item
2012-09-11 05:00:56 +00:00
*/
2014-01-08 23:20:12 +00:00
2016-05-21 05:52:47 +00:00
class ThreadItem {
2021-03-15 05:10:44 +00:00
public $data = [];
2012-11-05 00:57:09 +00:00
private $template = 'conv_item.tpl' ;
2012-09-11 05:00:56 +00:00
private $comment_box_template = 'comment_item.tpl' ;
2013-09-20 12:45:11 +00:00
private $commentable = false ;
2016-06-04 01:13:21 +00:00
// list of supported reaction emojis - a site can over-ride this via config system.reactions
2019-11-20 23:46:55 +00:00
// Deprecated. Use your operating system or a browser plugin.
2016-06-06 03:16:33 +00:00
private $reactions = [ '1f60a' , '1f44f' , '1f37e' , '1f48b' , '1f61e' , '2665' , '1f606' , '1f62e' , '1f634' , '1f61c' , '1f607' , '1f608' ];
2012-09-11 05:00:56 +00:00
private $toplevel = false ;
2021-03-15 05:10:44 +00:00
private $children = [];
2012-09-11 05:00:56 +00:00
private $parent = null ;
private $conversation = null ;
private $redirect_url = null ;
private $owner_url = '' ;
private $owner_photo = '' ;
private $owner_name = '' ;
2020-03-05 10:51:35 +00:00
private $owner_censored = false ;
2012-09-11 05:00:56 +00:00
private $wall_to_wall = false ;
private $threaded = false ;
private $visiting = false ;
2012-10-26 04:58:33 +00:00
private $channel = null ;
2014-11-17 04:23:22 +00:00
private $display_mode = 'normal' ;
2017-08-24 05:06:42 +00:00
private $reload = '' ;
2013-11-15 06:54:16 +00:00
2012-09-11 05:00:56 +00:00
public function __construct ( $data ) {
2012-10-26 04:58:33 +00:00
2012-09-11 05:00:56 +00:00
$this -> data = $data ;
$this -> toplevel = ( $this -> get_id () == $this -> get_data_value ( 'parent' ));
2019-07-08 03:11:37 +00:00
$this -> threaded = get_config ( 'system' , 'thread_allow' , true );
2012-09-11 05:00:56 +00:00
2019-07-08 03:11:37 +00:00
$observer = App :: get_observer ();
2018-11-19 05:53:09 +00:00
2012-09-11 05:00:56 +00:00
// Prepare the children
2017-12-04 07:56:01 +00:00
if ( $data [ 'children' ]) {
2012-09-11 05:00:56 +00:00
foreach ( $data [ 'children' ] as $item ) {
2013-02-11 01:03:33 +00:00
2012-09-11 05:00:56 +00:00
/*
2013-08-21 02:51:58 +00:00
* Only add those that will be displayed
2012-09-11 05:00:56 +00:00
*/
2013-02-11 01:03:33 +00:00
2019-09-26 01:39:37 +00:00
if ( ! visible_activity ( $item )) {
2012-09-11 05:00:56 +00:00
continue ;
}
2013-02-11 01:03:33 +00:00
2018-11-20 01:30:22 +00:00
// this is a quick hack to hide ActivityPub DMs that we should not be allowed to see
2018-11-19 05:53:09 +00:00
// but may have been forwarded as part of a conversation
2018-11-21 02:55:33 +00:00
if ( intval ( $item [ 'item_private' ]) && ( intval ( $item [ 'item_restrict' ]) & 1 ) && $item [ 'mid' ] !== $item [ 'parent_mid' ]) {
2018-12-03 04:24:12 +00:00
if ( ! $observer ) {
2018-11-20 01:30:22 +00:00
continue ;
2018-12-03 04:24:12 +00:00
}
2018-11-20 01:30:22 +00:00
}
2018-11-19 05:53:09 +00:00
2016-05-21 05:52:47 +00:00
$child = new ThreadItem ( $item );
2012-09-11 05:00:56 +00:00
$this -> add_child ( $child );
}
}
2016-06-04 01:13:21 +00:00
// allow a site to configure the order and content of the reaction emoji list
if ( $this -> toplevel ) {
$x = get_config ( 'system' , 'reactions' );
if ( $x && is_array ( $x ) && count ( $x )) {
$this -> reactions = $x ;
}
}
2012-09-11 05:00:56 +00:00
}
/**
* Get data in a form usable by a conversation template
*
* Returns :
* _ The data requested on success
* _ false on failure
*/
2012-10-26 04:58:33 +00:00
2020-12-10 03:38:55 +00:00
public function get_template_data ( $conv_responses , $thread_level = 1 ) {
2013-02-09 12:22:11 +00:00
2021-03-15 05:10:44 +00:00
$result = [];
2012-09-11 05:00:56 +00:00
2012-10-26 04:58:33 +00:00
$item = $this -> get_data ();
2012-09-11 05:00:56 +00:00
$commentww = '' ;
$sparkle = '' ;
$buttons = '' ;
$dropping = false ;
$star = false ;
2016-04-30 18:39:57 +00:00
$isstarred = " unstarred fa-star-o " ;
2017-03-13 15:34:23 +00:00
$is_comment = false ;
$is_item = false ;
2012-09-11 05:00:56 +00:00
$osparkle = '' ;
$total_children = $this -> count_descendants ();
2021-03-12 00:03:45 +00:00
$unseen_comments = (( isset ( $item [ 'real_uid' ]) && $item [ 'real_uid' ]) ? 0 : $this -> count_unseen_descendants ());
2012-09-11 05:00:56 +00:00
$conv = $this -> get_conversation ();
2013-07-10 12:14:23 +00:00
$observer = $conv -> get_observer ();
2012-09-11 05:00:56 +00:00
2019-06-19 02:21:31 +00:00
$lock = ((( intval ( $item [ 'item_private' ])) || (( $item [ 'uid' ] == local_channel ()) && ( strlen ( $item [ 'allow_cid' ]) || strlen ( $item [ 'allow_gid' ])
2012-09-11 05:00:56 +00:00
|| strlen ( $item [ 'deny_cid' ]) || strlen ( $item [ 'deny_gid' ]))))
? t ( 'Private Message' )
: false );
2020-09-21 04:11:42 +00:00
2021-01-25 02:17:30 +00:00
$locktype = $item [ 'item_private' ];
2015-01-29 04:56:04 +00:00
$shareable = ((( $conv -> get_profile_owner () == local_channel () && local_channel ()) && ( $item [ 'item_private' ] != 1 )) ? true : false );
2012-11-05 00:57:09 +00:00
2014-09-03 00:21:12 +00:00
// allow an exemption for sharing stuff from your private feeds
if ( $item [ 'author' ][ 'xchan_network' ] === 'rss' )
$shareable = true ;
2018-05-23 20:11:13 +00:00
$privacy_warning = false ;
2018-11-21 02:55:33 +00:00
2013-09-17 05:40:53 +00:00
$mode = $conv -> get_mode ();
2020-09-21 04:11:42 +00:00
$edlink = 'editpost' ;
2017-08-24 00:46:20 +00:00
2015-01-29 04:56:04 +00:00
if ( local_channel () && $observer [ 'xchan_hash' ] === $item [ 'author_xchan' ])
2017-08-24 00:46:20 +00:00
$edpost = array ( z_root () . '/' . $edlink . '/' . $item [ 'id' ], t ( 'Edit' ));
2012-09-11 05:00:56 +00:00
else
$edpost = false ;
2012-11-05 00:57:09 +00:00
2018-09-21 23:29:13 +00:00
if ( $item [ 'verb' ] === 'Announce' ) {
$edpost = false ;
}
2014-09-23 04:37:19 +00:00
2020-07-13 04:17:53 +00:00
if ( $observer && $observer [ 'xchan_hash' ]
&& ( $observer [ 'xchan_hash' ] == $this -> get_data_value ( 'author_xchan' )
2013-07-10 12:14:23 +00:00
|| $observer [ 'xchan_hash' ] == $this -> get_data_value ( 'owner_xchan' )
2020-07-06 06:18:31 +00:00
|| $observer [ 'xchan_hash' ] == $this -> get_data_value ( 'source_xchan' )
2020-07-13 04:17:53 +00:00
|| $this -> get_data_value ( 'uid' ) == local_channel ()))
2012-09-11 05:00:56 +00:00
$dropping = true ;
2014-09-23 04:37:19 +00:00
if ( array_key_exists ( 'real_uid' , $item )) {
$edpost = false ;
$dropping = false ;
}
2012-11-05 00:57:09 +00:00
if ( $dropping ) {
$drop = array (
'dropping' => $dropping ,
'delete' => t ( 'Delete' ),
);
}
2018-05-03 00:39:12 +00:00
elseif ( is_site_admin ()) {
$drop = [ 'dropping' => true , 'delete' => t ( 'Admin Delete' ) ];
}
2021-03-12 00:03:45 +00:00
if ( isset ( $observer_is_pageowner ) && $observer_is_pageowner ) {
2012-11-05 00:57:09 +00:00
$multidrop = array (
'select' => t ( 'Select' ),
);
}
2019-04-26 22:15:15 +00:00
$filer = ((( $conv -> get_profile_owner () == local_channel ()) && ( ! array_key_exists ( 'real_uid' , $item ))) ? t ( 'Save to Folder' ) : false );
2012-09-11 05:00:56 +00:00
2012-10-24 04:24:23 +00:00
$profile_avatar = $item [ 'author' ][ 'xchan_photo_m' ];
2017-02-23 08:53:24 +00:00
$profile_link = chanlink_hash ( $item [ 'author_xchan' ]);
2013-01-25 05:17:59 +00:00
$profile_name = $item [ 'author' ][ 'xchan_name' ];
2012-10-08 04:44:11 +00:00
2018-09-20 03:47:31 +00:00
$profile_addr = $item [ 'author' ][ 'xchan_addr' ] ? : $item [ 'author' ][ 'xchan_url' ];
2013-02-03 00:34:00 +00:00
$location = format_location ( $item );
2015-02-10 08:11:37 +00:00
$isevent = false ;
$attend = null ;
2015-02-11 05:21:18 +00:00
$canvote = false ;
2015-02-10 05:18:50 +00:00
// process action responses - e.g. like/dislike/attend/agree/whatever
2019-06-11 04:19:19 +00:00
$response_verbs = [ 'like' , 'dislike' ];
2015-02-11 05:21:18 +00:00
if ( $item [ 'obj_type' ] === ACTIVITY_OBJ_EVENT ) {
2015-02-10 05:18:50 +00:00
$response_verbs [] = 'attendyes' ;
$response_verbs [] = 'attendno' ;
$response_verbs [] = 'attendmaybe' ;
2017-06-20 12:11:07 +00:00
if ( $this -> is_commentable () && $observer ) {
2015-02-11 05:21:18 +00:00
$isevent = true ;
$attend = array ( t ( 'I will attend' ), t ( 'I will not attend' ), t ( 'I might attend' ));
}
2015-02-10 05:18:50 +00:00
}
2015-02-11 03:10:18 +00:00
2015-02-10 05:18:50 +00:00
$responses = get_responses ( $conv_responses , $response_verbs , $this , $item );
2013-02-03 00:34:00 +00:00
2016-09-26 03:34:36 +00:00
$my_responses = [];
foreach ( $response_verbs as $v ) {
2021-03-11 23:05:16 +00:00
$my_responses [ $v ] = (( isset ( $conv_responses [ $v ][ $item [ 'mid' ] . '-m' ]) && $conv_responses [ $v ][ $item [ 'mid' ] . '-m' ]) ? 1 : 0 );
2016-09-26 03:34:36 +00:00
}
2015-01-11 22:41:33 +00:00
$like_count = (( x ( $conv_responses [ 'like' ], $item [ 'mid' ])) ? $conv_responses [ 'like' ][ $item [ 'mid' ]] : '' );
$like_list = (( x ( $conv_responses [ 'like' ], $item [ 'mid' ])) ? $conv_responses [ 'like' ][ $item [ 'mid' ] . '-l' ] : '' );
2017-12-04 07:56:01 +00:00
if (( $like_list ) && ( count ( $like_list ) > MAX_LIKERS )) {
2014-05-18 07:14:21 +00:00
$like_list_part = array_slice ( $like_list , 0 , MAX_LIKERS );
2017-03-12 20:11:28 +00:00
array_push ( $like_list_part , '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#likeModal-' . $this -> get_id () . '"><b>' . t ( 'View all' ) . '</b></a>' );
2014-05-18 07:14:21 +00:00
} else {
$like_list_part = '' ;
}
2019-09-27 03:58:29 +00:00
if ( get_config ( 'system' , 'show_like_counts' , true )) {
$like_button_label = tt ( 'Like' , 'Likes' , $like_count , 'noun' );
}
else {
$like_button_label = t ( 'Likes' , 'noun' );
}
2019-06-11 04:19:19 +00:00
$dislike_count = (( x ( $conv_responses [ 'dislike' ], $item [ 'mid' ])) ? $conv_responses [ 'dislike' ][ $item [ 'mid' ]] : '' );
$dislike_list = (( x ( $conv_responses [ 'dislike' ], $item [ 'mid' ])) ? $conv_responses [ 'dislike' ][ $item [ 'mid' ] . '-l' ] : '' );
2019-09-27 03:58:29 +00:00
if ( get_config ( 'system' , 'show_like_counts' , true )) {
$dislike_button_label = tt ( 'Dislike' , 'Dislikes' , $dislike_count , 'noun' );
}
else {
$dislike_button_label = t ( 'Dislikes' , 'noun' );
}
2019-06-11 04:19:19 +00:00
if (( $dislike_list ) && ( count ( $dislike_list ) > MAX_LIKERS )) {
$dislike_list_part = array_slice ( $dislike_list , 0 , MAX_LIKERS );
array_push ( $dislike_list_part , '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#dislikeModal-' . $this -> get_id () . '"><b>' . t ( 'View all' ) . '</b></a>' );
} else {
$dislike_list_part = '' ;
}
2012-09-11 05:00:56 +00:00
2015-01-11 22:41:33 +00:00
$showlike = (( x ( $conv_responses [ 'like' ], $item [ 'mid' ])) ? format_like ( $conv_responses [ 'like' ][ $item [ 'mid' ]], $conv_responses [ 'like' ][ $item [ 'mid' ] . '-l' ], 'like' , $item [ 'mid' ]) : '' );
2019-05-03 10:17:57 +00:00
$showdislike = (( x ( $conv_responses [ 'dislike' ], $item [ 'mid' ]))
2015-01-11 22:41:33 +00:00
? format_like ( $conv_responses [ 'dislike' ][ $item [ 'mid' ]], $conv_responses [ 'dislike' ][ $item [ 'mid' ] . '-l' ], 'dislike' , $item [ 'mid' ]) : '' );
2012-09-11 05:00:56 +00:00
/*
* We should avoid doing this all the time , but it depends on the conversation mode
* And the conv mode may change when we change the conv , or it changes its mode
* Maybe we should establish a way to be notified about conversation changes
*/
2013-01-25 05:17:59 +00:00
2012-09-11 05:00:56 +00:00
$this -> check_wall_to_wall ();
if ( $this -> is_toplevel ()) {
2015-01-29 04:56:04 +00:00
if (( $conv -> get_profile_owner () == local_channel ()) && ( ! array_key_exists ( 'real_uid' , $item ))) {
2012-09-11 05:00:56 +00:00
$star = array (
2019-11-14 22:45:55 +00:00
'toggle' => t ( 'Save' ),
2018-04-13 09:58:12 +00:00
'isstarred' => (( intval ( $item [ 'item_starred' ])) ? true : false ),
2012-11-05 00:57:09 +00:00
);
2012-09-11 05:00:56 +00:00
}
2016-05-21 05:52:47 +00:00
}
else {
2017-03-13 15:34:23 +00:00
$is_comment = true ;
2012-09-11 05:00:56 +00:00
}
2013-10-03 04:04:48 +00:00
2015-01-23 01:41:16 +00:00
$verified = ( intval ( $item [ 'item_verified' ]) ? t ( 'Message signature validated' ) : '' );
$forged = ((( $item [ 'sig' ]) && ( ! intval ( $item [ 'item_verified' ]))) ? t ( 'Message signature incorrect' ) : '' );
$unverified = '' ; // (($this->is_wall_to_wall() && (! intval($item['item_verified']))) ? t('Message cannot be verified') : '');
2013-10-03 04:04:48 +00:00
2015-01-29 04:56:04 +00:00
if ( $conv -> get_profile_owner () == local_channel ()) {
2013-07-01 06:04:27 +00:00
$tagger = array (
2014-05-30 04:34:08 +00:00
'tagit' => t ( " Add Tag " ),
2013-07-01 06:04:27 +00:00
'classtagger' => " " ,
);
}
2014-02-05 01:12:13 +00:00
$has_bookmarks = false ;
2021-03-12 00:03:45 +00:00
if ( isset ( $item [ 'term' ]) && is_array ( $item [ 'term' ])) {
2014-02-05 01:12:13 +00:00
foreach ( $item [ 'term' ] as $t ) {
2018-07-31 06:55:09 +00:00
if ( $t [ 'ttype' ] == TERM_BOOKMARK )
2014-02-05 01:12:13 +00:00
$has_bookmarks = true ;
}
}
2014-05-30 03:09:21 +00:00
$has_event = false ;
2015-01-29 04:56:04 +00:00
if (( $item [ 'obj_type' ] === ACTIVITY_OBJ_EVENT ) && $conv -> get_profile_owner () == local_channel ())
2014-05-30 03:09:21 +00:00
$has_event = true ;
2014-02-05 01:12:13 +00:00
2017-06-20 12:11:07 +00:00
if ( $this -> is_commentable () && $observer ) {
2012-11-05 00:57:09 +00:00
$like = array ( t ( " I like this \x28 toggle \x29 " ), t ( " like " ));
$dislike = array ( t ( " I don't like this \x28 toggle \x29 " ), t ( " dislike " ));
2012-09-11 05:00:56 +00:00
}
2021-03-12 00:03:45 +00:00
$share = $embed = EMPTY_STR ;
2019-01-30 05:26:52 +00:00
if ( $shareable ) {
2019-01-31 23:54:37 +00:00
$share = t ( 'Repeat This' );
$embed = t ( 'Share this' );
2019-01-30 05:26:52 +00:00
}
2014-09-03 00:21:12 +00:00
2015-11-23 01:12:30 +00:00
$dreport = '' ;
$keep_reports = intval ( get_config ( 'system' , 'expire_delivery_reports' ));
if ( $keep_reports === 0 )
2017-03-02 04:05:52 +00:00
$keep_reports = 10 ;
2015-11-23 01:12:30 +00:00
2018-07-19 03:15:46 +00:00
if (( ! get_config ( 'system' , 'disable_dreport' )) && strcmp ( datetime_convert ( 'UTC' , 'UTC' , $item [ 'created' ]), datetime_convert ( 'UTC' , 'UTC' , " now - $keep_reports days " )) > 0 ) {
2015-11-23 01:12:30 +00:00
$dreport = t ( 'Delivery Report' );
2018-07-19 03:15:46 +00:00
$dreport_link = gen_link_id ( $item [ 'mid' ]);
}
2021-03-12 00:03:45 +00:00
$is_new = false ;
if ( strcmp ( datetime_convert ( 'UTC' , 'UTC' , $item [ 'created' ]), datetime_convert ( 'UTC' , 'UTC' , 'now - 12 hours' )) > 0 ) {
2017-03-13 15:34:23 +00:00
$is_new = true ;
2021-03-12 00:03:45 +00:00
}
2012-09-11 05:00:56 +00:00
2014-11-17 04:23:22 +00:00
localize_item ( $item );
2015-10-20 07:40:32 +00:00
2020-03-05 10:51:35 +00:00
$opts = [];
if ( $this -> is_wall_to_wall ()) {
if ( $this -> owner_censored ) {
$opts [ 'censored' ] = true ;
}
}
$body = prepare_body ( $item , true , $opts );
2014-12-16 22:12:40 +00:00
// $viewthread (below) is only valid in list mode. If this is a channel page, build the thread viewing link
// since we can't depend on llink or plink pointing to the right local location.
$owner_address = substr ( $item [ 'owner' ][ 'xchan_addr' ], 0 , strpos ( $item [ 'owner' ][ 'xchan_addr' ], '@' ));
$viewthread = $item [ 'llink' ];
if ( $conv -> get_mode () === 'channel' )
2018-07-19 03:15:46 +00:00
$viewthread = z_root () . '/channel/' . $owner_address . '?f=&mid=' . urlencode ( gen_link_id ( $item [ 'mid' ]));
2012-09-11 05:00:56 +00:00
2014-11-15 22:03:41 +00:00
$comment_count_txt = sprintf ( tt ( '%d comment' , '%d comments' , $total_children ), $total_children );
2019-12-10 05:39:48 +00:00
$list_unseen_txt = (( $unseen_comments ) ? sprintf ( t ( '%d unseen' ), $unseen_comments ) : '' );
2014-11-17 23:18:06 +00:00
2014-11-15 22:03:41 +00:00
$children = $this -> get_children ();
2013-02-09 12:22:11 +00:00
2018-12-03 04:24:12 +00:00
2015-10-14 20:14:19 +00:00
$has_tags = (( $body [ 'tags' ] || $body [ 'categories' ] || $body [ 'mentions' ] || $body [ 'attachments' ] || $body [ 'folders' ]) ? true : false );
2019-12-03 02:42:59 +00:00
$dropdown_extras_arr = [ 'item' => $item , 'dropdown_extras' => '' ];
call_hooks ( 'dropdown_extras' , $dropdown_extras_arr );
$dropdown_extras = $dropdown_extras_arr [ 'dropdown_extras' ];
2021-03-08 01:49:23 +00:00
// Pinned item processing
$allowed_type = ( in_array ( $item [ 'item_type' ], get_config ( 'system' , 'pin_types' , [ ITEM_TYPE_POST ])) ? true : false );
$pinned_items = ( $allowed_type ? get_pconfig ( $item [ 'uid' ], 'pinned' , $item [ 'item_type' ], []) : []);
2019-12-03 02:42:59 +00:00
$pinned = (( ! empty ( $pinned_items ) && in_array ( $item [ 'mid' ], $pinned_items )) ? true : false );
2018-08-27 03:26:10 +00:00
2012-09-11 05:00:56 +00:00
$tmp_item = array (
'template' => $this -> get_template (),
2017-09-06 01:32:37 +00:00
'mode' => $mode ,
2020-09-21 02:45:41 +00:00
'item_type' => intval ( $item [ 'item_type' ]),
'comment_order' => $item [ 'comment_order' ],
2020-09-21 04:11:42 +00:00
'parent' => $this -> get_data_value ( 'parent' ),
'collapsed' => (( intval ( $item [ 'comment_order' ]) > 3 ) ? true : false ),
2012-09-11 05:00:56 +00:00
'type' => implode ( " " , array_slice ( explode ( " / " , $item [ 'verb' ]), - 1 )),
2015-10-14 20:14:19 +00:00
'body' => $body [ 'html' ],
'tags' => $body [ 'tags' ],
'categories' => $body [ 'categories' ],
'mentions' => $body [ 'mentions' ],
'attachments' => $body [ 'attachments' ],
'folders' => $body [ 'folders' ],
'text' => strip_tags ( $body [ 'html' ]),
2012-09-11 05:00:56 +00:00
'id' => $this -> get_id (),
2015-09-22 11:04:51 +00:00
'mid' => $item [ 'mid' ],
2015-02-10 08:11:37 +00:00
'isevent' => $isevent ,
'attend' => $attend ,
2021-03-11 23:05:16 +00:00
'consensus' => '' ,
'conlabels' => '' ,
2015-02-11 05:21:18 +00:00
'canvote' => $canvote ,
2018-09-17 00:04:47 +00:00
'linktitle' => sprintf ( t ( 'View %s\'s profile - %s' ), $profile_name , (( $item [ 'author' ][ 'xchan_addr' ]) ? $item [ 'author' ][ 'xchan_addr' ] : $item [ 'author' ][ 'xchan_url' ])),
'olinktitle' => sprintf ( t ( 'View %s\'s profile - %s' ), $this -> get_owner_name (), (( $item [ 'owner' ][ 'xchan_addr' ]) ? $item [ 'owner' ][ 'xchan_addr' ] : $item [ 'owner' ][ 'xchan_url' ])),
2014-11-17 00:19:24 +00:00
'llink' => $item [ 'llink' ],
2014-12-16 22:12:40 +00:00
'viewthread' => $viewthread ,
2012-09-11 05:00:56 +00:00
'to' => t ( 'to' ),
2013-10-19 08:48:43 +00:00
'via' => t ( 'via' ),
2012-09-11 05:00:56 +00:00
'wall' => t ( 'Wall-to-Wall' ),
'vwall' => t ( 'via Wall-To-Wall:' ),
'profile_url' => $profile_link ,
2016-12-19 00:26:00 +00:00
'thread_action_menu' => thread_action_menu ( $item , $conv -> get_mode ()),
'thread_author_menu' => thread_author_menu ( $item , $conv -> get_mode ()),
2015-11-23 01:12:30 +00:00
'dreport' => $dreport ,
2021-03-12 00:03:45 +00:00
'dreport_link' => (( isset ( $dreport_link ) && $dreport_link ) ? $dreport_link : EMPTY_STR ),
2013-01-25 05:17:59 +00:00
'name' => $profile_name ,
2012-09-11 05:00:56 +00:00
'thumb' => $profile_avatar ,
'osparkle' => $osparkle ,
'sparkle' => $sparkle ,
2013-01-25 05:17:59 +00:00
'title' => $item [ 'title' ],
2014-09-14 13:59:27 +00:00
'title_tosource' => get_pconfig ( $conv -> get_profile_owner (), 'system' , 'title_tosource' ),
2013-05-22 03:52:18 +00:00
'ago' => relative_date ( $item [ 'created' ]),
'app' => $item [ 'app' ],
2015-04-02 00:23:26 +00:00
'str_app' => sprintf ( t ( 'from %s' ), $item [ 'app' ]),
2013-03-05 04:58:39 +00:00
'isotime' => datetime_convert ( 'UTC' , date_default_timezone_get (), $item [ 'created' ], 'c' ),
2012-09-11 05:00:56 +00:00
'localtime' => datetime_convert ( 'UTC' , date_default_timezone_get (), $item [ 'created' ], 'r' ),
2013-10-31 00:33:10 +00:00
'editedtime' => (( $item [ 'edited' ] != $item [ 'created' ]) ? sprintf ( t ( 'last edited: %s' ), datetime_convert ( 'UTC' , date_default_timezone_get (), $item [ 'edited' ], 'r' )) : '' ),
2016-09-26 00:06:13 +00:00
'expiretime' => (( $item [ 'expires' ] > NULL_DATE ) ? sprintf ( t ( 'Expires: %s' ), datetime_convert ( 'UTC' , date_default_timezone_get (), $item [ 'expires' ], 'r' )) : '' ),
2012-09-11 05:00:56 +00:00
'lock' => $lock ,
2021-01-25 02:17:30 +00:00
'locktype' => $locktype ,
2020-05-03 22:22:37 +00:00
'delayed' => $item [ 'item_delayed' ],
2018-05-23 20:11:13 +00:00
'privacy_warning' => $privacy_warning ,
2013-10-03 04:04:48 +00:00
'verified' => $verified ,
'unverified' => $unverified ,
2014-10-16 23:19:19 +00:00
'forged' => $forged ,
2013-01-25 05:17:59 +00:00
'location' => $location ,
2017-11-23 02:39:23 +00:00
'divider' => get_pconfig ( $conv -> get_profile_owner (), 'system' , 'item_divider' ),
2016-11-08 02:29:38 +00:00
'attend_label' => t ( 'Attend' ),
'attend_title' => t ( 'Attendance Options' ),
'vote_label' => t ( 'Vote' ),
'vote_title' => t ( 'Voting Options' ),
2018-12-02 23:52:20 +00:00
'comment_lbl' => (( $this -> is_commentable () && $observer ) ? t ( 'Reply' ) : '' ),
2017-03-13 15:34:23 +00:00
'is_comment' => $is_comment ,
'is_new' => $is_new ,
2020-09-22 04:29:30 +00:00
'mod_display' => (( argv ( 0 ) === 'display' ) ? true : false ), // comments are not collapsed when using mod_display
2012-09-11 05:00:56 +00:00
'owner_url' => $this -> get_owner_url (),
'owner_photo' => $this -> get_owner_photo (),
2013-01-25 07:49:44 +00:00
'owner_name' => $this -> get_owner_name (),
2015-10-22 08:52:10 +00:00
'photo' => $body [ 'photo' ],
2015-11-26 11:26:27 +00:00
'event' => $body [ 'event' ],
2015-10-14 20:14:19 +00:00
'has_tags' => $has_tags ,
2016-06-04 01:13:21 +00:00
'reactions' => $this -> reactions ,
2019-09-26 01:39:37 +00:00
// Item toolbar buttons
2019-11-20 23:46:55 +00:00
'emojis' => '' , // deprecated - use your operating system or a browser plugin
2012-11-05 00:57:09 +00:00
'like' => $like ,
2019-05-03 04:21:10 +00:00
'dislike' => $dislike ,
2012-11-05 00:57:09 +00:00
'share' => $share ,
2019-01-30 05:26:52 +00:00
'embed' => $embed ,
2014-02-08 17:49:09 +00:00
'rawmid' => $item [ 'mid' ],
2014-01-10 00:23:58 +00:00
'plink' => get_plink ( $item ),
2014-12-17 08:50:55 +00:00
'edpost' => $edpost , // ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''),
2019-11-14 22:45:55 +00:00
'star' => $star ,
2012-11-05 00:57:09 +00:00
'tagger' => (( feature_enabled ( $conv -> get_profile_owner (), 'commtag' )) ? $tagger : '' ),
'filer' => (( feature_enabled ( $conv -> get_profile_owner (), 'filing' )) ? $filer : '' ),
2019-12-03 02:42:59 +00:00
'pinned' => ( $pinned ? t ( 'Pinned post' ) : '' ),
2020-05-03 22:22:37 +00:00
'pinnable' => (( $this -> is_toplevel () && local_channel () && $item [ 'owner_xchan' ] == $observer [ 'xchan_hash' ] && $allowed_type && $item [ 'item_private' ] == 0 && $item [ 'item_delayed' ] == 0 ) ? '1' : '' ),
2021-03-08 01:49:23 +00:00
'pinme' => ( $pinned ? t ( 'Unpin this post' ) : t ( 'Pin this post' )),
'isdraft' => boolval ( $item [ 'item_unpublished' ]),
'draft_txt' => t ( 'Saved draft' ),
2015-01-29 04:56:04 +00:00
'bookmark' => (( $conv -> get_profile_owner () == local_channel () && local_channel () && $has_bookmarks ) ? t ( 'Save Bookmarks' ) : '' ),
2019-06-12 05:12:25 +00:00
'addtocal' => (( $has_event && ! $item [ 'resource_id' ]) ? t ( 'Add to Calendar' ) : '' ),
2012-11-05 00:57:09 +00:00
'drop' => $drop ,
'multidrop' => (( feature_enabled ( $conv -> get_profile_owner (), 'multi_delete' )) ? $multidrop : '' ),
2019-09-26 01:39:37 +00:00
'dropdown_extras' => $dropdown_extras ,
// end toolbar buttons
2014-11-17 23:18:06 +00:00
'unseen_comments' => $unseen_comments ,
2014-11-15 22:03:41 +00:00
'comment_count' => $total_children ,
'comment_count_txt' => $comment_count_txt ,
2014-11-17 23:18:06 +00:00
'list_unseen_txt' => $list_unseen_txt ,
'markseen' => t ( 'Mark all seen' ),
2015-02-10 05:18:50 +00:00
'responses' => $responses ,
2016-09-26 03:34:36 +00:00
'my_responses' => $my_responses ,
2014-05-08 11:44:43 +00:00
'like_count' => $like_count ,
'like_list' => $like_list ,
2014-05-18 07:14:21 +00:00
'like_list_part' => $like_list_part ,
2014-05-08 11:44:43 +00:00
'like_button_label' => $like_button_label ,
2014-05-21 08:32:46 +00:00
'like_modal_title' => t ( 'Likes' , 'noun' ),
'dislike_modal_title' => t ( 'Dislikes' , 'noun' ),
2019-05-03 10:17:57 +00:00
'dislike_count' => $dislike_count ,
2019-09-27 03:58:29 +00:00
'dislike_list' => $dislike_list ,
2019-05-03 10:17:57 +00:00
'dislike_list_part' => $dislike_list_part ,
'dislike_button_label' => $dislike_button_label ,
2014-05-18 07:14:21 +00:00
'modal_dismiss' => t ( 'Close' ),
2012-11-05 00:57:09 +00:00
'showlike' => $showlike ,
'showdislike' => $showdislike ,
2021-03-12 00:03:45 +00:00
'comment' => ( $item [ 'item_delayed' ] ? '' : $this -> get_comment_box ()),
2017-03-13 15:34:23 +00:00
'previewing' => ( $conv -> is_preview () ? true : false ),
2017-08-02 01:05:04 +00:00
'preview_lbl' => t ( 'This is an unsaved preview' ),
2012-09-11 05:00:56 +00:00
'wait' => t ( 'Please wait' ),
2017-09-05 21:18:02 +00:00
'submid' => str_replace ([ '+' , '=' ], [ '' , '' ], base64_encode ( $item [ 'mid' ])),
2019-09-10 04:03:33 +00:00
'thread_level' => $thread_level ,
2020-12-08 04:36:48 +00:00
'indentpx' => intval ( get_pconfig ( local_channel (), 'system' , 'thread_indent_px' , get_config ( 'system' , 'thread_indent_px' , 0 ))),
2020-08-15 21:55:03 +00:00
'thread_max' => intval ( get_config ( 'system' , 'thread_maxlevel' , 20 )) + 1
2012-09-11 05:00:56 +00:00
);
$arr = array ( 'item' => $item , 'output' => $tmp_item );
call_hooks ( 'display_item' , $arr );
$result = $arr [ 'output' ];
2018-09-20 03:47:31 +00:00
$result [ 'children' ] = [];
2020-11-27 00:17:07 +00:00
if ( local_channel () && get_pconfig ( local_channel (), 'system' , 'activitypub' , get_config ( 'system' , 'activitypub' , ACTIVITYPUB_ENABLED ))) {
2019-09-11 02:31:08 +00:00
// place to store all the author addresses (links if not available) in the thread so we can auto-mention them in JS.
$result [ 'authors' ] = [];
2019-09-30 02:20:09 +00:00
// fix to add in sub-replies if replying to a comment on your own post from the top level.
2019-09-11 02:31:08 +00:00
if ( $observer && ( $profile_addr === $observer [ 'xchan_hash' ] || $profile_addr === $observer [ 'xchan_addr' ])) {
2019-09-12 03:41:16 +00:00
// ignore it
}
else {
2019-09-11 02:31:08 +00:00
$result [ 'authors' ][] = $profile_addr ;
}
2019-09-30 02:20:09 +00:00
2019-09-25 03:03:04 +00:00
// Add any mentions from the immediate parent, unless they are mentions of the current viewer or duplicates
2021-03-12 00:03:45 +00:00
if ( isset ( $item [ 'term' ]) && is_array ( $item [ 'term' ])) {
2019-12-02 00:35:19 +00:00
$additional_mentions = [];
2019-09-10 04:03:33 +00:00
foreach ( $item [ 'term' ] as $t ) {
if ( $t [ 'ttype' ] == TERM_MENTION ) {
2019-12-02 00:35:19 +00:00
$additional_mentions [] = ((( $position = strpos ( $t [ 'url' ], 'url=' )) !== false ) ? urldecode ( substr ( $t [ 'url' ], $position + 4 )) : $t [ 'url' ]);;
}
}
if ( $additional_mentions ) {
$r = q ( " select hubloc_addr, hubloc_id_url, hubloc_hash from hubloc where hubloc_id_url in ( " . protect_sprintf ( stringify_array ( $additional_mentions , true )) . " ) " );
if ( $r ) {
foreach ( $r as $rv ) {
$ment = (( $r [ 0 ][ 'hubloc_addr' ]) ? $r [ 0 ][ 'hubloc_addr' ] : $r [ 0 ][ 'hubloc_id_url' ]);
if ( $ment ) {
if ( $observer && $observer [ 'xchan_hash' ] !== $rv [ 'hubloc_hash' ] && ! in_array ( $ment , $result [ 'authors' ])) {
$result [ 'authors' ][] = $ment ;
}
2019-09-25 03:03:04 +00:00
}
2019-09-10 04:03:33 +00:00
}
}
}
2019-09-11 02:31:08 +00:00
}
2018-10-11 03:24:28 +00:00
}
2018-09-20 03:47:31 +00:00
2012-09-11 05:00:56 +00:00
$nb_children = count ( $children );
2014-11-17 04:23:22 +00:00
2020-09-22 05:19:19 +00:00
$total_children = $this -> count_visible_descendants ();
2020-09-21 02:45:41 +00:00
$visible_comments = get_config ( 'system' , 'expanded_comments' , 3 );
2018-08-02 00:58:54 +00:00
2014-11-17 04:23:22 +00:00
if (( $this -> get_display_mode () === 'normal' ) && ( $nb_children > 0 )) {
2020-09-22 05:19:19 +00:00
if ( $children ) {
foreach ( $children as $child ) {
$xz = $child -> get_template_data ( $conv_responses , $thread_level + 1 );
$result [ 'children' ][] = $xz ;
2018-08-02 00:58:54 +00:00
}
2012-09-11 05:00:56 +00:00
}
// Collapse
2020-09-22 05:19:19 +00:00
if ( $total_children > $visible_comments && $thread_level == 1 ) {
2012-09-11 05:00:56 +00:00
$result [ 'children' ][ 0 ][ 'comment_firstcollapsed' ] = true ;
2014-11-15 22:03:41 +00:00
$result [ 'children' ][ 0 ][ 'num_comments' ] = $comment_count_txt ;
2016-06-27 23:50:06 +00:00
$result [ 'children' ][ 0 ][ 'hide_text' ] = sprintf ( t ( '%s show all' ), '<i class="fa fa-chevron-down"></i>' );
2012-09-11 05:00:56 +00:00
}
}
2018-10-11 03:24:28 +00:00
2013-08-02 01:50:36 +00:00
$result [ 'private' ] = $item [ 'item_private' ];
2012-09-11 05:00:56 +00:00
$result [ 'toplevel' ] = ( $this -> is_toplevel () ? 'toplevel_item' : '' );
if ( $this -> is_threaded ()) {
$result [ 'flatten' ] = false ;
$result [ 'threaded' ] = true ;
}
else {
$result [ 'flatten' ] = true ;
$result [ 'threaded' ] = false ;
}
return $result ;
}
public function get_id () {
return $this -> get_data_value ( 'id' );
}
2014-11-17 04:23:22 +00:00
public function get_display_mode () {
return $this -> display_mode ;
}
public function set_display_mode ( $mode ) {
$this -> display_mode = $mode ;
}
2012-09-11 05:00:56 +00:00
public function is_threaded () {
return $this -> threaded ;
}
2018-09-20 03:47:31 +00:00
public function get_author () {
$xchan = $this -> get_data_value ( 'author' );
if ( $xchan [ 'xchan_addr' ]) {
return $xchan [ 'xchan_addr' ];
}
return $xchan [ 'xchan_url' ];
}
2017-08-24 05:06:42 +00:00
public function set_reload ( $val ) {
$this -> reload = $val ;
}
public function get_reload () {
return $this -> reload ;
}
2013-09-20 12:45:11 +00:00
public function set_commentable ( $val ) {
$this -> commentable = $val ;
2013-09-20 21:50:23 +00:00
foreach ( $this -> get_children () as $child )
$child -> set_commentable ( $val );
2013-09-20 12:45:11 +00:00
}
public function is_commentable () {
return $this -> commentable ;
}
2012-09-11 05:00:56 +00:00
/**
* Add a child item
*/
public function add_child ( $item ) {
$item_id = $item -> get_id ();
if ( ! $item_id ) {
logger ( '[ERROR] Item::add_child : Item has no ID!!' , LOGGER_DEBUG );
return false ;
}
if ( $this -> get_child ( $item -> get_id ())) {
logger ( '[WARN] Item::add_child : Item already exists (' . $item -> get_id () . ').' , LOGGER_DEBUG );
return false ;
}
2019-09-26 01:39:37 +00:00
2012-09-11 05:00:56 +00:00
/*
* Only add what will be displayed
*/
2012-10-26 04:58:33 +00:00
2012-10-02 01:02:11 +00:00
if ( activity_match ( $item -> get_data_value ( 'verb' ), ACTIVITY_LIKE ) || activity_match ( $item -> get_data_value ( 'verb' ), ACTIVITY_DISLIKE )) {
2012-09-11 05:00:56 +00:00
return false ;
}
$item -> set_parent ( $this );
$this -> children [] = $item ;
return end ( $this -> children );
}
/**
* Get a child by its ID
*/
2019-09-26 01:39:37 +00:00
2012-09-11 05:00:56 +00:00
public function get_child ( $id ) {
foreach ( $this -> get_children () as $child ) {
if ( $child -> get_id () == $id )
return $child ;
}
return null ;
}
/**
2012-10-26 04:58:33 +00:00
* Get all our children
2012-09-11 05:00:56 +00:00
*/
2019-09-26 01:39:37 +00:00
2012-09-11 05:00:56 +00:00
public function get_children () {
return $this -> children ;
}
/**
* Set our parent
*/
protected function set_parent ( $item ) {
$parent = $this -> get_parent ();
if ( $parent ) {
$parent -> remove_child ( $this );
}
$this -> parent = $item ;
$this -> set_conversation ( $item -> get_conversation ());
}
/**
* Remove our parent
*/
2019-09-26 01:39:37 +00:00
2012-09-11 05:00:56 +00:00
protected function remove_parent () {
$this -> parent = null ;
$this -> conversation = null ;
}
/**
* Remove a child
*/
2019-09-26 01:39:37 +00:00
2012-09-11 05:00:56 +00:00
public function remove_child ( $item ) {
$id = $item -> get_id ();
foreach ( $this -> get_children () as $key => $child ) {
if ( $child -> get_id () == $id ) {
$child -> remove_parent ();
unset ( $this -> children [ $key ]);
// Reindex the array, in order to make sure there won't be any trouble on loops using count()
$this -> children = array_values ( $this -> children );
return true ;
}
}
logger ( '[WARN] Item::remove_child : Item is not a child (' . $id . ').' , LOGGER_DEBUG );
return false ;
}
/**
* Get parent item
*/
protected function get_parent () {
return $this -> parent ;
}
/**
* set conversation
*/
public function set_conversation ( $conv ) {
$previous_mode = ( $this -> conversation ? $this -> conversation -> get_mode () : '' );
$this -> conversation = $conv ;
// Set it on our children too
foreach ( $this -> get_children () as $child )
$child -> set_conversation ( $conv );
}
/**
* get conversation
*/
public function get_conversation () {
return $this -> conversation ;
}
/**
* Get raw data
*
* We shouldn ' t need this
*/
public function get_data () {
return $this -> data ;
}
/**
* Get a data value
*
* Returns :
* _ value on success
* _ false on failure
*/
public function get_data_value ( $name ) {
if ( ! isset ( $this -> data [ $name ])) {
2012-10-29 05:10:07 +00:00
// logger('[ERROR] Item::get_data_value : Item has no value name "'. $name .'".', LOGGER_DEBUG);
2012-09-11 05:00:56 +00:00
return false ;
}
return $this -> data [ $name ];
}
/**
* Get template
*/
2014-11-17 00:19:24 +00:00
public function get_template () {
2012-09-11 05:00:56 +00:00
return $this -> template ;
}
2014-01-08 23:20:12 +00:00
2014-11-17 00:19:24 +00:00
public function set_template ( $t ) {
2014-01-08 23:20:12 +00:00
$this -> template = $t ;
}
2012-09-11 05:00:56 +00:00
/**
* Check if this is a toplevel post
*/
private function is_toplevel () {
return $this -> toplevel ;
}
/**
* Count the total of our descendants
*/
private function count_descendants () {
$children = $this -> get_children ();
$total = count ( $children );
if ( $total > 0 ) {
foreach ( $children as $child ) {
$total += $child -> count_descendants ();
}
}
return $total ;
}
2020-09-22 05:19:19 +00:00
public function count_visible_descendants () {
$total = 0 ;
$children = $this -> get_children ();
if ( $children ) {
foreach ( $children as $child ) {
if ( ! visible_activity ( $child -> data )) {
continue ;
}
$total ++ ;
$total += $child -> count_visible_descendants ();
}
}
return $total ;
}
2018-12-04 05:45:35 +00:00
private function label_descendants ( $count = 0 ) {
if ( ! array_key_exists ( 'sequence' , $this -> data )) {
if ( $count ) {
$count ++ ;
}
$this -> data [ 'sequence' ] = $count ;
}
logger ( 'labelled: ' . print_r ( $this -> data , true ), LOGGER_DATA );
$children = $this -> get_children ();
$total = count ( $children );
if ( $total > 0 ) {
foreach ( $children as $child ) {
2019-09-26 01:39:37 +00:00
if ( ! visible_activity ( $child -> data )) {
2018-12-04 05:45:35 +00:00
continue ;
}
if ( ! array_key_exists ( 'sequence' , $this -> data )) {
$count ++ ;
$child -> data [ 'sequence' ] = $count ;
logger ( 'labelled_child: ' . print_r ( $child -> data , true ), LOGGER_DATA );
}
$child -> label_descendants ( $count );
}
}
}
2014-11-17 23:18:06 +00:00
private function count_unseen_descendants () {
$children = $this -> get_children ();
$total = count ( $children );
if ( $total > 0 ) {
$total = 0 ;
foreach ( $children as $child ) {
2019-09-26 01:39:37 +00:00
if ( ! visible_activity ( $child -> data )) {
2014-11-17 23:18:06 +00:00
continue ;
}
2015-02-13 01:45:25 +00:00
if ( intval ( $child -> data [ 'item_unseen' ]))
2014-11-17 23:18:06 +00:00
$total ++ ;
}
}
return $total ;
}
2012-09-11 05:00:56 +00:00
/**
* Get the template for the comment box
*/
private function get_comment_box_template () {
return $this -> comment_box_template ;
}
/**
* Get the comment box
*
* Returns :
* _ The comment box string ( empty if no comment box )
* _ false on failure
*/
2021-03-12 00:03:45 +00:00
private function get_comment_box ( $indent = 0 ) {
2013-01-25 04:05:23 +00:00
2019-07-08 03:11:37 +00:00
if ( ! $this -> is_toplevel () && ! get_config ( 'system' , 'thread_allow' , true )) {
2012-09-11 05:00:56 +00:00
return '' ;
}
$comment_box = '' ;
$conv = $this -> get_conversation ();
2013-01-25 04:05:23 +00:00
2013-09-20 12:45:11 +00:00
// logger('Commentable conv: ' . $conv->is_commentable());
if ( ! $this -> is_commentable ())
2013-02-11 01:03:33 +00:00
return ;
2012-09-11 05:00:56 +00:00
2013-07-09 05:01:57 +00:00
$template = get_markup_template ( $this -> get_comment_box_template ());
$observer = $conv -> get_observer ();
2016-02-05 06:39:56 +00:00
$arr = array ( 'comment_buttons' => '' , 'id' => $this -> get_id ());
2016-02-05 03:06:11 +00:00
call_hooks ( 'comment_buttons' , $arr );
$comment_buttons = $arr [ 'comment_buttons' ];
2018-04-08 23:44:21 +00:00
$feature_auto_save_draft = (( feature_enabled ( $conv -> get_profile_owner (), 'auto_save_draft' )) ? " true " : " false " );
2021-03-07 23:11:03 +00:00
$permanent_draft = (( intval ( $conv -> get_profile_owner ()) === intval ( local_channel ()) && Apps :: system_app_installed ( $conv -> get_profile_owner (), 'Drafts' )) ? ( 'Save draft' ) : EMPTY_STR );
2016-02-05 03:06:11 +00:00
2013-07-09 05:01:57 +00:00
$comment_box = replace_macros ( $template , array (
'$return_path' => '' ,
'$threaded' => $this -> is_threaded (),
2017-08-24 05:06:42 +00:00
'$jsreload' => $conv -> reload ,
2013-07-09 05:01:57 +00:00
'$type' => (( $conv -> get_mode () === 'channel' ) ? 'wall-comment' : 'net-comment' ),
'$id' => $this -> get_id (),
'$parent' => $this -> get_id (),
2016-02-05 03:06:11 +00:00
'$comment_buttons' => $comment_buttons ,
2013-07-09 05:01:57 +00:00
'$profile_uid' => $conv -> get_profile_owner (),
'$mylink' => $observer [ 'xchan_url' ],
'$mytitle' => t ( 'This is you' ),
'$myphoto' => $observer [ 'xchan_photo_s' ],
'$comment' => t ( 'Comment' ),
'$submit' => t ( 'Submit' ),
2019-09-24 00:52:03 +00:00
'$edat' => EMPTY_STR ,
2013-07-09 05:01:57 +00:00
'$edbold' => t ( 'Bold' ),
'$editalic' => t ( 'Italic' ),
'$eduline' => t ( 'Underline' ),
'$edquote' => t ( 'Quote' ),
'$edcode' => t ( 'Code' ),
'$edimg' => t ( 'Image' ),
2018-05-10 04:22:25 +00:00
'$edatt' => t ( 'Attach/Upload file' ),
2015-03-12 01:56:28 +00:00
'$edurl' => t ( 'Insert Link' ),
2013-07-09 05:01:57 +00:00
'$edvideo' => t ( 'Video' ),
2019-09-24 00:52:03 +00:00
'$preview' => t ( 'Preview' ),
2019-12-09 00:13:52 +00:00
'$reset' => t ( 'Reset' ),
2013-07-09 05:01:57 +00:00
'$indent' => $indent ,
2017-08-11 04:08:07 +00:00
'$can_upload' => ( perm_is_allowed ( $conv -> get_profile_owner (), get_observer_hash (), 'write_storage' ) && $conv -> is_uploadable ()),
2020-08-24 00:32:33 +00:00
'$feature_encrypt' => (( Apps :: system_app_installed ( $conv -> get_profile_owner (), 'Secrets' )) ? true : false ),
2020-09-24 00:59:09 +00:00
'$feature_markup' => (( Apps :: system_app_installed ( $conv -> get_profile_owner (), 'Markup' )) ? true : false ),
2013-11-14 23:41:25 +00:00
'$encrypt' => t ( 'Encrypt text' ),
2013-11-15 06:54:16 +00:00
'$cipher' => $conv -> get_cipher (),
2019-07-08 03:11:37 +00:00
'$sourceapp' => App :: $sourcename ,
2017-06-19 05:25:41 +00:00
'$observer' => get_observer_hash (),
2017-10-06 19:30:44 +00:00
'$anoncomments' => ((( $conv -> get_mode () === 'channel' || $conv -> get_mode () === 'display' ) && perm_is_allowed ( $conv -> get_profile_owner (), '' , 'post_comments' )) ? true : false ),
2017-08-28 21:42:17 +00:00
'$anonname' => [ 'anonname' , t ( 'Your full name (required)' ) ],
'$anonmail' => [ 'anonmail' , t ( 'Your email address (required)' ) ],
2018-04-08 23:44:21 +00:00
'$anonurl' => [ 'anonurl' , t ( 'Your website URL (optional)' ) ],
'$auto_save_draft' => $feature_auto_save_draft ,
2021-03-07 23:11:03 +00:00
'$save' => $permanent_draft ,
2013-07-09 05:01:57 +00:00
));
2012-09-11 05:00:56 +00:00
return $comment_box ;
}
private function get_redirect_url () {
return $this -> redirect_url ;
}
/**
* Check if we are a wall to wall item and set the relevant properties
*/
protected function check_wall_to_wall () {
$conv = $this -> get_conversation ();
$this -> wall_to_wall = false ;
2013-01-25 04:43:33 +00:00
$this -> owner_url = '' ;
$this -> owner_photo = '' ;
$this -> owner_name = '' ;
2020-03-05 10:51:35 +00:00
$this -> owner_censored = false ;
2013-01-25 07:10:37 +00:00
if ( $conv -> get_mode () === 'channel' )
2013-01-25 05:17:59 +00:00
return ;
2012-09-11 05:00:56 +00:00
2013-01-25 04:43:33 +00:00
if ( $this -> is_toplevel () && ( $this -> get_data_value ( 'author_xchan' ) != $this -> get_data_value ( 'owner_xchan' ))) {
2017-02-23 10:41:03 +00:00
$this -> owner_url = chanlink_hash ( $this -> data [ 'owner' ][ 'xchan_hash' ]);
2013-01-25 04:43:33 +00:00
$this -> owner_photo = $this -> data [ 'owner' ][ 'xchan_photo_m' ];
$this -> owner_name = $this -> data [ 'owner' ][ 'xchan_name' ];
$this -> wall_to_wall = true ;
2012-09-11 05:00:56 +00:00
}
2019-06-11 01:52:16 +00:00
// present friend-of-friend conversations from hyperdrive as relayed posts from the first friend
// we find among the respondents.
2019-09-27 00:05:30 +00:00
if ( $this -> is_toplevel () && ( ! $this -> data [ 'owner' ][ 'abook_id' ])) {
if ( $this -> data [ 'children' ]) {
$friend = $this -> find_a_friend ( $this -> data [ 'children' ]);
if ( $friend ) {
$this -> owner_url = $friend [ 'url' ];
$this -> owner_photo = $friend [ 'photo' ];
$this -> owner_name = $friend [ 'name' ];
2020-03-05 10:51:35 +00:00
$this -> owner_censored = $friend [ 'censored' ];
2019-09-27 00:05:30 +00:00
$this -> wall_to_wall = true ;
}
}
}
}
private function find_a_friend ( $items ) {
$ret = null ;
if ( $items ) {
foreach ( $items as $child ) {
if ( $child [ 'author' ][ 'abook_id' ] && ( ! intval ( $child [ 'author' ][ 'abook_self' ]))) {
return [
'url' => chanlink_hash ( $child [ 'author' ][ 'xchan_hash' ]),
'photo' => $child [ 'author' ][ 'xchan_photo_m' ],
2020-03-05 10:51:35 +00:00
'name' => $child [ 'author' ][ 'xchan_name' ],
'censored' => (( $child [ 'author' ][ 'xchan_censored' ] || $child [ 'author' ][ 'abook_censor' ]) ? true : false )
2019-09-27 00:05:30 +00:00
];
if ( $child [ 'children' ]) {
$ret = $this -> find_a_friend ( $child [ 'children' ]);
if ( $ret ) {
break ;
}
2019-06-11 01:52:16 +00:00
}
}
}
}
2019-09-27 00:05:30 +00:00
return $ret ;
2012-09-11 05:00:56 +00:00
}
2019-09-27 00:05:30 +00:00
2012-09-11 05:00:56 +00:00
private function is_wall_to_wall () {
return $this -> wall_to_wall ;
}
private function get_owner_url () {
return $this -> owner_url ;
}
private function get_owner_photo () {
return $this -> owner_photo ;
}
private function get_owner_name () {
return $this -> owner_name ;
}
private function is_visiting () {
return $this -> visiting ;
}
2012-10-02 01:02:11 +00:00
2012-09-11 05:00:56 +00:00
}
2012-10-26 04:58:33 +00:00