2024-12-05 01:00:07 +08:00
|
|
|
package core
|
2024-11-28 15:20:29 +08:00
|
|
|
|
|
|
|
import (
|
2024-12-03 09:21:00 +08:00
|
|
|
"ProjectWIND/LOG"
|
|
|
|
"bytes"
|
2024-11-28 15:20:29 +08:00
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
2024-12-03 09:21:00 +08:00
|
|
|
"io"
|
|
|
|
"net/http"
|
2024-11-28 15:20:29 +08:00
|
|
|
"net/url"
|
|
|
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
)
|
|
|
|
|
2024-11-29 11:43:39 +08:00
|
|
|
var gProtocolAddr string
|
2024-11-28 15:20:29 +08:00
|
|
|
|
2024-11-29 11:43:39 +08:00
|
|
|
// WebSocketHandler 接收WebSocket连接处的消息并处理
|
2024-11-30 10:25:12 +08:00
|
|
|
func WebSocketHandler(protocolAddr string) error {
|
2024-11-29 11:43:39 +08:00
|
|
|
// 保存全局变量
|
|
|
|
gProtocolAddr = protocolAddr
|
|
|
|
// 解析连接URL
|
|
|
|
u, err := url.Parse(protocolAddr)
|
2024-11-28 15:20:29 +08:00
|
|
|
if err != nil {
|
2024-12-03 09:21:00 +08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
|
|
|
|
if err != nil {
|
2024-12-03 09:21:00 +08:00
|
|
|
LOG.ERROR("Dial error: %v", err)
|
2024-11-30 10:25:12 +08:00
|
|
|
return err
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
defer func(conn *websocket.Conn) {
|
|
|
|
err := conn.Close()
|
|
|
|
if err != nil {
|
2024-12-03 09:21:00 +08:00
|
|
|
LOG.ERROR("Close error: %v", err)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
}(conn)
|
|
|
|
|
2024-12-03 09:21:00 +08:00
|
|
|
LOG.INFO("WebSocket connection to %v established.", u.String())
|
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 {
|
2024-12-03 09:21:00 +08:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-11-29 11:43:39 +08:00
|
|
|
// processMessage 处理接收到的消息
|
2024-11-28 15:20:29 +08:00
|
|
|
func processMessage(messageType int, message []byte) {
|
|
|
|
if messageType != websocket.TextMessage {
|
2024-12-03 09:21:00 +08:00
|
|
|
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 {
|
2024-12-03 09:21:00 +08:00
|
|
|
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
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
// 打印接收到的消息
|
2024-12-03 09:21:00 +08:00
|
|
|
LOG.WARN("Received unknown event: %s", message)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// wsSendMessage 向WebSocket服务器发送消息并返回发送状态
|
2024-12-03 09:21:00 +08:00
|
|
|
func wsAPI(body []byte) error {
|
2024-11-28 15:20:29 +08:00
|
|
|
// 解析连接URL
|
2024-11-29 11:43:39 +08:00
|
|
|
u, err := url.Parse(fmt.Sprintf("%v/api", gProtocolAddr))
|
2024-11-28 15:20:29 +08:00
|
|
|
if err != nil {
|
2024-11-29 11:43:39 +08:00
|
|
|
return fmt.Errorf("无效的URL: %v", err)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// 建立连接
|
|
|
|
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
|
|
|
|
if err != nil {
|
2024-11-29 11:43:39 +08:00
|
|
|
return fmt.Errorf("连接失败: %v", err)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
defer func(conn *websocket.Conn) {
|
|
|
|
err := conn.Close()
|
|
|
|
if err != nil {
|
2024-12-03 09:21:00 +08:00
|
|
|
LOG.ERROR("Close error: %v", err)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
}(conn)
|
|
|
|
|
2024-12-03 09:21:00 +08:00
|
|
|
// 发送请求
|
|
|
|
err = conn.WriteMessage(websocket.TextMessage, body)
|
2024-11-28 15:20:29 +08:00
|
|
|
if err != nil {
|
2024-12-03 09:21:00 +08:00
|
|
|
return fmt.Errorf("请求发送失败: %v", err)
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
|
|
|
|
2024-11-29 11:43:39 +08:00
|
|
|
return nil
|
2024-11-28 15:20:29 +08:00
|
|
|
}
|
2024-12-03 09:21:00 +08:00
|
|
|
|
|
|
|
func httpAPI(method, action string, body []byte) (int, []byte, error) {
|
|
|
|
urlStr := fmt.Sprintf("%v/api/%v", gProtocolAddr, action)
|
|
|
|
resp, err := http.Post(urlStr, "application/json", bytes.NewReader(body))
|
|
|
|
if err != nil {
|
|
|
|
return 0, nil, fmt.Errorf("请求失败: %v", err)
|
|
|
|
}
|
|
|
|
defer func(resp *http.Response) {
|
|
|
|
err := resp.Body.Close()
|
|
|
|
if err != nil {
|
|
|
|
LOG.ERROR("Close error: %v", err)
|
|
|
|
}
|
|
|
|
}(resp)
|
|
|
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
return 0, nil, fmt.Errorf("请求失败: %v", resp.Status)
|
|
|
|
}
|
|
|
|
|
|
|
|
body, err = io.ReadAll(resp.Body)
|
|
|
|
if err != nil {
|
|
|
|
return 0, nil, fmt.Errorf("读取响应失败: %v", err)
|
|
|
|
}
|
|
|
|
return resp.StatusCode, body, nil
|
|
|
|
}
|