2021-12-21 17:20:22 +00: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-23 17:13:08 +00:00
use function App\Core\I18n\_m ;
2021-12-21 17:20:22 +00:00
use App\Core\Modules\Component ;
use App\Core\Router\RouteLoader ;
2021-12-23 17:13:08 +00:00
use App\Core\Router\Router ;
2022-02-16 03:01:25 +00:00
use App\Entity\Activity ;
2021-12-23 17:13:08 +00:00
use App\Entity\Actor ;
use App\Util\Common ;
use App\Util\HTML ;
2021-12-21 17:20:22 +00:00
use App\Util\Nickname ;
2022-01-04 22:22:48 +00:00
use Component\Circle\Controller\SelfTagsSettings ;
2021-12-21 17:20:22 +00:00
use Component\Group\Controller as C ;
2021-12-27 17:27:07 +00:00
use Component\Group\Entity\LocalGroup ;
2022-02-16 03:01:25 +00:00
use Component\Notification\Notification ;
2021-12-23 17:13:08 +00:00
use Symfony\Component\HttpFoundation\Request ;
2021-12-21 17:20:22 +00:00
class Group extends Component
{
public function onAddRoute ( RouteLoader $r ) : bool
{
2022-02-15 17:13:16 +00: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-10 16:02:51 +00:00
$r -> connect ( id : 'group_create' , uri_path : '/group/new' , target : [ C\Group :: class , 'groupCreate' ]);
$r -> connect ( id : 'group_settings' , uri_path : '/group/{id<\d+>}/settings' , target : [ C\Group :: class , 'groupSettings' ]);
2021-12-21 17:20:22 +00:00
return Event :: next ;
}
2022-02-11 11:39:25 +00:00
/**
* Enqueues a notification for an Actor ( such as person or group ) which means
* it shows up in their home feed and such .
*/
public function onNewNotificationWithTargets ( Actor $sender , Activity $activity , array $targets = [], ? string $reason = null ) : bool
{
2022-02-16 03:01:25 +00:00
foreach ( $targets as $target ) {
2022-02-11 11:39:25 +00:00
if ( $target -> isGroup ()) {
// The Group announces to its subscribers
Notification :: notify ( $target , $activity , $target -> getSubscribers (), $reason );
}
}
return Event :: next ;
}
2021-12-24 09:34:13 +00:00
/**
* Add an < a href = group_settings > to the profile card for groups , if the current actor can access them
*/
2021-12-21 17:20:22 +00:00
public function onAppendCardProfile ( array $vars , array & $res ) : bool
{
2021-12-23 17:13:08 +00:00
$actor = Common :: actor ();
$group = $vars [ 'actor' ];
2022-02-15 17:13:16 +00:00
if ( ! \is_null ( $actor ) && $group -> isGroup ()) {
if ( $actor -> canModerate ( $group )) {
2022-02-16 03:01:25 +00:00
$url = Router :: url ( 'group_settings' , [ 'id' => $group -> getId ()]);
2022-02-15 17:13:16 +00: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-23 17:13:08 +00:00
}
return Event :: next ;
}
2022-02-10 16:02:51 +00:00
public function onPopulateSettingsTabs ( Request $request , string $section , array & $tabs ) : bool
2021-12-23 17:13:08 +00:00
{
if ( $section === 'profile' && $request -> get ( '_route' ) === 'group_settings' ) {
2022-02-16 03:01:25 +00:00
$group_id = ( int ) $request -> get ( 'id' );
2022-02-10 04:31:06 +00:00
$group = Actor :: getById ( $group_id );
2021-12-23 17:13:08 +00:00
$tabs [] = [
'title' => 'Self tags' ,
'desc' => 'Add or remove tags on this group' ,
'id' => 'settings-self-tags' ,
2022-01-04 22:22:48 +00:00
'controller' => SelfTagsSettings :: settingsSelfTags ( $request , $group , 'settings-self-tags-details' ),
2021-12-23 17:13:08 +00:00
];
2021-12-21 17:20:22 +00:00
}
return Event :: next ;
}
2021-12-25 11:23:25 +00:00
/**
* If in a group route , get the current group
*/
private function getGroupFromContext ( Request $request ) : ? Actor
{
if ( str_starts_with ( $request -> get ( '_route' ), 'group_actor_view_' )) {
if ( ! \is_null ( $id = $request -> get ( 'id' ))) {
return Actor :: getById (( int ) $id );
2022-01-26 20:01:37 +00:00
}
if ( ! \is_null ( $nickname = $request -> get ( 'nickname' ))) {
2021-12-27 17:27:07 +00:00
return LocalGroup :: getActorByNickname ( $nickname );
2021-12-25 11:23:25 +00:00
}
}
return null ;
}
2022-02-10 16:02:51 +00:00
public function onPostingFillTargetChoices ( Request $request , Actor $actor , array & $targets ) : bool
2021-12-25 11:23:25 +00:00
{
$group = $this -> getGroupFromContext ( $request );
if ( ! \is_null ( $group )) {
2022-02-10 04:31:06 +00:00
$nick = " ! { $group -> getNickname () } " ;
2022-01-02 20:04:52 +00:00
$targets [ $nick ] = $group -> getId ();
2021-12-25 11:23:25 +00:00
}
return Event :: next ;
}
2022-01-26 20:01:37 +00: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-10 16:02:51 +00:00
public function onPostingGetContextActor ( Request $request , Actor $actor , ? Actor & $context_actor ) : bool
2021-12-25 11:23:25 +00:00
{
$ctx = $this -> getGroupFromContext ( $request );
if ( ! \is_null ( $ctx )) {
$context_actor = $ctx ;
return Event :: stop ;
}
return Event :: next ;
}
2021-12-21 17:20:22 +00:00
}