// When commenting on a public post then store the post for the current user
// This enables interaction like starring and saving into folders
if ($toplevel_item['uid'] == 0) {
- $stored = Item::storeForUserByUriId($toplevel_item['uri-id'], local_user());
+ $stored = Item::storeForUserByUriId($toplevel_item['uri-id'], local_user(), ['post-reason' => Item::PR_ACTIVITY]);
Logger::info('Public item stored for user', ['uri-id' => $toplevel_item['uri-id'], 'uid' => $uid, 'stored' => $stored]);
if ($stored) {
$toplevel_item = Post::selectFirst(Item::ITEM_FIELDLIST, ['id' => $stored]);
$row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('You are following %s.', $row['author-name'])];
break;
case ItemModel::PR_TAG:
- $row['direction'] = ['direction' => 4, 'title' => $this->l10n->t('Tagged')];
+ $row['direction'] = ['direction' => 4, 'title' => $this->l10n->t('You subscribed to one or more tags in this post.')];
break;
case ItemModel::PR_ANNOUNCEMENT:
if (!empty($row['causer-id']) && $this->pConfig->get(local_user(), 'system', 'display_resharer')) {
$row['direction'] = ['direction' => 5, 'title' => $this->l10n->t('%s is participating in this thread.', $row['author-name'])];
break;
case ItemModel::PR_STORED:
- $row['direction'] = ['direction' => 8, 'title' => $this->l10n->t('Stored')];
+ $row['direction'] = ['direction' => 8, 'title' => $this->l10n->t('Stored for general reasons')];
break;
case ItemModel::PR_GLOBAL:
- $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global')];
+ $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global post')];
break;
case ItemModel::PR_RELAY:
- $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Relayed') : $this->l10n->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
+ $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Send via an relay server') : $this->l10n->t('Send via the relay server %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
case ItemModel::PR_FETCHED:
$row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Fetched') : $this->l10n->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
+ case ItemModel::PR_COMPLETION:
+ $row['direction'] = ['direction' => 2, 'title' => $this->l10n->t('Stored because of a child post to complete this thread.')];
+ break;
+ case ItemModel::PR_DIRECT:
+ $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('Local delivery')];
+ break;
+ case ItemModel::PR_ACTIVITY:
+ $row['direction'] = ['direction' => 2, 'title' => $this->l10n->t('Stored because of your activity (like, comment, star, ...)')];
+ break;
+ case ItemModel::PR_DISTRIBUTE:
+ $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('Distributed')];
+ break;
+
}
$row['thr-parent-row'] = $thr_parent;
use Friendica\Util\Strings;
use Friendica\Util\Temporal;
use Friendica\Worker\Delivery;
+use GuzzleHttp\Psr7\Uri;
use LanguageDetection\Language;
class Item
const PR_GLOBAL = 73;
const PR_RELAY = 74;
const PR_FETCHED = 75;
+ const PR_COMPLETION = 76;
+ const PR_DIRECT = 77;
+ const PR_ACTIVITY = 78;
+ const PR_DISTRIBUTE = 79;
// system.accept_only_sharer setting values
const COMPLETION_NONE = 1;
$parent = Post::selectFirst($fields, $condition, $params);
if (!DBA::isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) {
- $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid']);
+ $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
if (!$stored && ($item['thr-parent-id'] != $item['parent-uri-id'])) {
- $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid']);
+ $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
}
if ($stored) {
Logger::info('Stored thread parent item for user', ['uri-id' => $item['thr-parent-id'], 'uid' => $item['uid'], 'stored' => $stored]);
$toplevel_parent = Post::selectFirst($fields, $condition, $params);
if (!DBA::isResult($toplevel_parent) && $item['origin']) {
- $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid']);
+ $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
Logger::info('Stored parent item for user', ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid'], 'stored' => $stored]);
$toplevel_parent = Post::selectFirst($fields, $condition, $params);
}
$uids = Tag::getUIDListByURIId($item['uri-id']);
foreach ($uids as $uid) {
- if (Contact::isSharing($item['author-id'], $uid)) {
- $fields = [];
- } else {
- $fields = ['post-reason' => self::PR_TAG];
- }
-
- $stored = self::storeForUserByUriId($item['uri-id'], $uid, $fields);
- Logger::info('Stored item for users', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'fields' => $fields, 'stored' => $stored]);
+ $stored = self::storeForUserByUriId($item['uri-id'], $uid, ['post-reason' => self::PR_TAG]);
+ Logger::info('Stored item for users', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'stored' => $stored]);
}
}
if ($origin_uid == $uid) {
$item['diaspora_signed_text'] = $signed_text;
}
+ $item['post-reason'] = self::PR_DISTRIBUTE;
self::storeForUser($item, $uid);
}
}
unset($item['event-id']);
unset($item['hidden']);
unset($item['notification-type']);
- unset($item['post-reason']);
// Data from the "post-delivery-data" table
unset($item['postopts']);
}
if (!Post::exists(['uri-id' => $item['parent-uri-id'], 'uid' => $uid])) {
- $stored = self::storeForUserByUriId($item['parent-uri-id'], $uid);
+ $stored = self::storeForUserByUriId($item['parent-uri-id'], $uid, ['post-reason' => Item::PR_ACTIVITY]);
if (($item['parent-uri-id'] == $item['uri-id']) && !empty($stored)) {
$item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $stored]);
if (!DBA::isResult($item)) {
$urlparts = parse_url($url);
unset($urlparts['query']);
unset($urlparts['fragment']);
- $url = Network::unparseURL($urlparts);
+ $url = Uri::fromParts($urlparts);
// Remove media links to only search in embedded content
// @todo Check images for image link, audio for audio links, ...
}
if ($item['uid'] == 0) {
- $stored = Item::storeForUserByUriId($this->parameters['id'], $uid);
+ $stored = Item::storeForUserByUriId($this->parameters['id'], $uid, ['post-reason' => Item::PR_ACTIVITY]);
if (!empty($stored)) {
$item = Post::selectFirst(['id', 'gravity'], ['id' => $stored]);
if (!DBA::isResult($item)) {
}
if ($item['uid'] == 0) {
- $stored = Item::storeForUserByUriId($this->parameters['id'], $uid);
+ $stored = Item::storeForUserByUriId($this->parameters['id'], $uid, ['post-reason' => Item::PR_ACTIVITY]);
if (!empty($stored)) {
$item = Post::selectFirst(['id', 'gravity'], ['id' => $stored]);
if (!DBA::isResult($item)) {
}
if ($item['uid'] == 0) {
- $stored = Item::storeForUserByUriId($item['uri-id'], local_user());
+ $stored = Item::storeForUserByUriId($item['uri-id'], local_user(), ['post-reason' => Item::PR_ACTIVITY]);
if (!empty($stored)) {
$item = Post::selectFirst(['starred'], ['id' => $stored]);
if (!DBA::isResult($item)) {
} elseif ($cmd == WorkerDelivery::PROFILEUPDATE) {
$success = ActivityPub\Transmitter::sendProfileUpdate($uid, $inbox);
} else {
- $data = Post\Activity::getByURIId($uri_id);
- if (empty($data)) {
- $data = ActivityPub\Transmitter::createCachedActivityFromItem($item_id);
- }
+ $data = ActivityPub\Transmitter::createCachedActivityFromItem($item_id);
if (!empty($data)) {
$timestamp = microtime(true);
$response = HTTPSignature::post($data, $inbox, $uid);
if (!$item['deleted']) {
$data = Post\Activity::getByURIId($item['uri-id']);
if (!$item['origin'] && !empty($data)) {
- if (!empty($data['type'])) {
- if (in_array($data['type'], ['Create', 'Update'])) {
- if ($object_mode) {
- unset($data['@context']);
- unset($data['signature']);
- }
- Logger::info('Return stored conversation', ['item' => $item_id]);
- return $data;
- } elseif (in_array('as:' . $data['type'], Receiver::CONTENT_TYPES)) {
- if (!empty($data['@context'])) {
- $context = $data['@context'];
- unset($data['@context']);
- }
- unset($data['actor']);
- $object = $data;
- }
+ if ($object_mode) {
+ unset($data['@context']);
+ unset($data['signature']);
}
+ Logger::info('Return stored conversation', ['item' => $item_id]);
+ return $data;
}
}
+ if (!$item['origin'] && empty($object)) {
+ Logger::debug('Post is not ours and is not stored', ['id' => $item_id, 'uri-id' => $item['uri-id']]);
+ return false;
+ }
+
$type = self::getTypeOfItem($item);
if (!$object_mode) {
// Direct delivery of local contacts
if (!in_array($cmd, [Delivery::RELOCATION, Delivery::SUGGESTION, Delivery::DELETION, Delivery::MAIL]) && $target_uid = User::getIdForURL($contact['url'])) {
Logger::info('Direct delivery', ['uri-id' => $target_item['uri-id'], 'target' => $target_uid]);
- $fields = ['protocol' => Conversation::PARCEL_LOCAL_DFRN, 'direction' => Conversation::PUSH];
+ $fields = ['protocol' => Conversation::PARCEL_LOCAL_DFRN, 'direction' => Conversation::PUSH, 'post-reason' => Item::PR_DIRECT];
Item::storeForUserByUriId($target_item['uri-id'], $target_uid, $fields, $target_item['uid']);
continue;
}