static function start($subscriber, $other)
{
+ // @fixme should we enforce this as profiles in callers instead?
+ if ($subscriber instanceof User) {
+ $subscriber = $subscriber->getProfile();
+ }
+ if ($other instanceof User) {
+ $other = $other->getProfile();
+ }
+
if (!$subscriber->hasRight(Right::SUBSCRIBE)) {
+ // TRANS: Exception thrown when trying to subscribe while being banned from subscribing.
throw new Exception(_('You have been banned from subscribing.'));
}
if (self::exists($subscriber, $other)) {
+ // TRANS: Exception thrown when trying to subscribe while already subscribed.
throw new Exception(_('Already subscribed!'));
}
if ($other->hasBlocked($subscriber)) {
+ // TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user.
throw new Exception(_('User has blocked you.'));
}
if (Event::handle('StartSubscribe', array($subscriber, $other))) {
-
- $sub = new Subscription();
-
- $sub->subscriber = $subscriber->id;
- $sub->subscribed = $other->id;
- $sub->created = common_sql_now();
-
- $result = $sub->insert();
-
- if (!$result) {
- common_log_db_error($sub, 'INSERT', __FILE__);
- throw new Exception(_('Could not save subscription.'));
- }
-
+ $sub = self::saveNew($subscriber->id, $other->id);
$sub->notify();
self::blow('user:notices_with_friends:%d', $subscriber->id);
- $subscriber->blowSubscriptionsCount();
- $other->blowSubscribersCount();
+ $subscriber->blowSubscriptionCount();
+ $other->blowSubscriberCount();
$otherUser = User::staticGet('id', $other->id);
!self::exists($other, $subscriber) &&
!$subscriber->hasBlocked($other)) {
- $auto = new Subscription();
-
- $auto->subscriber = $subscriber->id;
- $auto->subscribed = $other->id;
- $auto->created = common_sql_now();
-
- $result = $auto->insert();
-
- if (!$result) {
- common_log_db_error($auto, 'INSERT', __FILE__);
- throw new Exception(_('Could not save subscription.'));
+ try {
+ self::start($other, $subscriber);
+ } catch (Exception $e) {
+ common_log(LOG_ERR, "Exception during autosubscribe of {$other->nickname} to profile {$subscriber->id}: {$e->getMessage()}");
}
-
- $auto->notify();
}
Event::handle('EndSubscribe', array($subscriber, $other));
return true;
}
+ /**
+ * Low-level subscription save.
+ * Outside callers should use Subscription::start()
+ */
+ protected function saveNew($subscriber_id, $other_id)
+ {
+ $sub = new Subscription();
+
+ $sub->subscriber = $subscriber_id;
+ $sub->subscribed = $other_id;
+ $sub->jabber = 1;
+ $sub->sms = 1;
+ $sub->created = common_sql_now();
+
+ $result = $sub->insert();
+
+ if (!$result) {
+ common_log_db_error($sub, 'INSERT', __FILE__);
+ // TRANS: Exception thrown when a subscription could not be stored on the server.
+ throw new Exception(_('Could not save subscription.'));
+ }
+
+ return $sub;
+ }
+
function notify()
{
# XXX: add other notifications (Jabber, SMS) here
* Cancel a subscription
*
*/
-
function cancel($subscriber, $other)
{
if (!self::exists($subscriber, $other)) {
+ // TRANS: Exception thrown when trying to unsibscribe without a subscription.
throw new Exception(_('Not subscribed!'));
}
// Don't allow deleting self subs
if ($subscriber->id == $other->id) {
- throw new Exception(_('Couldn\'t delete self-subscription.'));
+ // TRANS: Exception thrown when trying to unsubscribe a user from themselves.
+ throw new Exception(_('Could not delete self-subscription.'));
}
if (Event::handle('StartUnsubscribe', array($subscriber, $other))) {
$token = new Token();
$token->tok = $sub->token;
- $token->secret = $sub->secret;
if ($token->find(true)) {
if (!$result) {
common_log_db_error($token, 'DELETE', __FILE__);
- throw new Exception(_('Couldn\'t delete subscription OMB token.'));
+ // TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
+ throw new Exception(_('Could not delete subscription OMB token.'));
}
} else {
common_log(LOG_ERR, "Couldn't find credentials with token {$token->tok}");
if (!$result) {
common_log_db_error($sub, 'DELETE', __FILE__);
- throw new Exception(_('Couldn\'t delete subscription.'));
+ // TRANS: Exception thrown when a subscription could not be deleted on the server.
+ throw new Exception(_('Could not delete subscription.'));
}
self::blow('user:notices_with_friends:%d', $subscriber->id);
- $subscriber->blowSubscriptionsCount();
- $other->blowSubscribersCount();
+ $subscriber->blowSubscriptionCount();
+ $other->blowSubscriberCount();
Event::handle('EndUnsubscribe', array($subscriber, $other));
}
'subscribed' => $other->id));
return (empty($sub)) ? false : true;
}
+
+ function asActivity()
+ {
+ $subscriber = Profile::staticGet('id', $this->subscriber);
+ $subscribed = Profile::staticGet('id', $this->subscribed);
+
+ $act = new Activity();
+
+ $act->verb = ActivityVerb::FOLLOW;
+
+ $act->id = TagURI::mint('follow:%d:%d:%s',
+ $subscriber->id,
+ $subscribed->id,
+ common_date_iso8601($this->created));
+
+ $act->time = strtotime($this->created);
+ // TRANS: Activity tile when subscribing to another person.
+ $act->title = _("Follow");
+ // TRANS: Notification given when one person starts following another.
+ // TRANS: %1$s is the subscriber, %2$s is the subscribed.
+ $act->content = sprintf(_('%1$s is now following %2$s.'),
+ $subscriber->getBestName(),
+ $subscribed->getBestName());
+
+ $act->actor = ActivityObject::fromProfile($subscriber);
+ $act->objects[] = ActivityObject::fromProfile($subscribed);
+
+ return $act;
+ }
}