|
|
|
|
@ -54,17 +54,38 @@ class StatusService { |
|
|
|
|
/** @var EmojiService */ |
|
|
|
|
private $emojiService; |
|
|
|
|
|
|
|
|
|
/** @var string[] */ |
|
|
|
|
private $allowedStatusTypes = [ |
|
|
|
|
'online', |
|
|
|
|
'away', |
|
|
|
|
'dnd', |
|
|
|
|
'invisible', |
|
|
|
|
'offline' |
|
|
|
|
public const ONLINE = 'online'; |
|
|
|
|
public const AWAY = 'away'; |
|
|
|
|
public const DND = 'dnd'; |
|
|
|
|
public const INVISIBLE = 'invisible'; |
|
|
|
|
public const OFFLINE = 'offline'; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* List of priorities ordered by their priority |
|
|
|
|
*/ |
|
|
|
|
public const PRIORITY_ORDERED_STATUSES = [ |
|
|
|
|
self::ONLINE, |
|
|
|
|
self::AWAY, |
|
|
|
|
self::DND, |
|
|
|
|
self::INVISIBLE, |
|
|
|
|
self::OFFLINE |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* List of statuses that persist the clear-up |
|
|
|
|
* or UserLiveStatusEvents |
|
|
|
|
*/ |
|
|
|
|
public const PERSISTENT_STATUSES = [ |
|
|
|
|
self::AWAY, |
|
|
|
|
self::DND, |
|
|
|
|
self::INVISIBLE, |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
/** @var int */ |
|
|
|
|
public const INVALIDATE_STATUS_THRESHOLD = 5 /* minutes */ * 60 /* seconds */; |
|
|
|
|
|
|
|
|
|
/** @var int */ |
|
|
|
|
private $maximumMessageLength = 80; |
|
|
|
|
public const MAXIMUM_MESSAGE_LENGTH = 80; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* StatusService constructor. |
|
|
|
|
@ -145,7 +166,7 @@ class StatusService { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check if status-type is valid |
|
|
|
|
if (!\in_array($status, $this->allowedStatusTypes, true)) { |
|
|
|
|
if (!\in_array($status, self::PRIORITY_ORDERED_STATUSES, true)) { |
|
|
|
|
throw new InvalidStatusTypeException('Status-type "' . $status . '" is not supported'); |
|
|
|
|
} |
|
|
|
|
if ($statusTimestamp === null) { |
|
|
|
|
@ -179,7 +200,7 @@ class StatusService { |
|
|
|
|
} catch (DoesNotExistException $ex) { |
|
|
|
|
$userStatus = new UserStatus(); |
|
|
|
|
$userStatus->setUserId($userId); |
|
|
|
|
$userStatus->setStatus('offline'); |
|
|
|
|
$userStatus->setStatus(self::OFFLINE); |
|
|
|
|
$userStatus->setStatusTimestamp(0); |
|
|
|
|
$userStatus->setIsUserDefined(false); |
|
|
|
|
} |
|
|
|
|
@ -224,7 +245,7 @@ class StatusService { |
|
|
|
|
} catch (DoesNotExistException $ex) { |
|
|
|
|
$userStatus = new UserStatus(); |
|
|
|
|
$userStatus->setUserId($userId); |
|
|
|
|
$userStatus->setStatus('offline'); |
|
|
|
|
$userStatus->setStatus(self::OFFLINE); |
|
|
|
|
$userStatus->setStatusTimestamp(0); |
|
|
|
|
$userStatus->setIsUserDefined(false); |
|
|
|
|
} |
|
|
|
|
@ -234,8 +255,8 @@ class StatusService { |
|
|
|
|
throw new InvalidStatusIconException('Status-Icon is longer than one character'); |
|
|
|
|
} |
|
|
|
|
// Check for maximum length of custom message |
|
|
|
|
if (\mb_strlen($message) > $this->maximumMessageLength) { |
|
|
|
|
throw new StatusMessageTooLongException('Message is longer than supported length of ' . $this->maximumMessageLength . ' characters'); |
|
|
|
|
if (\mb_strlen($message) > self::MAXIMUM_MESSAGE_LENGTH) { |
|
|
|
|
throw new StatusMessageTooLongException('Message is longer than supported length of ' . self::MAXIMUM_MESSAGE_LENGTH . ' characters'); |
|
|
|
|
} |
|
|
|
|
// Check that clearAt is in the future |
|
|
|
|
if ($clearAt !== null && $clearAt < $this->timeFactory->getTime()) { |
|
|
|
|
@ -266,7 +287,7 @@ class StatusService { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$userStatus->setStatus('offline'); |
|
|
|
|
$userStatus->setStatus(self::OFFLINE); |
|
|
|
|
$userStatus->setStatusTimestamp(0); |
|
|
|
|
$userStatus->setIsUserDefined(false); |
|
|
|
|
|
|
|
|
|
@ -321,7 +342,7 @@ class StatusService { |
|
|
|
|
private function processStatus(UserStatus $status): UserStatus { |
|
|
|
|
$clearAt = $status->getClearAt(); |
|
|
|
|
if ($clearAt !== null && $clearAt < $this->timeFactory->getTime()) { |
|
|
|
|
$this->cleanStatus($status); |
|
|
|
|
$this->cleanStatusMessage($status); |
|
|
|
|
} |
|
|
|
|
if ($status->getMessageId() !== null) { |
|
|
|
|
$this->addDefaultMessage($status); |
|
|
|
|
@ -333,7 +354,7 @@ class StatusService { |
|
|
|
|
/** |
|
|
|
|
* @param UserStatus $status |
|
|
|
|
*/ |
|
|
|
|
private function cleanStatus(UserStatus $status): void { |
|
|
|
|
private function cleanStatusMessage(UserStatus $status): void { |
|
|
|
|
$status->setMessageId(null); |
|
|
|
|
$status->setCustomIcon(null); |
|
|
|
|
$status->setCustomMessage(null); |
|
|
|
|
|