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 }