more work on z6 commenting

This commit is contained in:
zotlabs 2018-12-03 18:50:45 -08:00
parent 7a693500c4
commit 7d694dca07
3 changed files with 271 additions and 67 deletions

View File

@ -1233,19 +1233,20 @@ class Activity {
static function decode_note($act) {
$response_activity = false;
$s = [];
$content = self::get_content($act->obj);
if(is_array($act->obj)) {
$content = self::get_content($act->obj);
}
$s['owner_xchan'] = $act->actor['id'];
$s['author_xchan'] = $act->actor['id'];
$s['mid'] = $act->id;
$s['mid'] = $act->obj['id'];
$s['parent_mid'] = $act->parent_id;
if($act->data['published']) {
$s['created'] = datetime_convert('UTC','UTC',$act->data['published']);
}
@ -1259,42 +1260,59 @@ class Activity {
$s['edited'] = datetime_convert('UTC','UTC',$act->obj['updated']);
}
if(in_array($act->type, [ 'Like', 'Dislike', 'Flag', 'Block', 'Announce', 'Accept', 'Reject', 'TentativeAccept' ])) {
$response_activity = true;
$s['mid'] = $act->id;
$s['parent_mid'] = $act->obj['id'];
// over-ride the object timestamp with the activity
if($act->data['published']) {
$s['created'] = datetime_convert('UTC','UTC',$act->data['published']);
}
if($act->data['updated']) {
$s['edited'] = datetime_convert('UTC','UTC',$act->data['updated']);
}
$obj_actor = ((isset($act->obj['actor'])) ? $act->obj['actor'] : $act->get_actor('attributedTo', $act->obj));
// ensure we store the original actor
self::actor_store($obj_actor['id'],$obj_actor);
$mention = self::get_actor_bbmention($obj_actor['id']);
if($act->type === 'Like') {
$content['content'] = sprintf( t('Likes %1$s\'s %2$s'),$mention,$act->obj['type']) . "\n\n" . $content['content'];
}
if($act->type === 'Dislike') {
$content['content'] = sprintf( t('Doesn\'t like %1$s\'s %2$s'),$mention,$act->obj['type']) . "\n\n" . $content['content'];
}
if($act->type === 'Accept' && $act->obj['type'] === 'Event' ) {
$content['content'] = sprintf( t('Will attend %1$s\'s %2$s'),$mention,$act->obj['type']) . "\n\n" . $content['content'];
}
if($act->type === 'Reject' && $act->obj['type'] === 'Event' ) {
$content['content'] = sprintf( t('Will not attend %1$s\'s %2$s'),$mention,$act->obj['type']) . "\n\n" . $content['content'];
}
if($act->type === 'TentativeAccept' && $act->obj['type'] === 'Event' ) {
$content['content'] = sprintf( t('May attend %1$s\'s %2$s'),$mention,$act->obj['type']) . "\n\n" . $content['content'];
}
if($act->type === 'Announce') {
$content['content'] = sprintf( t('🔁 Repeated %1$s\'s %2$s'), $mention, $act->obj['type']);
}
}
if(! $s['created'])
$s['created'] = datetime_convert();
if(! $s['edited'])
$s['edited'] = $s['created'];
if(in_array($act->type,['Announce'])) {
$root_content = self::get_content($act->raw);
$s['title'] = self::bb_content($root_content,'name');
$s['summary'] = self::bb_content($root_content,'summary');
$s['body'] = (self::bb_content($root_content,'bbcode') ? : self::bb_content($root_content,'content'));
if(strpos($s['body'],'[share') === false) {
// @fixme - error check and set defaults
$name = urlencode($act->obj['actor']['name']);
$profile = $act->obj['actor']['id'];
$photo = $act->obj['icon']['url'];
$s['body'] .= "\r\n[share author='" . $name .
"' profile='" . $profile .
"' avatar='" . $photo .
"' link='" . $act->obj['id'] .
"' auth='" . ((is_matrix_url($act->obj['id'])) ? 'true' : 'false' ) .
"' posted='" . $act->obj['published'] .
"' message_id='" . $act->obj['id'] .
"']";
}
}
else {
$s['title'] = self::bb_content($content,'name');
$s['summary'] = self::bb_content($content,'summary');
$s['body'] = (self::bb_content($content,'bbcode') ? : self::bb_content($content,'content'));
}
$s['title'] = self::bb_content($content,'name');
$s['summary'] = self::bb_content($content,'summary');
$s['body'] = ((self::bb_content($content,'bbcode') && (! $response_activity)) ? self::bb_content($content,'bbcode') : self::bb_content($content,'content'));
$s['verb'] = self::activity_mapper($act->type);
@ -1306,56 +1324,227 @@ class Activity {
$s['obj'] = $act->obj;
$instrument = $act->get_property_obj('instrument');
if(! $instrument)
if((! $instrument) && (! $response_activity)) {
$instrument = $act->get_property_obj('instrument',$act->obj);
}
if($instrument && array_key_exists('type',$instrument)
&& $instrument['type'] === 'Service' && array_key_exists('name',$instrument)) {
$s['app'] = escape_tags($instrument['name']);
}
$a = self::decode_taxonomy($act->obj);
if($a) {
$s['term'] = $a;
if(! $response_activity) {
$a = self::decode_taxonomy($act->obj);
if($a) {
$s['term'] = $a;
foreach($a as $b) {
if($b['ttype'] === TERM_EMOJI) {
$s['title'] = str_replace($b['term'],'[img=16x16]' . $b['url'] . '[/img]',$s['title']);
$s['summary'] = str_replace($b['term'],'[img=16x16]' . $b['url'] . '[/img]',$s['summary']);
$s['body'] = str_replace($b['term'],'[img=16x16]' . $b['url'] . '[/img]',$s['body']);
}
}
}
$a = self::decode_attachment($act->obj);
if($a) {
$s['attach'] = $a;
}
}
$a = self::decode_attachment($act->obj);
if($a) {
$s['attach'] = $a;
if($act->obj['type'] === 'Note' && $s['attach']) {
$s['body'] .= self::bb_attach($s['attach'],$s['body']);
}
// we will need a hook here to extract magnet links e.g. peertube
// right now just link to the largest mp4 we find that will fit in our
// standard content region
if($act->obj['type'] === 'Video') {
if(! $response_activity) {
if($act->obj['type'] === 'Video') {
$vtypes = [
'video/mp4',
'video/ogg',
'video/webm'
];
$vtypes = [
'video/mp4',
'video/ogg',
'video/webm'
];
$mps = [];
if(array_key_exists('url',$act->obj) && is_array($act->obj['url'])) {
foreach($act->obj['url'] as $vurl) {
if(in_array($vurl['mimeType'], $vtypes)) {
if(! array_key_exists('width',$vurl)) {
$vurl['width'] = 0;
$mps = [];
$ptr = null;
if(array_key_exists('url',$act->obj)) {
if(is_array($act->obj['url'])) {
if(array_key_exists(0,$act->obj['url'])) {
$ptr = $act->obj['url'];
}
$mps[] = $vurl;
else {
$ptr = [ $act->obj['url'] ];
}
foreach($ptr as $vurl) {
// peertube uses the non-standard element name 'mimeType' here
if(array_key_exists('mimeType',$vurl)) {
if(in_array($vurl['mimeType'], $vtypes)) {
if(! array_key_exists('width',$vurl)) {
$vurl['width'] = 0;
}
$mps[] = $vurl;
}
}
elseif(array_key_exists('mediaType',$vurl)) {
if(in_array($vurl['mediaType'], $vtypes)) {
if(! array_key_exists('width',$vurl)) {
$vurl['width'] = 0;
}
$mps[] = $vurl;
}
}
}
}
if($mps) {
usort($mps,[ __CLASS__, 'vid_sort' ]);
foreach($mps as $m) {
if(intval($m['width']) < 500 && self::media_not_in_body($m['href'],$s['body'])) {
$s['body'] .= "\n\n" . '[video]' . $m['href'] . '[/video]';
break;
}
}
}
elseif(is_string($act->obj['url']) && self::media_not_in_body($act->obj['url'],$s['body'])) {
$s['body'] .= "\n\n" . '[video]' . $act->obj['url'] . '[/video]';
}
}
}
if($mps) {
usort($mps,'as_vid_sort');
foreach($mps as $m) {
if(intval($m['width']) < 500) {
$s['body'] .= "\n\n" . '[video]' . $m['href'] . '[/video]';
break;
if($act->obj['type'] === 'Audio') {
$atypes = [
'audio/mpeg',
'audio/ogg',
'audio/wav'
];
$ptr = null;
if(array_key_exists('url',$act->obj)) {
if(is_array($act->obj['url'])) {
if(array_key_exists(0,$act->obj['url'])) {
$ptr = $act->obj['url'];
}
else {
$ptr = [ $act->obj['url'] ];
}
foreach($ptr as $vurl) {
if(in_array($vurl['mediaType'], $atypes) && self::media_not_in_body($vurl['href'],$s['body'])) {
$s['body'] .= "\n\n" . '[audio]' . $vurl['href'] . '[/audio]';
break;
}
}
}
elseif(is_string($act->obj['url']) && self::media_not_in_body($act->obj['url'],$s['body'])) {
$s['body'] .= "\n\n" . '[audio]' . $act->obj['url'] . '[/audio]';
}
}
}
if($act->obj['type'] === 'Image') {
$ptr = null;
if(array_key_exists('url',$act->obj)) {
if(is_array($act->obj['url'])) {
if(array_key_exists(0,$act->obj['url'])) {
$ptr = $act->obj['url'];
}
else {
$ptr = [ $act->obj['url'] ];
}
foreach($ptr as $vurl) {
if(strpos($s['body'],$vurl['href']) === false) {
$s['body'] .= "\n\n" . '[zmg]' . $vurl['href'] . '[/zmg]';
break;
}
}
}
elseif(is_string($act->obj['url'])) {
if(strpos($s['body'],$act->obj['url']) === false) {
$s['body'] .= "\n\n" . '[zmg]' . $act->obj['url'] . '[/zmg]';
}
}
}
}
if($act->obj['type'] === 'Page' && ! $s['body']) {
$ptr = null;
$purl = EMPTY_STR;
if(array_key_exists('url',$act->obj)) {
if(is_array($act->obj['url'])) {
if(array_key_exists(0,$act->obj['url'])) {
$ptr = $act->obj['url'];
}
else {
$ptr = [ $act->obj['url'] ];
}
foreach($ptr as $vurl) {
if(array_key_exists('mediaType',$vurl) && $vurl['mediaType'] === 'text/html') {
$purl = $vurl['href'];
break;
}
elseif(array_key_exists('mimeType',$vurl) && $vurl['mimeType'] === 'text/html') {
$purl = $vurl['href'];
break;
}
}
}
elseif(is_string($act->obj['url'])) {
$purl = $act->obj['url'];
}
if($purl) {
$li = z_fetch_url(z_root() . '/linkinfo?binurl=' . bin2hex($purl));
if($li['success'] && $li['body']) {
$s['body'] .= "\n" . $li['body'];
}
else {
$s['body'] .= "\n\n" . $purl;
}
}
}
}
}
if(in_array($act->obj['type'],[ 'Note','Article','Page' ])) {
$ptr = null;
if(array_key_exists('url',$act->obj)) {
if(is_array($act->obj['url'])) {
if(array_key_exists(0,$act->obj['url'])) {
$ptr = $act->obj['url'];
}
else {
$ptr = [ $act->obj['url'] ];
}
foreach($ptr as $vurl) {
if(array_key_exists('mediaType',$vurl) && $vurl['mediaType'] === 'text/html') {
$s['plink'] = $vurl['href'];
break;
}
}
}
elseif(is_string($act->obj['url'])) {
$s['plink'] = $act->obj['url'];
}
}
}
if(! $s['plink']) {
$s['plink'] = $s['mid'];
}
if($act->recips && (! in_array(ACTIVITY_PUBLIC_INBOX,$act->recips)))
@ -1371,8 +1560,6 @@ class Activity {
}
static function announce_note($channel,$observer_hash,$act) {
$s = [];

View File

@ -1418,7 +1418,7 @@ logger('4');
$DR = new DReport(z_root(),$sender,$d,$arr['mid']);
$channel = channelx_by_hash($d);
$channel = channelx_by_portid($d);
if (! $channel) {
$DR->update('recipient not found');
@ -1505,8 +1505,10 @@ logger('4');
}
}
if($arr['mid'] != $arr['parent_mid']) {
logger('item: ' . print_r($arr,true), LOGGER_DATA);
if($arr['mid'] !== $arr['parent_mid']) {
logger('checking source: "' . $arr['mid'] . '" != "' . $arr['parent_mid'] . '"');
// check source route.
// We are only going to accept comments from this sender if the comment has the same route as the top-level-post,
// this is so that permissions mismatches between senders apply to the entire conversation
@ -1591,7 +1593,7 @@ logger('4');
$arr['route'] = $last_prior_route;
}
}
logger('hey');
$ab = q("select * from abook where abook_channel = %d and abook_xchan = '%s'",
intval($channel['channel_id']),
dbesc($arr['owner_xchan'])

View File

@ -2333,6 +2333,21 @@ function channelx_by_hash($hash) {
return(($r) ? $r[0] : false);
}
/**
* @brief Get a channel array by a channel_hash.
*
* @param string $hash
* @return array|boolean false if channel ID not found, otherwise the channel array
*/
function channelx_by_portid($hash) {
$r = q("SELECT * FROM channel left join xchan on channel_portable_id = xchan_hash WHERE channel_portable_id = '%s' and channel_removed = 0 LIMIT 1",
dbesc($hash)
);
return(($r) ? $r[0] : false);
}
/**
* @brief Get a channel array by a channel ID.
*