MessageBuilder.php.
MessageBuilder | Class MessageBuilder. |
<?php
/*
* This file is part of the overtrue/wechat.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
/**
* MessageBuilder.php.
*
* @author overtrue <i@overtrue.me>
* @copyright 2015 overtrue <i@overtrue.me>
*
* @see https://github.com/overtrue
* @see http://overtrue.me
*/
namespace EasyWeChat\Broadcast;
use EasyWeChat\Core\Exceptions\InvalidArgumentException;
use EasyWeChat\Core\Exceptions\RuntimeException;
/**
* Class MessageBuilder.
*/
class MessageBuilder
{
/**
* Message target user or group.
*
* @var mixed
*/
protected $to;
/**
* Message type.
*
* @var string
*/
protected $msgType;
/**
* Message.
*
* @var mixed
*/
protected $message;
/**
* Message types.
*
* @var array
*/
private $msgTypes = [
Broadcast::MSG_TYPE_TEXT,
Broadcast::MSG_TYPE_NEWS,
Broadcast::MSG_TYPE_IMAGE,
Broadcast::MSG_TYPE_VIDEO,
Broadcast::MSG_TYPE_VOICE,
Broadcast::MSG_TYPE_CARD,
];
/**
* Preview bys.
*
* @var array
*/
private $previewBys = [
Broadcast::PREVIEW_BY_OPENID,
Broadcast::PREVIEW_BY_NAME,
];
/**
* Set message type.
*
* @param string $msgType
*
* @return MessageBuilder
*
* @throws InvalidArgumentException
*/
public function msgType($msgType)
{
if (!in_array($msgType, $this->msgTypes, true)) {
throw new InvalidArgumentException('This message type not exist.');
}
$this->msgType = $msgType;
return $this;
}
/**
* Set message.
*
* @param string|array $message
*
* @return MessageBuilder
*/
public function message($message)
{
$this->message = $message;
return $this;
}
/**
* Set target user or group.
*
* @param mixed $to
*
* @return MessageBuilder
*/
public function to($to)
{
$this->to = $to;
return $this;
}
/**
* Build message.
*
* @return bool
*
* @throws RuntimeException
*/
public function build()
{
if (empty($this->msgType)) {
throw new RuntimeException('message type not exist.');
}
if (empty($this->message)) {
throw new RuntimeException('No message content to send.');
}
// 群发视频消息给用户列表时,视频消息格式需要另外处理,具体见文档
if (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
if (is_array($this->message)) {
$this->message = array_shift($this->message);
}
$this->msgType = 'mpvideo';
}
$content = (new Transformer($this->msgType, $this->message))->transform();
$group = isset($this->to) ? $this->to : null;
$message = array_merge($this->buildGroup($group), $content);
return $message;
}
/**
* Build preview message.
*
* @param string $by
*
* @return array
*
* @throws RuntimeException
* @throws InvalidArgumentException
*/
public function buildPreview($by)
{
if (!in_array($by, $this->previewBys, true)) {
throw new InvalidArgumentException('This preview by not exist.');
}
if (empty($this->msgType)) {
throw new RuntimeException('Message type not exist.');
} elseif (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
if (is_array($this->message)) {
$this->message = array_shift($this->message);
}
$this->msgType = 'mpvideo';
}
if (empty($this->message)) {
throw new RuntimeException('No message content to send.');
}
if (empty($this->to)) {
throw new RuntimeException('No to.');
}
$content = (new Transformer($this->msgType, $this->message))->transform();
$message = array_merge($this->buildTo($this->to, $by), $content);
return $message;
}
/**
* Build group.
*
* @param mixed $group
*
* @return array
*/
private function buildGroup($group)
{
if (is_null($group)) {
$group = [
'filter' => [
'is_to_all' => true,
],
];
} elseif (is_array($group)) {
$group = [
'touser' => $group,
];
} else {
$group = [
'filter' => [
'is_to_all' => false,
'group_id' => $group,
],
];
}
return $group;
}
/**
* Build to.
*
* @param string $to
* @param string $by
*
* @return array
*/
private function buildTo($to, $by)
{
return [
$by => $to,
];
}
/**
* Return property.
*
* @param string $property
*
* @return mixed
*/
public function __get($property)
{
if (property_exists($this, $property)) {
return $this->$property;
}
}
}