package main import ( "io" "net/http" "strconv" "strings" "time" ) func logger(input string) { println("[" + time.Now().Format("15:04:05 CET") + "] " + input) fileAddLine("["+time.Now().Format("15:04:05 CET")+"] "+input, "./log/"+time.Now().Format("2006-02-01 CET")+".log") } func handler() { logger("Pages:") //pages httpHandleFunc("", "./web/pages/home.html", "text/html") httpHandleFunc("home", "./web/pages/home.html", "text/html") httpHandleFunc("treff", "./web/pages/treff.html", "text/html") httpHandleFunc("events", "./web/pages/events.html", "text/html") httpHandleFunc("about", "./web/pages/about.html", "text/html") //contact pages httpHandleFunc("kontakt", "./web/pages/kontakt.html", "text/html") httpHandleFunc("kontakt/adresse", "./web/pages/kontakt/adresse.html", "text/html") httpHandleFunc("kontakt/irc", "./web/pages/kontakt/irc.html", "text/html") httpHandleFunc("kontakt/mail", "./web/pages/kontakt/mail.html", "text/html") httpHandleFunc("kontakt/tel", "./web/pages/kontakt/tel.html", "text/html") //pages httpHandleFunc("verein", "./web/pages/verein.html", "text/html") httpHandleFunc("support", "./web/pages/support.html", "text/html") httpHandleFunc("impressum", "./web/pages/impressum.html", "text/html") httpHandleFunc("datenschutz", "./web/pages/datenschutz.html", "text/html") //admin pages keys := getAdminKeys() //this check is necessary! if keys != nil { for _, key := range keys { httpHandleFunc("admin/"+key, "./web/pages/admin/dashboard.html", "text/html") httpHandleFuncWithPOST("admin/"+key+"/addEvent", "./web/pages/admin/dashboard.html", "text/html") } } //styles httpHandleFunc("style/main.css", "./web/styles/main.css", "text/css") httpHandleFunc("style/kontakt.css", "./web/styles/kontakt.css", "text/css") httpHandleFunc("style/home.css", "./web/styles/home.css", "text/css") httpHandleFunc("style/events.css", "./web/styles/events.css", "text/css") //images httpHandleFunc("image/logo_ctdo.svg", "./web/images/logo_ctdo.svg", "image/svg+xml") httpHandleFunc("image/header.jpg", "./web/images/header.jpg", "image/jpeg") httpHandleFunc("image/adresse_knopf.webp", "./web/images/adresse_knopf.webp", "image/webp") httpHandleFunc("image/chat_knopf.webp", "./web/images/chat_knopf.webp", "image/webp") httpHandleFunc("image/mail_knopf.webp", "./web/images/mail_knopf.webp", "image/webp") httpHandleFunc("image/tel_knopf.webp", "./web/images/tel_knopf.webp", "image/webp") } func getPages() [][]string { output := [][]string{} output = append(output, []string{"home", "/home"}) output = append(output, []string{"zeiten & location", "/treff"}) output = append(output, []string{"events", "/events"}) output = append(output, []string{"über uns", "/about"}) output = append(output, []string{"kontakt", "/kontakt"}) output = append(output, []string{"verein", "/verein"}) output = append(output, []string{"unterstützung", "/support"}) return output } func getFooterPages() [][]string { output := [][]string{} output = append(output, []string{"impressum", "/impressum"}) output = append(output, []string{"datenschutzerklärung", "/datenschutz"}) return output } func getRoomState() status { c := &http.Client{Timeout: 10 * time.Second} r, err := c.Get("https://status.ctdo.de/api/simple/v2") if err != nil { panic(err.Error()) } defer r.Body.Close() var body []byte body, err = io.ReadAll(r.Body) errorPanic(err) bodyString := string(body) temp := []string{} bodyString = strings.ReplaceAll(bodyString, "{", "") bodyString = strings.ReplaceAll(bodyString, "}", "") Temp := strings.Split(bodyString, ",") for _, element := range Temp { TEmp := strings.Split(element, ":") temp = append(temp, TEmp[1]) } roomState := new(status) roomState.state = temp[0] == "true" roomState.power, err = strconv.ParseInt(temp[2], 0, 64) errorPanic(err) return *roomState } func htmlNewBanner(text string, link string) string { output := "" output += htmlElement("div", htmlLinkElement(text, link, true, ""), "class=\"newBanner\"") return output } func htmlReplacer(input string, activePage string) string { output := strings.ReplaceAll(input, "!NAV", htmlNav(getPages(), activePage)) if getRoomState().state { output = strings.ReplaceAll(output, "!RAUMSTATUS", "
Raumstatus: offen
") } else { output = strings.ReplaceAll(output, "!RAUMSTATUS", "Raumstatus: geschlossen
") } output = strings.ReplaceAll(output, "!FOOTERNAV", htmlNav(getFooterPages(), activePage)) if getNextTopic().days == 0 { output = strings.ReplaceAll(output, "!TOPICTREFF", htmlElement("h3", "Nächster Topictreff findet Heute statt!", "")) } else if getNextTopic().days == 1 { output = strings.ReplaceAll(output, "!TOPICTREFF", htmlElement("h3", "Nächster Topictreff findet Morgen statt!", "class=\"topic\"")+htmlElement("p", "Am "+getNextTopic().date, "class=\"topic\"")) } else if getNextTopic().days < 10 { output = strings.ReplaceAll(output, "!TOPICTREFF", htmlElement("h3", "Nächster Topictreff findet in "+strconv.FormatInt(int64(getNextTopic().days), 10)+" Tagen statt!", "class=\"topic\"")+htmlElement("p", "Am "+getNextTopic().date, "class=\"topic\"")) } else { output = strings.ReplaceAll(output, "!TOPICTREFF", htmlElement("h3", "Nächster Topictreff findet in "+string(getNextTopic().days)+" Tagen statt!", "class=\"topic\"")+htmlElement("p", "Am "+getNextTopic().date, "class=\"topic\"")) } events := getEvents() if len(events) == 0 { output = strings.ReplaceAll(output, "!EVENTS", htmlElement("h4", "Keine Events in der nächsten Zeit.", "")) output = strings.ReplaceAll(output, "!NEXTEVENTS", htmlElement("h4", "Keine Events in der nächsten Zeit.", "")) } else { tempA, tempB := "", "" for i, Event := range events { if i == 24 { break } tempA = htmlElement("h2", Event.title, "") tempA += htmlElement("p", Event.description, "") tempA += htmlElement("p", Event.date, "") tempB += htmlElement("div", tempA, "class=\"event\"") } output = strings.ReplaceAll(output, "!EVENTS", htmlElement("div", tempB, "class=\"eventList\"")) output = strings.ReplaceAll(output, "!NEXTEVENTS", htmlElement("div", string(tempB[0]+tempB[1]+tempB[2]+tempB[3]), "class=\"eventList\"")) } output = strings.ReplaceAll(output, "!NEWBANNER", htmlNewBanner("Rundgang", "https://www.chaostreff-dortmund.de/rundgang/")) output = strings.ReplaceAll(output, "!ADMINKEY", activePage) return output } func ifFloatRange(variable float64, min float64, max float64, includeMin bool, includeMax bool) bool { a, b := false, false if includeMin { a = variable >= min } else { a = variable > min } if includeMax { b = variable <= max } else { b = variable < max } return a && b } func stringSplit(input string, sep string) []string { output := *new([]string) for _, element := range strings.Split(input, sep) { if element != "" { output = append(output, element) } } return output } // jeden ersten donnerstag und dritten dienstag func getNextTopic() topic { date := time.Now() var output topic for i := 0; i < 31; i++ { newDate := stringSplit(date.AddDate(0, 0, 1*i).Format("Mon Jan _2 15:04:05 CET 2006"), " ") if newDate[0] == "Thu" || newDate[0] == "Tue" { dayA, errA := strconv.Atoi(newDate[2]) errorPanic(errA) dayB, errB := strconv.Atoi(newDate[2]) errorPanic(errB) if ifFloatRange(float64(dayA)/7, 0, 1, false, true) || (ifFloatRange(float64(dayB)/7, 2, 3, false, true) && newDate[0] == "Tue") { output.date = date.AddDate(0, 0, 1*i).Format("02.01.2006 CET") output.days = i break } } } return output } func readDatabaseYML() database { file := fileRead("./config/database.yml") rows := [][]string{} for _, row := range strings.Split(file, "\n") { rows = append(rows, strings.Split(row, ": ")) } output := new(database) for i, row := range rows { switch i { case 0: output.username = row[1] case 1: output.password = row[1] case 2: output.address = row[1] case 3: output.port = row[1] case 4: output.database = row[1] default: logger("func.go:259 -> switch-case is out of range") } } return *output } func readHttpYML() string { file := fileRead("./config/http.yml") rows := [][]string{} for _, row := range strings.Split(file, "\n") { rows = append(rows, strings.Split(row, ": ")) } for i, row := range rows { switch i { case 0: return row[1] default: logger("func.go:280 -> switch-case is out of range") } } return "" } /* func generateRandomString(length int) string { chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" chars += strings.ToLower(chars) output := "" for i := 0; i < length; i++ { output += string(chars[rand.Intn(len(chars)-1)]) } return output } */ func errorPanic(err error) { if err != nil { logger(err.Error()) panic("----------------ERROR----------------") } }