forked from schneider/mensa
				
			
				 1 changed files with 87 additions and 87 deletions
			
			
		- 
					174server/server.go
 
@ -1,119 +1,119 @@ | 
				
			|||
package main | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
    "encoding/json" | 
				
			|||
    "fmt" | 
				
			|||
    "io/ioutil" | 
				
			|||
    "os" | 
				
			|||
    "regexp" | 
				
			|||
    "strings" | 
				
			|||
    "time" | 
				
			|||
 | 
				
			|||
    "github.com/PuerkitoBio/goquery" | 
				
			|||
	"encoding/json" | 
				
			|||
	"fmt" | 
				
			|||
	"io/ioutil" | 
				
			|||
	"os" | 
				
			|||
	"regexp" | 
				
			|||
	"strings" | 
				
			|||
	"time" | 
				
			|||
 | 
				
			|||
	"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   int    `json:"day"` | 
				
			|||
        Mensa string `json:"mensa"` | 
				
			|||
        Meals []Meal `json:"meals"` | 
				
			|||
        Date  string `json:"date"` | 
				
			|||
    } | 
				
			|||
	// 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   int    `json:"day"` | 
				
			|||
		Mensa string `json:"mensa"` | 
				
			|||
		Meals []Meal `json:"meals"` | 
				
			|||
		Date  string `json:"date"` | 
				
			|||
	} | 
				
			|||
) | 
				
			|||
 | 
				
			|||
var ( | 
				
			|||
    mensen = map[string]string{ | 
				
			|||
        "Zentralmensa":  "zentralmensa", | 
				
			|||
        "Nordmensa":     "nordmensa", | 
				
			|||
        "Mensa+am+Turm": "turmmensa", | 
				
			|||
        "Mensa+Italia":  "mensaitalia", | 
				
			|||
        "Bistro+HAWK":   "bistrohawk", | 
				
			|||
    } | 
				
			|||
    trimRegex = regexp.MustCompile(`\s{2,}`) | 
				
			|||
	mensen = map[string]string{ | 
				
			|||
		"Zentralmensa":  "zentralmensa", | 
				
			|||
		"Nordmensa":     "nordmensa", | 
				
			|||
		"Mensa+am+Turm": "turmmensa", | 
				
			|||
		"Mensa+Italia":  "mensaitalia", | 
				
			|||
		"Bistro+HAWK":   "bistrohawk", | 
				
			|||
	} | 
				
			|||
	trimRegex = regexp.MustCompile(`\s{2,}`) | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
    path := "./" | 
				
			|||
    if len(os.Args) == 2 { | 
				
			|||
        path = os.Args[1] + "/" | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    for mensa := range mensen { | 
				
			|||
        for day := 1; day < 8; day = day + 1 { | 
				
			|||
            menu, err := operate(mensa, day) | 
				
			|||
            if err != nil { | 
				
			|||
                fmt.Println(err.Error()) | 
				
			|||
                return | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            content, err := json.Marshal(menu) | 
				
			|||
            if err != nil { | 
				
			|||
                fmt.Println(err.Error()) | 
				
			|||
                return | 
				
			|||
            } | 
				
			|||
 | 
				
			|||
            err = ioutil.WriteFile(fmt.Sprintf("%s/%s.%v.json", path, mensen[mensa], day), content, 0644) | 
				
			|||
            if err != nil { | 
				
			|||
                fmt.Println(err.Error()) | 
				
			|||
                return | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
	path := "./" | 
				
			|||
	if len(os.Args) == 2 { | 
				
			|||
		path = os.Args[1] + "/" | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	for mensa := range mensen { | 
				
			|||
		for day := 1; day < 8; day = day + 1 { | 
				
			|||
			menu, err := operate(mensa, day) | 
				
			|||
			if err != nil { | 
				
			|||
				fmt.Println(err.Error()) | 
				
			|||
				return | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			content, err := json.Marshal(menu) | 
				
			|||
			if err != nil { | 
				
			|||
				fmt.Println(err.Error()) | 
				
			|||
				return | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			err = ioutil.WriteFile(fmt.Sprintf("%s/%s.%v.json", path, mensen[mensa], day), content, 0644) | 
				
			|||
			if err != nil { | 
				
			|||
				fmt.Println(err.Error()) | 
				
			|||
				return | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func writeToFile(content []byte) error { | 
				
			|||
    err := ioutil.WriteFile(os.Args[1], content, 0644) | 
				
			|||
    if err != nil { | 
				
			|||
        return err | 
				
			|||
    } | 
				
			|||
    return nil | 
				
			|||
	err := ioutil.WriteFile(os.Args[1], content, 0644) | 
				
			|||
	if err != nil { | 
				
			|||
		return err | 
				
			|||
	} | 
				
			|||
	return nil | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func operate(mensa string, day int) (Menu, error) { | 
				
			|||
    currentDay := int(time.Now().Weekday())		// week starts on sunday in go, but thats not relevant, because the canteen is closed on sunday
 | 
				
			|||
    push := 0 | 
				
			|||
    if currentDay > day { | 
				
			|||
        push = 1 | 
				
			|||
    } | 
				
			|||
	currentDay := int(time.Now().Weekday()) // week starts on sunday in go, but thats not relevant, because the canteen is closed on sunday
 | 
				
			|||
	push := 0 | 
				
			|||
	if currentDay > day { | 
				
			|||
		push = 1 | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
    document, err := goquery.NewDocument(fmt.Sprintf("http://www.studentenwerk-goettingen.de/speiseplan.html?no_cache=1&day=%v&push=%v&selectmensa=%s", day, push, mensa)) | 
				
			|||
	document, err := goquery.NewDocument(fmt.Sprintf("http://www.studentenwerk-goettingen.de/speiseplan.html?no_cache=1&day=%v&push=%v&selectmensa=%s", day, push, mensa)) | 
				
			|||
 | 
				
			|||
    if err != nil { | 
				
			|||
        return Menu{}, err | 
				
			|||
    } | 
				
			|||
	if err != nil { | 
				
			|||
		return Menu{}, err | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
    meals, err := parseMeals(document) | 
				
			|||
    if err != nil { | 
				
			|||
        return Menu{}, err | 
				
			|||
    } | 
				
			|||
	meals, err := parseMeals(document) | 
				
			|||
	if err != nil { | 
				
			|||
		return Menu{}, err | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
    date := parseDate(document) | 
				
			|||
    return Menu{Day: day, Mensa: mensa, Meals: meals, Date: date}, nil | 
				
			|||
	date := parseDate(document) | 
				
			|||
	return Menu{Day: day, Mensa: mensa, Meals: meals, Date: date}, nil | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func parseDate(doc *goquery.Document) string { | 
				
			|||
    return strip(doc.Find("#speise-head2_datum").Text()) | 
				
			|||
	return strip(doc.Find("#speise-head2_datum").Text()) | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func strip(old string) string { | 
				
			|||
    return strings.TrimSpace(trimRegex.ReplaceAllString(old, " ")) | 
				
			|||
	return strings.TrimSpace(trimRegex.ReplaceAllString(old, " ")) | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func parseMeals(doc *goquery.Document) ([]Meal, error) { | 
				
			|||
    meals := []Meal{} | 
				
			|||
    doc.Find("table.speise-tblmain tbody tr").Each(func(i int, s *goquery.Selection) { | 
				
			|||
        meal := Meal{ | 
				
			|||
            Category: strip(s.Find(".ext_sits_preis").Text()), // yes, really preis
 | 
				
			|||
            Title:    strip(s.Find(".ext_sits_essen").Text()), | 
				
			|||
        } | 
				
			|||
        meals = append(meals, meal) | 
				
			|||
    }) | 
				
			|||
    return meals, nil | 
				
			|||
	meals := []Meal{} | 
				
			|||
	doc.Find("table.speise-tblmain tbody tr").Each(func(i int, s *goquery.Selection) { | 
				
			|||
		meal := Meal{ | 
				
			|||
			Category: strip(s.Find(".ext_sits_preis").Text()), // yes, really preis
 | 
				
			|||
			Title:    strip(s.Find(".ext_sits_essen").Text()), | 
				
			|||
		} | 
				
			|||
		meals = append(meals, meal) | 
				
			|||
	}) | 
				
			|||
	return meals, nil | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue