EVOLUTION-MANAGER
Edit File: Message.php
<?php /** * Nexmo Client Library for PHP * * @copyright Copyright (c) 2016 Nexmo, Inc. (http://nexmo.com) * @license https://github.com/Nexmo/nexmo-php/blob/master/LICENSE.txt MIT License */ namespace Nexmo\Message; use Nexmo\Message\EncodingDetector; use Nexmo\Entity\JsonResponseTrait; use Nexmo\Entity\Psr7Trait; use Nexmo\Entity\RequestArrayTrait; /** * Abstract Message * * Extended by concrete message types (text, binary, etc). */ class Message implements MessageInterface, \Countable, \ArrayAccess, \Iterator { use Psr7Trait; use JsonResponseTrait; use RequestArrayTrait; use CollectionTrait; const TYPE = null; const CLASS_FLASH = 0; protected $responseParams = [ 'status', 'message-id', 'to', 'remaining-balance', 'message-price', 'network' ]; protected $current = 0; protected $id; protected $autodetectEncoding = false; /** * @param string $idOrTo Message ID or E.164 (international) formatted number to send the message * @param null|string $from Number or name the message is from * @param array $additional Additional API Params */ public function __construct($idOrTo, $from = null, $additional = []) { if(is_null($from)){ $this->id = $idOrTo; return; } $this->requestData['to'] = (string) $idOrTo; $this->requestData['from'] = (string) $from; if(static::TYPE){ $this->requestData['type'] = static::TYPE; } $this->requestData = array_merge($this->requestData, $additional); } public function requestDLR($dlr = true) { return $this->setRequestData('status-report-req', $dlr ? 1 : 0); } public function setCallback($callback) { return $this->setRequestData('callback', (string) $callback); } public function setClientRef($ref) { return $this->setRequestData('client-ref', (string) $ref); } public function setNetwork($network) { return $this->setRequestData('network-code', (string) $network); } public function setTTL($ttl) { return $this->setRequestData('ttl', (int) $ttl); } public function setClass($class) { return $this->setRequestData('message-class', $class); } public function enableEncodingDetection() { $this->autodetectEncoding = true; } public function disableEncodingDetection() { $this->autodetectEncoding = false; } public function count() { $data = $this->getResponseData(); if(!isset($data['messages'])){ return 0; } return count($data['messages']); } public function getMessageId($index = null) { if(isset($this->id)){ return $this->id; } return $this->getMessageData('message-id', $index); } public function getStatus($index = null) { return $this->getMessageData('status', $index); } public function getFinalStatus($index = null) { return $this->getMessageData('final-status', $index); } public function getTo($index = null) { $data = $this->getResponseData(); //check if this is data from a send request //(which also has a status, but it's not the same) if(isset($data['messages'])){ return $this->getMessageData('to', $index); } return $this['to']; } public function getRemainingBalance($index = null) { return $this->getMessageData('remaining-balance', $index); } public function getPrice($index = null) { $data = $this->getResponseData(); //check if this is data from a send request //(which also has a status, but it's not the same) if(isset($data['messages'])){ return $this->getMessageData('message-price', $index); } return $this['price']; } public function getNetwork($index = null) { return $this->getMessageData('network', $index); } public function getDeliveryStatus() { $data = $this->getResponseData(); //check if this is data from a send request //(which also has a status, but it's not the same) if(isset($data['messages'])){ return; } return $this['status']; } public function getFrom() { return $this['from']; } public function getBody() { return $this['body']; } public function getDateReceived() { return new \DateTime($this['date-received']); } public function getDeliveryError() { return $this['error-code']; } public function getDeliveryLabel() { return $this['error-code-label']; } public function isEncodingDetectionEnabled() { return $this->autodetectEncoding; } protected function getMessageData($name, $index = null) { if(!isset($this->response)){ return null; } $data = $this->getResponseData(); if(is_null($index)){ $index = $this->count() -1; } if (isset($data['messages'])) { return $data['messages'][$index][$name]; } return isset($data[$name]) ? $data[$name] : null; } protected function preGetRequestDataHook() { // If $autodetectEncoding is true, we want to set the `type` // field in our payload if ($this->isEncodingDetectionEnabled()) { $this->requestData['type'] = $this->detectEncoding(); } } protected function detectEncoding() { if (!isset($this->requestData['text'])) { return static::TYPE; } // Auto detect unicode messages $detector = new EncodingDetector; if ($detector->requiresUnicodeEncoding($this->requestData['text'])){ return Unicode::TYPE; } return static::TYPE; } public function offsetExists($offset) { $response = $this->getResponseData(); if(isset($this->index)){ $response = $response['items'][$this->index]; } $request = $this->getRequestData(); $dirty = $this->getRequestData(false); if(isset($response[$offset]) || isset($request[$offset]) || isset($dirty[$offset])){ return true; } //provide access to split messages by virtual index if(is_int($offset) && $offset < $this->count()){ return true; } return false; } public function offsetGet($offset) { $response = $this->getResponseData(); if(isset($this->index)){ $response = $response['items'][$this->index]; } $request = $this->getRequestData(); $dirty = $this->getRequestData(false); if(isset($response[$offset])){ return $response[$offset]; } //provide access to split messages by virtual index, if there is data if(isset($response['messages'])){ if(is_int($offset) && isset($response['messages'][$offset])){ return $response['messages'][$offset]; } $index = $this->count() -1; if(isset($response['messages'][$index]) && isset($response['messages'][$index][$offset])){ return $response['messages'][$index][$offset]; } } if(isset($request[$offset])){ return $request[$offset]; } if(isset($dirty[$offset])){ return $dirty[$offset]; } } public function offsetSet($offset, $value) { throw $this->getReadOnlyException($offset); } public function offsetUnset($offset) { throw $this->getReadOnlyException($offset); } protected function getReadOnlyException($offset) { return new \RuntimeException(sprintf( 'can not modify `%s` using array access', $offset )); } public function current() { if(!isset($this->response)){ return null; } $data = $this->getResponseData(); return $data['messages'][$this->current]; } public function next() { $this->current++; } public function key() { if(!isset($this->response)){ return null; } return $this->current; } public function valid() { if(!isset($this->response)){ return null; } $data = $this->getResponseData(); return isset($data['messages'][$this->current]); } public function rewind() { $this->current = 0; } }