add leaderboard

This commit is contained in:
Chris Sexton 2019-11-30 23:19:23 -05:00
parent d94be4df73
commit dc696067b5
4 changed files with 97 additions and 6 deletions

View File

@ -3,6 +3,7 @@ package main
import (
"flag"
"fmt"
"log"
"os"
"strconv"
@ -33,7 +34,10 @@ func main() {
sess = *sessId
}
body := getaoc.GetInput(sess, *year, day)
body, err := getaoc.GetInput(sess, *year, day)
if err != nil {
log.Fatal(err)
}
if *file == "-" {
fmt.Println(body)

View File

@ -0,0 +1,41 @@
package main
import (
"flag"
"fmt"
"log"
"os"
"code.chrissexton.org/cws/getaoc"
)
var year = flag.Int("year", 2019, "event year")
var sessId = flag.String("session", "", "session id")
var boardId = flag.Int("id", 0, "board id")
const base = "https://adventofcode.com"
func main() {
flag.Parse()
if *boardId == 0 {
fmt.Fprintln(os.Stderr, "Error: Must provide a leaderboard id.")
return
}
sess, ok := os.LookupEnv("AOC_SESSION")
if !ok && *sessId == "" {
fmt.Fprintln(os.Stderr, "Error: Must provide a session id.")
return
}
if *sessId != "" {
sess = *sessId
}
body, err := getaoc.GetLeaderboard(sess, *year, *boardId)
if err != nil {
log.Fatal(err)
}
fmt.Println(body)
}

View File

@ -1,20 +1,20 @@
package getaoc
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
const base = "https://adventofcode.com"
func GetInput(session string, year, day int) string {
func GetInput(session string, year, day int) (string, error) {
url := fmt.Sprintf("%s/%d/day/%d/input", base, year, day)
r, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
panic(err)
return "", err
}
r.AddCookie(&http.Cookie{
Name: "session",
@ -28,9 +28,55 @@ func GetInput(session string, year, day int) string {
c := http.Client{}
resp, err := c.Do(r)
if err != nil {
log.Fatal(err)
return "", err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
return string(body)
return string(body), nil
}
func GetLeaderboard(session string, year, id int) (LeaderBoard, error) {
url := fmt.Sprintf("%s/%d/leaderboard/private/view/%d.json", base, year, id)
board := LeaderBoard{}
r, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return board, err
}
r.AddCookie(&http.Cookie{
Name: "session",
Value: session,
Path: "",
Domain: ".adventofcode.com",
Secure: false,
HttpOnly: false,
SameSite: 0,
})
c := http.Client{}
resp, err := c.Do(r)
if err != nil {
return board, err
}
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
err = dec.Decode(&board)
if err != nil {
return board, err
}
return board, nil
}
type Member struct {
ID string `json:"id"`
Stars int `json:"stars"`
GlobalScore int `json:"global_score"`
Name string `json:"name"`
LastStarTs int `json:"last_star_ts"`
LocalScore int `json:"local_score"`
}
type LeaderBoard struct {
Event string `json:"event"`
OwnerID string `json:"owner_id"`
Members map[string]Member `json:"members"`
}

0
go.sum Normal file
View File