diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..cefd54b --- /dev/null +++ b/server/server.go @@ -0,0 +1,100 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/PuerkitoBio/goquery" +) + +type ( + // Meal contains the info about a meals + Meal struct { + Category string `json:"category"` + Price string `json:"price"` + Title string `json:"title"` + } + // Menu contains all info to menues in a mensa on one day + Menu struct { + Day string `json:"day"` + Mensa string `json:"mensa"` + Meals []Meal `json:"meals"` + } +) + +var ( + mensen = []string{ + "Zentralmensa", + "Nordmensa", + } + days = []string{ + "heute", + "morgen", + "uebermorgen", + } +) + +func main() { + menus := []Menu{} + + for _, mensa := range mensen { + for _, day := range days { + menu, err := operate(mensa, day) + if err != nil { + fmt.Println(err.Error()) + } + menus = append(menus, menu) + } + } + + bytes, err := json.Marshal(menus) + if err != nil { + fmt.Println(err.Error()) + } + + if len(os.Args) == 2 { + err = writeToFile(bytes) + if err != nil { + fmt.Println(err.Error()) + } + } else { + fmt.Println(string(bytes)) + } +} + +func writeToFile(content []byte) error { + err := ioutil.WriteFile(os.Args[1], content, 0644) + if err != nil { + return err + } + return nil +} + +func operate(mensa, day string) (Menu, error) { + meals, err := parseHTML(fmt.Sprintf("https://phpapp2.zvw.uni-goettingen.de/portlet_mensaplan/public/ajaxresponse/getgerichte?mensa=%s&tag=%s&preis=stu&vegetarisch=true&schweinefleisch=true&vegan=true&fisch=true&gefluegel=true&rind=true&wild=true&lamm=true&alkohol=true&knoblauch=true&sonstige_gerichte=true", mensa, day)) + if err != nil { + return Menu{}, err + } + + return Menu{Day: day, Mensa: mensa, Meals: meals}, nil +} + +func parseHTML(url string) ([]Meal, error) { + doc, err := goquery.NewDocument(url) + if err != nil { + return nil, err + } + + meals := []Meal{} + doc.Find("table tr").Each(func(i int, s *goquery.Selection) { + meal := Meal{ + Category: s.Find(".gericht_kategorie").Text(), + Price: s.Find(".gericht_preis").Text(), + Title: s.Find(".spalte_gericht").Text(), + } + meals = append(meals, meal) + }) + return meals, nil +}