xiaoai/php_server/app/api/logic/wechat/MessageLogic.php

239 lines
7.1 KiB
PHP

<?php
namespace app\api\logic\wechat;
use app\common\model\wechat\AiWechatGreetStrategy;
use app\common\model\wechat\AiWechatReplyStrategy;
use app\common\model\wechat\AiWechatRobot;
use app\common\service\FileService;
use app\common\model\wechat\AiWechatContact;
use app\common\model\wechat\AiWechat;
/**
* MessageLogic
* @desc 微信消息
* @author Qasim
*/
class MessageLogic extends WechatBaseLogic
{
/**
* @desc 打招呼
* @param array $params
* @return bool
*/
public static function greetMessage(array $params)
{
try {
// 获取微信账号信息
$wechat = self::wechatInfo($params['wechat_id']);
if (is_bool($wechat)) {
return false;
}
// 获取微信好友信息
$friend = self::friendInfo($params['wechat_id'], $params['friend_id']);
if (is_bool($friend)) {
return false;
}
if ($friend->open_ai == 0) {
self::setError('未开启全局AI');
return false;
}
// 获取用户设置
$greet = AiWechatGreetStrategy::where('user_id', self::$uid)->findOrEmpty();
if ($greet->isEmpty()) {
self::setError('请先设置打招呼的配置');
return false;
}
if ($greet->is_enable == 0) {
self::setError('未开启打招呼配置');
return false;
}
// 给好友发消息
foreach ($greet->greet_content as $key => $content) {
if ($key !== 0) {
sleep(5);
}
$message = [
'wechat_id' => $wechat->wechat_id,
'friend_id' => $params['friend_id'],
'device_code' => $wechat->device_code,
'opt_type' => 'greet'
];
switch ($content['type']) {
case 0: //文本
// 推送消息
$message['message'] = str_replace('${remark}', $friend->remark, $content['content']);
break;
case 1: //图片
// 推送消息
$message['message'] = FileService::getFileUrl($content['content']);
$message['message_type'] = 2;
break;
default:
}
//\app\common\service\ToolsService::Wechat()->push($message);
self::wxPush($message);
}
// 用户设置打招呼,设置接管模式
$friend->takeover_mode = $greet->greet_after_ai_enable;
$friend->save();
return true;
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* @desc 发送消息
* @param array $params
* @return bool
*/
public static function sendMessage(array $params)
{
try {
// 获取微信账号信息
$wechat = AiWechat::alias('w')
->join('ai_wechat_setting s', 's.wechat_id = w.wechat_id')
->where('w.wechat_id', $params['wechat_id'])
->where('w.user_id', self::$uid)
->findOrEmpty();
if ($wechat->isEmpty()) {
self::setError('微信账号不存在');
return false;
}
// 获取微信好友信息
$friend = self::friendInfo($params['wechat_id'], $params['friend_id']);
if (is_bool($friend)) {
return false;
}
// 未开启全局AI
if ($friend->open_ai == 0) {
self::setError('未开启全局AI');
return false;
}
// 获取用户回复设置
$reply = AiWechatReplyStrategy::where('user_id', self::$uid)->findOrEmpty();
if ($reply->isEmpty()) {
self::setError('请先设置回复的配置');
return false;
}
// 机器人
$robot = AiWechatRobot::where('id', $wechat->robot_id)->findOrEmpty();
if ($robot->isEmpty()) {
self::setError('机器人不存在');
return false;
}
// 组装请求参数
$request = [
'wechat_id' => $wechat->wechat_id,
'friend_id' => $params['friend_id'],
'friend_remark' => $friend->remark,
'device_code' => $wechat->device_code,
'message' => $params['message'],
'message_id' => $params['message_id'],
'message_type' => 1,
];
//step 1. 正则匹配停止AI回复
$stop = self::regularMatchStopAI($reply, $request);
if ($stop) {
// 关闭AI接管
AiWechatContact::where('wechat_id', $wechat->wechat_id)->where('friend_id', $params['friend_id'])->update(['takeover_mode' => 0]);
return true;
}
// step 2. 正则匹配关键词
$match = self::regularMatchKeyword($robot, $request);
if ($match) {
return true;
}
// step 3. 发送AI消息
self::parseAiPrompt($robot, $request, $params['message_logs']);
return true;
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* @desc 获取在线状态
* @param string $wechat_id
* @param string $device_code
* @param int $type 0: 微信 1: 设备
* @return bool
*/
public static function getOnlineStatus(string $wechat_id, string $device_code, int $type = 0)
{
try {
// 获取微信账号信息
$wechat = self::wechatInfo($wechat_id);
if (is_bool($wechat)) {
return false;
}
// 获取设备信息
$device = self::deviceInfo($device_code);
if (is_bool($device)) {
self::setError('设备不存在');
return false;
}
// $response = \app\common\service\ToolsService::Wechat()->online([
// 'wechat_id' => $wechat_id,
// 'device_code' => $device_code,
// 'type' => $type,
// ]);
$response = self::wxOnline([
'wechat_id' => $wechat_id,
'device_code' => $device_code,
'type' => $type,
]);
if (isset($response['code']) && $response['code'] != 10000) {
self::setError($response['message']?? '获取在线状态失败');
return false;
}
self::$returnData = $response['data']['online_status'] ?? 0;
return true;
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
}