From 2b467c2747c9a5b246e173e05c3800a74c834193 Mon Sep 17 00:00:00 2001 From: Marcel Transier Date: Fri, 11 Oct 2019 16:04:40 +0200 Subject: [PATCH] Use mow.cli instead of flag and some minor changes I dont wanna seperate with git add -p --- README.md | 7 ++++- cmd/lsf/main.go | 77 +++++++++++++++++++++++++++---------------------- go.mod | 1 + go.sum | 11 +++++++ noten.go | 14 ++++++--- 5 files changed, 71 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 9c1cd01..1f9b063 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,12 @@ -# LSF - LSF S... F... rekusives akronym!!!111elf +# LSF - LSF Shutthe Fuckup + +or LSF Served Fabulously ## TODO - documentation - tests - webapi +- rename session to client? +- wrap errors correctly. run cmd/lsf without an internet connection and get inspired by the standard libary +- use english terms only diff --git a/cmd/lsf/main.go b/cmd/lsf/main.go index bce99ee..41cdbc6 100644 --- a/cmd/lsf/main.go +++ b/cmd/lsf/main.go @@ -2,7 +2,6 @@ package main import ( - "flag" "fmt" "io/ioutil" "log" @@ -12,57 +11,66 @@ import ( "syscall" "git.marceltransier.de/lsf" + cli "github.com/jawher/mow.cli" "github.com/pkg/errors" "golang.org/x/crypto/ssh/terminal" ) var ( - sessionCache string - username string - showGrades bool + sessionCacheDir *string + username *string ) -func init() { - homeDir, err := os.UserHomeDir() - if err != nil { - log.Fatal(err) - } - defaultCacheDir := path.Join(homeDir, ".cache/go-lsf/sessions") - flag.StringVar(&sessionCache, "session-cache", defaultCacheDir, "path where the session tokens are located") - flag.StringVar(&username, "username", "", "username to login with in lsf") - flag.BoolVar(&showGrades, "noten", false, "list grades") - flag.Parse() - - err = os.MkdirAll(sessionCache, os.ModePerm) - if err != nil { - log.Fatal(err) - } -} +var s *lsf.Session func main() { - if len(username) == 0 { - var err error - username, err = readUsername() - if err != nil { - log.Fatal(err) - } - } - - s, err := session(username) + cacheDir, err := os.UserCacheDir() if err != nil { log.Fatal(err) } + defaultSessionCacheDir := path.Join(cacheDir, "go-lsf/sessions") - if showGrades { + app := cli.App("lsf", "LSF Shutthe Fuckup") + + sessionCacheDir = app.StringOpt("c session-cache-dir", defaultSessionCacheDir, "path to where the session tokens are cached") + username = app.StringOpt("u username", "", "username to login with") + + app.Command("grades", "view your grades", cmdGrades) + //app.Command("events", "show your personalized events", cmdEvents) + //app.Command("reports", "download reports", cmdReports) + //app.Command("courses", "show courses", cmdCourses) + + app.Run(os.Args) +} + +func cmdGrades(cmd *cli.Cmd) { + cmd.Before = sessionNeeded + cmd.Action = func() { noten, err := s.Noten() if err != nil { log.Fatal(err) } fmt.Println("Noten:") - for _, note := range noten { - fmt.Println(note) + noten.Print() + } +} + +func sessionNeeded() { + err := os.MkdirAll(*sessionCacheDir, os.ModePerm) + if err != nil { + log.Fatal(err) + } + if len(*username) == 0 { + var err error + *username, err = readUsername() + if err != nil { + log.Fatal(err) } } + s, err = session(*username) + if err != nil { + log.Fatal(err) + } } func readUsername() (string, error) { @@ -88,7 +96,8 @@ func readPassword() (string, error) { } func session(username string) (*lsf.Session, error) { - sessionPath := path.Join(sessionCache, username) + + sessionPath := path.Join(*sessionCacheDir, username) sessionFile, err := os.Open(sessionPath) if err != nil { pErr, ok := err.(*os.PathError) @@ -135,7 +144,7 @@ func login(username string) (*lsf.Session, error) { if err != nil { return nil, err } - sessionPath := path.Join(sessionCache, username) + sessionPath := path.Join(*sessionCacheDir, username) err = ioutil.WriteFile(sessionPath, []byte(s.SID), 0666) if err != nil { log.Println(errors.Wrap(err, "could not cache session id")) diff --git a/go.mod b/go.mod index d1e0936..d74b00d 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( github.com/PuerkitoBio/goquery v1.5.0 + github.com/jawher/mow.cli v1.1.0 github.com/pkg/errors v0.8.1 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc ) diff --git a/go.sum b/go.sum index cb780ed..792eb51 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,19 @@ github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/jawher/mow.cli v1.1.0 h1:NdtHXRc0CwZQ507wMvQ/IS+Q3W3x2fycn973/b8Zuk8= +github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/noten.go b/noten.go index 28b693c..54b4eb0 100644 --- a/noten.go +++ b/noten.go @@ -20,6 +20,8 @@ type Note struct { Versuch string } +type Noten []*Note + func (n *Note) String() string { var status string switch n.Status { @@ -28,8 +30,6 @@ func (n *Note) String() string { case "bestanden": status = "✔ " case "nicht bestanden": - // Not sure if thats the correct value. - // Can't test it. Never failed an exam :P status = "✖ " default: status = "❓" @@ -37,9 +37,15 @@ func (n *Note) String() string { return fmt.Sprintf("%s%s %s", status, n.Note, n.Name) } +func (nn Noten) Print() { + for _, n := range nn { + fmt.Println(n) + } +} + // Noten returns a list of the grades of all graded or signed up modules -func (s *Session) Noten() ([]*Note, error) { - var noten []*Note +func (s *Session) Noten() (Noten, error) { + var noten Noten client := &http.Client{} url := "https://lsf.hs-worms.de/qisserver/rds?state=notenspiegelStudent&next=list.vm&nextdir=qispos/notenspiegel/student&createInfos=Y&struct=auswahlBaum&nodeID=auswahlBaum%7Cabschluss%3Aabschl%3D05%2Cstgnr%3D1%7Cstudiengang%3Astg%3D938%2Cpversion%3D2018&expand=0&asi=" + s.ASI req, err := http.NewRequest("GET", url, nil)