X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2Factions%2Fusersalmon.php;h=7fce6c808c5118fba49450ce95049fd4973cd2c1;hb=c44146d6f83c06d1d10dac6a1e35754c7c783974;hp=5355aeba03fed5b2eca9c762709d3466aae00f4b;hpb=47f31bce47b182aa55c02c7872d7e473d3ab10f2;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 5355aeba03..7fce6c808c 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -17,9 +17,7 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * @package OStatusPlugin @@ -27,23 +25,25 @@ if (!defined('STATUSNET')) { */ class UsersalmonAction extends SalmonAction { - function prepare($args) + protected function prepare(array $args=array()) { parent::prepare($args); $id = $this->trimmed('id'); if (!$id) { + // TRANS: Client error displayed trying to perform an action without providing an ID. $this->clientError(_m('No ID.')); } - $this->user = User::staticGet('id', $id); + $this->user = User::getKV('id', $id); - if (empty($this->user)) { + if (!$this->user instanceof User) { + // TRANS: Client error displayed when referring to a non-existing user. $this->clientError(_m('No such user.')); } - $this->target = $this->user; + $this->target = $this->user->getProfile(); return true; } @@ -67,42 +67,37 @@ class UsersalmonAction extends SalmonAction case ActivityObject::COMMENT: break; default: - throw new ClientException("Can't handle that kind of post."); + // TRANS: Client exception thrown when an undefied activity is performed. + throw new ClientException(_m('Cannot handle that kind of post.')); } // Notice must either be a) in reply to a notice by this user - // or b) to the attention of this user - // or c) in reply to a notice to the attention of this user + // or b) in reply to a notice to the attention of this user + // or c) to the attention of this user $context = $this->activity->context; + $notice = false; if (!empty($context->replyToID)) { - $notice = Notice::staticGet('uri', $context->replyToID); - if (empty($notice)) { - // TRANS: Client exception. - throw new ClientException(_m('In reply to unknown notice.')); - } - if ($notice->profile_id != $this->user->id && - !in_array($this->user->id, $notice->getReplies())) { - // TRANS: Client exception. - throw new ClientException(_m('In reply to a notice not by this user and not mentioning this user.')); - } - } else if (!empty($context->attention)) { - if (!in_array($this->user->uri, $context->attention) && - !in_array(common_profile_url($this->user->nickname), $context->attention)) { - common_log(LOG_ERR, "{$this->user->uri} not in attention list (".implode(',', $context->attention).")"); - // TRANS: Client exception. - throw new ClientException('To the attention of user(s), not including this one.'); - } + $notice = Notice::getKV('uri', $context->replyToID); + } + + if ($notice instanceof Notice && + ($notice->profile_id == $this->target->id || + array_key_exists($this->target->id, $notice->getReplies()))) + { + // In reply to a notice either from or mentioning this user. + } elseif (!empty($context->attention) && + array_key_exists($this->target->getUri(), $context->attention)) { + // To the attention of this user. } else { // TRANS: Client exception. - throw new ClientException('Not to anyone in reply to anything.'); + throw new ClientException(_m('Not to anyone in reply to anything.')); } - $existing = Notice::staticGet('uri', $this->activity->objects[0]->id); - - if (!empty($existing)) { - common_log(LOG_ERR, "Not saving notice '{$existing->uri}'; already exists."); + $existing = Notice::getKV('uri', $this->activity->objects[0]->id); + if ($existing instanceof Notice) { + common_log(LOG_ERR, "Not saving notice with duplicate URI '".$existing->getUri()."' (seems it already exists)."); return; } @@ -115,14 +110,8 @@ class UsersalmonAction extends SalmonAction */ function handleFollow() { - $oprofile = $this->ensureProfile(); - if ($oprofile) { - common_log(LOG_INFO, "Setting up subscription from remote {$oprofile->uri} to local {$this->user->nickname}"); - Subscription::start($oprofile->localProfile(), - $this->user->getProfile()); - } else { - common_log(LOG_INFO, "Can't set up subscription from remote; missing profile."); - } + common_log(LOG_INFO, sprintf('Setting up subscription from remote %s to local %s', $this->oprofile->getUri(), $this->target->getNickname())); + Subscription::start($this->actor, $this->target); } /** @@ -133,56 +122,77 @@ class UsersalmonAction extends SalmonAction */ function handleUnfollow() { - $oprofile = $this->ensureProfile(); - if ($oprofile) { - common_log(LOG_INFO, "Canceling subscription from remote {$oprofile->uri} to local {$this->user->nickname}"); - Subscription::cancel($oprofile->localProfile(), $this->user->getProfile()); - } else { - common_log(LOG_ERR, "Can't cancel subscription from remote, didn't find the profile"); + common_log(LOG_INFO, sprintf('Canceling subscription from remote %s to local %s', $this->oprofile->getUri(), $this->target->getNickname())); + try { + Subscription::cancel($this->actor, $this->target); + } catch (NoProfileException $e) { + common_debug('Could not find profile for Subscription: '.$e->getMessage()); } } - /** - * Remote user likes one of our posts. - * Confirm the post is ours, and save a local favorite event. - */ - - function handleFavorite() + function handleTag() { - $notice = $this->getNotice($this->activity->objects[0]); - $profile = $this->ensureProfile()->localProfile(); + if ($this->activity->target->type == ActivityObject::_LIST) { + if ($this->activity->objects[0]->type != ActivityObject::PERSON) { + // TRANS: Client exception. + throw new ClientException(_m('Not a person object.')); + } + // this is a peopletag + $tagged = User::getKV('uri', $this->activity->objects[0]->id); - $old = Fave::pkeyGet(array('user_id' => $profile->id, - 'notice_id' => $notice->id)); + if (!$tagged instanceof User) { + // TRANS: Client exception. + throw new ClientException(_m('Unidentified profile being listed.')); + } - if (!empty($old)) { - // TRANS: Client exception. - throw new ClientException(_('This is already a favorite.')); - } + if ($tagged->id !== $this->target->id) { + // TRANS: Client exception. + throw new ClientException(_m('This user is not the one being listed.')); + } + + // save the list + $list = Ostatus_profile::ensureActivityObjectProfile($this->activity->target); - if (!Fave::addNew($profile, $notice)) { - // TRANS: Client exception. - throw new ClientException(_m('Could not save new favorite.')); + $ptag = $list->localPeopletag(); + $result = Profile_tag::setTag($ptag->tagger, $tagged->id, $ptag->tag); + if (!$result) { + // TRANS: Client exception. + throw new ClientException(_m('The listing could not be saved.')); + } } } - /** - * Remote user doesn't like one of our posts after all! - * Confirm the post is ours, and save a local favorite event. - */ - function handleUnfavorite() + function handleUntag() { - $notice = $this->getNotice($this->activity->objects[0]); - $profile = $this->ensureProfile()->localProfile(); + if ($this->activity->target->type == ActivityObject::_LIST) { + if ($this->activity->objects[0]->type != ActivityObject::PERSON) { + // TRANS: Client exception. + throw new ClientException(_m('Not a person object.')); + } + // this is a peopletag + $tagged = User::getKV('uri', $this->activity->objects[0]->id); - $fave = Fave::pkeyGet(array('user_id' => $profile->id, - 'notice_id' => $notice->id)); - if (empty($fave)) { - // TRANS: Client exception. - throw new ClientException(_('Notice wasn\'t favorited!')); - } + if (!$tagged instanceof User) { + // TRANS: Client exception. + throw new ClientException(_m('Unidentified profile being unlisted.')); + } - $fave->delete(); + if ($tagged->id !== $this->target->id) { + // TRANS: Client exception. + throw new ClientException(_m('This user is not the one being unlisted.')); + } + + // save the list + $list = Ostatus_profile::ensureActivityObjectProfile($this->activity->target); + + $ptag = $list->localPeopletag(); + $result = Profile_tag::unTag($ptag->tagger, $tagged->id, $ptag->tag); + + if (!$result) { + // TRANS: Client exception. + throw new ClientException(_m('The listing could not be deleted.')); + } + } } /** @@ -190,13 +200,8 @@ class UsersalmonAction extends SalmonAction * @return Notice * @throws ClientException on invalid input */ - function getNotice($object) + function getNotice(ActivityObject $object) { - if (!$object) { - // TRANS: Client exception. - throw new ClientException(_m('Can\'t favorite/unfavorite without an object.')); - } - switch ($object->type) { case ActivityObject::ARTICLE: case ActivityObject::BLOGENTRY: @@ -206,19 +211,19 @@ class UsersalmonAction extends SalmonAction break; default: // TRANS: Client exception. - throw new ClientException(_m('Can\'t handle that kind of object for liking/faving.')); + throw new ClientException(_m('Cannot handle that kind of object for liking/faving.')); } - $notice = Notice::staticGet('uri', $object->id); + $notice = Notice::getKV('uri', $object->id); - if (empty($notice)) { + if (!$notice instanceof Notice) { // TRANS: Client exception. %s is an object ID. throw new ClientException(sprintf(_m('Notice with ID %s unknown.'),$object->id)); } - if ($notice->profile_id != $this->user->id) { + if ($notice->profile_id != $this->target->id) { // TRANS: Client exception. %1$s is a notice ID, %2$s is a user ID. - throw new ClientException(sprintf(_m('Notice with ID %1$s not posted by %2$s.'),$object->id,$this->user->id)); + throw new ClientException(sprintf(_m('Notice with ID %1$s not posted by %2$s.'), $object->id, $this->target->id)); } return $notice;