forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			117 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| // This file is part of GNU social - https://www.gnu.org/software/social
 | |
| //
 | |
| // GNU social is free software: you can redistribute it and/or modify
 | |
| // it under the terms of the GNU Affero General Public License as published by
 | |
| // the Free Software Foundation, either version 3 of the License, or
 | |
| // (at your option) any later version.
 | |
| //
 | |
| // GNU social is distributed in the hope that it will be useful,
 | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| // GNU Affero General Public License for more details.
 | |
| //
 | |
| // You should have received a copy of the GNU Affero General Public License
 | |
| // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| /**
 | |
|  * ActivityPub implementation for GNU social
 | |
|  *
 | |
|  * @package   GNUsocial
 | |
|  *
 | |
|  * @author    Diogo Cordeiro <diogo@fc.up.pt>
 | |
|  * @copyright 2018-2019 Free Software Foundation, Inc http://www.fsf.org
 | |
|  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
 | |
|  *
 | |
|  * @see      http://www.gnu.org/software/social/
 | |
|  */
 | |
| defined('GNUSOCIAL') || die();
 | |
| 
 | |
| /**
 | |
|  * ActivityPub Like representation
 | |
|  *
 | |
|  * @category  Plugin
 | |
|  * @package   GNUsocial
 | |
|  *
 | |
|  * @author    Diogo Cordeiro <diogo@fc.up.pt>
 | |
|  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
 | |
|  */
 | |
| class Activitypub_like
 | |
| {
 | |
|     /**
 | |
|      * Generates an ActivityPub representation of a Like
 | |
|      *
 | |
|      * @author Diogo Cordeiro <diogo@fc.up.pt>
 | |
|      *
 | |
|      * @param string $actor  Actor URI
 | |
|      * @param string $object Notice URI
 | |
|      *
 | |
|      * @return array pretty array to be used in a response
 | |
|      * @author Diogo Cordeiro <diogo@fc.up.pt>
 | |
|      */
 | |
|     public static function like_to_array(string $actor, Notice $notice): array
 | |
|     {
 | |
|         $res = [
 | |
|             '@context' => 'https://www.w3.org/ns/activitystreams',
 | |
|             'id'       => common_root_url() . 'like_from_' . urlencode($actor) . '_to_' . urlencode($object),
 | |
|             'type'     => 'Like',
 | |
|             'actor'    => $actor,
 | |
|             'object'   => $object,
 | |
|         ];
 | |
|         return $res;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Save a favorite record.
 | |
|      *
 | |
|      * @param string $uri
 | |
|      * @param Profile $actor the local or remote Profile who favorites
 | |
|      * @param Notice $target the notice that is favorited
 | |
|      * @return Notice record on success
 | |
|      * @throws AlreadyFulfilledException
 | |
|      * @throws ClientException
 | |
|      * @throws NoticeSaveException
 | |
|      * @throws ServerException
 | |
|      */
 | |
|     public static function addNew(string $uri, Profile $actor, Notice $target): Notice
 | |
|     {
 | |
|         if (Fave::existsForProfile($target, $actor)) {
 | |
|             // TRANS: Client error displayed when trying to mark a notice as favorite that already is a favorite.
 | |
|             throw new AlreadyFulfilledException(_m('You have already favorited this!'));
 | |
|         }
 | |
| 
 | |
|         $act = new Activity();
 | |
|         $act->type  = ActivityObject::ACTIVITY;
 | |
|         $act->verb  = ActivityVerb::FAVORITE;
 | |
|         $act->time  = time();
 | |
|         $act->id    = $uri;
 | |
|         $act->title = _m('Favor');
 | |
|         // TRANS: Message that is the "content" of a favorite (%1$s is the actor's nickname, %2$ is the favorited
 | |
|         //        notice's nickname and %3$s is the content of the favorited notice.)
 | |
|         $act->content = sprintf(
 | |
|             _m('%1$s favorited something by %2$s: %3$s'),
 | |
|             $actor->getNickname(),
 | |
|             $target->getProfile()->getNickname(),
 | |
|             $target->getRendered()
 | |
|         );
 | |
|         $act->actor   = $actor->asActivityObject();
 | |
|         $act->target  = $target->asActivityObject();
 | |
|         $act->objects = [clone($act->target)];
 | |
| 
 | |
|         $url = common_local_url('AtomPubShowFavorite', ['profile'=>$actor->id, 'notice'=>$target->id]);
 | |
|         $act->selfLink = $url;
 | |
|         $act->editLink = $url;
 | |
| 
 | |
|         $options = [
 | |
|             'source'   => 'ActivityPub',
 | |
|             'uri'      => $act->id,
 | |
|             'url'      => $url,
 | |
|             'is_local' => ($actor->isLocal() ? Notice::LOCAL_PUBLIC : Notice::REMOTE),
 | |
|             'scope'    => $target->getScope(),
 | |
|         ];
 | |
| 
 | |
|         // saveActivity will in turn also call Fave::saveActivityObject
 | |
|         return Notice::saveActivity($act, $actor, $options);
 | |
|     }
 | |
| }
 |