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  }