2019-07-15 01:49:38 +00:00
< ? php
2020-02-09 14:45:36 +00:00
/**
2023-01-01 14:36:24 +00:00
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
2020-02-09 14:45:36 +00:00
*
* @ 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 />.
*
*/
2019-07-15 01:49:38 +00:00
namespace Friendica\Module\Item ;
2021-08-01 13:01:31 +00:00
use DateTime ;
2022-10-16 15:24:50 +00:00
use Friendica\App ;
2019-07-15 01:49:38 +00:00
use Friendica\BaseModule ;
use Friendica\Content\Feature ;
2019-11-28 17:53:12 +00:00
use Friendica\Core\ACL ;
2022-10-16 15:49:27 +00:00
use Friendica\Core\Config\Capability\IManageConfigValues ;
2019-07-15 01:49:38 +00:00
use Friendica\Core\Hook ;
2022-10-16 15:24:50 +00:00
use Friendica\Core\L10n ;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues ;
2019-07-15 01:49:38 +00:00
use Friendica\Core\Renderer ;
2019-11-28 17:53:12 +00:00
use Friendica\Core\Theme ;
2022-04-13 05:31:32 +00:00
use Friendica\Database\DBA ;
2019-12-15 21:34:11 +00:00
use Friendica\DI ;
2021-07-24 11:49:11 +00:00
use Friendica\Model\Contact ;
2019-07-15 01:49:38 +00:00
use Friendica\Model\Item ;
use Friendica\Model\User ;
2022-10-16 15:24:50 +00:00
use Friendica\Module\Response ;
2019-12-27 21:19:28 +00:00
use Friendica\Module\Security\Login ;
2022-10-16 15:24:50 +00:00
use Friendica\Navigation\SystemMessages ;
2019-07-15 01:49:38 +00:00
use Friendica\Network\HTTPException\NotImplementedException ;
2022-10-16 15:24:50 +00:00
use Friendica\Util\ACLFormatter ;
2019-07-15 01:49:38 +00:00
use Friendica\Util\Crypto ;
2022-10-16 15:24:50 +00:00
use Friendica\Util\Profiler ;
2021-08-01 13:01:31 +00:00
use Friendica\Util\Temporal ;
2022-10-16 15:24:50 +00:00
use Psr\Log\LoggerInterface ;
2019-07-15 01:49:38 +00:00
class Compose extends BaseModule
{
2022-10-16 15:24:50 +00:00
/** @var SystemMessages */
private $systemMessages ;
/** @var ACLFormatter */
private $ACLFormatter ;
/** @var App\Page */
private $page ;
/** @var IManagePersonalConfigValues */
private $pConfig ;
2022-10-16 15:49:27 +00:00
/** @var IManageConfigValues */
private $config ;
public function __construct ( IManageConfigValues $config , IManagePersonalConfigValues $pConfig , App\Page $page , ACLFormatter $ACLFormatter , SystemMessages $systemMessages , L10n $l10n , App\BaseURL $baseUrl , App\Arguments $args , LoggerInterface $logger , Profiler $profiler , Response $response , array $server , array $parameters = [])
2022-10-16 15:24:50 +00:00
{
parent :: __construct ( $l10n , $baseUrl , $args , $logger , $profiler , $response , $server , $parameters );
$this -> systemMessages = $systemMessages ;
$this -> ACLFormatter = $ACLFormatter ;
$this -> page = $page ;
$this -> pConfig = $pConfig ;
2022-10-16 15:49:27 +00:00
$this -> config = $config ;
2022-10-16 15:24:50 +00:00
}
2021-11-28 12:44:42 +00:00
protected function post ( array $request = [])
2019-07-15 01:49:38 +00:00
{
if ( ! empty ( $_REQUEST [ 'body' ])) {
$_REQUEST [ 'return' ] = 'network' ;
require_once 'mod/item.php' ;
2019-12-15 21:34:11 +00:00
item_post ( DI :: app ());
2019-07-15 01:49:38 +00:00
} else {
2022-10-16 15:24:50 +00:00
$this -> systemMessages -> addNotice ( $this -> l10n -> t ( 'Please enter a post body.' ));
2019-07-15 01:49:38 +00:00
}
}
2021-11-20 14:38:03 +00:00
protected function content ( array $request = []) : string
2019-07-15 01:49:38 +00:00
{
2022-10-20 20:59:12 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2022-10-16 15:24:50 +00:00
return Login :: form ( 'compose' );
2019-07-15 01:49:38 +00:00
}
2019-12-15 21:34:11 +00:00
$a = DI :: app ();
2019-07-15 01:49:38 +00:00
if ( $a -> getCurrentTheme () !== 'frio' ) {
2022-10-16 15:24:50 +00:00
throw new NotImplementedException ( $this -> l10n -> t ( 'This feature is only available with the frio theme.' ));
2019-07-15 01:49:38 +00:00
}
2021-11-14 22:19:25 +00:00
$posttype = $this -> parameters [ 'type' ] ? ? Item :: PT_ARTICLE ;
2019-07-15 01:49:38 +00:00
if ( ! in_array ( $posttype , [ Item :: PT_ARTICLE , Item :: PT_PERSONAL_NOTE ])) {
switch ( $posttype ) {
2019-07-27 22:06:47 +00:00
case 'note' :
$posttype = Item :: PT_PERSONAL_NOTE ;
break ;
default :
$posttype = Item :: PT_ARTICLE ;
break ;
2019-07-15 01:49:38 +00:00
}
}
2022-10-20 20:59:12 +00:00
$user = User :: getById ( DI :: userSession () -> getLocalUserId (), [ 'allow_cid' , 'allow_gid' , 'deny_cid' , 'deny_gid' , 'default-location' ]);
2019-07-15 01:49:38 +00:00
2022-10-16 15:24:50 +00:00
$contact_allow_list = $this -> ACLFormatter -> expand ( $user [ 'allow_cid' ]);
$group_allow_list = $this -> ACLFormatter -> expand ( $user [ 'allow_gid' ]);
$contact_deny_list = $this -> ACLFormatter -> expand ( $user [ 'deny_cid' ]);
$group_deny_list = $this -> ACLFormatter -> expand ( $user [ 'deny_gid' ]);
2019-11-28 17:53:12 +00:00
2019-07-15 01:49:38 +00:00
switch ( $posttype ) {
case Item :: PT_PERSONAL_NOTE :
2022-10-16 15:24:50 +00:00
$compose_title = $this -> l10n -> t ( 'Compose new personal note' );
2019-07-15 01:49:38 +00:00
$type = 'note' ;
2019-07-15 02:48:08 +00:00
$doesFederate = false ;
2021-07-24 20:34:07 +00:00
$contact_allow_list = [ $a -> getContactId ()];
2019-11-28 17:53:12 +00:00
$group_allow_list = [];
$contact_deny_list = [];
$group_deny_list = [];
2019-07-15 01:49:38 +00:00
break ;
default :
2022-10-16 15:24:50 +00:00
$compose_title = $this -> l10n -> t ( 'Compose new post' );
2019-07-15 01:49:38 +00:00
$type = 'post' ;
2019-07-15 02:48:08 +00:00
$doesFederate = true ;
2019-11-28 17:53:12 +00:00
2019-12-19 12:48:08 +00:00
$contact_allow = $_REQUEST [ 'contact_allow' ] ? ? '' ;
$group_allow = $_REQUEST [ 'group_allow' ] ? ? '' ;
$contact_deny = $_REQUEST [ 'contact_deny' ] ? ? '' ;
$group_deny = $_REQUEST [ 'group_deny' ] ? ? '' ;
if ( $contact_allow
. $group_allow
. $contact_deny
. $group_deny )
2019-11-28 17:53:12 +00:00
{
2019-12-19 12:48:08 +00:00
$contact_allow_list = $contact_allow ? explode ( ',' , $contact_allow ) : [];
$group_allow_list = $group_allow ? explode ( ',' , $group_allow ) : [];
$contact_deny_list = $contact_deny ? explode ( ',' , $contact_deny ) : [];
$group_deny_list = $group_deny ? explode ( ',' , $group_deny ) : [];
2019-11-28 17:53:12 +00:00
}
2019-07-15 01:49:38 +00:00
break ;
}
$title = $_REQUEST [ 'title' ] ? ? '' ;
$category = $_REQUEST [ 'category' ] ? ? '' ;
$body = $_REQUEST [ 'body' ] ? ? '' ;
$location = $_REQUEST [ 'location' ] ? ? $user [ 'default-location' ];
$wall = $_REQUEST [ 'wall' ] ? ? $type == 'post' ;
2019-07-15 02:48:08 +00:00
2019-07-15 01:49:38 +00:00
$jotplugins = '' ;
Hook :: callAll ( 'jot_tool' , $jotplugins );
// Output
2022-10-16 15:24:50 +00:00
$this -> page -> registerFooterScript ( Theme :: getPathForFile ( 'js/ajaxupload.js' ));
$this -> page -> registerFooterScript ( Theme :: getPathForFile ( 'js/linkPreview.js' ));
$this -> page -> registerFooterScript ( Theme :: getPathForFile ( 'js/compose.js' ));
2021-07-24 20:34:07 +00:00
$contact = Contact :: getById ( $a -> getContactId ());
2021-07-24 11:49:11 +00:00
2022-10-20 20:59:12 +00:00
if ( $this -> pConfig -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'set_creation_date' )) {
2022-04-13 05:31:32 +00:00
$created_at = Temporal :: getDateTimeField (
new \DateTime ( DBA :: NULL_DATETIME ),
new \DateTime ( 'now' ),
null ,
$this -> l10n -> t ( 'Created at' ),
'created_at'
);
} else {
$created_at = '' ;
}
2019-07-15 01:49:38 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'item/compose.tpl' );
return Renderer :: replaceMacros ( $tpl , [
2022-10-16 15:24:50 +00:00
'$l10n' => [
'compose_title' => $compose_title ,
'default' => '' ,
'visibility_title' => $this -> l10n -> t ( 'Visibility' ),
'mytitle' => $this -> l10n -> t ( 'This is you' ),
'submit' => $this -> l10n -> t ( 'Submit' ),
'edbold' => $this -> l10n -> t ( 'Bold' ),
'editalic' => $this -> l10n -> t ( 'Italic' ),
'eduline' => $this -> l10n -> t ( 'Underline' ),
'edquote' => $this -> l10n -> t ( 'Quote' ),
'edcode' => $this -> l10n -> t ( 'Code' ),
'edimg' => $this -> l10n -> t ( 'Image' ),
'edurl' => $this -> l10n -> t ( 'Link' ),
'edattach' => $this -> l10n -> t ( 'Link or Media' ),
'prompttext' => $this -> l10n -> t ( 'Please enter a image/video/audio/webpage URL:' ),
'preview' => $this -> l10n -> t ( 'Preview' ),
'location_set' => $this -> l10n -> t ( 'Set your location' ),
'location_clear' => $this -> l10n -> t ( 'Clear the location' ),
'location_unavailable' => $this -> l10n -> t ( 'Location services are unavailable on your device' ),
'location_disabled' => $this -> l10n -> t ( 'Location services are disabled. Please check the website\'s permissions on your device' ),
'wait' => $this -> l10n -> t ( 'Please wait' ),
'placeholdertitle' => $this -> l10n -> t ( 'Set title' ),
2022-10-20 20:59:12 +00:00
'placeholdercategory' => Feature :: isEnabled ( DI :: userSession () -> getLocalUserId (), 'categories' ) ? $this -> l10n -> t ( 'Categories (comma-separated list)' ) : '' ,
'always_open_compose' => $this -> pConfig -> get ( DI :: userSession () -> getLocalUserId (), 'frio' , 'always_open_compose' ,
2022-10-16 15:49:27 +00:00
$this -> config -> get ( 'frio' , 'always_open_compose' , false )) ? '' :
$this -> l10n -> t ( 'You can make this page always open when you use the New Post button in the <a href="/settings/display">Theme Customization settings</a>.' ),
2022-10-16 15:24:50 +00:00
],
2019-07-15 01:49:38 +00:00
'$id' => 0 ,
'$posttype' => $posttype ,
'$type' => $type ,
'$wall' => $wall ,
2022-10-16 15:24:50 +00:00
'$mylink' => $this -> baseUrl -> remove ( $contact [ 'url' ]),
'$myphoto' => $this -> baseUrl -> remove ( $contact [ 'thumb' ]),
2021-08-01 13:01:31 +00:00
'$scheduled_at' => Temporal :: getDateTimeField (
new DateTime (),
2021-09-14 21:59:05 +00:00
new DateTime ( 'now + 6 months' ),
2021-08-01 13:01:31 +00:00
null ,
2022-10-16 15:24:50 +00:00
$this -> l10n -> t ( 'Scheduled at' ),
2021-09-14 21:59:05 +00:00
'scheduled_at'
2021-08-01 13:01:31 +00:00
),
2022-04-13 05:31:32 +00:00
'$created_at' => $created_at ,
2019-07-15 01:49:38 +00:00
'$title' => $title ,
'$category' => $category ,
'$body' => $body ,
'$location' => $location ,
2019-11-28 17:53:12 +00:00
'$contact_allow' => implode ( ',' , $contact_allow_list ),
'$group_allow' => implode ( ',' , $group_allow_list ),
'$contact_deny' => implode ( ',' , $contact_deny_list ),
'$group_deny' => implode ( ',' , $group_deny_list ),
2019-07-15 01:49:38 +00:00
'$jotplugins' => $jotplugins ,
2019-11-28 17:53:12 +00:00
'$rand_num' => Crypto :: randomDigits ( 12 ),
2022-10-16 15:24:50 +00:00
'$acl_selector' => ACL :: getFullSelectorHTML ( $this -> page , $a -> getLoggedInUserId (), $doesFederate , [
2019-11-28 17:53:12 +00:00
'allow_cid' => $contact_allow_list ,
'allow_gid' => $group_allow_list ,
'deny_cid' => $contact_deny_list ,
'deny_gid' => $group_deny_list ,
]),
2023-03-13 12:47:09 +00:00
// Dropzone
2023-03-14 15:35:18 +00:00
'$max_imagesize' => floor ( Strings :: getBytesFromShorthand ( DI :: config () -> get ( 'system' , 'maximagesize' )) / 1000000 ),
2019-07-15 01:49:38 +00:00
]);
}
}