Use mow.cli instead of flag

and some minor changes I dont wanna seperate with git add -p
This commit is contained in:
Marcel Transier 2019-10-11 16:04:40 +02:00
parent 987cccd189
commit 2b467c2747
5 changed files with 71 additions and 39 deletions

View File

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

View File

@ -2,7 +2,6 @@
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
@ -12,56 +11,65 @@ 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()
cacheDir, err := os.UserCacheDir()
if err != nil {
log.Fatal(err)
}
}
defaultSessionCacheDir := path.Join(cacheDir, "go-lsf/sessions")
s, err := session(username)
if err != nil {
log.Fatal(err)
}
app := cli.App("lsf", "LSF Shutthe Fuckup")
if showGrades {
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)
}
}
@ -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"))

1
go.mod
View File

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

11
go.sum
View File

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

View File

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