2016-04-19 03:38:38 +00:00
< ? php
2021-12-03 03:01:39 +00:00
2022-02-16 04:08:28 +00:00
namespace Code\Module ;
2016-04-19 03:38:38 +00:00
2020-06-24 00:45:27 +00:00
use App ;
2022-02-16 04:08:28 +00:00
use Code\Web\Controller ;
use Code\Lib\Libzot ;
use Code\Lib\Webfinger ;
use Code\Lib\Activity ;
use Code\Render\Theme ;
2022-02-12 20:43:29 +00:00
2018-10-16 02:29:32 +00:00
2021-12-02 23:02:31 +00:00
class Chanview extends Controller
{
public function get ()
{
$observer = App :: get_observer ();
$xchan = null ;
$r = null ;
if ( $_REQUEST [ 'hash' ]) {
2021-12-03 03:01:39 +00:00
$r = q (
" select * from xchan where xchan_hash = '%s' limit 1 " ,
2021-12-02 23:02:31 +00:00
dbesc ( $_REQUEST [ 'hash' ])
);
}
if ( $_REQUEST [ 'address' ]) {
2021-12-03 03:01:39 +00:00
$r = q (
" select * from xchan where xchan_addr = '%s' limit 1 " ,
2021-12-02 23:02:31 +00:00
dbesc ( punify ( $_REQUEST [ 'address' ]))
);
} elseif ( local_channel () && intval ( $_REQUEST [ 'cid' ])) {
2021-12-03 03:01:39 +00:00
$r = q (
" SELECT abook.*, xchan.*
2016-04-19 03:38:38 +00:00
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = % d and abook_id = % d LIMIT 1 " ,
2021-12-02 23:02:31 +00:00
intval ( local_channel ()),
intval ( $_REQUEST [ 'cid' ])
);
} elseif ( $_REQUEST [ 'url' ]) {
// if somebody re-installed they will have more than one xchan, use the most recent name date as this is
// the most useful consistently ascending table item we have.
2021-12-03 03:01:39 +00:00
$r = q (
2022-06-17 02:46:54 +00:00
" select * from hubloc left join xchan on hubloc_hash = xchan_hash where (hubloc_url = '%s' or hubloc_id_url = '%s') and hubloc_deleted = 0 order by xchan_name_date desc limit 1 " ,
2021-12-02 23:02:31 +00:00
dbesc ( $_REQUEST [ 'url' ]),
dbesc ( $_REQUEST [ 'url' ])
);
}
if ( $r ) {
App :: $poi = array_shift ( $r );
}
// Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
// info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
// address, we can and should try to import it. If it's just a hash, we can't continue, but we
// probably wouldn't have a hash if we don't already have an xchan for this channel.
if ( ! App :: $poi ) {
logger ( 'mod_chanview: fallback' );
// This is hackish - construct a zot address from the url
if ( $_REQUEST [ 'url' ]) {
if ( preg_match ( '/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism' , $_REQUEST [ 'url' ], $matches )) {
$_REQUEST [ 'address' ] = $matches [ 3 ] . '@' . $matches [ 1 ];
}
logger ( 'mod_chanview: constructed address ' . print_r ( $matches , true ));
}
$r = null ;
if ( $_REQUEST [ 'address' ]) {
$href = Webfinger :: zot_url ( punify ( $url ));
if ( $href ) {
$zf = Zotfinger :: exec ( $href , $channel );
}
if ( is_array ( $zf ) && array_path_exists ( 'signature/signer' , $zf ) && $zf [ 'signature' ][ 'signer' ] === $href && intval ( $zf [ 'signature' ][ 'header_valid' ])) {
$xc = Libzot :: import_xchan ( $zf [ 'data' ]);
2021-12-03 03:01:39 +00:00
$r = q (
" select * from xchan where xchan_addr = '%s' limit 1 " ,
2021-12-02 23:02:31 +00:00
dbesc ( $_REQUEST [ 'address' ])
);
if ( $r ) {
App :: $poi = $r [ 0 ];
}
}
if ( ! $r ) {
if ( discover_by_webbie ( $_REQUEST [ 'address' ])) {
2021-12-03 03:01:39 +00:00
$r = q (
" select * from xchan where xchan_addr = '%s' limit 1 " ,
2021-12-02 23:02:31 +00:00
dbesc ( $_REQUEST [ 'address' ])
);
if ( $r ) {
App :: $poi = $r [ 0 ];
}
}
}
}
}
if ( ! App :: $poi ) {
notice ( t ( 'Channel not found.' ) . EOL );
return ;
}
$is_zot = false ;
$connected = false ;
$url = App :: $poi [ 'xchan_url' ];
2021-10-28 08:55:09 +00:00
if ( in_array ( App :: $poi [ 'xchan_network' ],[ 'nomad' , 'zot6' ])) {
2021-12-02 23:02:31 +00:00
$is_zot = true ;
}
if ( local_channel ()) {
2021-12-03 03:01:39 +00:00
$c = q (
" select abook_id, abook_pending from abook where abook_channel = %d and abook_xchan = '%s' limit 1 " ,
2021-12-02 23:02:31 +00:00
intval ( local_channel ()),
dbesc ( App :: $poi [ 'xchan_hash' ])
);
// if somebody followed us and we want to find out more, start
// by viewing their publicly accessible information.
// Otherwise the primary use of this page is to provide a connect
// button for anybody in the fediverse - which doesn't have to ask
// you who you are.
if ( $c && intval ( $c [ 0 ][ 'abook_pending' ]) === 0 ) {
$connected = true ;
}
}
if ( $is_zot && $observer ) {
$url = zid ( $url );
}
// If we are already connected, just go to the profile.
if ( $connected ) {
goaway ( $url );
} else {
$about = false ;
2021-12-03 03:01:39 +00:00
$xprof = q (
" select * from xprof where xprof_hash = '%s' " ,
2021-12-02 23:02:31 +00:00
dbesc ( App :: $poi [ 'xchan_hash' ])
);
if ( $xprof ) {
$about = zidify_links ( bbcode ( $xprof [ 0 ][ 'xprof_about' ]));
}
$followers = t ( 'Not available' );
$following = t ( 'Not available' );
$f = get_xconfig ( App :: $poi [ 'xchan_hash' ], 'activitypub' , 'collections' );
if ( $f && isset ( $f [ 'followers' ])) {
$m = Activity :: fetch ( $f [ 'followers' ]);
if ( is_array ( $m ) && isset ( $m [ 'totalItems' ])) {
$followers = intval ( $m [ 'totalItems' ]);
}
}
if ( $f && isset ( $f [ 'following' ])) {
$m = Activity :: fetch ( $f [ 'following' ]);
if ( is_array ( $m ) && isset ( $m [ 'totalItems' ])) {
$following = intval ( $m [ 'totalItems' ]);
}
}
2022-02-12 20:43:29 +00:00
$o = replace_macros ( Theme :: get_template ( 'chanview.tpl' ), [
2021-12-02 23:02:31 +00:00
'$url' => $url ,
'$photo' => get_xconfig ( App :: $poi [ 'xchan_hash' ], 'system' , 'cover_photo' ),
'$alt' => t ( 'Cover photo for this channel' ),
'$about' => $about ,
'$followers_txt' => t ( 'Followers' ),
'$following_txt' => t ( 'Following' ),
'$followers' => $followers ,
'$following' => $following ,
'$visit' => t ( 'Visit' ),
'$full' => t ( 'toggle full screen mode' )
]);
return $o ;
}
}
2016-04-19 03:38:38 +00:00
}