Use mow.cli instead of flag
and some minor changes I dont wanna seperate with git add -p
This commit is contained in:
parent
987cccd189
commit
2b467c2747
@ -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
|
||||
|
@ -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()
|
||||
cacheDir, err := os.UserCacheDir()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defaultSessionCacheDir := path.Join(cacheDir, "go-lsf/sessions")
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
s, err := session(username)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if showGrades {
|
||||
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"))
|
||||
|
1
go.mod
1
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
|
||||
)
|
||||
|
11
go.sum
11
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=
|
||||
|
14
noten.go
14
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user