|
@@ -0,0 +1,55 @@
|
|
|
+package MessageHandlers
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+ "wechat-api/internal/pkg/wechat_ws"
|
|
|
+ "wechat-api/internal/svc"
|
|
|
+)
|
|
|
+
|
|
|
+// MessageHandlerStrategy 消息处理策略接口
|
|
|
+type MessageHandlerStrategy interface {
|
|
|
+ Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error
|
|
|
+}
|
|
|
+
|
|
|
+type MessageHandler struct {
|
|
|
+ strategies map[string]MessageHandlerStrategy
|
|
|
+ svcCtx *svc.ServiceContext
|
|
|
+}
|
|
|
+
|
|
|
+func NewMessageHandler(svcCtx *svc.ServiceContext) *MessageHandler {
|
|
|
+ return &MessageHandler{
|
|
|
+ strategies: make(map[string]MessageHandlerStrategy),
|
|
|
+ svcCtx: svcCtx,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// RegisterStrategy 注册消息处理策略
|
|
|
+func (h *MessageHandler) RegisterStrategy(msgType string, strategy MessageHandlerStrategy) {
|
|
|
+ h.strategies[msgType] = strategy
|
|
|
+}
|
|
|
+
|
|
|
+// Handle 根据 msgType 处理消息
|
|
|
+func (h *MessageHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject) error {
|
|
|
+ strategy, exists := h.strategies[msg.MsgType]
|
|
|
+ if !exists {
|
|
|
+ logx.Error("No handler registered for msgType: %s", msg.MsgType)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return strategy.Handle(ctx, msg, h.svcCtx)
|
|
|
+}
|
|
|
+
|
|
|
+// RegisterStrategies 使用映射表注册所有策略
|
|
|
+func (h *MessageHandler) RegisterStrategies() {
|
|
|
+ strategyMap := map[string]func(*svc.ServiceContext) MessageHandlerStrategy{
|
|
|
+ "FriendPushNotice": func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
|
|
|
+ return NewFriendPushNoticeTypeHandler(svcCtx)
|
|
|
+ },
|
|
|
+ "ChatroomPushNotice": func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
|
|
|
+ return NewChatroomPushNoticeTypeHandler(svcCtx)
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for msgType, strategyFunc := range strategyMap {
|
|
|
+ h.RegisterStrategy(msgType, strategyFunc(h.svcCtx))
|
|
|
+ }
|
|
|
+}
|