|
@@ -2,6 +2,7 @@ package server
|
|
|
|
|
|
import (
|
|
import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
|
|
+ "regexp"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gin-gonic/gin"
|
|
@@ -48,7 +49,6 @@ func (c *Client) reader() {
|
|
zlog.Errorf("error: %v", err)
|
|
zlog.Errorf("error: %v", err)
|
|
}
|
|
}
|
|
// Close connect
|
|
// Close connect
|
|
-
|
|
|
|
break
|
|
break
|
|
}
|
|
}
|
|
|
|
|
|
@@ -57,43 +57,27 @@ func (c *Client) reader() {
|
|
case MessageTypePingPong:
|
|
case MessageTypePingPong:
|
|
zlog.Debugf("receive ping message from %s", c.UserId)
|
|
zlog.Debugf("receive ping message from %s", c.UserId)
|
|
case MessageTypeUpChating, MessageTypeDownChating:
|
|
case MessageTypeUpChating, MessageTypeDownChating:
|
|
-
|
|
|
|
// Chat dialogue messages
|
|
// Chat dialogue messages
|
|
chatingContent := message.Content.(ChatingContent)
|
|
chatingContent := message.Content.(ChatingContent)
|
|
|
|
|
|
// Save message to database
|
|
// Save message to database
|
|
- payload, _ := json.Marshal(chatingContent.Payload)
|
|
|
|
messageId := uuid.NewString()
|
|
messageId := uuid.NewString()
|
|
- err = c.repos.SessionRepository.CreateMessage(c.ctx, &models.SessionMessage{
|
|
|
|
- ID: messageId,
|
|
|
|
- SessionId: chatingContent.Receiver,
|
|
|
|
- Receiver: chatingContent.Receiver,
|
|
|
|
- Sender: c.UserId,
|
|
|
|
- Type: message.Type,
|
|
|
|
- ContentType: chatingContent.PayloadType,
|
|
|
|
- Content: string(payload),
|
|
|
|
- IsRead: false,
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- if err != nil {
|
|
|
|
- c.writeError(message.RequestId, err)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- members, err := c.repos.SessionRepository.GetSessionMembersRemoveOneself(
|
|
|
|
- c.ctx, chatingContent.Receiver, c.UserId)
|
|
|
|
|
|
+ chatingContent.MessageId = messageId
|
|
|
|
+ err = c.saveMessage(messageId, message.Type, &chatingContent)
|
|
if err != nil {
|
|
if err != nil {
|
|
c.writeError(message.RequestId, err)
|
|
c.writeError(message.RequestId, err)
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
|
|
- chatingContent.MessageId = messageId
|
|
|
|
- for _, member := range members {
|
|
|
|
|
|
+ // Receiver ID format determines whether the receiver is an account or a session
|
|
|
|
+ users := c.getReceiverUserIds(chatingContent.Receiver)
|
|
|
|
+ for _, id := range users {
|
|
var messaging = *message
|
|
var messaging = *message
|
|
- messaging.Receiver = member.AccountId
|
|
|
|
|
|
+ messaging.Receiver = id
|
|
messaging.Content = chatingContent
|
|
messaging.Content = chatingContent
|
|
|
|
+ zlog.Info("Send message to ", id)
|
|
|
|
+
|
|
c.hub.Message <- &messaging
|
|
c.hub.Message <- &messaging
|
|
- zlog.Info("Send message to ", member.AccountId)
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// Reply message id
|
|
// Reply message id
|
|
@@ -149,3 +133,39 @@ func (c *Client) writeError(requestId string, err error) {
|
|
Content: ContentError{Err: err.Error()},
|
|
Content: ContentError{Err: err.Error()},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func (c *Client) saveMessage(messageId string, messageType int8, content *ChatingContent) error {
|
|
|
|
+ payload, _ := json.Marshal(content.Payload)
|
|
|
|
+ return c.repos.SessionRepository.CreateMessage(c.ctx, &models.SessionMessage{
|
|
|
|
+ ID: messageId,
|
|
|
|
+ SessionId: content.Receiver,
|
|
|
|
+ Receiver: content.Receiver,
|
|
|
|
+ Sender: c.UserId,
|
|
|
|
+ Type: messageType,
|
|
|
|
+ ContentType: content.PayloadType,
|
|
|
|
+ Content: string(payload),
|
|
|
|
+ IsRead: false,
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// getReceiverUserIds 通过 receiver 获取接收者的用户ID
|
|
|
|
+// 使用正则表达式验证ID 是否是 account_id 或 session_id
|
|
|
|
+// session_id 的话需要查询 session_member 表获取 session 的成员
|
|
|
|
+func (c *Client) getReceiverUserIds(receiver string) []string {
|
|
|
|
+ reg, _ := regexp.Compile(`[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}`)
|
|
|
|
+ if reg.Match([]byte(receiver)) {
|
|
|
|
+ return []string{receiver}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ members, err := c.repos.SessionRepository.GetSessionMembersRemoveOneself(
|
|
|
|
+ c.ctx, receiver, c.UserId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return []string{}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var ms = make([]string, len(members))
|
|
|
|
+ for i, memb := range members {
|
|
|
|
+ ms[i] = memb.AccountId
|
|
|
|
+ }
|
|
|
|
+ return ms
|
|
|
|
+}
|