2021-12-22 02:20:22 +09:00
< ? php
declare ( strict_types = 1 );
// {{{ License
// 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/>.
// }}}
namespace Component\Group ;
use App\Core\Event ;
2021-12-24 02:13:08 +09:00
use function App\Core\I18n\_m ;
2021-12-22 02:20:22 +09:00
use App\Core\Modules\Component ;
use App\Core\Router\RouteLoader ;
2021-12-24 02:13:08 +09:00
use App\Core\Router\Router ;
2022-02-16 12:01:25 +09:00
use App\Entity\Activity ;
2021-12-24 02:13:08 +09:00
use App\Entity\Actor ;
use App\Util\Common ;
use App\Util\HTML ;
2021-12-22 02:20:22 +09:00
use App\Util\Nickname ;
use Component\Group\Controller as C ;
2021-12-28 02:27:07 +09:00
use Component\Group\Entity\LocalGroup ;
2022-02-16 12:01:25 +09:00
use Component\Notification\Notification ;
2021-12-24 02:13:08 +09:00
use Symfony\Component\HttpFoundation\Request ;
2021-12-22 02:20:22 +09:00
class Group extends Component
{
public function onAddRoute ( RouteLoader $r ) : bool
{
2022-02-16 02:13:16 +09:00
$r -> connect ( id : 'group_actor_view_id' , uri_path : '/group/{id<\d+>}' , target : [ C\GroupFeed :: class , 'groupViewId' ]);
$r -> connect ( id : 'group_actor_view_nickname' , uri_path : '/!{nickname<' . Nickname :: DISPLAY_FMT . '>}' , target : [ C\GroupFeed :: class , 'groupViewNickname' ]);
2022-02-11 01:02:51 +09:00
$r -> connect ( id : 'group_create' , uri_path : '/group/new' , target : [ C\Group :: class , 'groupCreate' ]);
2022-03-08 01:17:44 +09:00
$r -> connect ( id : 'group_actor_settings' , uri_path : '/group/{id<\d+>}/settings' , target : [ C\Group :: class , 'groupSettings' ]);
2021-12-22 02:20:22 +09:00
return Event :: next ;
}
2022-02-11 20:39:25 +09:00
/**
* Enqueues a notification for an Actor ( such as person or group ) which means
* it shows up in their home feed and such .
*/
2022-03-14 03:23:19 +09:00
public function onNewNotificationStart ( Actor $sender , Activity $activity , array $targets = [], ? string $reason = null ) : bool
2022-02-11 20:39:25 +09:00
{
2022-02-16 12:01:25 +09:00
foreach ( $targets as $target ) {
2022-02-11 20:39:25 +09:00
if ( $target -> isGroup ()) {
// The Group announces to its subscribers
2022-03-14 03:23:19 +09:00
Notification :: notify (
sender : $target ,
activity : $activity ,
targets : $target -> getSubscribers (),
reason : $reason ,
);
2022-02-11 20:39:25 +09:00
}
}
return Event :: next ;
}
2021-12-24 18:34:13 +09:00
/**
2022-03-08 01:17:44 +09:00
* Add an < a href = group_actor_settings > to the profile card for groups , if the current actor can access them
2021-12-24 18:34:13 +09:00
*/
2021-12-22 02:20:22 +09:00
public function onAppendCardProfile ( array $vars , array & $res ) : bool
{
2021-12-24 02:13:08 +09:00
$actor = Common :: actor ();
$group = $vars [ 'actor' ];
2022-02-16 02:13:16 +09:00
if ( ! \is_null ( $actor ) && $group -> isGroup ()) {
if ( $actor -> canModerate ( $group )) {
2022-03-08 01:17:44 +09:00
$url = Router :: url ( 'group_actor_settings' , [ 'id' => $group -> getId ()]);
2022-02-16 02:13:16 +09:00
$res [] = HTML :: html ([ 'a' => [ 'attrs' => [ 'href' => $url , 'title' => _m ( 'Edit group settings' ), 'class' => 'profile-extra-actions' ], _m ( 'Group settings' )]]);
}
$res [] = HTML :: html ([ 'a' => [ 'attrs' => [ 'href' => Router :: url ( 'blog_post' , [ 'in' => $group -> getId ()]), 'title' => _m ( 'Make a new blog post' ), 'class' => 'profile-extra-actions' ], _m ( 'Post in blog' )]]);
2021-12-24 02:13:08 +09:00
}
return Event :: next ;
}
2021-12-25 20:23:25 +09:00
/**
* If in a group route , get the current group
*/
private function getGroupFromContext ( Request $request ) : ? Actor
{
2022-03-11 12:14:47 +09:00
if ( \is_array ( $request -> get ( 'post_note' )) && \array_key_exists ( '_next' , $request -> get ( 'post_note' ))) {
$next = parse_url ( $request -> get ( 'post_note' )[ '_next' ]);
$match = Router :: match ( $next [ 'path' ]);
$route = $match [ '_route' ];
$identifier = $match [ 'id' ] ? ? $match [ 'nickname' ] ? ? null ;
} else {
$route = $request -> get ( '_route' );
$identifier = $request -> get ( 'id' ) ? ? $request -> get ( 'nickname' );
}
if ( str_starts_with ( $route , 'group_actor_view_' )) {
switch ( $route ) {
case 'group_actor_view_nickname' :
return LocalGroup :: getActorByNickname ( $identifier );
case 'group_actor_view_id' :
2022-03-18 07:53:05 +09:00
return Actor :: getById (( int ) $identifier );
2021-12-25 20:23:25 +09:00
}
}
return null ;
}
2022-02-11 01:02:51 +09:00
public function onPostingFillTargetChoices ( Request $request , Actor $actor , array & $targets ) : bool
2021-12-25 20:23:25 +09:00
{
$group = $this -> getGroupFromContext ( $request );
if ( ! \is_null ( $group )) {
2022-02-10 13:31:06 +09:00
$nick = " ! { $group -> getNickname () } " ;
2022-01-03 05:04:52 +09:00
$targets [ $nick ] = $group -> getId ();
2021-12-25 20:23:25 +09:00
}
return Event :: next ;
}
2022-01-27 05:01:37 +09:00
/**
* Indicates the context in which Posting 's form is to be presented. Passing on $context_actor to Posting' s
* onAppendRightPostingBlock event , the Group a given $actor is currently browsing .
*
* Makes it possible to automagically fill in the targets ( aka the Group which this $request route is connected to )
* in the Posting ' s form .
*
* @ param null | Actor $context_actor Actor group , if current route is part of an existing Group set of routes
*/
2022-02-11 01:02:51 +09:00
public function onPostingGetContextActor ( Request $request , Actor $actor , ? Actor & $context_actor ) : bool
2021-12-25 20:23:25 +09:00
{
$ctx = $this -> getGroupFromContext ( $request );
if ( ! \is_null ( $ctx )) {
$context_actor = $ctx ;
return Event :: stop ;
}
return Event :: next ;
}
2021-12-22 02:20:22 +09:00
}