addType('room_id', Types::BIGINT); $this->addType('actorId', Types::STRING); $this->addType('actorType', Types::STRING); $this->addType('threadId', Types::BIGINT); $this->addType('parentId', Types::BIGINT); $this->addType('message', Types::TEXT); $this->addType('messageType', Types::STRING); $this->addType('metaData', Types::TEXT); $this->addType('sendAt', Types::DATETIME); } /** * @return array{silent: bool, threadId: int, threadTitle?: string, lastEditedTime?: int, sendAt: ?int} */ public function getDecodedMetaData(): array { return json_decode($this->metaData, true, 512, JSON_THROW_ON_ERROR); } public function getThreadTitle(): string { $metaData = $this->getDecodedMetaData(); return $metaData[self::METADATA_THREAD_TITLE] ?? ''; } /** * @param array{silent: bool, threadId: int, threadTitle?: string, lastEditedTime?: int, sendAt: ?int} $metaData */ public function setMetaData(array $metaData): void { $this->metaData = json_encode($metaData, JSON_THROW_ON_ERROR); $this->markFieldUpdated('metaData'); } /** * @throws MessageTooLongException When the message is too long (~32k characters) */ public function setMessage(string $message): void { $message = trim($message); if (mb_strlen($message, 'UTF-8') > ChatManager::MAX_CHAT_LENGTH) { throw new MessageTooLongException('Comment message must not exceed ' . ChatManager::MAX_CHAT_LENGTH . ' characters'); } $this->message = $message; $this->markFieldUpdated('message'); } /** * @param string $format * @psalm-param 'json'|'xml' $format * @return TalkScheduledMessage */ public function toArray(string $format, ?Message $parent, ?Thread $thread) : array { $metaData = $this->getDecodedMetaData(); $data = [ 'id' => (string)$this->getId(), 'actorId' => $this->getActorId(), 'actorType' => $this->getActorType(), 'threadId' => $this->getThreadId(), 'message' => $this->getMessage(), 'messageType' => $this->getMessageType(), 'createdAt' => $this->getCreatedAt()?->getTimestamp() ?? 0, 'sendAt' => $this->getSendAt()?->getTimestamp() ?? 0, 'silent' => $metaData[self::METADATA_SILENT] ?? false, ]; if ($parent !== null) { $data['parent'] = $parent->toArray($format, $thread); } if (isset($metaData[self::METADATA_SEND_AT])) { $data['originalSendAt'] = $metaData[self::METADATA_SEND_AT]; } if ($thread !== null) { $data['threadTitle'] = $thread->getName(); } elseif (isset($metaData[self::METADATA_THREAD_TITLE]) && $this->getThreadId() === Thread::THREAD_CREATE) { $data['threadTitle'] = (string)$metaData[self::METADATA_THREAD_TITLE]; } return $data; } }