541 lines
18 KiB
PHP
541 lines
18 KiB
PHP
<?php
|
|
/**
|
|
* @copyright Copyright (C) 2010-2022, 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/>.
|
|
*
|
|
* The events module
|
|
*/
|
|
|
|
use Friendica\App;
|
|
use Friendica\Content\Nav;
|
|
use Friendica\Content\Widget\CalendarExport;
|
|
use Friendica\Core\ACL;
|
|
use Friendica\Core\Logger;
|
|
use Friendica\Core\Protocol;
|
|
use Friendica\Core\Renderer;
|
|
use Friendica\Core\System;
|
|
use Friendica\Core\Theme;
|
|
use Friendica\Core\Worker;
|
|
use Friendica\Database\DBA;
|
|
use Friendica\DI;
|
|
use Friendica\Model\Conversation;
|
|
use Friendica\Model\Event;
|
|
use Friendica\Model\Item;
|
|
use Friendica\Model\Post;
|
|
use Friendica\Model\User;
|
|
use Friendica\Module\BaseProfile;
|
|
use Friendica\Module\Security\Login;
|
|
use Friendica\Util\DateTimeFormat;
|
|
use Friendica\Util\Strings;
|
|
use Friendica\Util\Temporal;
|
|
use Friendica\Worker\Delivery;
|
|
|
|
function events_init(App $a)
|
|
{
|
|
if (!DI::userSession()->getLocalUserId()) {
|
|
return;
|
|
}
|
|
|
|
if (empty(DI::page()['aside'])) {
|
|
DI::page()['aside'] = '';
|
|
}
|
|
|
|
$cal_widget = CalendarExport::getHTML(DI::userSession()->getLocalUserId());
|
|
|
|
DI::page()['aside'] .= $cal_widget;
|
|
|
|
return;
|
|
}
|
|
|
|
function events_post(App $a)
|
|
{
|
|
Logger::debug('post', ['request' => $_REQUEST]);
|
|
if (!DI::userSession()->getLocalUserId()) {
|
|
return;
|
|
}
|
|
|
|
$event_id = !empty($_POST['event_id']) ? intval($_POST['event_id']) : 0;
|
|
$cid = !empty($_POST['cid']) ? intval($_POST['cid']) : 0;
|
|
$uid = DI::userSession()->getLocalUserId();
|
|
|
|
$start_text = Strings::escapeHtml($_REQUEST['start_text'] ?? '');
|
|
$finish_text = Strings::escapeHtml($_REQUEST['finish_text'] ?? '');
|
|
|
|
$nofinish = intval($_POST['nofinish'] ?? 0);
|
|
|
|
$share = intval($_POST['share'] ?? 0);
|
|
|
|
// The default setting for the `private` field in event_store() is false, so mirror that
|
|
$private_event = false;
|
|
|
|
$start = DBA::NULL_DATETIME;
|
|
$finish = DBA::NULL_DATETIME;
|
|
|
|
if ($start_text) {
|
|
$start = $start_text;
|
|
}
|
|
|
|
if ($finish_text) {
|
|
$finish = $finish_text;
|
|
}
|
|
|
|
$start = DateTimeFormat::convert($start, 'UTC', $a->getTimeZone());
|
|
if (!$nofinish) {
|
|
$finish = DateTimeFormat::convert($finish, 'UTC', $a->getTimeZone());
|
|
}
|
|
|
|
// Don't allow the event to finish before it begins.
|
|
// It won't hurt anything, but somebody will file a bug report
|
|
// and we'll waste a bunch of time responding to it. Time that
|
|
// could've been spent doing something else.
|
|
|
|
$summary = trim($_POST['summary'] ?? '');
|
|
$desc = trim($_POST['desc'] ?? '');
|
|
$location = trim($_POST['location'] ?? '');
|
|
$type = 'event';
|
|
|
|
$params = [
|
|
'summary' => $summary,
|
|
'description' => $desc,
|
|
'location' => $location,
|
|
'start' => $start_text,
|
|
'finish' => $finish_text,
|
|
'nofinish' => $nofinish,
|
|
];
|
|
|
|
$action = ($event_id == '') ? 'new' : 'event/' . $event_id;
|
|
$onerror_path = 'events/' . $action . '?' . http_build_query($params, '', '&', PHP_QUERY_RFC3986);
|
|
|
|
if (strcmp($finish, $start) < 0 && !$nofinish) {
|
|
DI::sysmsg()->addNotice(DI::l10n()->t('Event can not end before it has started.'));
|
|
if (intval($_REQUEST['preview'])) {
|
|
System::httpExit(DI::l10n()->t('Event can not end before it has started.'));
|
|
}
|
|
DI::baseUrl()->redirect($onerror_path);
|
|
}
|
|
|
|
if (!$summary || ($start === DBA::NULL_DATETIME)) {
|
|
DI::sysmsg()->addNotice(DI::l10n()->t('Event title and start time are required.'));
|
|
if (intval($_REQUEST['preview'])) {
|
|
System::httpExit(DI::l10n()->t('Event title and start time are required.'));
|
|
}
|
|
DI::baseUrl()->redirect($onerror_path);
|
|
}
|
|
|
|
$self = \Friendica\Model\Contact::getPublicIdByUserId($uid);
|
|
|
|
$aclFormatter = DI::aclFormatter();
|
|
|
|
if ($share) {
|
|
$user = User::getById($uid, ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid']);
|
|
if (!DBA::isResult |