Add updating special case for main board

This commit is contained in:
NGnius 2020-08-13 21:08:33 -04:00
parent 09faf67c6f
commit e1e97bf405

View file

@ -43,19 +43,36 @@ func main() {
}() }()
// get new rankings // get new rankings
rows, err := db.Query("SELECT * FROM Entries WHERE rank=-1 ORDER BY time ASC;") rows, err := db.Query("SELECT * FROM Entries WHERE rank=-1 ORDER BY time ASC;")
var players []int64
if err == nil { if err == nil {
// update rank for boards
var entries []*Entry var entries []*Entry
count := 0 count := 0
for rows.Next() { for rows.Next() {
entries = append(entries, &Entry{}) entries = append(entries, &Entry{})
scanErr := rows.Scan(entries[count].Intake()...) scanErr := rows.Scan(entries[count].Intake()...)
if scanErr == nil { if scanErr == nil {
//fmt.Printf("Updating rank for entry %d in board %d from player %d\n", entries[count].ID, entries[count].Board, entries[count].Player)
if entries[count].Board > 2 { // ignore special boards
players = append(players, entries[count].Player)
}
updateBoardEntries(entries[count]) updateBoardEntries(entries[count])
count++ count++
} else { } else {
fmt.Println(scanErr) fmt.Println(scanErr)
} }
} }
// update special boards
for _, elem := range players {
p := &Player{ID: elem}
err := p.Load()
if err == nil {
//fmt.Printf("Updating high score for player %d\n", p.ID)
updateMainRank(p)
} else {
fmt.Println(err)
}
}
} else { } else {
fmt.Println(err) fmt.Println(err)
} }
@ -79,7 +96,7 @@ func updateBoardEntries(entry *Entry) {
// get nearest entry that's lower and steal it's rank // get nearest entry that's lower and steal it's rank
nearestEntry := &Entry{} nearestEntry := &Entry{}
scanErr := db.QueryRow("SELECT * FROM Entries WHERE score < $1 AND rank!= -1 AND board=$2 ORDER BY score DESC LIMIT 1;", entry.Score, entry.Board).Scan(nearestEntry.Intake()...) scanErr := db.QueryRow("SELECT * FROM Entries WHERE score < $1 AND rank!= -1 AND board=$2 ORDER BY score DESC LIMIT 1;", entry.Score, entry.Board).Scan(nearestEntry.Intake()...)
if (scanErr == nil) { if scanErr == nil {
entry.Rank = nearestEntry.Rank entry.Rank = nearestEntry.Rank
entry.Commit() entry.Commit()
// update all ranks lower than itself // update all ranks lower than itself
@ -95,14 +112,65 @@ func updateBoardEntries(entry *Entry) {
} else { } else {
// nothing to beat // nothing to beat
scanErr = db.QueryRow("SELECT * FROM Entries WHERE score >= $1 AND rank!= -1 AND board=$2 ORDER BY score ASC LIMIT 1;", entry.Score, entry.Board).Scan(nearestEntry.Intake()...) scanErr = db.QueryRow("SELECT * FROM Entries WHERE score >= $1 AND rank!= -1 AND board=$2 ORDER BY score ASC LIMIT 1;", entry.Score, entry.Board).Scan(nearestEntry.Intake()...)
if (scanErr == nil) { if scanErr == nil {
entry.Rank = nearestEntry.Rank + 1 entry.Rank = nearestEntry.Rank + 1
entry.Commit() entry.Commit()
} else { } else {
// no other entries // no other entries
entry.Rank = 1 entry.Rank = 1
entry.Commit() entry.Commit()
//fmt.Println(scanErr)
} }
} }
} }
func updateMainRank(p *Player) {
rows, err := db.Query("SELECT * FROM Entries WHERE player = $1 AND board > 2 ORDER BY score DESC LIMIT $2;", p.ID, 100)
var count int64 = 0
var sum int64 = 0
if err == nil {
for rows.Next() {
entry := &Entry{}
scanErr := rows.Scan(entry.Intake()...)
if scanErr == nil {
count++
sum += entry.Score
} else {
fmt.Println(scanErr)
return
}
}
if count > 0 && sum > 0 {
mainEntry := &Entry{
Player: p.ID,
Board: 1,
}
average := sum / count
//fmt.Printf("Average of %d/%d is %d\n", sum, count, average)
dne := db.QueryRow("SELECT * FROM Entries WHERE board=$1 AND player=$2", 1, p.ID).Scan(mainEntry.Intake()...)
if dne == nil {
tx, _ := db.Begin()
stmt, _ := tx.Prepare("UPDATE Entries SET rank=rank-1 WHERE rank >$1 AND id!=$2 AND board=$3;")
_, err := stmt.Exec(mainEntry.Rank, mainEntry.ID, 1)
if err != nil {
tx.Rollback()
fmt.Println(err)
return // abort
} else {
tx.Commit()
}
mainEntry.Score = average
mainEntry.Rank = -1
mainEntry.Commit()
} else {
createErr := newEntrySql(average, p.ID, 1)
if createErr == nil {
fmt.Println(createErr)
return
}
}
}
} else {
fmt.Println(err)
return
}
}