<?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.
*/
namespace EasyWeChat\Kernel\Messages;
use EasyWeChat\Kernel\Contracts\MessageInterface;
use EasyWeChat\Kernel\Support\XML;
use EasyWeChat\Kernel\Traits\HasAttributes;
use Mockery\Exception\BadMethodCallException;
abstract class Message implements MessageInterface
{
use HasAttributes;
const TEXT = 2;
const IMAGE = 4;
const VOICE = 8;
const VIDEO = 16;
const SHORT_VIDEO = 32;
const LOCATION = 64;
const LINK = 128;
const DEVICE_EVENT = 256;
const DEVICE_TEXT = 512;
const FILE = 1024;
const TEXT_CARD = 2048;
const TRANSFER = 4096;
const EVENT = 1048576;
const MINIPROGRAM_PAGE = 2097152;
const ALL = 1049598;
protected $type;
protected $id;
protected $to;
protected $from;
protected $properties = [];
protected $jsonAliases = [];
public function __construct(array $attributes = [])
{
$this->setAttributes($attributes);
}
public function getType(): string
{
return $this->type;
}
public function setType(string $type)
{
$this->type = $type;
}
public function __get($property)
{
if (property_exists($this, $property)) {
return $this->$property;
}
return $this->getAttribute($property);
}
public function __set($property, $value)
{
if (property_exists($this, $property)) {
$this->$property = $value;
} else {
$this->setAttribute($property, $value);
}
return $this;
}
public function transformForJsonRequestWithoutType(array $appends = [])
{
return $this->transformForJsonRequest($appends, false);
}
public function transformForJsonRequest(array $appends = [], $withType = true): array
{
if (!$withType) {
return $this->propertiesToArray([], $this->jsonAliases);
}
$messageType = $this->getType();
$data = array_merge(['msgtype' => $messageType], $appends);
$data[$messageType] = array_merge($data[$messageType] ?? [], $this->propertiesToArray([], $this->jsonAliases));
return $data;
}
public function transformToXml(array $appends = [], bool $returnAsArray = false): string
{
$data = array_merge(['MsgType' => $this->getType()], $this->toXmlArray(), $appends);
return $returnAsArray ? $data : XML::build($data);
}
protected function propertiesToArray(array $data, array $aliases = []): array
{
$this->checkRequiredAttributes();
foreach ($this->attributes as $property => $value) {
if (is_null($value) && !$this->isRequired($property)) {
continue;
}
$alias = array_search($property, $aliases, true);
$data[$alias ?: $property] = $this->get($property);
}
return $data;
}
public function toXmlArray()
{
throw new BadMethodCallException(sprintf('Class "%s" cannot support transform to XML message.', __CLASS__));
}
}