mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-23 00:25:35 +08:00
重构完成
This commit is contained in:
212
src/cqbot/item/CQ.php
Normal file
212
src/cqbot/item/CQ.php
Normal file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: jerry
|
||||
* Date: 2018/8/27
|
||||
* Time: 7:17 PM
|
||||
*/
|
||||
|
||||
class CQ
|
||||
{
|
||||
/**
|
||||
* at一下QQ用户(仅在QQ群支持at全体)
|
||||
* @param $qq
|
||||
* @return string
|
||||
*/
|
||||
public static function at($qq) {
|
||||
if (is_numeric($qq) || $qq === "all") {
|
||||
return "[CQ:at,qq=" . $qq . "]";
|
||||
}
|
||||
Console::error("传入的QQ号码($qq)错误!");
|
||||
return " ";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送QQ原生表情
|
||||
* @param $id
|
||||
* @return string
|
||||
*/
|
||||
public static function face($id) {
|
||||
if (is_numeric($id)) {
|
||||
return "[CQ:face,id=" . $id . "]";
|
||||
}
|
||||
Console::error("传入的face id($id)错误!");
|
||||
return " ";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送emoji表情
|
||||
* @param $id
|
||||
* @return string
|
||||
*/
|
||||
public static function emoji($id) {
|
||||
if (is_numeric($id)) {
|
||||
return "[CQ:emoji,id=" . $id . "]";
|
||||
}
|
||||
Console::error("传入的emoji id($id)错误!");
|
||||
return " ";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送原创表情,存放在酷Q目录的data/bface/下
|
||||
* @param $id
|
||||
* @return string
|
||||
*/
|
||||
public static function bface($id) {
|
||||
return "[CQ:bface,id=" . $id . "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送小表情
|
||||
* @param $id
|
||||
* @return string
|
||||
*/
|
||||
public static function sface($id) {
|
||||
if (is_numeric($id)) {
|
||||
return "[CQ:sface,id=" . $id . "]";
|
||||
}
|
||||
Console::error("传入的sface id($id)错误!");
|
||||
return " ";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送图片
|
||||
* cache为<FALSE>时禁用CQ-HTTP-API插件的缓存
|
||||
* @param $file
|
||||
* @param bool $cache
|
||||
* @return string
|
||||
*/
|
||||
public static function image($file, $cache = true) {
|
||||
if ($cache === false)
|
||||
return "[CQ:image,file=" . $file . ",cache=0]";
|
||||
else
|
||||
return "[CQ:image,file=" . $file . "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送语音
|
||||
* cache为<FALSE>时禁用CQ-HTTP-API插件的缓存
|
||||
* magic为<TRUE>时标记为变声
|
||||
* @param $file
|
||||
* @param bool $magic
|
||||
* @param bool $cache
|
||||
* @return string
|
||||
*/
|
||||
public static function record($file, $magic = false, $cache = true) {
|
||||
if ($cache === false) $c = ",cache=0";
|
||||
else $c = "";
|
||||
if ($magic === true) $m = ",magic=true";
|
||||
else $m = "";
|
||||
return "[CQ:record,file=" . $file . $c . $m . "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送投掷骰子(只能在单条回复中单独使用)
|
||||
* @return string
|
||||
*/
|
||||
public static function rps() {
|
||||
return "[CQ:rps]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送掷骰子表情(只能在单条回复中单独使用)
|
||||
* @return string
|
||||
*/
|
||||
public static function dice() {
|
||||
return "[CQ:dice]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 戳一戳(原窗口抖动,仅支持好友消息使用)
|
||||
* @return string
|
||||
*/
|
||||
public static function shake() {
|
||||
return "[CQ:shake]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送音乐分享(只能在单条回复中单独使用)
|
||||
* qq、163、xiami为内置分享,需要先通过搜索功能获取id后使用
|
||||
* custom为自定义分享
|
||||
* 当为自定义分享时:
|
||||
* $id_or_url 为音乐卡片点进去打开的链接(一般是音乐介绍界面啦什么的)
|
||||
* $audio 为音乐(如mp3文件)的HTTP链接地址(不可为空)
|
||||
* $title 为音乐卡片的标题,建议12字以内(不可为空)
|
||||
* $content 为音乐卡片的简介(可忽略)
|
||||
* $image 为音乐卡片的图片链接地址(可忽略)
|
||||
* @param $type
|
||||
* @param $id_or_url
|
||||
* @param string $audio
|
||||
* @param string $title
|
||||
* @param string $content
|
||||
* @param string $image
|
||||
* @return string
|
||||
*/
|
||||
public static function music($type, $id_or_url, $audio = null, $title = null, $content = null, $image = null) {
|
||||
switch ($type) {
|
||||
case "qq":
|
||||
case "163":
|
||||
case "xiami":
|
||||
return "[CQ:music,id=" . $id_or_url . "]";
|
||||
case "custom":
|
||||
if ($title === null || $audio === null) {
|
||||
Console::error("传入CQ码实例的标题和音频链接不能为空!");
|
||||
return " ";
|
||||
}
|
||||
if ($content === null) $c = "";
|
||||
else $c = ",content=" . $content;
|
||||
if ($image === null) $i = "";
|
||||
else $i = ",image=" . $image;
|
||||
return "[CQ:music,type=custom,url=" . $id_or_url . ",audio=" . $audio . ",title=" . $title . $c . $i . "]";
|
||||
default:
|
||||
Console::error("传入的music type($type)错误!");
|
||||
return " ";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送链接分享(只能在单条回复中单独使用)
|
||||
* @param $url
|
||||
* @param $title
|
||||
* @param null $content
|
||||
* @param null $image
|
||||
* @return string
|
||||
*/
|
||||
public static function share($url, $title, $content = null, $image = null) {
|
||||
if ($content === null) $c = "";
|
||||
else $c = ",content=" . $content;
|
||||
if ($image === null) $i = "";
|
||||
else $i = ",image=" . $image;
|
||||
return "[CQ:share,url=" . $url . ",title=" . $title . $c . $i . "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串中的CQ码敏感符号进行转义
|
||||
* @param $str
|
||||
* @return mixed
|
||||
*/
|
||||
public static function encode($str) {
|
||||
$str = str_replace("&", "&", $str);
|
||||
$str = str_replace("[", "[", $str);
|
||||
$str = str_replace("]", "]", $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反转义字符串中的CQ码敏感符号
|
||||
* @param $str
|
||||
* @return mixed
|
||||
*/
|
||||
public static function decode($str) {
|
||||
$str = str_replace("&", "&", $str);
|
||||
$str = str_replace("[", "[", $str);
|
||||
$str = str_replace("]", "]", $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
public static function replace($str) {
|
||||
$str = str_replace("{{", "[", $str);
|
||||
$str = str_replace("}}", "]", $str);
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: jerry
|
||||
* Date: 2018/5/2
|
||||
* Time: 下午1:59
|
||||
*/
|
||||
|
||||
class Group
|
||||
{
|
||||
private $group_id;
|
||||
private $group_name;
|
||||
private $self_id;
|
||||
//private $prefix;
|
||||
private $members = [];
|
||||
|
||||
public function __construct($group_id, $info, $self_id) {
|
||||
$this->self_id = $self_id;
|
||||
$this->group_id = $group_id;
|
||||
$this->group_name = $info["group_name"];
|
||||
//$this->prefix = $info["prefix"];
|
||||
$member_list = $info["member"];
|
||||
$this->members = [];
|
||||
foreach ($member_list as $k => $v) {
|
||||
$this->members[$v["user_id"]] = new GroupMember($v["user_id"], $this, $v);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getGroupId() {
|
||||
return $this->group_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getGroupName() {
|
||||
return $this->group_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getMembers(): array {
|
||||
return $this->members;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $user_id
|
||||
* @return GroupMember|null
|
||||
*/
|
||||
public function getMember($user_id) {
|
||||
return isset($this->members[$user_id]) ? $this->members[$user_id] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $group_name
|
||||
*/
|
||||
public function setGroupName($group_name) {
|
||||
$this->group_name = $group_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* set群成员的类
|
||||
* @param array $members
|
||||
*/
|
||||
public function setMembers(array $members) {
|
||||
$this->members = $members;
|
||||
}
|
||||
|
||||
/**
|
||||
* set群成员的类
|
||||
* @param $user_id
|
||||
* @param GroupMember $member
|
||||
*/
|
||||
public function setMember($user_id, GroupMember $member) {
|
||||
$this->members[$user_id] = $member;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新群信息
|
||||
* @param bool $with_members
|
||||
*/
|
||||
public function updateData($with_members = false) {
|
||||
$connection = CQUtil::getApiConnectionByQQ($this->getSelfId());
|
||||
CQUtil::sendAPI($connection->fd, ["action" => "get_group_list"], ["update_group_info", $this->getGroupId()]);
|
||||
if ($with_members) {
|
||||
CQUtil::sendAPI($connection->fd, ["action" => "get_group_member_list", "params" => ["group_id" => $this->getGroupId()]], ["update_group_member_list", strval($this->getGroupId())]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getSelfId() {
|
||||
return $this->self_id;
|
||||
}
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: jerry
|
||||
* Date: 2018/5/2
|
||||
* Time: 下午2:43
|
||||
*/
|
||||
|
||||
class GroupMember extends User
|
||||
{
|
||||
private $group = 0;
|
||||
private $card = "";
|
||||
private $join_time = 0;
|
||||
private $last_sent_time = 0;
|
||||
private $role = "member";
|
||||
private $attribute = [];
|
||||
|
||||
public function __construct($qid, Group $group, $data) {
|
||||
parent::__construct($qid);
|
||||
$this->group = $group;
|
||||
$this->card = $data["card"];
|
||||
$this->join_time = $data["join_time"];
|
||||
$this->last_sent_time = $data["last_sent_time"];
|
||||
$this->role = $data["role"];
|
||||
$this->attribute = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Group
|
||||
*/
|
||||
public function getGroup(): Group {
|
||||
return $this->group;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getCard() {
|
||||
return $this->card;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getJoinTime() {
|
||||
return $this->join_time;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getLastSentTime() {
|
||||
return $this->last_sent_time;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回角色
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRole() {
|
||||
return $this->role;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回用户是不是群管理员
|
||||
* @return bool
|
||||
*/
|
||||
public function isAdmin() {
|
||||
return in_array($this->getRole(), ["owner", "admin"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $card
|
||||
*/
|
||||
public function setCard(string $card) {
|
||||
$this->card = $card;
|
||||
$data = [
|
||||
"action" => "set_group_card",
|
||||
"params" => [
|
||||
"group_id" => $this->getGroup()->getGroupId(),
|
||||
"user_id" => $this->getId(),
|
||||
"card" => $card
|
||||
]
|
||||
];
|
||||
CQUtil::sendAPI(CQUtil::getApiConnectionByQQ($this->getGroup()->getSelfId())->fd, $data, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $join_time
|
||||
*/
|
||||
public function setJoinTime(int $join_time) {
|
||||
$this->join_time = $join_time;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $last_sent_time
|
||||
*/
|
||||
public function setLastSentTime(int $last_sent_time) {
|
||||
$this->last_sent_time = $last_sent_time;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $role
|
||||
*/
|
||||
public function setRole(string $role) {
|
||||
$this->role = $role;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getAttribute(): array {
|
||||
return $this->attribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $attribute
|
||||
*/
|
||||
public function setAttribute(array $attribute) {
|
||||
$this->attribute = $attribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新群组成员信息
|
||||
*/
|
||||
public function updateData() {
|
||||
$user_id = $this->getId();
|
||||
CQUtil::sendAPI(CQUtil::getApiConnectionByQQ($this->getGroup()->getSelfId())->fd, [
|
||||
"action" => "get_group_member_info",
|
||||
"params" => [
|
||||
"group_id" => $this->getGroup()->getGroupId(),
|
||||
"user_id" => $user_id,
|
||||
"no_cache" => true
|
||||
]
|
||||
], ["update_group_member_info", $this->getGroup()->getGroupId(), $user_id]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,68 +11,126 @@ use DataProvider as DP;
|
||||
class User
|
||||
{
|
||||
private $id;
|
||||
private $word_status = [];
|
||||
private $permission;
|
||||
private $is_friend = false;
|
||||
|
||||
private $buffer = null;
|
||||
protected $nickname = "";
|
||||
protected $permission = 0;
|
||||
protected $friend = [];
|
||||
protected $lexicon = [];
|
||||
protected $user_type = 0;//预留位置,0为QQ用户,1为为微信公众号用户
|
||||
|
||||
public function __construct($qid){
|
||||
protected $function = [];
|
||||
|
||||
public $buffer = null;
|
||||
|
||||
public function __construct($qid) {
|
||||
$this->id = $qid;
|
||||
if (strlen($qid) >= 15) $this->user_type = 1;
|
||||
$this->permission = DP::getJsonData("permissions.json")[$qid] ?? 0;
|
||||
$this->is_friend = isset(Buffer::get("friend_list")[$qid]) ? true : false;
|
||||
$this->friend = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户QQ号
|
||||
* @return mixed
|
||||
*/
|
||||
public function getId(){ return $this->id; }
|
||||
|
||||
/**
|
||||
* 获取用户添加词库的状态
|
||||
* @return array
|
||||
*/
|
||||
public function getWordStatus() : array{ return $this->word_status; }
|
||||
public function getId() { return $this->id; }
|
||||
|
||||
/**
|
||||
* 获取用户权限值
|
||||
* @return int
|
||||
*/
|
||||
public function getPermission() : int{ return $this->permission; }
|
||||
|
||||
/**
|
||||
* @param array $word_status
|
||||
* @return User
|
||||
*/
|
||||
public function setWordStatus(array $word_status): User{
|
||||
$this->word_status = $word_status;
|
||||
return $this;
|
||||
}
|
||||
public function getPermission() { return $this->permission; }
|
||||
|
||||
/**
|
||||
* @param int $permission
|
||||
* @return User
|
||||
*/
|
||||
public function setPermission(int $permission): User{
|
||||
public function setPermission(int $permission) {
|
||||
$this->permission = $permission;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 和用户是否是好友//TODO功能
|
||||
* @return bool
|
||||
*/
|
||||
public function isFriend(): bool{
|
||||
return $this->is_friend;
|
||||
}
|
||||
|
||||
public function getBuffer(){
|
||||
public function getBuffer() {
|
||||
return $this->buffer;
|
||||
}
|
||||
|
||||
public function setBuffer($buffer){
|
||||
public function setBuffer($buffer) {
|
||||
$this->buffer = $buffer;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getNickname() {
|
||||
return $this->nickname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFriend() {
|
||||
return $this->friend;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $friend
|
||||
*/
|
||||
public function setFriend(array $friend) {
|
||||
$this->friend = $friend;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $nickname
|
||||
*/
|
||||
public function setNickname(string $nickname) {
|
||||
$this->nickname = $nickname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getLexicon() {
|
||||
return $this->lexicon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $lexicon
|
||||
*/
|
||||
public function setLexicon(array $lexicon) {
|
||||
$this->lexicon = $lexicon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFunction() {
|
||||
return $this->function;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $function
|
||||
*/
|
||||
public function setFunction(array $function) {
|
||||
$this->function = $function;
|
||||
}
|
||||
|
||||
public function closeFunction($name) {
|
||||
unset($this->function[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getUserType() {
|
||||
return $this->user_type;
|
||||
}
|
||||
|
||||
public function toJson() {
|
||||
$ls = [];
|
||||
foreach ($this as $k => $v) {
|
||||
$ls[$k] = $v;
|
||||
}
|
||||
return json_encode($ls, 128 | 256);
|
||||
}
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: jerry
|
||||
* Date: 2018/6/13
|
||||
* Time: 8:10 PM
|
||||
*/
|
||||
|
||||
class WSConnection
|
||||
{
|
||||
public $fd;
|
||||
|
||||
/**
|
||||
* 0 = event连接
|
||||
* 1 = api连接
|
||||
* 默认为event连接,如果可以收到返回的get_status则标记为1
|
||||
* @var int
|
||||
*/
|
||||
protected $type = 0;
|
||||
|
||||
protected $server;
|
||||
|
||||
/** @var WSConnection */
|
||||
protected $pair = null;
|
||||
|
||||
protected $qq = "";
|
||||
|
||||
public function __construct(swoole_websocket_server $server, $fd) {
|
||||
$this->server = $server;
|
||||
$this->fd = $fd;
|
||||
$this->manageType();
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回swoole server
|
||||
* @return swoole_websocket_server
|
||||
*/
|
||||
public function getServer() {
|
||||
return $this->server;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回本连接是什么类型的
|
||||
* @return int
|
||||
*/
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用来确认此连接是API还是event
|
||||
* 如果此fd连接是event,则不会返回任何信息,关于QQ的匹配,则会在接收入第一条消息后设置
|
||||
* 如果此连接是api,则此操作后,HTTP API会返回登录号的号码,如果返回了则标记此连接为api并记录这个api连接属于的QQ号
|
||||
*/
|
||||
private function manageType() {
|
||||
$this->server->push($this->fd, '{"action":"get_login_info","echo":{"type":"handshake"}}');
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回此连接相关联的event连接,使用前需初始化完成
|
||||
* @return $this|null|WSConnection
|
||||
*/
|
||||
public function getEventConnection() {
|
||||
switch ($this->type) {
|
||||
case 0:
|
||||
return $this;
|
||||
case 1:
|
||||
return $this->pair;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回此链接相关联的api连接,使用前需初始化完成
|
||||
* @return $this|null|WSConnection
|
||||
*/
|
||||
public function getApiConnection() {
|
||||
switch ($this->type) {
|
||||
case 0:
|
||||
return $this->pair;
|
||||
case 1:
|
||||
return $this;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查此连接对应的QQ,此部分较为复杂,先留着
|
||||
* @param $qq
|
||||
*/
|
||||
public function manageQQ($qq) {
|
||||
//TODO
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回此连接属于的QQ号
|
||||
* @return string
|
||||
*/
|
||||
public function getQQ() {
|
||||
return $this->qq;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回关联连接(experiment)
|
||||
* @return WSConnection
|
||||
*/
|
||||
public function getPair() {
|
||||
return $this->pair;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置关联连接
|
||||
* @param WSConnection $pair
|
||||
*/
|
||||
public function setPair(WSConnection $pair) {
|
||||
$this->pair = $pair;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $qq
|
||||
*/
|
||||
public function setQQ($qq) {
|
||||
$this->qq = $qq;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $type
|
||||
*/
|
||||
public function setType(int $type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function findSub() {
|
||||
if ($this->qq != "") {
|
||||
foreach (CQUtil::getConnections() as $fd => $cn) {
|
||||
if ($cn->getQQ() == $this->qq && $cn->getType() != $this->getType()) {
|
||||
$this->setPair($cn);
|
||||
$cn->setPair($this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user