mirror of
https://github.com/IceWhaleTech/CasaOS.git
synced 2025-09-18 17:48:31 +00:00
wip
This commit is contained in:
parent
8ced2addaf
commit
a9a6a9e275
@ -30,6 +30,7 @@ import (
|
|||||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
|
||||||
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
||||||
"github.com/IceWhaleTech/CasaOS/service"
|
"github.com/IceWhaleTech/CasaOS/service"
|
||||||
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
|
|
||||||
"github.com/IceWhaleTech/CasaOS/internal/sign"
|
"github.com/IceWhaleTech/CasaOS/internal/sign"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@ -971,6 +972,7 @@ type Client struct {
|
|||||||
RtcSupported bool `json:"rtcSupported"`
|
RtcSupported bool `json:"rtcSupported"`
|
||||||
TimerId int `json:"timerId"`
|
TimerId int `json:"timerId"`
|
||||||
LastBeat time.Time `json:"lastBeat"`
|
LastBeat time.Time `json:"lastBeat"`
|
||||||
|
Offline bool `json:"offline"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ConnectWebSocket(c *gin.Context) {
|
func ConnectWebSocket(c *gin.Context) {
|
||||||
@ -978,8 +980,8 @@ func ConnectWebSocket(c *gin.Context) {
|
|||||||
writer := c.Writer
|
writer := c.Writer
|
||||||
request := c.Request
|
request := c.Request
|
||||||
key := uuid.NewV4().String()
|
key := uuid.NewV4().String()
|
||||||
peerModel := service.MyService.Peer().GetPeerByUserAgent(c.Request.UserAgent())
|
//peerModel := service.MyService.Peer().GetPeerByUserAgent(c.Request.UserAgent())
|
||||||
//peerModel := model2.PeerDriveDBModel{}
|
peerModel := model2.PeerDriveDBModel{}
|
||||||
name := service.GetName(request)
|
name := service.GetName(request)
|
||||||
if conn, err = upgraderFile.Upgrade(writer, request, writer.Header()); err != nil {
|
if conn, err = upgraderFile.Upgrade(writer, request, writer.Header()); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@ -996,6 +998,7 @@ func ConnectWebSocket(c *gin.Context) {
|
|||||||
client.Name = service.GetNameByDB(peerModel)
|
client.Name = service.GetNameByDB(peerModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var list = service.MyService.Peer().GetPeers()
|
||||||
if len(peerModel.ID) == 0 {
|
if len(peerModel.ID) == 0 {
|
||||||
peerModel.ID = key
|
peerModel.ID = key
|
||||||
peerModel.DisplayName = name.DisplayName
|
peerModel.DisplayName = name.DisplayName
|
||||||
@ -1005,7 +1008,9 @@ func ConnectWebSocket(c *gin.Context) {
|
|||||||
peerModel.UserAgent = c.Request.UserAgent()
|
peerModel.UserAgent = c.Request.UserAgent()
|
||||||
peerModel.IP = client.IP
|
peerModel.IP = client.IP
|
||||||
service.MyService.Peer().CreatePeer(&peerModel)
|
service.MyService.Peer().CreatePeer(&peerModel)
|
||||||
|
list = append(list, peerModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
cookie := http.Cookie{
|
cookie := http.Cookie{
|
||||||
Name: "peerid",
|
Name: "peerid",
|
||||||
Value: key,
|
Value: key,
|
||||||
@ -1020,11 +1025,31 @@ func ConnectWebSocket(c *gin.Context) {
|
|||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
client.handler.broadcast <- pby
|
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{}
|
clients := []Client{}
|
||||||
for _, v := range handler.clients {
|
for _, v := range list {
|
||||||
|
if _, ok := handler.clients[v.ID]; ok {
|
||||||
clients = append(clients, *v)
|
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 := make(map[string]interface{})
|
||||||
@ -1032,14 +1057,12 @@ func ConnectWebSocket(c *gin.Context) {
|
|||||||
other["peers"] = clients
|
other["peers"] = clients
|
||||||
otherBy, err := json.Marshal(other)
|
otherBy, err := json.Marshal(other)
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
client.send <- otherBy
|
client.handler.broadcast <- otherBy
|
||||||
|
|
||||||
// 推给监控中心注册到用户集合中
|
|
||||||
handler.register <- client
|
|
||||||
|
|
||||||
data := make(map[string]string)
|
data := make(map[string]string)
|
||||||
data["displayName"] = client.Name.DisplayName
|
data["displayName"] = client.Name.DisplayName
|
||||||
data["deviceName"] = client.Name.DeviceName
|
data["deviceName"] = client.Name.DeviceName
|
||||||
|
data["id"] = client.ID
|
||||||
msg := make(map[string]interface{})
|
msg := make(map[string]interface{})
|
||||||
msg["type"] = "display-name"
|
msg["type"] = "display-name"
|
||||||
msg["message"] = data
|
msg["message"] = data
|
||||||
@ -1110,7 +1133,22 @@ func (c *Client) readPump() {
|
|||||||
if t.String() == "disconnect" {
|
if t.String() == "disconnect" {
|
||||||
c.handler.unregister <- c
|
c.handler.unregister <- c
|
||||||
c.conn.Close()
|
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 <- []byte(`{"type":"peer-left","peerId":"` + c.ID + `"}`)
|
||||||
|
c.handler.broadcast <- otherBy
|
||||||
break
|
break
|
||||||
} else if t.String() == "pong" {
|
} else if t.String() == "pong" {
|
||||||
c.LastBeat = time.Now()
|
c.LastBeat = time.Now()
|
||||||
|
@ -22,12 +22,17 @@ type PeerService interface {
|
|||||||
GetPeers() (peers []model2.PeerDriveDBModel)
|
GetPeers() (peers []model2.PeerDriveDBModel)
|
||||||
CreatePeer(m *model2.PeerDriveDBModel)
|
CreatePeer(m *model2.PeerDriveDBModel)
|
||||||
DeletePeer(id string)
|
DeletePeer(id string)
|
||||||
|
GetPeerByName(name string) (m model2.PeerDriveDBModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
type peerStruct struct {
|
type peerStruct struct {
|
||||||
db *gorm.DB
|
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) {
|
func (s *peerStruct) GetPeerByUserAgent(ua string) (m model2.PeerDriveDBModel) {
|
||||||
s.db.Where("user_agent = ?", ua).First(&m)
|
s.db.Where("user_agent = ?", ua).First(&m)
|
||||||
return
|
return
|
||||||
@ -37,17 +42,11 @@ func (s *peerStruct) GetPeerByID(id string) (m model2.PeerDriveDBModel) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (s *peerStruct) GetPeers() (peers []model2.PeerDriveDBModel) {
|
func (s *peerStruct) GetPeers() (peers []model2.PeerDriveDBModel) {
|
||||||
s.db.Find(&peers)
|
s.db.Order("updated desc").Find(&peers)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (s *peerStruct) CreatePeer(m *model2.PeerDriveDBModel) {
|
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)
|
s.db.Create(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
||||||
@ -13,9 +14,8 @@ type Name struct {
|
|||||||
Model string `json:"model"`
|
Model string `json:"model"`
|
||||||
OS string `json:"os"`
|
OS string `json:"os"`
|
||||||
Browser string `json:"browser"`
|
Browser string `json:"browser"`
|
||||||
Type string `json:"type"`
|
|
||||||
DeviceName string `json:"deviceName"`
|
DeviceName string `json:"deviceName"`
|
||||||
DisplayName string `json:"displayName"` //随机生成
|
DisplayName string `json:"displayName"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPeerId(request *http.Request, id string) string {
|
func GetPeerId(request *http.Request, id string) string {
|
||||||
@ -47,7 +47,6 @@ func GetIP(request *http.Request) string {
|
|||||||
|
|
||||||
func GetName(request *http.Request) Name {
|
func GetName(request *http.Request) Name {
|
||||||
us := useragent.Parse(request.Header.Get("user-agent"))
|
us := useragent.Parse(request.Header.Get("user-agent"))
|
||||||
|
|
||||||
device := ""
|
device := ""
|
||||||
if len(us.Device) > 0 {
|
if len(us.Device) > 0 {
|
||||||
device += us.Device
|
device += us.Device
|
||||||
@ -55,12 +54,37 @@ func GetName(request *http.Request) Name {
|
|||||||
device += us.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{
|
return Name{
|
||||||
Model: us.Device,
|
Model: model,
|
||||||
OS: us.OS,
|
OS: us.OS,
|
||||||
Browser: us.Name,
|
Browser: us.Name,
|
||||||
DeviceName: device,
|
DeviceName: device,
|
||||||
DisplayName: Generate(),
|
DisplayName: display,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func GetNameByDB(m model2.PeerDriveDBModel) Name {
|
func GetNameByDB(m model2.PeerDriveDBModel) Name {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user