2019-07-14 21:49:38 -04:00
< ? php
2020-02-09 09:45:36 -05:00
/**
2022-01-02 02:27:47 -05:00
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
2020-02-09 09:45:36 -05: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-14 21:49:38 -04:00
namespace Friendica\Module\Item ;
2021-08-01 09:01:31 -04:00
use DateTime ;
2022-10-16 11:24:50 -04:00
use Friendica\App ;
2019-07-14 21:49:38 -04:00
use Friendica\BaseModule ;
use Friendica\Content\Feature ;
2019-11-28 12:53:12 -05:00
use Friendica\Core\ACL ;
2022-10-16 11:49:27 -04:00
use Friendica\Core\Config\Capability\IManageConfigValues ;
2019-07-14 21:49:38 -04:00
use Friendica\Core\Hook ;
2022-10-16 11:24:50 -04:00
use Friendica\Core\L10n ;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues ;
2019-07-14 21:49:38 -04:00
use Friendica\Core\Renderer ;
2019-11-28 12:53:12 -05:00
use Friendica\Core\Theme ;
2022-04-13 01:31:32 -04:00
use Friendica\Database\DBA ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2021-07-24 07:49:11 -04:00
use Friendica\Model\Contact ;
2019-07-14 21:49:38 -04:00
use Friendica\Model\Item ;
use Friendica\Model\User ;
2022-10-16 11:24:50 -04:00
use Friendica\Module\Response ;
2019-12-27 16:19:28 -05:00
use Friendica\Module\Security\Login ;
2022-10-16 11:24:50 -04:00
use Friendica\Navigation\SystemMessages ;
2019-07-14 21:49:38 -04:00
use Friendica\Network\HTTPException\NotImplementedException ;
2022-10-16 11:24:50 -04:00
use Friendica\Util\ACLFormatter ;
2019-07-14 21:49:38 -04:00
use Friendica\Util\Crypto ;
2022-10-16 11:24:50 -04:00
use Friendica\Util\Profiler ;
2021-08-01 09:01:31 -04:00
use Friendica\Util\Temporal ;
2022-10-16 11:24:50 -04:00
use Psr\Log\LoggerInterface ;
2019-07-14 21:49:38 -04:00
class Compose extends BaseModule
{
2022-10-16 11:24:50 -04:00
/** @var SystemMessages */
private $systemMessages ;
/** @var ACLFormatter */
private $ACLFormatter ;
/** @var App\Page */
private $page ;
/** @var IManagePersonalConfigValues */
private $pConfig ;
2022-10-16 11:49:27 -04: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 11:24:50 -04: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 11:49:27 -04:00
$this -> config = $config ;
2022-10-16 11:24:50 -04:00
}
2021-11-28 07:44:42 -05:00
protected function post ( array $request = [])
2019-07-14 21:49:38 -04:00
{
if ( ! empty ( $_REQUEST [ 'body' ])) {
$_REQUEST [ 'return' ] = 'network' ;
require_once 'mod/item.php' ;
2019-12-15 16:34:11 -05:00
item_post ( DI :: app ());
2019-07-14 21:49:38 -04:00
} else {
2022-10-16 11:24:50 -04:00
$this -> systemMessages -> addNotice ( $this -> l10n -> t ( 'Please enter a post body.' ));
2019-07-14 21:49:38 -04:00
}
}
2021-11-20 09:38:03 -05:00
protected function content ( array $request = []) : string
2019-07-14 21:49:38 -04:00
{
2022-10-20 16:59:12 -04:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2022-10-16 11:24:50 -04:00
return Login :: form ( 'compose' );
2019-07-14 21:49:38 -04:00
}
2019-12-15 16:34:11 -05:00
$a = DI :: app ();
2019-07-14 21:49:38 -04:00
if ( $a -> getCurrentTheme () !== 'frio' ) {
2022-10-16 11:24:50 -04:00
throw new NotImplementedException ( $this -> l10n -> t ( 'This feature is only available with the frio theme.' ));
2019-07-14 21:49:38 -04:00
}
2021-11-14 17:19:25 -05:00
$posttype = $this -> parameters [ 'type' ] ? ? Item :: PT_ARTICLE ;
2019-07-14 21:49:38 -04:00
if ( ! in_array ( $posttype , [ Item :: PT_ARTICLE , Item :: PT_PERSONAL_NOTE ])) {
switch ( $posttype ) {
2019-07-27 18:06:47 -04:00
case 'note' :
$posttype = Item :: PT_PERSONAL_NOTE ;
break ;
default :
$posttype = Item :: PT_ARTICLE ;
break ;
2019-07-14 21:49:38 -04:00
}
}
2022-10-20 16:59:12 -04:00
$user = User :: getById ( DI :: userSession () -> getLocalUserId (), [ 'allow_cid' , 'allow_gid' , 'deny_cid' , 'deny_gid' , 'default-location' ]);
2019-07-14 21:49:38 -04:00
2022-10-16 11:24:50 -04: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 12:53:12 -05:00
2019-07-14 21:49:38 -04:00
switch ( $posttype ) {
case Item :: PT_PERSONAL_NOTE :
2022-10-16 11:24:50 -04:00
$compose_title = $this -> l10n -> t ( 'Compose new personal note' );
2019-07-14 21:49:38 -04:00
$type = 'note' ;
2019-07-14 22:48:08 -04:00
$doesFederate = false ;
2021-07-24 16:34:07 -04:00
$contact_allow_list = [ $a -> getContactId ()];
2019-11-28 12:53:12 -05:00
$group_allow_list = [];
$contact_deny_list = [];
$group_deny_list = [];
2019-07-14 21:49:38 -04:00
break ;
default :
2022-10-16 11:24:50 -04:00
$compose_title = $this -> l10n -> t ( 'Compose new post' );
2019-07-14 21:49:38 -04:00
$type = 'post' ;
2019-07-14 22:48:08 -04:00
$doesFederate = true ;
2019-11-28 12:53:12 -05:00
2019-12-19 07:48:08 -05: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 12:53:12 -05:00
{
2019-12-19 07:48:08 -05: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 12:53:12 -05:00
}
2019-07-14 21:49:38 -04:00
break ;
}
$title = $_REQUEST [ 'title' ] ? ? '' ;
$category = $_REQUEST [ 'category' ] ? ? '' ;
$body = $_REQUEST [ 'body' ] ? ? '' ;
$location = $_REQUEST [ 'location' ] ? ? $user [ 'default-location' ];
$wall = $_REQUEST [ 'wall' ] ? ? $type == 'post' ;
2019-07-14 22:48:08 -04:00
2019-07-14 21:49:38 -04:00
$jotplugins = '' ;
Hook :: callAll ( 'jot_tool' , $jotplugins );
// Output
2022-10-16 11:24:50 -04: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' ));
2019-07-14 21:49:38 -04:00
2021-07-24 16:34:07 -04:00
$contact = Contact :: getById ( $a -> getContactId ());
2021-07-24 07:49:11 -04:00
2022-10-20 16:59:12 -04:00
if ( $this -> pConfig -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'set_creation_date' )) {
2022-04-13 01:31:32 -04: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-14 21:49:38 -04:00
$tpl = Renderer :: getMarkupTemplate ( 'item/compose.tpl' );
return Renderer :: replaceMacros ( $tpl , [
2022-10-16 11:24:50 -04: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 16:59:12 -04: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 11:49:27 -04: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 11:24:50 -04:00
],
2019-07-14 21:49:38 -04:00
'$id' => 0 ,
'$posttype' => $posttype ,
'$type' => $type ,
'$wall' => $wall ,
2022-10-16 11:24:50 -04:00
'$mylink' => $this -> baseUrl -> remove ( $contact [ 'url' ]),
'$myphoto' => $this -> baseUrl -> remove ( $contact [ 'thumb' ]),
2021-08-01 09:01:31 -04:00
'$scheduled_at' => Temporal :: getDateTimeField (
new DateTime (),
2021-09-14 17:59:05 -04:00
new DateTime ( 'now + 6 months' ),
2021-08-01 09:01:31 -04:00
null ,
2022-10-16 11:24:50 -04:00
$this -> l10n -> t ( 'Scheduled at' ),
2021-09-14 17:59:05 -04:00
'scheduled_at'
2021-08-01 09:01:31 -04:00
),
2022-04-13 01:31:32 -04:00
'$created_at' => $created_at ,
2019-07-14 21:49:38 -04:00
'$title' => $title ,
'$category' => $category ,
'$body' => $body ,
'$location' => $location ,
2019-11-28 12:53:12 -05: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-14 21:49:38 -04:00
'$jotplugins' => $jotplugins ,
2019-11-28 12:53:12 -05:00
'$rand_num' => Crypto :: randomDigits ( 12 ),
2022-10-16 11:24:50 -04:00
'$acl_selector' => ACL :: getFullSelectorHTML ( $this -> page , $a -> getLoggedInUserId (), $doesFederate , [
2019-11-28 12:53:12 -05:00
'allow_cid' => $contact_allow_list ,
'allow_gid' => $group_allow_list ,
'deny_cid' => $contact_deny_list ,
'deny_gid' => $group_deny_list ,
]),
2019-07-14 21:49:38 -04:00
]);
}
}