diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 42d2c829f..25b71f94d 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -705,6 +705,27 @@ class WebSocketDialog extends AbstractModel return WebSocketDialogUser::whereDialogId($this->id)->where('userid', '>', 0)->count() === 1; } + /** + * 检查是否是AI对话 + * @return bool + */ + public function isAiDialog() + { + // 这个不会有变化,所以可以使用永久缓存 + return Cache::rememberForever('is-ai-dialog-' . $this->id, function () { + if ($this->type !== 'user') { + return false; + } + $data = $this->dialogUserBuilder()->get(); + foreach ($data as $item) { + if (preg_match('/^ai-(.*?)@bot\.system$/', $item->email)) { + return true; + } + } + return false; + }); + } + /** * 获取对话(同时检验对话身份) * @param $dialog_id diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 83e56cbdd..15b3041d3 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -456,27 +456,10 @@ class WebSocketDialogMsg extends AbstractModel 'parent_id' => $this->id, // 转发的消息ID 'parent_userid' => $this->userid, // 转发的消息会员ID 'show' => $showSource, // 是否显示原发送者信息 + 'leave' => $leaveMessage ? 1 : 0, // 是否留言(用于判断是否发给AI) ]; $msgs = []; - $already = []; - if ($dialogids) { - if (!is_array($dialogids)) { - $dialogids = [$dialogids]; - } - foreach ($dialogids as $dialogid) { - $res = self::sendMsg('forward-' . $forwardId, $dialogid, $this->type, $msgData, $user->userid); - if (Base::isSuccess($res)) { - $msgs[] = $res['data']; - $already[] = $dialogid; - } - if ($leaveMessage) { - $res = self::sendMsg(null, $dialogid, 'text', ['text' => $leaveMessage], $user->userid); - if (Base::isSuccess($res)) { - $msgs[] = $res['data']; - } - } - } - } + $dialogs = []; if ($userids) { if (!is_array($userids)) { $userids = [$userids]; @@ -486,17 +469,35 @@ class WebSocketDialogMsg extends AbstractModel continue; } $dialog = WebSocketDialog::checkUserDialog($user, $userid); - if ($dialog && !in_array($dialog->id, $already)) { - $res = self::sendMsg('forward-' . $forwardId, $dialog->id, $this->type, $msgData, $user->userid); - if (Base::isSuccess($res)) { - $msgs[] = $res['data']; - } - if ($leaveMessage) { - $res = self::sendMsg(null, $dialog->id, 'text', ['text' => $leaveMessage], $user->userid); - if (Base::isSuccess($res)) { - $msgs[] = $res['data']; - } - } + if ($dialog) { + $dialogs[$dialog->id] = $dialog; + } + } + } + if ($dialogids) { + if (!is_array($dialogids)) { + $dialogids = [$dialogids]; + } + foreach ($dialogids as $dialogid) { + if (isset($dialogs[$dialogid])) { + continue; + } + $dialog = WebSocketDialog::find($dialogid); + if ($dialog) { + $dialogs[$dialog->id] = $dialog; + } + } + } + foreach ($dialogs as $dialog) { + $res = self::sendMsg('forward-' . $forwardId, $dialog->id, $this->type, $msgData, $user->userid); + if (Base::isSuccess($res)) { + $msgs[] = $res['data']; + } + if ($leaveMessage) { + $action = $dialog->isAiDialog() ? "reply-{$res['data']['id']}" : null; + $res = self::sendMsg($action, $dialog->id, 'text', ['text' => $leaveMessage], $user->userid); + if (Base::isSuccess($res)) { + $msgs[] = $res['data']; } } } diff --git a/app/Tasks/BotReceiveMsgTask.php b/app/Tasks/BotReceiveMsgTask.php index 66b7567e0..89ad8907d 100644 --- a/app/Tasks/BotReceiveMsgTask.php +++ b/app/Tasks/BotReceiveMsgTask.php @@ -408,6 +408,10 @@ class BotReceiveMsgTask extends AbstractTask $errorContent = null; if ($botUser->isAiBot($type)) { // AI机器人 + if (Base::val($msg->msg, 'forward_data.leave')) { + // AI机器人不处理带有留言的转发消息,因为他要处理那条留言消息 + return; + } $setting = Base::setting('aibotSetting'); $extras = [ 'model_type' => match ($type) {