diff --git a/patch-schema/return.sql b/patch-schema/return.sql new file mode 100644 index 000000000..4e09d7e47 --- /dev/null +++ b/patch-schema/return.sql @@ -0,0 +1,9 @@ +BEGIN; + +ALTER TABLE IF EXISTS public.users + ADD COLUMN IF NOT EXISTS last_login timestamp without time zone; + +ALTER TABLE IF EXISTS public.users + ADD COLUMN IF NOT EXISTS return_expires timestamp without time zone; + +END; \ No newline at end of file diff --git a/server/signserver/dbutils.go b/server/signserver/dbutils.go index 973860ed5..d39d96c92 100644 --- a/server/signserver/dbutils.go +++ b/server/signserver/dbutils.go @@ -47,7 +47,7 @@ func (s *Server) registerDBAccount(username string, password string) error { return err } - _, err = s.db.Exec("INSERT INTO users (username, password) VALUES ($1, $2)", username, string(passwordHash)) + _, err = s.db.Exec("INSERT INTO users (username, password, return_expires) VALUES ($1, $2, $3)", username, string(passwordHash), time.Now().Add(time.Hour*24*30)) if err != nil { return err } @@ -95,6 +95,23 @@ func (s *Server) getCharactersForUser(uid int) ([]character, error) { return characters, nil } +func (s *Server) getReturnExpiry(uid int) time.Time { + var returnExpiry, lastLogin time.Time + s.db.Get(&lastLogin, "SELECT COALESCE(last_login, now()) FROM users WHERE id=$1", uid) + if time.Now().Add((time.Hour * 24) * -90).After(lastLogin) { + returnExpiry = time.Now().Add(time.Hour * 24 * 30) + s.db.Exec("UPDATE users SET return_expires=$1 WHERE id=$2", returnExpiry, uid) + } else { + err := s.db.Get(&returnExpiry, "SELECT return_expires FROM users WHERE id=$1", uid) + if err != nil { + returnExpiry = time.Now() + s.db.Exec("UPDATE users SET return_expires=$1 WHERE id=$2", returnExpiry, uid) + } + } + s.db.Exec("UPDATE users SET last_login=$1 WHERE id=$2", time.Now(), uid) + return returnExpiry +} + func (s *Server) getLastCID(uid int) uint32 { var lastPlayed uint32 _ = s.db.QueryRow("SELECT last_character FROM users WHERE id=$1", uid).Scan(&lastPlayed) diff --git a/server/signserver/dsgn_resp.go b/server/signserver/dsgn_resp.go index 650188000..a169d93a1 100644 --- a/server/signserver/dsgn_resp.go +++ b/server/signserver/dsgn_resp.go @@ -28,6 +28,8 @@ func randSeq(n int) string { } func (s *Session) makeSignInResp(uid int) []byte { + returnExpiry := s.server.getReturnExpiry(uid) + // Get the characters from the DB. chars, err := s.server.getCharactersForUser(uid) if err != nil { @@ -115,15 +117,7 @@ func (s *Session) makeSignInResp(uid int) []byte { bf.WriteUint8(0x00) bf.WriteUint32(0xCA110001) bf.WriteUint32(0x4E200000) - - returning := false - // return course end time - if returning { - bf.WriteUint32(uint32(channelserver.Time_Current_Adjusted().Add(30 * 24 * time.Hour).Unix())) - } else { - bf.WriteUint32(0) - } - + bf.WriteUint32(uint32(returnExpiry.Unix())) bf.WriteUint32(0x00000000) bf.WriteUint32(0x0A5197DF)