diff --git a/route/v1/file.go b/route/v1/file.go index 93645c7..2b83476 100644 --- a/route/v1/file.go +++ b/route/v1/file.go @@ -30,6 +30,7 @@ import ( "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/service" + model2 "github.com/IceWhaleTech/CasaOS/service/model" "github.com/IceWhaleTech/CasaOS/internal/sign" "github.com/gin-gonic/gin" @@ -971,6 +972,7 @@ type Client struct { RtcSupported bool `json:"rtcSupported"` TimerId int `json:"timerId"` LastBeat time.Time `json:"lastBeat"` + Offline bool `json:"offline"` } func ConnectWebSocket(c *gin.Context) { @@ -978,8 +980,8 @@ func ConnectWebSocket(c *gin.Context) { writer := c.Writer request := c.Request key := uuid.NewV4().String() - peerModel := service.MyService.Peer().GetPeerByUserAgent(c.Request.UserAgent()) - //peerModel := model2.PeerDriveDBModel{} + //peerModel := service.MyService.Peer().GetPeerByUserAgent(c.Request.UserAgent()) + peerModel := model2.PeerDriveDBModel{} name := service.GetName(request) if conn, err = upgraderFile.Upgrade(writer, request, writer.Header()); err != nil { log.Println(err) @@ -996,6 +998,7 @@ func ConnectWebSocket(c *gin.Context) { client.Name = service.GetNameByDB(peerModel) } } + var list = service.MyService.Peer().GetPeers() if len(peerModel.ID) == 0 { peerModel.ID = key peerModel.DisplayName = name.DisplayName @@ -1005,7 +1008,9 @@ func ConnectWebSocket(c *gin.Context) { peerModel.UserAgent = c.Request.UserAgent() peerModel.IP = client.IP service.MyService.Peer().CreatePeer(&peerModel) + list = append(list, peerModel) } + cookie := http.Cookie{ Name: "peerid", Value: key, @@ -1020,11 +1025,31 @@ func ConnectWebSocket(c *gin.Context) { fmt.Println(err) client.handler.broadcast <- pby + // 推给监控中心注册到用户集合中 + handler.register <- client + if len(list) > 10 { + fmt.Println("有溢出", list) + } + if len(list) > 10 { + count := len(list) - 10 + for i := len(list) - 1; count > 0 && i > -1; i-- { + if _, ok := handler.clients[list[i].ID]; !ok { + count-- + service.MyService.Peer().DeletePeer(list[i].ID) + } + } + } + list = service.MyService.Peer().GetPeers() + if len(list) > 10 { + fmt.Println("解决完后依然有溢出", list) + } clients := []Client{} - for _, v := range handler.clients { - - clients = append(clients, *v) - + for _, v := range list { + if _, ok := handler.clients[v.ID]; ok { + clients = append(clients, *handler.clients[v.ID]) + } else { + clients = append(clients, Client{ID: v.ID, Name: service.GetNameByDB(v), IP: v.IP, Offline: true}) + } } other := make(map[string]interface{}) @@ -1032,14 +1057,12 @@ func ConnectWebSocket(c *gin.Context) { other["peers"] = clients otherBy, err := json.Marshal(other) fmt.Println(err) - client.send <- otherBy - - // 推给监控中心注册到用户集合中 - handler.register <- client + client.handler.broadcast <- otherBy data := make(map[string]string) data["displayName"] = client.Name.DisplayName data["deviceName"] = client.Name.DeviceName + data["id"] = client.ID msg := make(map[string]interface{}) msg["type"] = "display-name" msg["message"] = data @@ -1110,7 +1133,22 @@ func (c *Client) readPump() { if t.String() == "disconnect" { c.handler.unregister <- c c.conn.Close() + clients := []Client{} + list := service.MyService.Peer().GetPeers() + for _, v := range list { + if _, ok := handler.clients[v.ID]; ok { + clients = append(clients, *handler.clients[v.ID]) + } else { + clients = append(clients, Client{ID: v.ID, Name: service.GetNameByDB(v), IP: v.IP, Offline: true}) + } + } + other := make(map[string]interface{}) + other["type"] = "peers" + other["peers"] = clients + otherBy, err := json.Marshal(other) + fmt.Println(err) c.handler.broadcast <- []byte(`{"type":"peer-left","peerId":"` + c.ID + `"}`) + c.handler.broadcast <- otherBy break } else if t.String() == "pong" { c.LastBeat = time.Now() diff --git a/service/peer.go b/service/peer.go index ac5d97f..5b613ce 100644 --- a/service/peer.go +++ b/service/peer.go @@ -22,12 +22,17 @@ type PeerService interface { GetPeers() (peers []model2.PeerDriveDBModel) CreatePeer(m *model2.PeerDriveDBModel) DeletePeer(id string) + GetPeerByName(name string) (m model2.PeerDriveDBModel) } type peerStruct struct { db *gorm.DB } +func (s *peerStruct) GetPeerByName(name string) (m model2.PeerDriveDBModel) { + s.db.Where("display_name = ?", name).First(&m) + return +} func (s *peerStruct) GetPeerByUserAgent(ua string) (m model2.PeerDriveDBModel) { s.db.Where("user_agent = ?", ua).First(&m) return @@ -37,17 +42,11 @@ func (s *peerStruct) GetPeerByID(id string) (m model2.PeerDriveDBModel) { return } func (s *peerStruct) GetPeers() (peers []model2.PeerDriveDBModel) { - s.db.Find(&peers) + s.db.Order("updated desc").Find(&peers) return } func (s *peerStruct) CreatePeer(m *model2.PeerDriveDBModel) { - var list []model.PeerDriveDBModel - s.db.Order("updated desc").Find(&list) - if len(list) > 10 { - for _, v := range list[10:] { - s.db.Where("id = ?", v.ID).Delete(&model.PeerDriveDBModel{}) - } - } + s.db.Create(m) } diff --git a/service/socket.go b/service/socket.go index fd60c98..89f28ce 100644 --- a/service/socket.go +++ b/service/socket.go @@ -2,6 +2,7 @@ package service import ( "net/http" + "strconv" "strings" model2 "github.com/IceWhaleTech/CasaOS/service/model" @@ -13,9 +14,8 @@ type Name struct { Model string `json:"model"` OS string `json:"os"` Browser string `json:"browser"` - Type string `json:"type"` DeviceName string `json:"deviceName"` - DisplayName string `json:"displayName"` //随机生成 + DisplayName string `json:"displayName"` } func GetPeerId(request *http.Request, id string) string { @@ -47,7 +47,6 @@ func GetIP(request *http.Request) string { func GetName(request *http.Request) Name { us := useragent.Parse(request.Header.Get("user-agent")) - device := "" if len(us.Device) > 0 { device += us.Device @@ -55,12 +54,37 @@ func GetName(request *http.Request) Name { device += us.Name } + display := "" + if len(us.Device) > 0 { + display = us.Device + " " + us.Name + } else { + display = us.OS + " " + us.Name + } + + model := "desktop" + if us.Mobile { + model = "mobile" + } + if us.Tablet { + model = "tablet" + } + peer := MyService.Peer().GetPeerByName(display) + if len(peer.ID) > 0 { + for i := 0; true; i++ { + peer = MyService.Peer().GetPeerByName(display + "_" + strconv.Itoa(i+1)) + if len(peer.ID) == 0 { + display = display + "_" + strconv.Itoa(i+1) + break + } + } + } + return Name{ - Model: us.Device, + Model: model, OS: us.OS, Browser: us.Name, DeviceName: device, - DisplayName: Generate(), + DisplayName: display, } } func GetNameByDB(m model2.PeerDriveDBModel) Name {