2023-01-26 20:58:13 +00:00
package main
import (
"io"
"net/http"
"strconv"
"strings"
"time"
)
2023-01-28 20:43:07 +00:00
func logger ( input string ) {
2023-01-28 21:22:13 +00:00
println ( "[" + time . Now ( ) . Format ( "15:04:05" ) + "] " + input )
fileAddLine ( "[" + time . Now ( ) . Format ( "15:04:05" ) + "] " + input , "./log/" + time . Now ( ) . Format ( "2006-02-01" ) + ".log" )
2023-01-28 20:43:07 +00:00
}
2023-01-26 20:58:13 +00:00
func handler ( ) {
2023-01-28 20:43:07 +00:00
logger ( "Pages:" )
//pages
2023-01-26 22:47:23 +00:00
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" )
2023-01-26 20:58:13 +00:00
2023-01-28 20:43:07 +00:00
//contact pages
2023-01-26 22:47:23 +00:00
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" )
2023-01-26 20:58:13 +00:00
2023-01-28 20:43:07 +00:00
//pages
2023-01-26 22:47:23 +00:00
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" )
2023-01-26 20:58:13 +00:00
2023-01-28 20:43:07 +00:00
//admin pages
2023-01-28 18:52:41 +00:00
keys := getAdminKeys ( )
2023-01-28 20:43:07 +00:00
//this check is necessary!
2023-01-28 18:52:41 +00:00
if keys != nil {
for _ , key := range keys {
httpHandleFunc ( "admin/" + key , "./web/pages/admin/dashboard.html" , "text/html" )
2023-01-28 20:01:15 +00:00
httpHandleFuncWithPOST ( "admin/" + key + "/addEvent" , "./web/pages/admin/dashboard.html" , "text/html" )
2023-01-28 18:52:41 +00:00
}
}
2023-01-28 20:43:07 +00:00
//styles
2023-01-26 22:47:23 +00:00
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" )
2023-01-28 13:23:31 +00:00
httpHandleFunc ( "style/events.css" , "./web/styles/events.css" , "text/css" )
2023-01-26 20:58:13 +00:00
2023-01-28 20:43:07 +00:00
//images
2023-01-26 22:47:23 +00:00
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" )
2023-01-26 20:58:13 +00:00
}
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 {
2023-01-28 17:44:11 +00:00
panic ( err . Error ( ) )
2023-01-26 20:58:13 +00:00
}
defer r . Body . Close ( )
2023-01-28 20:43:07 +00:00
var body [ ] byte
body , err = io . ReadAll ( r . Body )
errorPanic ( err )
2023-01-26 20:58:13 +00:00
bodyString := string ( body )
temp := [ ] string { }
bodyString = strings . ReplaceAll ( bodyString , "{" , "" )
bodyString = strings . ReplaceAll ( bodyString , "}" , "" )
2023-01-28 20:43:07 +00:00
Temp := strings . Split ( bodyString , "," )
2023-01-26 20:58:13 +00:00
2023-01-28 20:43:07 +00:00
for _ , element := range Temp {
TEmp := strings . Split ( element , ":" )
temp = append ( temp , TEmp [ 1 ] )
2023-01-26 20:58:13 +00:00
}
roomState := new ( status )
roomState . state = temp [ 0 ] == "true"
2023-01-28 20:43:07 +00:00
roomState . power , err = strconv . ParseInt ( temp [ 2 ] , 0 , 64 )
errorPanic ( err )
2023-01-26 20:58:13 +00:00
return * roomState
}
2023-01-26 22:13:44 +00:00
2023-01-28 13:23:31 +00:00
func htmlNewBanner ( text string , link string ) string {
output := ""
output += htmlElement ( "div" , htmlLinkElement ( text , link , true , "" ) , "class=\"newBanner\"" )
return output
}
2023-01-27 14:30:42 +00:00
func htmlReplacer ( input string , activePage string ) string {
output := strings . ReplaceAll ( input , "!NAV" , htmlNav ( getPages ( ) , activePage ) )
2023-01-26 22:13:44 +00:00
if getRoomState ( ) . state {
output = strings . ReplaceAll ( output , "!RAUMSTATUS" , "<p>Raumstatus: <b class=\"green-text\">offen</b></p>" )
} else {
output = strings . ReplaceAll ( output , "!RAUMSTATUS" , "<p>Raumstatus: <b class=\"red-text\">geschlossen</b></p>" )
}
2023-01-27 14:30:42 +00:00
output = strings . ReplaceAll ( output , "!FOOTERNAV" , htmlNav ( getFooterPages ( ) , activePage ) )
2023-01-26 22:13:44 +00:00
2023-01-28 13:23:31 +00:00
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\"" ) )
}
2023-01-28 18:56:02 +00:00
events := getEvents ( )
2023-01-28 17:21:21 +00:00
2023-01-28 18:56:02 +00:00
if len ( events ) == 0 {
2023-01-28 20:01:15 +00:00
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." , "" ) )
2023-01-28 18:56:02 +00:00
} else {
2023-01-28 19:16:03 +00:00
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\"" )
}
2023-01-28 20:01:15 +00:00
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\"" ) )
2023-01-28 18:56:02 +00:00
}
2023-01-28 17:21:21 +00:00
2023-01-28 13:23:31 +00:00
output = strings . ReplaceAll ( output , "!NEWBANNER" , htmlNewBanner ( "Rundgang" , "https://www.chaostreff-dortmund.de/rundgang/" ) )
2023-01-28 22:15:00 +00:00
if strings . Contains ( activePage , "/addEvent" ) {
output = strings . ReplaceAll ( output , "!ADMINKEY" , activePage )
} else {
output = strings . ReplaceAll ( output , "!ADMINKEY" , activePage + "/addEvent" )
}
2023-01-28 20:01:15 +00:00
2023-01-28 13:23:31 +00:00
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 ++ {
2023-01-28 21:22:13 +00:00
newDate := stringSplit ( date . AddDate ( 0 , 0 , 1 * i ) . Format ( time . UnixDate ) , " " )
2023-01-28 13:23:31 +00:00
if newDate [ 0 ] == "Thu" || newDate [ 0 ] == "Tue" {
dayA , errA := strconv . Atoi ( newDate [ 2 ] )
2023-01-28 20:43:07 +00:00
errorPanic ( errA )
2023-01-28 13:23:31 +00:00
dayB , errB := strconv . Atoi ( newDate [ 2 ] )
2023-01-28 20:43:07 +00:00
errorPanic ( errB )
2023-01-28 13:23:31 +00:00
if ifFloatRange ( float64 ( dayA ) / 7 , 0 , 1 , false , true ) || ( ifFloatRange ( float64 ( dayB ) / 7 , 2 , 3 , false , true ) && newDate [ 0 ] == "Tue" ) {
2023-01-28 21:22:13 +00:00
output . date = date . AddDate ( 0 , 0 , 1 * i ) . Format ( "02.01.2006" )
2023-01-28 13:23:31 +00:00
output . days = i
break
}
}
}
2023-01-26 22:13:44 +00:00
return output
}
2023-01-28 18:00:25 +00:00
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 ]
2023-01-28 20:43:07 +00:00
default :
logger ( "func.go:259 -> switch-case is out of range" )
2023-01-28 18:00:25 +00:00
}
}
return * output
}
2023-01-28 18:52:41 +00:00
2023-01-28 20:43:07 +00:00
func readHttpYML ( ) string {
file := fileRead ( "./config/http.yml" )
2023-01-28 18:52:41 +00:00
2023-01-28 20:43:07 +00:00
rows := [ ] [ ] string { }
2023-01-28 18:52:41 +00:00
2023-01-28 20:43:07 +00:00
for _ , row := range strings . Split ( file , "\n" ) {
rows = append ( rows , strings . Split ( row , ": " ) )
2023-01-28 18:52:41 +00:00
}
2023-01-28 20:43:07 +00:00
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----------------" )
}
2023-01-28 18:52:41 +00:00
}