93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
|
|
kafkago "github.com/segmentio/kafka-go"
|
|
)
|
|
|
|
// MessageHandler 处理 Kafka 消息
|
|
type MessageHandler struct {
|
|
wsService *WebSocketService
|
|
}
|
|
|
|
// WebSocketMessage 定义 WebSocket 消息结构
|
|
type WebSocketMessage struct {
|
|
Type string `json:"type"`
|
|
Content string `json:"content"`
|
|
Payload json.RawMessage `json:"payload,omitempty"`
|
|
}
|
|
|
|
func NewMessageHandler(wsService *WebSocketService) *MessageHandler {
|
|
return &MessageHandler{
|
|
wsService: wsService,
|
|
}
|
|
}
|
|
|
|
func (h *MessageHandler) Start() error {
|
|
return nil
|
|
}
|
|
|
|
func (h *MessageHandler) Stop() error {
|
|
return nil
|
|
}
|
|
|
|
// parseJSONMessage 解析并格式化 JSON 消息
|
|
func (h *MessageHandler) parseJSONMessage(message []byte) (string, error) {
|
|
var jsonData interface{}
|
|
if err := json.Unmarshal(message, &jsonData); err != nil {
|
|
return "", fmt.Errorf("failed to parse JSON: %v", err)
|
|
}
|
|
|
|
prettyJSON, err := json.MarshalIndent(jsonData, "", " ")
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to format JSON: %v", err)
|
|
}
|
|
|
|
return string(prettyJSON), nil
|
|
}
|
|
|
|
// parseWebSocketMessage 解析为 WebSocketMessage 结构
|
|
func (h *MessageHandler) parseWebSocketMessage(message []byte) (*WebSocketMessage, error) {
|
|
var wsMsg WebSocketMessage
|
|
if err := json.Unmarshal(message, &wsMsg); err != nil {
|
|
return nil, fmt.Errorf("failed to parse WebSocket message: %v", err)
|
|
}
|
|
return &wsMsg, nil
|
|
}
|
|
|
|
func (h *MessageHandler) HandleMessage(message *kafkago.Message) error {
|
|
// 解析并打印格式化的 JSON
|
|
prettyJSON, err := h.parseJSONMessage(message.Value)
|
|
if err != nil {
|
|
log.Printf("Error parsing message: %v", err)
|
|
return err
|
|
}
|
|
fmt.Printf("Received message:\n%s\n", prettyJSON)
|
|
|
|
// 解析为 WebSocketMessage
|
|
wsMsg, err := h.parseWebSocketMessage(message.Value)
|
|
if err != nil {
|
|
log.Printf("Error parsing WebSocket message: %v", err)
|
|
return err
|
|
}
|
|
|
|
// 根据消息类型处理不同的业务逻辑
|
|
switch wsMsg.Type {
|
|
case "message":
|
|
// 处理普通消息
|
|
return h.wsService.Broadcast(message.Value)
|
|
case "broadcast":
|
|
// 广播消息给所有连接的客户端
|
|
return h.wsService.Broadcast(wsMsg.Payload)
|
|
case "private":
|
|
// 处理私聊消息
|
|
return h.wsService.SendPrivateMessage(wsMsg.Payload)
|
|
default:
|
|
log.Printf("Unknown message type: %s", wsMsg.Type)
|
|
return nil
|
|
}
|
|
}
|