Răsfoiți Sursa

id的生成

luoyangwei 1 an în urmă
părinte
comite
e8f417192c
6 a modificat fișierele cu 75 adăugiri și 2 ștergeri
  1. 1 0
      go.mod
  2. 2 0
      go.sum
  3. 1 0
      models/session.go
  4. 27 0
      repositories/session_repositroy.go
  5. 21 2
      server/client.go
  6. 23 0
      utils/gid/gid.go

+ 1 - 0
go.mod

@@ -4,6 +4,7 @@ go 1.21.4
 
 require (
 	github.com/DeanThompson/ginpprof v0.0.0-20201112072838-007b1e56b2e1
+	github.com/bwmarrin/snowflake v0.3.0
 	github.com/denisbrodbeck/machineid v1.0.1
 	github.com/gin-gonic/gin v1.9.1
 	github.com/golang-jwt/jwt/v5 v5.2.0

+ 2 - 0
go.sum

@@ -4,6 +4,8 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
 github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
 github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
 github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
+github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
+github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
 github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
 github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
 github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=

+ 1 - 0
models/session.go

@@ -43,6 +43,7 @@ type SessionMessage struct {
 	ContentType uint8
 	Content     string
 	IsRead      BitBool
+	Received    BitBool
 }
 
 func (*Session) TableName() string {

+ 27 - 0
repositories/session_repositroy.go

@@ -3,6 +3,7 @@ package repositories
 import (
 	"context"
 
+	"github.com/mitchellh/mapstructure"
 	"github.com/rotisserie/eris"
 	"gorm.io/gorm"
 	"sikey.com/websocket/models"
@@ -29,14 +30,40 @@ type sessionMemberRepository interface {
 
 type sessionMessageRepository interface {
 
+	// FindMessageById 根据消息ID查询消息
+	FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error)
+
 	// CreateMessage 存消息
 	CreateMessage(ctx context.Context, message *models.SessionMessage) error
+
+	// UpdateMessage 修改消息内容
+	UpdateMessage(ctx context.Context, message *models.SessionMessage) error
 }
 
 type sessionRepository struct {
 	source *gorm.DB
 }
 
+// FindMessageById implements SessionRepository.
+func (repo *sessionRepository) FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error) {
+	var err error
+	var message models.SessionMessage
+	err = repo.source.WithContext(ctx).
+		Where(&models.SessionMessage{ID: msgId}).
+		First(&message).
+		Error
+	return &message, err
+}
+
+// UpdateMessage implements SessionRepository.
+func (repo *sessionRepository) UpdateMessage(ctx context.Context, message *models.SessionMessage) error {
+	var messageMap map[string]interface{}
+	if err := mapstructure.Decode(message, &messageMap); err != nil {
+		return eris.Wrap(err, "mapstructure.Decode error")
+	}
+	return repo.source.WithContext(ctx).Where(&models.SessionMessage{ID: message.ID}).Updates(messageMap).Error
+}
+
 // CreateMessage implements SessionRepository.
 func (repo *sessionRepository) CreateMessage(ctx context.Context, message *models.SessionMessage) error {
 	return repo.source.WithContext(ctx).Create(message).Error

+ 21 - 2
server/client.go

@@ -6,10 +6,12 @@ import (
 	"time"
 
 	"github.com/gin-gonic/gin"
-	"github.com/google/uuid"
 	"github.com/gorilla/websocket"
+	"github.com/rotisserie/eris"
+	"gorm.io/gorm"
 	"sikey.com/websocket/models"
 	"sikey.com/websocket/repositories"
+	"sikey.com/websocket/utils/gid"
 	"sikey.com/websocket/utils/zlog"
 )
 
@@ -63,7 +65,7 @@ func (c *Client) reader() {
 			chatingContent := message.Content.(ChatingContent)
 
 			// Save message to database
-			messageId := uuid.NewString()
+			messageId := gid.GetMessageId()
 			chatingContent.MessageId = messageId
 			err = c.saveMessage(messageId, message.Type, &chatingContent)
 			if err != nil {
@@ -118,6 +120,23 @@ func (c *Client) writer() {
 			if err != nil {
 				return
 			}
+
+			// Received modification message status
+			switch message.Type {
+			case MessageTypeUpChating, MessageTypeDownChating:
+				// Chat dialogue messages
+				chatingContent := message.Content.(ChatingContent)
+				if msg, err := c.repos.SessionRepository.FindMessageById(c.ctx, chatingContent.MessageId); err != nil {
+					msg.Received = true
+					c.repos.SessionRepository.UpdateMessage(c.ctx, msg)
+				} else {
+					if eris.Is(err, gorm.ErrRecordNotFound) {
+						break
+					}
+					zlog.Error(err)
+				}
+			}
+
 		case <-ticker.C:
 			// 到时间发送 ping 信号
 			c.UnderlyingConn.SetWriteDeadline(time.Now().Add(c.writeWait))

+ 23 - 0
utils/gid/gid.go

@@ -0,0 +1,23 @@
+package gid
+
+import (
+	"log"
+	"time"
+
+	"github.com/bwmarrin/snowflake"
+)
+
+var node *snowflake.Node
+
+func init() {
+	var err error
+	nodeId := time.Now().Unix()
+	node, err = snowflake.NewNode(nodeId)
+	if err != nil {
+		log.Fatalln(err)
+	}
+}
+
+func GetMessageId() string {
+	return node.Generate().String()
+}