diff --git a/clientsession.go b/clientsession.go index aaa65d7..b55d7ac 100644 --- a/clientsession.go +++ b/clientsession.go @@ -329,14 +329,14 @@ func (s *ClientSession) ParsedUserData() (api.StringMap, error) { return s.parseUserData() } -func (s *ClientSession) SetRoom(room *Room) { +func (s *ClientSession) SetRoom(room *Room, joinTime time.Time) { s.room.Store(room) - s.onRoomSet(room != nil) + s.onRoomSet(room != nil, joinTime) } -func (s *ClientSession) onRoomSet(hasRoom bool) { +func (s *ClientSession) onRoomSet(hasRoom bool, joinTime time.Time) { if hasRoom { - s.roomJoinTime.Store(time.Now().UnixNano()) + s.roomJoinTime.Store(joinTime.UnixNano()) } else { s.roomJoinTime.Store(0) } @@ -361,7 +361,7 @@ func (s *ClientSession) SetFederationClient(federation *FederationClient) { defer s.mu.Unlock() s.doLeaveRoom(true) - s.onRoomSet(federation != nil) + s.onRoomSet(federation != nil, time.Now()) if prev := s.federation.Swap(federation); prev != nil && prev != federation { prev.Close() @@ -561,7 +561,7 @@ func (s *ClientSession) doLeaveRoom(notify bool) *Room { } s.doUnsubscribeRoomEvents(notify) - s.SetRoom(nil) + s.SetRoom(nil, time.Time{}) s.releaseMcuObjects() room.RemoveSession(s) return room diff --git a/hub.go b/hub.go index 96b8802..e6eb2fa 100644 --- a/hub.go +++ b/hub.go @@ -1848,8 +1848,10 @@ func (h *Hub) processRoom(sess Session, message *api.ClientMessage) { } var room talk.BackendClientResponse + var joinRoomTime time.Time if session.ClientType() == api.HelloClientTypeInternal { // Internal clients can join any room. + joinRoomTime = time.Now() room = talk.BackendClientResponse{ Type: "room", Room: &talk.BackendClientRoomResponse{ @@ -1876,6 +1878,7 @@ func (h *Hub) processRoom(sess Session, message *api.ClientMessage) { // TODO(jojo): Validate response + joinRoomTime = time.Now() if message.Room.SessionId != "" { // There can only be one connection per Nextcloud Talk session, // disconnect any other connections without sending a "leave" event. @@ -1886,7 +1889,7 @@ func (h *Hub) processRoom(sess Session, message *api.ClientMessage) { } } - h.processJoinRoom(session, message, &room) + h.processJoinRoom(session, message, &room, joinRoomTime) } func (h *Hub) publishFederatedSessions() (int, *sync.WaitGroup) { @@ -2005,7 +2008,7 @@ func (h *Hub) createRoomLocked(id string, properties json.RawMessage, backend *t return room, nil } -func (h *Hub) processJoinRoom(session *ClientSession, message *api.ClientMessage, room *talk.BackendClientResponse) { +func (h *Hub) processJoinRoom(session *ClientSession, message *api.ClientMessage, room *talk.BackendClientResponse, joinTime time.Time) { if room.Type == "error" { session.SendMessage(message.NewErrorServerMessage(room.Error)) return @@ -2051,7 +2054,7 @@ func (h *Hub) processJoinRoom(session *ClientSession, message *api.ClientMessage delete(h.dialoutSessions, session) } h.mu.Unlock() - session.SetRoom(r) + session.SetRoom(r, joinTime) if room.Room.Permissions != nil { session.SetPermissions(*room.Room.Permissions) } @@ -2540,7 +2543,7 @@ func (h *Hub) processInternalMsg(sess Session, message *api.ClientMessage) { statsHubSessionsTotal.WithLabelValues(session.Backend().Id(), string(sess.ClientType())).Inc() h.logger.Printf("Session %s added virtual session %s with initial flags %d", session.PublicId(), sess.PublicId(), sess.Flags()) session.AddVirtualSession(sess) - sess.SetRoom(room) + sess.SetRoom(room, time.Now()) room.AddSession(sess, nil) case "updatesession": msg := msg.UpdateSession diff --git a/roomsessions_test.go b/roomsessions_test.go index 81fc57d..0a8d5b5 100644 --- a/roomsessions_test.go +++ b/roomsessions_test.go @@ -26,6 +26,7 @@ import ( "encoding/json" "net/url" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -82,7 +83,7 @@ func (s *DummySession) ParsedBackendUrl() *url.URL { return nil } -func (s *DummySession) SetRoom(room *Room) { +func (s *DummySession) SetRoom(room *Room, joinTime time.Time) { } func (s *DummySession) GetRoom() *Room { diff --git a/session.go b/session.go index 3ef6485..606cccf 100644 --- a/session.go +++ b/session.go @@ -26,6 +26,7 @@ import ( "encoding/json" "net/url" "sync" + "time" "github.com/strukturag/nextcloud-spreed-signaling/api" "github.com/strukturag/nextcloud-spreed-signaling/talk" @@ -46,7 +47,7 @@ type Session interface { BackendUrl() string ParsedBackendUrl() *url.URL - SetRoom(room *Room) + SetRoom(room *Room, joinTime time.Time) GetRoom() *Room LeaveRoom(notify bool) *Room IsInRoom(id string) bool diff --git a/virtualsession.go b/virtualsession.go index b8e6cfa..4a34810 100644 --- a/virtualsession.go +++ b/virtualsession.go @@ -27,6 +27,7 @@ import ( "errors" "net/url" "sync/atomic" + "time" "github.com/strukturag/nextcloud-spreed-signaling/api" "github.com/strukturag/nextcloud-spreed-signaling/async/events" @@ -169,7 +170,7 @@ func (s *VirtualSession) ParsedUserData() (api.StringMap, error) { return s.parseUserData() } -func (s *VirtualSession) SetRoom(room *Room) { +func (s *VirtualSession) SetRoom(room *Room, joinTime time.Time) { s.room.Store(room) if room != nil { if err := s.hub.roomSessions.SetRoomSession(s, api.RoomSessionId(s.PublicId())); err != nil { @@ -195,7 +196,7 @@ func (s *VirtualSession) LeaveRoom(notify bool) *Room { return nil } - s.SetRoom(nil) + s.SetRoom(nil, time.Time{}) room.RemoveSession(s) return room }