diff options
-rw-r--r-- | api/context.go | 1 | ||||
-rw-r--r-- | app/session.go | 14 | ||||
-rw-r--r-- | app/status.go | 5 | ||||
-rw-r--r-- | app/web_conn.go | 5 | ||||
-rw-r--r-- | app/websocket_router.go | 5 | ||||
-rw-r--r-- | model/session.go | 13 |
6 files changed, 30 insertions, 13 deletions
diff --git a/api/context.go b/api/context.go index f8953f547..33dc8b2ac 100644 --- a/api/context.go +++ b/api/context.go @@ -222,6 +222,7 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if c.Err == nil && h.isUserActivity && token != "" && len(c.Session.UserId) > 0 { app.SetStatusOnline(c.Session.UserId, c.Session.Id, false) + app.UpdateLastActivityAtIfNeeded(c.Session) } if c.Err == nil && (h.requireUser || h.requireSystemAdmin) { diff --git a/app/session.go b/app/session.go index 89244d780..7290bfd88 100644 --- a/app/session.go +++ b/app/session.go @@ -181,3 +181,17 @@ func AttachDeviceId(sessionId string, deviceId string, expiresAt int64) *model.A return nil } + +func UpdateLastActivityAtIfNeeded(session model.Session) { + now := model.GetMillis() + if now-session.LastActivityAt < model.SESSION_ACTIVITY_TIMEOUT { + return + } + + if result := <-Srv.Store.Session().UpdateLastActivityAt(session.Id, now); result.Err != nil { + l4g.Error(utils.T("api.status.last_activity.error", session.UserId, session.Id)) + } + + session.LastActivityAt = now + AddSessionToCache(&session) +} diff --git a/app/status.go b/app/status.go index dd57b82b2..f0a26e6eb 100644 --- a/app/status.go +++ b/app/status.go @@ -195,7 +195,6 @@ func SetStatusOnline(userId string, sessionId string, manual bool) { // Only update the database if the status has changed, the status has been manually set, // or enough time has passed since the previous action if status.Status != oldStatus || status.Manual != oldManual || status.LastActivityAt-oldTime > model.STATUS_MIN_UPDATE_TIME { - achan := Srv.Store.Session().UpdateLastActivityAt(sessionId, status.LastActivityAt) var schan store.StoreChannel if broadcast { @@ -204,10 +203,6 @@ func SetStatusOnline(userId string, sessionId string, manual bool) { schan = Srv.Store.Status().UpdateLastActivityAt(status.UserId, status.LastActivityAt) } - if result := <-achan; result.Err != nil { - l4g.Error(utils.T("api.status.last_activity.error"), userId, sessionId, result.Err) - } - if result := <-schan; result.Err != nil { l4g.Error(utils.T("api.status.save_status.error"), userId, result.Err) } diff --git a/app/web_conn.go b/app/web_conn.go index 2c1913e2b..1ebed9fa5 100644 --- a/app/web_conn.go +++ b/app/web_conn.go @@ -43,7 +43,10 @@ type WebConn struct { func NewWebConn(ws *websocket.Conn, session model.Session, t goi18n.TranslateFunc, locale string) *WebConn { if len(session.UserId) > 0 { - go SetStatusOnline(session.UserId, session.Id, false) + go func() { + SetStatusOnline(session.UserId, session.Id, false) + UpdateLastActivityAtIfNeeded(session) + }() } return &WebConn{ diff --git a/app/websocket_router.go b/app/websocket_router.go index 84806b5cf..80773eb9d 100644 --- a/app/websocket_router.go +++ b/app/websocket_router.go @@ -53,7 +53,10 @@ func (wr *WebSocketRouter) ServeWebSocket(conn *WebConn, r *model.WebSocketReque if err != nil { conn.WebSocket.Close() } else { - go SetStatusOnline(session.UserId, session.Id, false) + go func() { + SetStatusOnline(session.UserId, session.Id, false) + UpdateLastActivityAtIfNeeded(*session) + }() conn.SessionToken = session.Token conn.UserId = session.UserId diff --git a/model/session.go b/model/session.go index 38d1c91f1..4f3547582 100644 --- a/model/session.go +++ b/model/session.go @@ -10,12 +10,13 @@ import ( ) const ( - SESSION_COOKIE_TOKEN = "MMAUTHTOKEN" - SESSION_COOKIE_USER = "MMUSERID" - SESSION_CACHE_SIZE = 35000 - SESSION_PROP_PLATFORM = "platform" - SESSION_PROP_OS = "os" - SESSION_PROP_BROWSER = "browser" + SESSION_COOKIE_TOKEN = "MMAUTHTOKEN" + SESSION_COOKIE_USER = "MMUSERID" + SESSION_CACHE_SIZE = 35000 + SESSION_PROP_PLATFORM = "platform" + SESSION_PROP_OS = "os" + SESSION_PROP_BROWSER = "browser" + SESSION_ACTIVITY_TIMEOUT = 1000 * 60 * 5 // 5 minutes ) type Session struct { |