2017-11-24 00:09:36 +01:00
< ? php
/**
* Class for creating and rendering an incident
*/
2018-04-13 21:31:03 +02:00
class Incident implements JsonSerializable
2017-11-24 00:09:36 +01:00
{
private $id ;
private $date ;
private $end_date ;
2018-04-13 22:38:10 +02:00
private $timestamp ;
private $end_timestamp ;
2017-11-24 00:09:36 +01:00
private $text ;
private $type ;
private $title ;
private $username ;
2018-11-21 10:50:21 +01:00
private $service_id ;
private $service_name ;
2017-11-24 00:09:36 +01:00
2018-01-07 20:39:10 +01:00
/**
* Constructs service from its data.
* @param array $data incident data
*/
2017-11-24 00:09:36 +01:00
function __construct ( $data )
{
2018-01-07 20:39:10 +01:00
//TODO: Maybe get data from id?
2017-11-24 00:09:36 +01:00
$this -> id = $data [ 'status_id' ];
2018-04-13 22:38:10 +02:00
$this -> timestamp = $data [ 'time' ];
$this -> end_timestamp = $data [ 'end_time' ];
2017-11-24 00:09:36 +01:00
$this -> date = new DateTime ( " @ " . $data [ 'time' ]);
$this -> date = $this -> date -> format ( 'Y-m-d H:i:sP' );
if ( $data [ 'end_time' ] > 0 ){
$this -> end_date = new DateTime ( " @ " . $data [ 'end_time' ]);
$this -> end_date = $this -> end_date -> format ( 'Y-m-d H:i:sP' );
}
$this -> type = $data [ 'type' ];
$this -> title = $data [ 'title' ];
$this -> text = $data [ 'text' ];
$this -> username = $data [ 'username' ];
2018-11-21 10:50:21 +01:00
$this -> service_id = $data [ 'service_id' ];
$this -> service_name = $data [ 'service_name' ];
2017-11-24 00:09:36 +01:00
}
2018-01-07 20:39:10 +01:00
/**
* Deletes incident by ID.
* @param int ID
*/
2017-11-24 00:09:36 +01:00
public static function delete ( $id ){
2018-01-13 00:16:38 +01:00
global $mysqli , $message , $user ;
if ( $user -> get_rank () > 1 )
{
$stmt = $mysqli -> prepare ( " SELECT count(*) as count FROM status WHERE id= ? AND user_id = ? " );
$stmt -> bind_param ( " ii " , $id , $_SESSION [ 'user' ]);
$stmt -> execute ();
$query = $stmt -> get_result ();
if ( ! $query -> fetch_assoc ()[ 'count' ])
{
$message = _ ( " You don't have permission to do that! " );
return ;
}
}
2017-11-24 00:09:36 +01:00
$stmt = $mysqli -> prepare ( " DELETE FROM services_status WHERE status_id = ? " );
$stmt -> bind_param ( " i " , $id );
$stmt -> execute ();
$query = $stmt -> get_result ();
$stmt = $mysqli -> prepare ( " DELETE FROM status WHERE id= ? " );
$stmt -> bind_param ( " i " , $id );
$stmt -> execute ();
$query = $stmt -> get_result ();
2018-01-12 21:35:31 +01:00
header ( " Location: " . WEB_URL . " /admin " );
2017-11-24 00:09:36 +01:00
}
2018-01-07 20:39:10 +01:00
/**
* Processes submitted form and adds incident unless problem is encountered,
2018-01-18 22:59:34 +01:00
* calling this is possible only for admin or higher rank. Also checks requirements
2018-01-07 20:39:10 +01:00
* for char limits.
* @return void
*/
2017-11-24 00:09:36 +01:00
public static function add ()
{
global $mysqli , $message ;
$user_id = $_SESSION [ 'user' ];
$type = $_POST [ 'type' ];
$title = $_POST [ 'title' ];
$text = $_POST [ 'text' ];
if ( strlen ( $title ) == 0 )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please enter title " );
2017-11-24 00:09:36 +01:00
return ;
} else if ( strlen ( $title ) > 50 ){
2017-12-31 00:41:58 +01:00
$message = _ ( " Title too long! Character limit is 50 " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( strlen ( $title ) == 0 )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please enter text " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( $type == 2 && ( ! strlen ( trim ( $_POST [ 'time' ])) || ! strlen ( trim ( $_POST [ 'end_time' ]))))
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please set start and end time! Use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( empty ( $_POST [ 'services' ])){
2017-12-31 00:41:58 +01:00
$message = _ ( " Please select at least one service " );
2017-11-24 00:09:36 +01:00
}
else
{
if ( ! is_array ( $_POST [ 'services' ]))
{
$services = array ( $_POST [ 'services' ]);
}
else
{
$services = $_POST [ 'services' ];
}
2018-08-23 20:37:45 +02:00
if ( ! empty ( $_POST [ 'time' ]) && $type == 2 ){
$input_time = ( ! empty ( $_POST [ 'time_js' ]) ? $_POST [ 'time_js' ] : $_POST [ 'time' ]);
$input_end_time = ( ! empty ( $_POST [ 'end_time_js' ]) ? $_POST [ 'end_time_js' ] : $_POST [ 'end_time' ]);
2018-04-13 23:41:05 +02:00
$time = strtotime ( $input_time );
$end_time = strtotime ( $input_end_time );
2017-11-24 00:09:36 +01:00
if ( ! $time )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Start date format is not recognized. Please use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( ! $end_time )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " End date format is not recognized. Please use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
2018-08-23 20:37:45 +02:00
if ( $time >= $end_time )
{
$message = _ ( " End time is either the same or earlier than start time! " );
return ;
}
2017-11-24 00:09:36 +01:00
} else {
$time = time ();
$end_time = '' ;
}
2017-11-29 15:01:16 +01:00
$stmt = $mysqli -> prepare ( " INSERT INTO status VALUES (NULL,?, ?, ?, ?, ?, ?) " );
2017-11-24 00:09:36 +01:00
$stmt -> bind_param ( " issiii " , $type , $title , $text , $time , $end_time , $user_id );
$stmt -> execute ();
$query = $stmt -> get_result ();
$status_id = $mysqli -> insert_id ;
foreach ( $services as $service ) {
2017-11-29 15:01:16 +01:00
$stmt = $mysqli -> prepare ( " INSERT INTO services_status VALUES (NULL,?, ?) " );
2017-11-24 00:09:36 +01:00
$stmt -> bind_param ( " ii " , $service , $status_id );
$stmt -> execute ();
$query = $stmt -> get_result ();
2018-06-07 11:20:53 +02:00
$query = $mysqli -> query ( " SELECT * FROM services_subscriber WHERE serviceIDFK= " . $service );
while ( $subscriber = $query -> fetch_assoc ()){
2018-06-07 11:29:28 +02:00
$subscriberQuery = $mysqli -> query ( " SELECT * FROM subscribers WHERE subscriberID= " . $subscriber [ 'subscriberIDFK' ]);
2018-06-07 11:20:53 +02:00
while ( $subscriberData = $subscriberQuery -> fetch_assoc ()){
$telegramID = $subscriberData [ 'telegramID' ];
$firstname = $subscriberData [ 'firstname' ];
$tg_message = urlencode ( 'Hi ' . $firstname . chr ( 10 ) . 'There is a status update on a service that you have subscribed. <a href="' . WEB_URL . '">View online</a>' );
2018-06-07 16:30:24 +02:00
$response = json_decode ( file_get_contents ( " https://api.telegram.org/bot " . TG_BOT_API_TOKEN . " /sendMessage?chat_id= " . $telegramID . " &parse_mode=HTML&text= " . $tg_message ), true );
if ( $response [ 'ok' ] == true ){
$tgsent = true ;
}
2018-06-07 11:20:53 +02:00
}
2017-11-24 00:09:36 +01:00
}
2018-06-07 16:30:24 +02:00
if ( $tgsent ){
header ( " Location: " . WEB_URL . " /admin?sent=true " );
} else {
header ( " Location: " . WEB_URL . " /admin?sent=false " );
}
2017-11-24 00:09:36 +01:00
}
}
2018-06-07 11:29:28 +02:00
}
2018-01-07 20:39:10 +01:00
/**
* Renders incident
* @param Boolean $admin - decides whether admin controls should be rendered
* @return void
*/
2017-11-24 00:09:36 +01:00
public function render ( $admin = 0 ){
global $icons ;
2018-11-21 10:50:21 +01:00
global $classes , $user ;
2017-11-24 00:09:36 +01:00
$admin = $admin && (( $user -> get_rank () <= 1 ) || ( $user -> get_username () == $this -> username ));
2018-11-19 09:19:23 +01:00
2017-11-24 00:09:36 +01:00
?>
<article class="panel panel-<?php echo $classes[$this->type];?>">
<div class="panel-heading icon">
<i class="<?php echo $icons[$this->type];?>"></i>
</div>
<div class="panel-heading clearfix">
<h2 class="panel-title"><?php echo $this->title; ?></h2>
<?php if ($admin){
2018-01-12 22:38:19 +01:00
echo '<a href="'.WEB_URL.'/admin/?delete='.$this->id.'" class="pull-right delete"><i class="fa fa-trash"></i></a>';
2017-11-24 00:09:36 +01:00
}?>
<time class="pull-right timeago" datetime="<?php echo $this->date; ?>"><?php echo $this->date; ?></time>
</div>
<div class="panel-body">
<?php echo $this->text; ?>
</div>
2018-11-21 10:50:21 +01:00
<div class="panel-footer clearfix">
2018-11-19 09:19:23 +01:00
<small>
2018-11-21 10:50:21 +01:00
<?php echo _("Impacted service(s): ");
foreach ( $this->service_name as $key => $value ) {
2018-11-19 09:19:23 +01:00
echo '<span class="label label-default">'.$value . '</span> ';
}
2018-11-21 10:50:21 +01:00
2017-11-24 00:09:36 +01:00
if (isset($this->end_date)){?>
2018-01-13 00:57:13 +01:00
<span class="pull-right"><?php echo strtotime($this->end_date)>time()?_("Ending"):_("Ended");?>: <time class="pull-right timeago" datetime="<?php echo $this->end_date; ?>"><?php echo $this->end_date; ?></time></span>
2018-01-12 21:35:31 +01:00
<?php } ?>
2017-11-24 00:09:36 +01:00
</small>
</div>
</article>
<?php
}
2018-04-13 21:31:03 +02:00
public function jsonSerialize() {
return [
"id" => $this->id,
2018-04-13 22:38:10 +02:00
"date" => $this->timestamp,
"end_date" => $this->end_timestamp,
2018-04-13 21:31:03 +02:00
"text" => $this->text,
"type" => $this->type,
"title" => $this->title,
"username" => $this->username
];
}
2017-11-24 00:09:36 +01:00
}