ticker will now only update timetable not send all requests to avoid rate limiting Untis.go Main() will only be used in initial startup ticker cleanup in botstart since that isnt being used anymore
102 lines
2.1 KiB
Go
102 lines
2.1 KiB
Go
package Untis
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
type Params struct {
|
|
Users string `json:"user"`
|
|
Password string `json:"password"`
|
|
Client string `json:"client"`
|
|
}
|
|
|
|
type Login struct {
|
|
Id string `json:"id"`
|
|
Method string `json:"method"`
|
|
Params Params `json:"params"`
|
|
|
|
Jsonrpc string `json:"jsonrpc"`
|
|
}
|
|
type LoginResponse struct {
|
|
Jsonrpc string `json:"jsonrpc"`
|
|
ID string `json:"id"`
|
|
Result Loginresult `json:"result"`
|
|
}
|
|
|
|
var Url = os.Getenv("URL")
|
|
|
|
func Main(user, password, userID string) {
|
|
godotenv.Load("../.env")
|
|
cookies, err := Auth(user, password, userID)
|
|
if err != nil {
|
|
log.Printf("Authentication failed for user %s: %v", user, err)
|
|
return
|
|
}
|
|
Rooms(cookies)
|
|
Classes(cookies)
|
|
Subjects(cookies)
|
|
Timetable(cookies, userID)
|
|
Teachers(cookies)
|
|
}
|
|
|
|
func Update(user, password, userID string) {
|
|
godotenv.Load("../.env")
|
|
cookies, err := Auth(user, password, userID)
|
|
if err != nil {
|
|
log.Printf("Authentication failed for user %s: %v", user, err)
|
|
return
|
|
}
|
|
Timetable(cookies, userID)
|
|
}
|
|
|
|
func Auth(user, password, userID string) ([]*http.Cookie, error) {
|
|
l := Login{"2023-05-06 15:44:22.215292", "authenticate", Params{user, password, "WebUntis Test"}, "2.0"}
|
|
loginJSON, err := json.Marshal(l)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
login := bytes.NewReader(loginJSON)
|
|
if Url == "" {
|
|
Url = os.Getenv("URL")
|
|
}
|
|
LoginOut, err := http.Post(Url, "application/json", login)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer LoginOut.Body.Close()
|
|
|
|
cookies := LoginOut.Cookies()
|
|
log.Printf("Login successful for user: %s", user)
|
|
|
|
response, err := io.ReadAll(LoginOut.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var Response LoginResponse
|
|
if err := json.Unmarshal(response, &Response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
data, err := json.MarshalIndent(Response.Result, "", " ")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
loginFile := "login.json"
|
|
if userID != "" {
|
|
loginFile = "login_" + userID + ".json"
|
|
}
|
|
if err := os.WriteFile(loginFile, data, 0o644); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return cookies, nil
|
|
}
|