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
|
## TODO
|
||||||
|
|
||||||
- documentation
|
- documentation
|
||||||
- tests
|
- tests
|
||||||
- webapi
|
- 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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
@ -12,57 +11,66 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"git.marceltransier.de/lsf"
|
"git.marceltransier.de/lsf"
|
||||||
|
cli "github.com/jawher/mow.cli"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
sessionCache string
|
sessionCacheDir *string
|
||||||
username string
|
username *string
|
||||||
showGrades bool
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
var s *lsf.Session
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if len(username) == 0 {
|
cacheDir, err := os.UserCacheDir()
|
||||||
var err error
|
|
||||||
username, err = readUsername()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s, err := session(username)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
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()
|
noten, err := s.Noten()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
fmt.Println("Noten:")
|
fmt.Println("Noten:")
|
||||||
for _, note := range noten {
|
noten.Print()
|
||||||
fmt.Println(note)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
func readUsername() (string, error) {
|
||||||
@ -88,7 +96,8 @@ func readPassword() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func session(username string) (*lsf.Session, error) {
|
func session(username string) (*lsf.Session, error) {
|
||||||
sessionPath := path.Join(sessionCache, username)
|
|
||||||
|
sessionPath := path.Join(*sessionCacheDir, username)
|
||||||
sessionFile, err := os.Open(sessionPath)
|
sessionFile, err := os.Open(sessionPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
pErr, ok := err.(*os.PathError)
|
pErr, ok := err.(*os.PathError)
|
||||||
@ -135,7 +144,7 @@ func login(username string) (*lsf.Session, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
sessionPath := path.Join(sessionCache, username)
|
sessionPath := path.Join(*sessionCacheDir, username)
|
||||||
err = ioutil.WriteFile(sessionPath, []byte(s.SID), 0666)
|
err = ioutil.WriteFile(sessionPath, []byte(s.SID), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(errors.Wrap(err, "could not cache session id"))
|
log.Println(errors.Wrap(err, "could not cache session id"))
|
||||||
|
1
go.mod
1
go.mod
@ -4,6 +4,7 @@ go 1.13
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/PuerkitoBio/goquery v1.5.0
|
github.com/PuerkitoBio/goquery v1.5.0
|
||||||
|
github.com/jawher/mow.cli v1.1.0
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/pkg/errors v0.8.1
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
|
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/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 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
|
||||||
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
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 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
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-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 h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
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
|
Versuch string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Noten []*Note
|
||||||
|
|
||||||
func (n *Note) String() string {
|
func (n *Note) String() string {
|
||||||
var status string
|
var status string
|
||||||
switch n.Status {
|
switch n.Status {
|
||||||
@ -28,8 +30,6 @@ func (n *Note) String() string {
|
|||||||
case "bestanden":
|
case "bestanden":
|
||||||
status = "✔ "
|
status = "✔ "
|
||||||
case "nicht bestanden":
|
case "nicht bestanden":
|
||||||
// Not sure if thats the correct value.
|
|
||||||
// Can't test it. Never failed an exam :P
|
|
||||||
status = "✖ "
|
status = "✖ "
|
||||||
default:
|
default:
|
||||||
status = "❓"
|
status = "❓"
|
||||||
@ -37,9 +37,15 @@ func (n *Note) String() string {
|
|||||||
return fmt.Sprintf("%s%s %s", status, n.Note, n.Name)
|
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
|
// Noten returns a list of the grades of all graded or signed up modules
|
||||||
func (s *Session) Noten() ([]*Note, error) {
|
func (s *Session) Noten() (Noten, error) {
|
||||||
var noten []*Note
|
var noten Noten
|
||||||
client := &http.Client{}
|
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
|
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)
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user