Merge pull request #35 from ZeruLight/feature/return

implement return course
This commit is contained in:
wish
2022-08-26 21:07:05 +10:00
committed by GitHub
3 changed files with 30 additions and 10 deletions

9
patch-schema/return.sql Normal file
View File

@@ -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;

View File

@@ -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)

View File

@@ -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)