95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
package services
|
|
|
|
import (
|
|
"ai_scheduler/internal/data/constant"
|
|
"ai_scheduler/internal/entitys"
|
|
"encoding/json"
|
|
"log"
|
|
|
|
"github.com/gofiber/websocket/v2"
|
|
)
|
|
|
|
// ChatHandler 聊天处理器
|
|
type ChatService struct {
|
|
routerService entitys.RouterService
|
|
}
|
|
|
|
// NewChatHandler 创建聊天处理器
|
|
func NewChatService(routerService entitys.RouterService) *ChatService {
|
|
return &ChatService{
|
|
routerService: routerService,
|
|
}
|
|
}
|
|
|
|
// ToolCallResponse 工具调用响应
|
|
type ToolCallResponse struct {
|
|
ID string `json:"id" example:"call_1"`
|
|
Type string `json:"type" example:"function"`
|
|
Function FunctionCallResponse `json:"function"`
|
|
Result interface{} `json:"result,omitempty"`
|
|
}
|
|
|
|
// FunctionCallResponse 函数调用响应
|
|
type FunctionCallResponse struct {
|
|
Name string `json:"name" example:"get_weather"`
|
|
Arguments interface{} `json:"arguments"`
|
|
}
|
|
|
|
func (h *ChatService) ChatFail(c *websocket.Conn, content string) {
|
|
//c.WriteMessage(messageType, message)
|
|
}
|
|
|
|
func (h *ChatService) Chat(c *websocket.Conn) {
|
|
log.Println("客户端已连接")
|
|
defer c.Close()
|
|
// 循环读取客户端消息
|
|
for {
|
|
messageType, message, err := c.ReadMessage()
|
|
if err != nil {
|
|
log.Println("读取错误:", err)
|
|
break
|
|
}
|
|
msg, chatType := h.handleMessageToString(c, messageType, message)
|
|
if chatType == constant.ConnStatusClosed {
|
|
break
|
|
}
|
|
if chatType == constant.ConnStatusIgnore {
|
|
continue
|
|
}
|
|
|
|
log.Printf("收到消息: %s", string(msg))
|
|
var req entitys.ChatSockRequest
|
|
if err := json.Unmarshal(msg, &req); err != nil {
|
|
log.Println("JSON parse error:", err)
|
|
continue
|
|
}
|
|
err = h.routerService.RouteWithSocket(c, &req)
|
|
if err != nil {
|
|
log.Println("处理失败:", err)
|
|
continue
|
|
}
|
|
}
|
|
log.Println("客户端已断开")
|
|
}
|
|
|
|
func (h *ChatService) handleMessageToString(c *websocket.Conn, msgType int, msg any) (text []byte, chatType constant.ConnStatus) {
|
|
switch msgType {
|
|
case websocket.TextMessage:
|
|
return msg.([]byte), constant.ConnStatusNormal
|
|
case websocket.BinaryMessage:
|
|
return msg.([]byte), constant.ConnStatusNormal
|
|
case websocket.CloseMessage:
|
|
|
|
return nil, constant.ConnStatusClosed
|
|
case websocket.PingMessage:
|
|
// 可选:回复 Pong
|
|
c.WriteMessage(websocket.PongMessage, nil)
|
|
return nil, constant.ConnStatusIgnore
|
|
case websocket.PongMessage:
|
|
return nil, constant.ConnStatusIgnore
|
|
default:
|
|
return nil, constant.ConnStatusIgnore
|
|
}
|
|
return msg.([]byte), constant.ConnStatusIgnore
|
|
}
|