ProjectWIND/core/web_socket.go

193 lines
4.9 KiB
Go
Raw Normal View History

2024-12-05 01:00:07 +08:00
package core
2024-11-28 15:20:29 +08:00
import (
"ProjectWIND/LOG"
2024-12-13 22:04:56 +08:00
"ProjectWIND/wba"
2024-11-28 15:20:29 +08:00
"encoding/json"
"fmt"
2024-12-13 22:04:56 +08:00
"github.com/gorilla/websocket"
"net/http"
2024-11-28 15:20:29 +08:00
"net/url"
)
var gProtocolAddr string
2024-12-13 22:04:56 +08:00
var gToken string
2024-11-28 15:20:29 +08:00
// WebSocketHandler 接收WebSocket连接处的消息并处理
2024-12-07 17:16:44 +08:00
func WebSocketHandler(protocolAddr string, token string) error {
// 保存全局变量
gProtocolAddr = protocolAddr
2024-12-13 22:04:56 +08:00
gToken = token
// 解析连接URL
u, err := url.Parse(protocolAddr)
2024-11-28 15:20:29 +08:00
if err != nil {
LOG.ERROR("Parse URL error: %v", err)
2024-11-30 10:25:12 +08:00
return err
2024-11-28 15:20:29 +08:00
}
2024-12-13 22:04:56 +08:00
// 创建一个带有Authorization头的HTTP请求
2024-12-07 17:16:44 +08:00
req, err := http.NewRequest("GET", u.String(), nil)
2024-11-28 15:20:29 +08:00
if err != nil {
2024-12-07 17:16:44 +08:00
LOG.FATAL("创建请求出错:%v", err)
}
req.Header.Set("Authorization", "Bearer "+token)
// 配置WebSocket连接升级器
dialer := websocket.DefaultDialer
// 使用升级器建立WebSocket连接
conn, _, err := dialer.Dial(req.URL.String(), req.Header)
if err != nil {
LOG.FATAL("建立WebSocket连接出错:%v", err)
2024-11-28 15:20:29 +08:00
}
defer func(conn *websocket.Conn) {
err := conn.Close()
if err != nil {
LOG.ERROR("Close error: %v", err)
2024-11-28 15:20:29 +08:00
}
}(conn)
2024-12-14 17:51:09 +08:00
LOG.INFO("已连接到WebSocket服务器: %v", u.String())
ProtocolInfo := AppApi.GetVersionInfo()
LOG.INFO("协议端信息: %v-%v", ProtocolInfo.Data.AppName, ProtocolInfo.Data.AppVersion)
2024-12-13 22:04:56 +08:00
logInfo := AppApi.GetLoginInfo()
LOG.INFO("连接到账号: %v%v", logInfo.Data.Nickname, logInfo.Data.UserId)
2024-11-28 19:45:03 +08:00
2024-11-30 10:25:12 +08:00
// 定义通道,缓存消息和消息类型,防止消息处理阻塞
messageChan := make(chan []byte, 32)
messageTypeChan := make(chan int, 32)
2024-11-28 15:20:29 +08:00
for {
2024-11-30 10:25:12 +08:00
// 接收消息并放入通道
2024-11-28 15:20:29 +08:00
messageType, message, err := conn.ReadMessage()
if err != nil {
LOG.ERROR("ReadMessage error: %v", err)
2024-11-30 10:25:12 +08:00
return err
2024-11-28 15:20:29 +08:00
}
2024-11-30 10:25:12 +08:00
messageChan <- message
messageTypeChan <- messageType
2024-11-28 15:20:29 +08:00
2024-11-30 10:25:12 +08:00
// 启动一个新的goroutine来处理消息
go func() {
defer func() {
// 处理完成后从通道中移除消息
<-messageChan
<-messageTypeChan
}()
processMessage(messageType, message)
}()
2024-11-28 15:20:29 +08:00
}
}
// processMessage 处理接收到的消息
2024-11-28 15:20:29 +08:00
func processMessage(messageType int, message []byte) {
if messageType != websocket.TextMessage {
LOG.ERROR("Invalid message type: %v", messageType)
2024-11-28 15:20:29 +08:00
return
}
//message json解析
var messageMap map[string]interface{}
err := json.Unmarshal(message, &messageMap)
if err != nil {
LOG.ERROR("Unmarshal error: %v", err)
2024-11-28 15:20:29 +08:00
return
}
// 处理接收到的消息
messageTypeStr := messageMap["post_type"]
switch messageTypeStr {
case "message":
{
// 处理message消息
HandleMessage(message)
return
}
case "notice":
{
// 处理notice消息
HandleNotice(message)
return
}
case "request":
{
// 处理request消息
HandleRequest(message)
return
}
case "meta_event":
{
// 处理meta_event消息
HandleMetaEvent(message)
return
}
}
}
// wsSendMessage 向WebSocket服务器发送消息并返回发送状态
2024-12-13 22:04:56 +08:00
func wsAPI(body wba.APIRequestInfo) (Response wba.APIResponseInfo, err error) {
// 序列化请求体
bodyBytes, err := json.Marshal(body)
if err != nil {
return wba.APIResponseInfo{}, err
}
2024-11-28 15:20:29 +08:00
// 解析连接URL
2024-12-13 22:04:56 +08:00
u, err := url.Parse(gProtocolAddr)
2024-11-28 15:20:29 +08:00
if err != nil {
2024-12-13 22:04:56 +08:00
LOG.ERROR("Parse URL error: %v", err)
return wba.APIResponseInfo{}, err
2024-11-28 15:20:29 +08:00
}
2024-12-13 22:04:56 +08:00
// 创建一个带有Authorization头的HTTP请求
req, err := http.NewRequest("GET", u.String(), nil)
2024-11-28 15:20:29 +08:00
if err != nil {
2024-12-13 22:04:56 +08:00
LOG.FATAL("创建请求出错:%v", err)
}
req.Header.Set("Authorization", "Bearer "+gToken)
// 配置WebSocket连接升级器
dialer := websocket.DefaultDialer
// 使用升级器建立WebSocket连接
conn, _, err := dialer.Dial(req.URL.String(), req.Header)
if err != nil {
LOG.FATAL("建立WebSocket连接出错:%v", err)
2024-11-28 15:20:29 +08:00
}
defer func(conn *websocket.Conn) {
err := conn.Close()
if err != nil {
LOG.ERROR("Close error: %v", err)
2024-11-28 15:20:29 +08:00
}
}(conn)
2024-12-13 22:04:56 +08:00
err = conn.WriteMessage(websocket.TextMessage, bodyBytes)
if err != nil {
2024-12-13 22:04:56 +08:00
return wba.APIResponseInfo{}, fmt.Errorf("请求发送失败: %v", err)
}
2024-12-13 22:04:56 +08:00
if body.Action == "get_group_list" || body.Action == "get_member_list" {
for {
_, message, err := conn.ReadMessage()
if err != nil {
return wba.APIResponseInfo{}, fmt.Errorf("响应接收失败: %v", err)
}
var Response wba.APIResponseInfo
err = json.Unmarshal(message, &Response)
if err != nil {
return wba.APIResponseInfo{}, fmt.Errorf("unmarshal error: %v", err)
}
if Response.Echo == body.Echo {
return Response, nil
}
}
}
2024-12-13 22:04:56 +08:00
//检查是否含有echo字段
if body.Echo != "" {
// 接收响应消息,直到收到echo字段一致的消息
for {
_, message, err := conn.ReadMessage()
if err != nil {
return wba.APIResponseInfo{}, fmt.Errorf("响应接收失败: %v", err)
}
var Response wba.APIResponseInfo
err = json.Unmarshal(message, &Response)
if err != nil {
return wba.APIResponseInfo{}, fmt.Errorf("unmarshal error: %v", err)
}
if Response.Echo == body.Echo {
return Response, nil
}
}
}
2024-12-13 22:04:56 +08:00
return wba.APIResponseInfo{}, nil
}