namespace Friendica\Core;
+use Friendica\Database\DBA;
use Friendica\DI;
+use Friendica\Model\User;
use Friendica\Network\HTTPException;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
return $display_name . ' (' . self::getAddrFromProfileUrl($profile_url) . ')';
}
+ /**
+ * Send a follow message to a remote server.
+ *
+ * @param int $uid User Id
+ * @param array $contact Contact being followed
+ * @param ?string $protocol Expected protocol
+ * @return bool Only returns false in the unlikely case an ActivityPub contact ID doesn't exist (???)
+ * @throws HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function follow(int $uid, array $contact, ?string $protocol = null): bool
+ {
+ $owner = User::getOwnerDataById($uid);
+ if (!DBA::isResult($owner)) {
+ return true;
+ }
+
+ $protocol = $protocol ?? $contact['protocol'];
+
+ if (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) {
+ // create a follow slap
+ $item = [
+ 'verb' => Activity::FOLLOW,
+ 'gravity' => GRAVITY_ACTIVITY,
+ 'follow' => $contact['url'],
+ 'body' => '',
+ 'title' => '',
+ 'guid' => '',
+ 'uri-id' => 0,
+ ];
+
+ $slap = OStatus::salmon($item, $owner);
+
+ if (!empty($contact['notify'])) {
+ Salmon::slapper($owner, $contact['notify'], $slap);
+ }
+ } elseif ($protocol == Protocol::DIASPORA) {
+ $contact = Diaspora::sendShare($owner, $contact);
+ Logger::notice('share returns: ' . $contact);
+ } elseif ($protocol == Protocol::ACTIVITYPUB) {
+ $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact['id']);
+ if (empty($activity_id)) {
+ // This really should never happen
+ return false;
+ }
+
+ $success = ActivityPub\Transmitter::sendActivity('Follow', $contact['url'], $owner['uid'], $activity_id);
+ Logger::notice('Follow returns: ' . $success);
+ }
+
+ return true;
+ }
+
/**
* Sends an unfriend message. Does not remove the contact
*
Worker::add(PRIORITY_HIGH, 'UpdateContact', $contact_id);
}
- $owner = User::getOwnerDataById($uid);
-
- if (DBA::isResult($owner)) {
- if (in_array($protocol, [Protocol::OSTATUS, Protocol::DFRN])) {
- // create a follow slap
- $item = [];
- $item['verb'] = Activity::FOLLOW;
- $item['gravity'] = GRAVITY_ACTIVITY;
- $item['follow'] = $contact["url"];
- $item['body'] = '';
- $item['title'] = '';
- $item['guid'] = '';
- $item['uri-id'] = 0;
-
- $slap = OStatus::salmon($item, $owner);
-
- if (!empty($contact['notify'])) {
- Salmon::slapper($owner, $contact['notify'], $slap);
- }
- } elseif ($protocol == Protocol::DIASPORA) {
- $ret = Diaspora::sendShare($owner, $contact);
- Logger::notice('share returns: ' . $ret);
- } elseif ($protocol == Protocol::ACTIVITYPUB) {
- $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact_id);
- if (empty($activity_id)) {
- // This really should never happen
- return false;
- }
-
- $ret = ActivityPub\Transmitter::sendActivity('Follow', $contact['url'], $uid, $activity_id);
- Logger::notice('Follow returns: ' . $ret);
- }
- }
+ $result['success'] = Protocol::follow($uid, $contact, $protocol);
- $result['success'] = true;
return $result;
}
- /**
- * Follow a contact
- *
- * @param int $cid Public contact id
- * @param int $uid User ID
- *
- * @return bool "true" if following had been successful
- */
- public static function follow(int $cid, int $uid)
- {
- $contact = self::getById($cid, ['url']);
-
- $result = self::createFromProbeForUser($uid, $contact['url']);
-
- return $result['cid'];
- }
-
/**
* Unfollow a contact
*
DI::mstdnError()->UnprocessableEntity();
}
- $cid = Contact::follow($this->parameters['id'], $uid);
+ $contact = Contact::getById($this->parameters['id'], ['url']);
- System::jsonExit(DI::mstdnRelationship()->createFromContactId($cid, $uid)->toArray());
+ $result = Contact::createFromProbeForUser($uid, $contact['url']);
+
+ if (!$result['success']) {
+ DI::mstdnError()->UnprocessableEntity($result['message']);
+ }
+
+ System::jsonExit(DI::mstdnRelationship()->createFromContactId($result['cid'], $uid)->toArray());
}
}