github.com/glide-im/glide@v1.6.0/internal/message_handler/chat.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/gate" 6 "github.com/glide-im/glide/pkg/logger" 7 "github.com/glide-im/glide/pkg/messages" 8 ) 9 10 // handleChatMessage 分发用户单聊消息 11 func (d *MessageHandler) handleChatMessage(c *gate.Info, m *messages.GlideMessage) error { 12 msg := new(messages.ChatMessage) 13 if !d.unmarshalData(c, m, msg) { 14 return nil 15 } 16 msg.From = c.ID.UID() 17 msg.To = m.To 18 19 if msg.Mid == 0 && m.Action != messages.ActionChatMessageResend { 20 // 当客户端发送一条 mid 为 0 的消息时表示这条消息未被服务端收到过, 或客户端未收到服务端的确认回执 21 err := d.store.StoreMessage(msg) 22 if err != nil { 23 logger.E("store chat message error %v", err) 24 return err 25 } 26 } 27 // sender resend message to receiver, server has already acked it 28 // does the server should not ack it again ? 29 err := d.ackChatMessage(c, msg) 30 if err != nil { 31 logger.E("ack chat message error %v", err) 32 } 33 34 pushMsg := messages.NewMessage(0, messages2.ActionChatMessage, msg) 35 36 if !d.dispatchAllDevice(msg.To, pushMsg) { 37 // receiver offline, send offline message, and ack message 38 err := d.ackNotifyMessage(c, msg) 39 if err != nil { 40 logger.E("ack notify message error %v", err) 41 } 42 return d.dispatchOffline(c, msg) 43 } 44 return nil 45 } 46 47 func (d *MessageHandler) handleChatRecallMessage(c *gate.Info, msg *messages.GlideMessage) error { 48 return d.handleChatMessage(c, msg) 49 } 50 51 func (d *MessageHandler) ackNotifyMessage(c *gate.Info, m *messages.ChatMessage) error { 52 ackNotify := messages.AckNotify{Mid: m.Mid} 53 msg := messages.NewMessage(0, messages2.ActionAckNotify, &ackNotify) 54 return d.def.GetClientInterface().EnqueueMessage(c.ID, msg) 55 } 56 57 func (d *MessageHandler) ackChatMessage(c *gate.Info, msg *messages.ChatMessage) error { 58 ackMsg := messages.AckMessage{ 59 CliMid: msg.CliMid, 60 Mid: msg.Mid, 61 Seq: 0, 62 } 63 ack := messages.NewMessage(0, messages2.ActionAckMessage, &ackMsg) 64 return d.def.GetClientInterface().EnqueueMessage(c.ID, ack) 65 } 66 67 // dispatchOffline 接收者不在线, 离线推送 68 func (d *MessageHandler) dispatchOffline(c *gate.Info, message *messages.ChatMessage) error { 69 logger.D("dispatch offline message %v %v", c.ID, message) 70 err := d.store.StoreOffline(message) 71 if err != nil { 72 logger.E("store chat message error %v", err) 73 return err 74 } 75 return nil 76 } 77 78 // dispatchOnline 接收者在线, 直接投递消息 79 func (d *MessageHandler) dispatchOnline(c *gate.Info, msg *messages.ChatMessage) error { 80 receiverMsg := msg 81 msg.From = c.ID.UID() 82 dispatchMsg := messages.NewMessage(-1, messages2.ActionChatMessage, receiverMsg) 83 return d.def.GetClientInterface().EnqueueMessage(c.ID, dispatchMsg) 84 } 85 86 // TODO optimize 2022-6-20 11:18:24 87 func (d *MessageHandler) dispatchAllDevice(uid string, m *messages.GlideMessage) bool { 88 devices := []string{"", "1", "2", "3"} 89 90 var ok = false 91 for _, device := range devices { 92 id := gate.NewID("", uid, device) 93 err := d.def.GetClientInterface().EnqueueMessage(id, m) 94 if err != nil { 95 if !gate.IsClientNotExist(err) { 96 logger.E("dispatch message error %v", err) 97 } 98 } else { 99 ok = true 100 } 101 } 102 return ok 103 }