github.com/glide-im/glide@v1.6.0/internal/message_handler/handler.go (about)

     1  package message_handler
     2  
     3  import (
     4  	messages2 "github.com/glide-im/glide/im_service/messages"
     5  	"github.com/glide-im/glide/pkg/auth"
     6  	"github.com/glide-im/glide/pkg/gate"
     7  	"github.com/glide-im/glide/pkg/logger"
     8  	"github.com/glide-im/glide/pkg/messages"
     9  	"github.com/glide-im/glide/pkg/messaging"
    10  	"github.com/glide-im/glide/pkg/store"
    11  	"github.com/glide-im/glide/pkg/subscription"
    12  )
    13  
    14  var _ messaging.Messaging = (*MessageHandler)(nil)
    15  
    16  type Options struct {
    17  	// MessageStore chat message store
    18  	MessageStore store.MessageStore
    19  
    20  	// OfflineHandleFn client offline, handle message
    21  	OfflineHandleFn func(h *MessageHandler, ci *gate.Info, pushMessage *messages.GlideMessage)
    22  
    23  	// Auth used for client auth action handler messages.ActionApiAuth
    24  	Auth auth.Interface
    25  
    26  	// DontInitDefaultHandler true will not init default action handler, MessageHandler.InitDefaultHandler
    27  	DontInitDefaultHandler bool
    28  
    29  	// NotifyOnErr true express notify client on server error.
    30  	NotifyOnErr bool
    31  }
    32  
    33  // MessageHandler .
    34  type MessageHandler struct {
    35  	def   *messaging.MessageInterfaceImpl
    36  	store store.MessageStore
    37  
    38  	auth            auth.Interface
    39  	offlineHandleFn func(h *MessageHandler, ci *gate.Info, m *messages.GlideMessage)
    40  }
    41  
    42  func NewHandlerWithOptions(opts *Options) (*MessageHandler, error) {
    43  	impl, err := messaging.NewDefaultImpl(&messaging.Options{
    44  		NotifyServerError:     true,
    45  		MaxMessageConcurrency: 10_0000,
    46  	})
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	impl.SetNotifyErrorOnServer(opts.NotifyOnErr)
    51  	ret := &MessageHandler{
    52  		def:             impl,
    53  		store:           opts.MessageStore,
    54  		auth:            opts.Auth,
    55  		offlineHandleFn: opts.OfflineHandleFn,
    56  	}
    57  	if !opts.DontInitDefaultHandler {
    58  		ret.InitDefaultHandler(nil)
    59  	}
    60  	return ret, nil
    61  }
    62  
    63  // InitDefaultHandler
    64  // 初始化 message.Action 对应的默认 Handler, 部分类型的 Action 才有默认 Handler, 若要修改特定 Action 的默认 Handler 则可以在
    65  // callback 回调中返回你需要的即可, callback 参数 fn 既是该 action 对的默认 Handler.
    66  func (d *MessageHandler) InitDefaultHandler(callback func(action messages.Action, fn messaging.HandlerFunc) messaging.HandlerFunc) {
    67  	m := map[messages.Action]messaging.HandlerFunc{
    68  		messages2.ActionChatMessage:  d.handleChatMessage,
    69  		messages2.ActionGroupMessage: d.handleGroupMsg,
    70  		messages2.ActionAckRequest:   d.handleAckRequest,
    71  		messages2.ActionAckGroupMsg:  d.handleAckGroupMsgRequest,
    72  		messages2.ActionApiAuth:      d.handleAuth,
    73  		messages2.AckOffline:         d.handleAckOffline,
    74  		messages2.ActionHeartbeat:    d.handleHeartbeat,
    75  	}
    76  	for action, handlerFunc := range m {
    77  		if callback != nil {
    78  			handlerFunc = callback(action, handlerFunc)
    79  		}
    80  		d.AddHandler(messaging.NewActionHandler(action, handlerFunc))
    81  	}
    82  }
    83  
    84  func (d *MessageHandler) AddHandler(i messaging.MessageHandler) {
    85  	d.def.AddHandler(i)
    86  }
    87  
    88  func (d *MessageHandler) SetAuthorize(a auth.Interface) {
    89  	d.auth = a
    90  }
    91  
    92  func (d *MessageHandler) Handle(cInfo *gate.Info, msg *messages.GlideMessage) error {
    93  	return d.def.Handle(cInfo, msg)
    94  }
    95  
    96  func (d *MessageHandler) SetGate(g gate.Gateway) {
    97  	d.def.SetGate(g)
    98  }
    99  
   100  func (d *MessageHandler) SetSubscription(s subscription.Interface) {
   101  	d.def.SetSubscription(s)
   102  }
   103  
   104  // SetOfflineMessageHandler called while client is offline
   105  func (d *MessageHandler) SetOfflineMessageHandler(fn func(h *MessageHandler, ci *gate.Info, m *messages.GlideMessage)) {
   106  	d.offlineHandleFn = fn
   107  }
   108  
   109  func (d *MessageHandler) dispatchGroupMessage(gid int64, msg *messages.ChatMessage) error {
   110  	return d.def.GetGroupInterface().PublishMessage("", nil)
   111  }
   112  
   113  func (d *MessageHandler) enqueueMessage(id gate.ID, message *messages.GlideMessage) {
   114  	err := d.def.GetClientInterface().EnqueueMessage(id, message)
   115  	if err != nil {
   116  		logger.E("%v", err)
   117  	}
   118  }
   119  func (d *MessageHandler) unmarshalData(c *gate.Info, msg *messages.GlideMessage, to interface{}) bool {
   120  	err := msg.Data.Deserialize(to)
   121  	if err != nil {
   122  		logger.E("sender chat senderMsg %v", err)
   123  		return false
   124  	}
   125  	return true
   126  }