File "message.php"
Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/helpers/src/chat/message.php
File size: 7.67 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* @package VikBooking
* @subpackage core
* @author E4J s.r.l.
* @copyright Copyright (C) 2021 E4J s.r.l. All Rights Reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
* @link https://vikwp.com
*/
// No direct access
defined('ABSPATH') or die('No script kiddies please!');
/**
* This class holds the information of a generic chat message.
*
* @since 1.8
*/
class VBOChatMessage implements JsonSerializable
{
/**
* The context of the message.
*
* @var VBOChatContext
*/
protected $context;
/**
* The message identifier.
*
* @var int
*/
protected $id;
/**
* The name of the user that sent the message.
*
* @var string
*/
protected $sender_name;
/**
* The ID of the user that sent the message.
* When empty, the sender will be equal to the administrator.
*
* @var int
*/
protected $id_sender;
/**
* The content of the message.
*
* @var string
*/
protected $message;
/**
* An array of attached files.
*
* @var VBOChatAttachment[]
*/
protected $attachments = [];
/**
* The creation date of the message.
*
* @var string
*/
protected $createdon;
/**
* The ID of the user that created the message.
*
* @var int
*/
protected $createdby;
/**
* Whether the message has been read by the user.
*
* @var bool
*/
protected $read = true;
/**
* Class constructor.
*
* @param VBOChatContext $context The message context.
* @param array|object|null $data The message details.
*/
public function __construct(VBOChatContext $context, $data = null)
{
$this->context = $context;
if ($data) {
$this->bind($data);
}
}
/**
* Binds the message properties with the provided data.
*
* @param array|object $data The message data.
*
* @return self This object to support chaining.
*/
public function bind($data)
{
if (!is_array($data) && !is_object($data)) {
throw new \InvalidArgumentException('Cannot bind chat message! Array or object expected, ' . gettype($data) . ' given.', 400);
}
foreach ($data as $k => $v) {
// never update the context of the message
if (!strcasecmp($k, 'context')) {
continue;
}
if (!strcasecmp($k, 'attachments')) {
// set attachments accordingly
$this->setAttachments((array) $v);
} else if (!strcasecmp($k, 'createdon')) {
// set creation date accordingly
$this->setCreationDate($v);
} else if (property_exists($this, $k)) {
// inject value only in case the property actually exists
$this->{$k} = $v;
}
}
return $this;
}
/**
* Returns the context of the message.
*
* @return VBOChatContext
*/
public function getContext()
{
return $this->context;
}
/**
* Returns the ID the message.
*
* @return int
*/
public function getID()
{
return (int) $this->id;
}
/**
* Returns the name of the user that wrote the message.
*
* @return string
*/
public function getSenderName()
{
return (string) $this->sender_name;
}
/**
* Returns the ID of the sender.
* When the value is equal to 0, the message is sent by an administrator.
*
* @return int
*/
public function getSenderID()
{
return (int) $this->id_sender;
}
/**
* Sets the sender information.
*
* @param string $name The name of the sender.
* @param int $id The ID of the sender (0 for admin).
*
* @return self
*/
public function setSender(string $name, int $id = 0)
{
$this->sender_name = $name;
$this->id_sender = $id;
return $this;
}
/**
* Returns the text of the message.
*
* @return string
*/
public function getMessage()
{
return (string) $this->message;
}
/**
* Sets the text of the message.
*
* @param string $message
*
* @return self
*/
public function setMessage(string $message)
{
$this->message = $message;
return $this;
}
/**
* Returns an array of files.
*
* @return array
*/
public function getAttachments()
{
return $this->attachments;
}
/**
* Sets the specified files as attachments.
*
* @param VBOChatAttachment[] $attachments
*
* @return self
*/
public function setAttachments(array $attachments)
{
$this->attachments = [];
foreach ($attachments as $attachment) {
if ($attachment instanceof VBOChatAttachment) {
$this->addAttachment($attachment);
}
}
return $this;
}
/**
* Adds a new file as attachment.
*
* @param VBOChatAttachment $attachment
*
* @return self
*
* @throws InvalidArgumentException
*/
public function addAttachment(VBOChatAttachment $attachment)
{
// make sure the file exists
if (!$attachment->exists()) {
throw new \InvalidArgumentException('The attached file does not exist: ' . $attachment->getName(), 404);
}
$this->attachments[] = $attachment;
return $this;
}
/**
* Returns the creation date of the message (UTC).
*
* @return string
*/
public function getCreationDate()
{
if (!$this->createdon) {
$this->createdon = JFactory::getDate()->toSql();
}
return $this->createdon;
}
/**
* Sets the creation date of the message (UTC).
*
* @param mixed $date Either a date string or a DateTime object.
*
* @return self
*/
public function setCreationDate($date)
{
try {
if (is_string($date)) {
// make sure the provided date is correct
$date = JFactory::getDate($date);
}
// convert date object into a string
$date = $date->toSql();
} catch (Exception $error) {
// malformed date
$date = null;
}
$this->createdon = $date;
return $this;
}
/**
* Returns the user ID of the message author.
*
* @return int
*/
public function getAuthor()
{
if (!$this->createdby) {
$this->createdby = \JFactory::getUser()->id;
}
return $this->createdby;
}
/**
* Checks whether the message has been read by the current user.
*
* @return bool
*/
public function isRead()
{
return (bool) $this->read;
}
/**
* @inheritDoc
*
* @see JsonSerializable
*/
#[ReturnTypeWillChange]
public function jsonSerialize()
{
return [
'id' => $this->getID(),
'context' => $this->getContext()->getAlias(),
'id_context' => $this->getContext()->getID(),
'sender_name' => $this->getSenderName(),
'id_sender' => $this->getSenderID(),
'message' => $this->getMessage(),
'attachments' => $this->getAttachments(),
'createdon' => $this->getCreationDate(),
'createdby' => $this->getAuthor(),
'read' => $this->isRead(),
];
}
}