+ /**
+ * Fetch a user id from an activity array
+ *
+ * @param array $activity
+ * @param string $actor
+ *
+ * @return int user id
+ */
+ public static function getBestUserForActivity(array $activity)
+ {
+ $uid = 0;
+ $actor = JsonLD::fetchElement($activity, 'as:actor', '@id') ?? '';
+
+ $receivers = self::getReceivers($activity, $actor);
+ foreach ($receivers as $receiver) {
+ if ($receiver['type'] == self::TARGET_GLOBAL) {
+ return 0;
+ }
+ if (empty($uid) || ($receiver['type'] == self::TARGET_TO)) {
+ $uid = $receiver['uid'];
+ }
+ }
+
+ // When we haven't found any user yet, we just chose a user who most likely could have access to the content
+ if (empty($uid)) {
+ $contact = Contact::selectFirst(['uid'], ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND]]);
+ if (!empty($contact['uid'])) {
+ $uid = $contact['uid'];
+ }
+ }
+
+ return $uid;
+ }
+
+ public static function getReceiverURL($activity)
+ {
+ $urls = [];
+
+ foreach (['as:to', 'as:cc', 'as:bto', 'as:bcc'] as $element) {
+ $receiver_list = JsonLD::fetchElementArray($activity, $element, '@id');
+ if (empty($receiver_list)) {
+ continue;
+ }
+
+ foreach ($receiver_list as $receiver) {
+ if ($receiver == self::PUBLIC_COLLECTION) {
+ $receiver = ActivityPub::PUBLIC_COLLECTION;
+ }
+ $urls[$element][] = $receiver;
+ }
+ }
+
+ return $urls;
+ }
+