From: Jeff Halter Date: Fri, 27 May 2022 17:44:52 +0000 (-0700) Subject: Simplify user idle check X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/61c272e101b6f0444c7b2a666b0b5e828ba6db03?ds=sidebyside Simplify user idle check --- diff --git a/hotline/client_conn.go b/hotline/client_conn.go index 8e9a614..b43a6ff 100644 --- a/hotline/client_conn.go +++ b/hotline/client_conn.go @@ -31,7 +31,7 @@ type ClientConn struct { Flags *[]byte UserName []byte Account *Account - IdleTime *int + IdleTime int Server *Server Version *[]byte Idle bool @@ -103,28 +103,28 @@ func (cc *ClientConn) handleTransaction(transaction *Transaction) error { cc.Server.mux.Lock() defer cc.Server.mux.Unlock() - // if user was idle and this is a non-keepalive transaction - if *cc.IdleTime > userIdleSeconds && requestNum != tranKeepAlive { - flagBitmap := big.NewInt(int64(binary.BigEndian.Uint16(*cc.Flags))) - flagBitmap.SetBit(flagBitmap, userFlagAway, 0) - binary.BigEndian.PutUint16(*cc.Flags, uint16(flagBitmap.Int64())) - cc.Idle = false - //*cc.IdleTime = 0 - - cc.sendAll( - tranNotifyChangeUser, - NewField(fieldUserID, *cc.ID), - NewField(fieldUserFlags, *cc.Flags), - NewField(fieldUserName, cc.UserName), - NewField(fieldUserIconID, *cc.Icon), - ) - - //return nil + if requestNum != tranKeepAlive { + // reset the user idle timer + cc.IdleTime = 0 + + // if user was previously idle, mark as not idle and notify other connected clients that + // the user is no longer away + if cc.Idle { + flagBitmap := big.NewInt(int64(binary.BigEndian.Uint16(*cc.Flags))) + flagBitmap.SetBit(flagBitmap, userFlagAway, 0) + binary.BigEndian.PutUint16(*cc.Flags, uint16(flagBitmap.Int64())) + cc.Idle = false + + cc.sendAll( + tranNotifyChangeUser, + NewField(fieldUserID, *cc.ID), + NewField(fieldUserFlags, *cc.Flags), + NewField(fieldUserName, cc.UserName), + NewField(fieldUserIconID, *cc.Icon), + ) + } } - // TODO: Don't we need to skip this if requestNum == tranKeepalive ?? - *cc.IdleTime = 0 - return nil } diff --git a/hotline/client_conn_test.go b/hotline/client_conn_test.go index 6e3464f..2176185 100644 --- a/hotline/client_conn_test.go +++ b/hotline/client_conn_test.go @@ -13,7 +13,7 @@ func TestClientConn_handleTransaction(t *testing.T) { Flags *[]byte UserName []byte Account *Account - IdleTime *int + IdleTime int Server *Server Version *[]byte Idle bool @@ -39,7 +39,6 @@ func TestClientConn_handleTransaction(t *testing.T) { Flags: tt.fields.Flags, UserName: tt.fields.UserName, Account: tt.fields.Account, - IdleTime: tt.fields.IdleTime, Server: tt.fields.Server, Version: tt.fields.Version, Idle: tt.fields.Idle, diff --git a/hotline/server.go b/hotline/server.go index 61cd7fa..c5a29ba 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -278,8 +278,8 @@ func (s *Server) keepaliveHandler() { s.mux.Lock() for _, c := range s.Clients { - *c.IdleTime += idleCheckInterval - if *c.IdleTime > userIdleSeconds && !c.Idle { + c.IdleTime += idleCheckInterval + if c.IdleTime > userIdleSeconds && !c.Idle { c.Idle = true flagBitmap := big.NewInt(int64(binary.BigEndian.Uint16(*c.Flags))) @@ -327,7 +327,6 @@ func (s *Server) NewClientConn(conn net.Conn) *ClientConn { Connection: conn, Server: s, Version: &[]byte{}, - IdleTime: new(int), AutoReply: &[]byte{}, Transfers: make(map[int][]*FileTransfer), Agreed: false, @@ -335,8 +334,6 @@ func (s *Server) NewClientConn(conn net.Conn) *ClientConn { *s.NextGuestID++ ID := *s.NextGuestID - *clientConn.IdleTime = 0 - binary.BigEndian.PutUint16(*clientConn.ID, ID) s.Clients[ID] = clientConn diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go index ade024c..5aa6984 100644 --- a/hotline/transaction_handlers.go +++ b/hotline/transaction_handlers.go @@ -1399,9 +1399,9 @@ func HandleSetClientUserInfo(cc *ClientConn, t *Transaction) (res []Transaction, return res, err } -// HandleKeepAlive response to keepalive transactions with an empty reply -// HL 1.9.2 Client sends keepalive msg every 3 minutes -// HL 1.2.3 Client doesn't send keepalives +// HandleKeepAlive responds to keepalive transactions with an empty reply +// * HL 1.9.2 Client sends keepalive msg every 3 minutes +// * HL 1.2.3 Client doesn't send keepalives func HandleKeepAlive(cc *ClientConn, t *Transaction) (res []Transaction, err error) { res = append(res, cc.NewReply(t))