2023-09-20 21:39:05 +00:00
< ? php
/**
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
*
* @ license GNU AGPL version 3 or any later version
*
* This program 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 .
*
* This program 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 this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
namespace Friendica\Module\Settings ;
use Friendica\App ;
2023-10-07 05:44:24 -04:00
use Friendica\Content\Conversation\Factory ;
use Friendica\Content\Conversation\Repository\UserDefinedChannel ;
2023-09-20 21:39:05 +00:00
use Friendica\Core\L10n ;
use Friendica\Core\Renderer ;
use Friendica\Core\Session\Capability\IHandleUserSessions ;
2023-09-24 00:45:07 +00:00
use Friendica\Model\Circle ;
2023-09-20 21:39:05 +00:00
use Friendica\Module\BaseSettings ;
use Friendica\Module\Response ;
use Friendica\Network\HTTPException ;
use Friendica\Util\Profiler ;
use Psr\Log\LoggerInterface ;
class Channels extends BaseSettings
{
2023-10-07 05:44:24 -04:00
/** @var UserDefinedChannel */
2023-09-20 21:39:05 +00:00
private $channel ;
2023-10-07 05:44:24 -04:00
/** @var Factory\UserDefinedChannel */
private $userDefinedChannel ;
2023-09-20 21:39:05 +00:00
2023-10-07 05:44:24 -04:00
public function __construct ( Factory\UserDefinedChannel $userDefinedChannel , UserDefinedChannel $channel , App\Page $page , IHandleUserSessions $session , L10n $l10n , App\BaseURL $baseUrl , App\Arguments $args , LoggerInterface $logger , Profiler $profiler , Response $response , array $server , array $parameters = [])
2023-09-20 21:39:05 +00:00
{
parent :: __construct ( $session , $page , $l10n , $baseUrl , $args , $logger , $profiler , $response , $server , $parameters );
2023-10-07 05:44:24 -04:00
$this -> userDefinedChannel = $userDefinedChannel ;
$this -> channel = $channel ;
2023-09-20 21:39:05 +00:00
}
protected function post ( array $request = [])
{
$uid = $this -> session -> getLocalUserId ();
if ( ! $uid ) {
throw new HTTPException\ForbiddenException ( $this -> t ( 'Permission denied.' ));
}
if ( empty ( $request [ 'edit_channel' ]) && empty ( $request [ 'add_channel' ])) {
return ;
}
self :: checkFormSecurityTokenRedirectOnError ( '/settings/channels' , 'settings_channels' );
if ( ! empty ( $request [ 'add_channel' ])) {
2023-10-07 05:44:24 -04:00
$channel = $this -> userDefinedChannel -> createFromTableRow ([
2023-09-20 21:39:05 +00:00
'label' => $request [ 'new_label' ],
'description' => $request [ 'new_description' ],
'access-key' => substr ( mb_strtolower ( $request [ 'new_access_key' ]), 0 , 1 ),
'uid' => $uid ,
2023-09-24 00:45:07 +00:00
'circle' => ( int ) $request [ 'new_circle' ],
2023-09-20 21:39:05 +00:00
'include-tags' => $this -> cleanTags ( $request [ 'new_include_tags' ]),
'exclude-tags' => $this -> cleanTags ( $request [ 'new_exclude_tags' ]),
2023-10-14 18:39:35 +00:00
'full-text-search' => $request [ 'new_text_search' ],
2023-09-20 21:39:05 +00:00
'media-type' => ( $request [ 'new_image' ] ? 1 : 0 ) | ( $request [ 'new_video' ] ? 2 : 0 ) | ( $request [ 'new_audio' ] ? 4 : 0 ),
]);
$saved = $this -> channel -> save ( $channel );
$this -> logger -> debug ( 'New channel added' , [ 'saved' => $saved ]);
return ;
}
2023-11-21 23:13:26 +00:00
foreach ( array_keys (( array ) $request [ 'label' ]) as $id ) {
2023-09-20 21:39:05 +00:00
if ( $request [ 'delete' ][ $id ]) {
$success = $this -> channel -> deleteById ( $id , $uid );
$this -> logger -> debug ( 'Channel deleted' , [ 'id' => $id , 'success' => $success ]);
continue ;
}
2023-10-07 05:44:24 -04:00
$channel = $this -> userDefinedChannel -> createFromTableRow ([
2023-09-20 21:39:05 +00:00
'id' => $id ,
'label' => $request [ 'label' ][ $id ],
'description' => $request [ 'description' ][ $id ],
'access-key' => substr ( mb_strtolower ( $request [ 'access_key' ][ $id ]), 0 , 1 ),
'uid' => $uid ,
2023-09-24 00:45:07 +00:00
'circle' => ( int ) $request [ 'circle' ][ $id ],
2023-09-20 21:39:05 +00:00
'include-tags' => $this -> cleanTags ( $request [ 'include_tags' ][ $id ]),
'exclude-tags' => $this -> cleanTags ( $request [ 'exclude_tags' ][ $id ]),
2023-10-14 18:39:35 +00:00
'full-text-search' => $request [ 'text_search' ][ $id ],
2023-09-20 21:39:05 +00:00
'media-type' => ( $request [ 'image' ][ $id ] ? 1 : 0 ) | ( $request [ 'video' ][ $id ] ? 2 : 0 ) | ( $request [ 'audio' ][ $id ] ? 4 : 0 ),
]);
$saved = $this -> channel -> save ( $channel );
$this -> logger -> debug ( 'Save channel' , [ 'id' => $id , 'saved' => $saved ]);
}
$this -> baseUrl -> redirect ( '/settings/channels' );
}
protected function content ( array $request = []) : string
{
parent :: content ();
$uid = $this -> session -> getLocalUserId ();
if ( ! $uid ) {
throw new HTTPException\ForbiddenException ( $this -> t ( 'Permission denied.' ));
}
2023-09-24 00:45:07 +00:00
$circles = [
0 => $this -> l10n -> t ( 'Global Community' ),
2023-11-21 23:13:26 +00:00
- 3 => $this -> l10n -> t ( 'Network' ),
2023-09-24 00:45:07 +00:00
- 1 => $this -> l10n -> t ( 'Following' ),
- 2 => $this -> l10n -> t ( 'Followers' ),
];
2023-09-26 05:05:51 +00:00
foreach ( Circle :: getByUserId ( $uid ) as $circle ) {
2023-09-24 00:45:07 +00:00
$circles [ $circle [ 'id' ]] = $circle [ 'name' ];
}
2023-12-16 21:43:01 +00:00
$id = 0 ;
$channels = [];
2023-09-20 21:39:05 +00:00
foreach ( $this -> channel -> selectByUid ( $uid ) as $channel ) {
2023-12-16 21:43:01 +00:00
$channels [] = [
'id' => ++ $id ,
2023-09-20 21:39:05 +00:00
'label' => [ " label[ $channel->code ] " , $this -> t ( 'Label' ), $channel -> label , '' , $this -> t ( 'Required' )],
'description' => [ " description[ $channel->code ] " , $this -> t ( " Description " ), $channel -> description ],
'access_key' => [ " access_key[ $channel->code ] " , $this -> t ( " Access Key " ), $channel -> accessKey ],
2023-09-24 00:45:07 +00:00
'circle' => [ " circle[ $channel->code ] " , $this -> t ( 'Circle/Channel' ), $channel -> circle , '' , $circles ],
2023-10-14 18:39:35 +00:00
'include_tags' => [ " include_tags[ $channel->code ] " , $this -> t ( " Include Tags " ), str_replace ( ',' , ', ' , $channel -> includeTags )],
'exclude_tags' => [ " exclude_tags[ $channel->code ] " , $this -> t ( " Exclude Tags " ), str_replace ( ',' , ', ' , $channel -> excludeTags )],
2023-09-21 23:27:05 +00:00
'text_search' => [ " text_search[ $channel->code ] " , $this -> t ( " Full Text Search " ), $channel -> fullTextSearch ],
2023-09-20 21:39:05 +00:00
'image' => [ " image[ $channel->code ] " , $this -> t ( " Images " ), $channel -> mediaType & 1 ],
'video' => [ " video[ $channel->code ] " , $this -> t ( " Videos " ), $channel -> mediaType & 2 ],
'audio' => [ " audio[ $channel->code ] " , $this -> t ( " Audio " ), $channel -> mediaType & 4 ],
'delete' => [ " delete[ $channel->code ] " , $this -> t ( " Delete channel " ) . ' (' . $channel -> label . ')' , false , $this -> t ( " Check to delete this entry from the channel list " )]
];
}
$t = Renderer :: getMarkupTemplate ( 'settings/channels.tpl' );
return Renderer :: replaceMacros ( $t , [
'label' => [ " new_label " , $this -> t ( 'Label' ), '' , $this -> t ( 'Short name for the channel. It is displayed on the channels widget.' ), $this -> t ( 'Required' )],
'description' => [ " new_description " , $this -> t ( " Description " ), '' , $this -> t ( 'This should describe the content of the channel in a few word.' )],
2023-09-23 14:46:15 +00:00
'access_key' => [ " new_access_key " , $this -> t ( " Access Key " ), '' , $this -> t ( 'When you want to access this channel via an access key, you can define it here. Pay attention to not use an already used one.' )],
2023-09-24 00:45:07 +00:00
'circle' => [ 'new_circle' , $this -> t ( 'Circle/Channel' ), 0 , $this -> t ( 'Select a circle or channel, that your channel should be based on.' ), $circles ],
2023-09-20 21:39:05 +00:00
'include_tags' => [ " new_include_tags " , $this -> t ( " Include Tags " ), '' , $this -> t ( 'Comma separated list of tags. A post will be used when it contains any of the listed tags.' )],
'exclude_tags' => [ " new_exclude_tags " , $this -> t ( " Exclude Tags " ), '' , $this -> t ( 'Comma separated list of tags. If a post contain any of these tags, then it will not be part of nthis channel.' )],
2023-09-23 14:46:15 +00:00
'text_search' => [ " new_text_search " , $this -> t ( " Full Text Search " ), '' , $this -> t ( 'Search terms for the body, supports the "boolean mode" operators from MariaDB. See the help for a complete list of operators and additional keywords: %s' , '<a href="help/Channels">help/Channels</a>' )],
2023-09-20 21:39:05 +00:00
'image' => [ 'new_image' , $this -> t ( " Images " ), false , $this -> t ( " Check to display images in the channel. " )],
'video' => [ " new_video " , $this -> t ( " Videos " ), false , $this -> t ( " Check to display videos in the channel. " )],
'audio' => [ " new_audio " , $this -> t ( " Audio " ), false , $this -> t ( " Check to display audio in the channel. " )],
2023-09-20 21:42:37 +00:00
'$l10n' => [
2023-09-20 21:39:05 +00:00
'title' => $this -> t ( 'Channels' ),
'intro' => $this -> t ( 'This page can be used to define your own channels.' ),
'addtitle' => $this -> t ( 'Add new entry to the channel list' ),
'addsubmit' => $this -> t ( 'Add' ),
'savechanges' => $this -> t ( 'Save' ),
'currenttitle' => $this -> t ( 'Current Entries in the channel list' ),
'thurl' => $this -> t ( 'Blocked server domain pattern' ),
'threason' => $this -> t ( 'Reason for the block' ),
'delentry' => $this -> t ( 'Delete entry from the channel list' ),
'confirm_delete' => $this -> t ( 'Delete entry from the channel list?' ),
],
2023-12-16 21:43:01 +00:00
'$entries' => $channels ,
2023-09-20 21:39:05 +00:00
'$baseurl' => $this -> baseUrl ,
'$form_security_token' => self :: getFormSecurityToken ( 'settings_channels' ),
]);
}
private function cleanTags ( string $tag_list ) : string
{
$tags = [];
2023-09-20 21:42:37 +00:00
2023-09-20 21:39:05 +00:00
$tagitems = explode ( ',' , mb_strtolower ( $tag_list ));
foreach ( $tagitems as $tag ) {
$tag = trim ( $tag , '# ' );
if ( ! empty ( $tag )) {
2023-10-14 18:39:35 +00:00
$tags [] = preg_replace ( '#\s#u' , '' , $tag );
2023-09-20 21:39:05 +00:00
}
}
return implode ( ',' , $tags );
}
}