X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FTransmitter.php;h=2be621cb93e9b09ec4c28b570880e32c6a14f1a9;hb=abed3ba90607392d0e84abf08e247bf7bea437dd;hp=8fff3fec212c63fcd73f43041e20ce4d32387e5e;hpb=8644d300d0a7105b45c49a41ac6144875a02367a;p=friendica.git diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 8fff3fec21..2be621cb93 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -176,9 +176,11 @@ class Transmitter $items = Item::select(['id'], $condition, ['limit' => [($page - 1) * 20, 20], 'order' => ['created' => true]]); while ($item = Item::fetch($items)) { - $object = self::createObjectFromItemID($item['id']); - unset($object['@context']); - $list[] = $object; + $activity = self::createActivityFromItem($item['id'], true); + // Only list "Create" activity objects here, no reshares + if (is_array($activity['object']) && ($activity['type'] == 'Create')) { + $list[] = $activity['object']; + } } if (!empty($list)) { @@ -379,6 +381,15 @@ class Transmitter $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]); + // Directly mention the original author upon a quoted reshare. + // Else just ensure that the original author receives the reshare. + $announce = self::getAnnounceObject($item); + if (!empty($announce['comment'])) { + $data['to'][] = $announce['actor']['url']; + } elseif (!empty($announce)) { + $data['cc'][] = $announce['actor']['url']; + } + if (!$item['private']) { $data = array_merge($data, self::fetchPermissionBlockFromConversation($item)); @@ -653,6 +664,9 @@ class Transmitter public static function ItemArrayFromMail($mail_id) { $mail = DBA::selectFirst('mail', [], ['id' => $mail_id]); + if (!DBA::isResult($mail)) { + return []; + } $reply = DBA::selectFirst('mail', ['uri'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]); @@ -696,11 +710,6 @@ class Transmitter $mail = self::ItemArrayFromMail($mail_id); $object = self::createNote($mail); - $object['to'] = $object['cc']; - unset($object['cc']); - - $object['tag'] = [['type' => 'Mention', 'href' => $object['to'][0], 'name' => 'test']]; - if (!$object_mode) { $data = ['@context' => ActivityPub::CONTEXT]; } else { @@ -726,6 +735,8 @@ class Transmitter unset($data['bcc']); $object['to'] = $data['to']; + $object['tag'] = [['type' => 'Mention', 'href' => $object['to'][0], 'name' => '']]; + unset($object['cc']); unset($object['bcc']); @@ -757,8 +768,8 @@ class Transmitter // Only check for a reshare, if it is a real reshare and no quoted reshare if (strpos($item['body'], "[share") === 0) { - $announce = api_share_as_retweet($item); - $reshared = !empty($announce['plink']); + $announce = self::getAnnounceObject($item); + $reshared = !empty($announce); } if ($reshared) { @@ -919,29 +930,6 @@ class Transmitter /// @todo Create "conversation" entry } - /** - * Creates an object array for a given item id - * - * @param integer $item_id - * - * @return array with the object data - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - * @throws \ImagickException - */ - public static function createObjectFromItemID($item_id) - { - $item = Item::selectFirst([], ['id' => $item_id, 'parent-network' => Protocol::NATIVE_SUPPORT]); - - if (!DBA::isResult($item)) { - return false; - } - - $data = ['@context' => ActivityPub::CONTEXT]; - $data = array_merge($data, self::createNote($item)); - - return $data; - } - /** * Creates a location entry for a given item array * @@ -1004,6 +992,13 @@ class Transmitter $tags[] = ['type' => 'Mention', 'href' => $term['url'], 'name' => $mention]; } } + + $announce = self::getAnnounceObject($item); + // Mention the original author upon commented reshares + if (!empty($announce['comment'])) { + $tags[] = ['type' => 'Mention', 'href' => $announce['actor']['url'], 'name' => '@' . $announce['actor']['addr']]; + } + return $tags; } @@ -1020,6 +1015,9 @@ class Transmitter { $attachments = []; + // Currently deactivated, since it creates side effects on Mastodon and Pleroma. + // It will be reactivated, once this cleared. + /* $attach_data = BBCode::getAttachmentData($item['body']); if (!empty($attach_data['url'])) { $attachment = ['type' => 'Page', @@ -1047,7 +1045,7 @@ class Transmitter $attachments[] = $attachment; } - + */ $arr = explode('[/attach],', $item['attach']); if (count($arr)) { foreach ($arr as $r) { @@ -1231,6 +1229,10 @@ class Transmitter */ public static function createNote($item) { + if (empty($item)) { + return []; + } + if ($item['event-type'] == 'event') { $type = 'Event'; } elseif (!empty($item['title'])) { @@ -1364,21 +1366,21 @@ class Transmitter private static function createAnnounce($item, $data) { $orig_body = $item['body']; - $announce = api_share_as_retweet($item); - if (empty($announce['plink'])) { + $announce = self::getAnnounceObject($item); + if (empty($announce)) { $data['type'] = 'Create'; $data['object'] = self::createNote($item); return $data; } // Fetch the original id of the object - $activity = ActivityPub::fetchContent($announce['plink'], $item['uid']); + $activity = ActivityPub::fetchContent($announce['id'], $item['uid']); if (!empty($activity)) { $ldactivity = JsonLD::compact($activity); $id = JsonLD::fetchElement($ldactivity, '@id'); $type = str_replace('as:', '', JsonLD::fetchElement($ldactivity, '@type')); if (!empty($id)) { - if (empty($announce['share-pre-body'])) { + if (empty($announce['comment'])) { // Pure announce, without a quote $data['type'] = 'Announce'; $data['object'] = $id; @@ -1387,7 +1389,7 @@ class Transmitter // Quote $data['type'] = 'Create'; - $item['body'] = trim($announce['share-pre-body']) . "\n" . $id; + $item['body'] = $announce['comment'] . "\n" . $id; $data['object'] = self::createNote($item); /// @todo Finally descide how to implement this in AP. This is a possible way: @@ -1404,6 +1406,30 @@ class Transmitter return $data; } + /** + * Return announce related data if the item is an annunce + * + * @param array $item + * + * @return array + */ + public static function getAnnounceObject($item) + { + $announce = api_share_as_retweet($item); + if (empty($announce['plink'])) { + return []; + } + + /// @ToDo Check if the announced item is an AP object + + $profile = APContact::getByURL($announce['author-link'], false); + if (empty($profile)) { + return []; + } + + return ['id' => $announce['plink'], 'actor' => $profile, 'comment' => trim($announce['share-pre-body'])]; + } + /** * Creates an activity id for a given contact id *