register_strategy.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package MessageHandlers
  2. import (
  3. "context"
  4. "time"
  5. "github.com/zeromicro/go-zero/core/logx"
  6. "wechat-api/internal/pkg/wechat_ws"
  7. "wechat-api/internal/svc"
  8. )
  9. // MessageHandlerStrategy 消息处理策略接口
  10. type MessageHandlerStrategy interface {
  11. Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error
  12. }
  13. type MessageHandler struct {
  14. strategies map[string]MessageHandlerStrategy
  15. svcCtx *svc.ServiceContext
  16. }
  17. // NewMessageHandler 创建新的消息调度器
  18. func NewMessageHandler(svcCtx *svc.ServiceContext) *MessageHandler {
  19. return &MessageHandler{
  20. strategies: make(map[string]MessageHandlerStrategy),
  21. svcCtx: svcCtx,
  22. }
  23. }
  24. // GetWrappedHandler 返回适配后的 handler,可直接用于 ws.RegisterMessageHandler
  25. func (h *MessageHandler) GetWrappedHandler() func(msg *wechat_ws.MsgJsonObject) error {
  26. return WrapToSimpleHandler(h.Handle)
  27. }
  28. // RegisterStrategy 注册单个消息处理策略
  29. func (h *MessageHandler) RegisterStrategy(msgType string, strategy MessageHandlerStrategy) {
  30. h.strategies[msgType] = strategy
  31. }
  32. // RegisterStrategies 批量注册消息处理策略
  33. func (h *MessageHandler) RegisterStrategies() {
  34. strategyMap := map[string]func(*svc.ServiceContext) MessageHandlerStrategy{
  35. "FriendPushNotice": toStrategy(NewFriendPushNoticeTypeHandler),
  36. //"ChatroomPushNotice": toStrategy(NewChatroomPushNoticeTypeHandler),
  37. "ContactLabelInfoNotice": toStrategy(NewContactLabelInfoNotice),
  38. "FindContactTaskResultNotice": toStrategy(NewFindContactTaskResultNoticeHandler),
  39. }
  40. for msgType, strategyFunc := range strategyMap {
  41. h.RegisterStrategy(msgType, strategyFunc(h.svcCtx))
  42. logx.Infof("已注册消息处理策略: %s", msgType)
  43. }
  44. }
  45. // Handle 消息分发逻辑,带 recover 容错
  46. func (h *MessageHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject) (err error) {
  47. defer func() {
  48. if r := recover(); r != nil {
  49. logx.Errorf("处理消息 msgType=%s 时 panic: %v", msg.MsgType, r)
  50. err = nil // 防止 panic 向上冒泡
  51. }
  52. }()
  53. strategy, exists := h.strategies[msg.MsgType]
  54. if !exists {
  55. logx.Infof("未注册处理器的消息类型: %s,跳过处理", msg.MsgType)
  56. return nil
  57. }
  58. return strategy.Handle(ctx, msg, h.svcCtx)
  59. }
  60. // toStrategy 泛型辅助转换
  61. func toStrategy[T MessageHandlerStrategy](fn func(*svc.ServiceContext) T) func(*svc.ServiceContext) MessageHandlerStrategy {
  62. return func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
  63. return fn(svcCtx)
  64. }
  65. }
  66. // WrapToSimpleHandler 将带 context 的 handler 包装成简洁 MessageHandler 函数
  67. func WrapToSimpleHandler(handler func(ctx context.Context, msg *wechat_ws.MsgJsonObject) error) func(msg *wechat_ws.MsgJsonObject) error {
  68. return func(msg *wechat_ws.MsgJsonObject) error {
  69. // 创建默认上下文(支持自定义扩展)
  70. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  71. defer cancel()
  72. return handler(ctx, msg)
  73. }
  74. }