message_handler.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. type MessageHandlerStrategy interface {
  10. Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error
  11. }
  12. type MessageHandler struct {
  13. strategies map[string]MessageHandlerStrategy
  14. svcCtx *svc.ServiceContext
  15. }
  16. func NewMessageHandler(svcCtx *svc.ServiceContext) *MessageHandler {
  17. return &MessageHandler{
  18. strategies: make(map[string]MessageHandlerStrategy),
  19. svcCtx: svcCtx,
  20. }
  21. }
  22. func (h *MessageHandler) GetWrappedHandler() func(msg *wechat_ws.MsgJsonObject) error {
  23. return WrapToSimpleHandler(h.Handle)
  24. }
  25. func (h *MessageHandler) RegisterStrategy(msgType string, strategy MessageHandlerStrategy) {
  26. h.strategies[msgType] = strategy
  27. }
  28. func (h *MessageHandler) RegisterStrategies(strategyMap map[string]func(*svc.ServiceContext) MessageHandlerStrategy) {
  29. for msgType, strategyFunc := range strategyMap {
  30. h.RegisterStrategy(msgType, strategyFunc(h.svcCtx))
  31. logx.Infof("已注册消息处理策略: %s", msgType)
  32. }
  33. }
  34. func (h *MessageHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject) (err error) {
  35. defer func() {
  36. if r := recover(); r != nil {
  37. logx.Errorf("处理消息 msgType=%s 时 panic: %v", msg.MsgType, r)
  38. err = nil
  39. }
  40. }()
  41. strategy, exists := h.strategies[msg.MsgType]
  42. if !exists {
  43. logx.Infof("未注册处理器的消息类型: %s,跳过处理", msg.MsgType)
  44. return nil
  45. }
  46. return strategy.Handle(ctx, msg, h.svcCtx)
  47. }
  48. func toStrategy[T MessageHandlerStrategy](fn func(*svc.ServiceContext) T) func(*svc.ServiceContext) MessageHandlerStrategy {
  49. return func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
  50. return fn(svcCtx)
  51. }
  52. }
  53. func WrapToSimpleHandler(handler func(ctx context.Context, msg *wechat_ws.MsgJsonObject) error) func(msg *wechat_ws.MsgJsonObject) error {
  54. return func(msg *wechat_ws.MsgJsonObject) error {
  55. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  56. defer cancel()
  57. return handler(ctx, msg)
  58. }
  59. }