php umsetzung anfang
|
@ -1,7 +0,0 @@
|
||||||
# Readme
|
|
||||||
|
|
||||||
```git clone https://git.ctdo.de/xoy/ctdo.de.git```
|
|
||||||
|
|
||||||
```cd ./ctdo.de/```
|
|
||||||
|
|
||||||
```go run .```
|
|
|
@ -47,7 +47,9 @@
|
||||||
</p>
|
</p>
|
||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
!FOOTERNAV
|
<nav>
|
||||||
|
|
||||||
|
</nav>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -1,5 +0,0 @@
|
||||||
username: admin
|
|
||||||
password: password
|
|
||||||
address: localhost
|
|
||||||
port: 3306
|
|
||||||
database: ctdo
|
|
|
@ -1 +0,0 @@
|
||||||
address: :80
|
|
61
ctdo.go
|
@ -1,61 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 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(time.UnixDate), " ")
|
|
||||||
|
|
||||||
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")
|
|
||||||
output.days = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
|
|
||||||
func getRoomState() status {
|
|
||||||
var err error
|
|
||||||
body := httpGetBody("https://status.ctdo.de/api/simple/v2")
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
13
ctdo.sql
|
@ -1,13 +0,0 @@
|
||||||
create database ctdo;
|
|
||||||
use ctdo;
|
|
||||||
create table events (
|
|
||||||
id int not null auto_increment,
|
|
||||||
title varchar(80) not null,
|
|
||||||
description varchar(500) not null,
|
|
||||||
media varchar(10000),
|
|
||||||
date varchar(10) not null,
|
|
||||||
primary key(id)
|
|
||||||
);
|
|
||||||
create table adminKeys (
|
|
||||||
adminKey varchar(16) not null
|
|
||||||
);
|
|
39
database.go
|
@ -1,39 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
_ "github.com/go-sql-driver/mysql"
|
|
||||||
)
|
|
||||||
|
|
||||||
func dbConnect(username string, password string, address string, port string, database string) *sql.DB {
|
|
||||||
db, err := sql.Open("mysql", username+":"+password+"@tcp("+address+":"+port+")/"+database)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
return db
|
|
||||||
}
|
|
||||||
|
|
||||||
func dbClose(database *sql.DB) {
|
|
||||||
database.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func dbQuerry(database *sql.DB, sqlCode string) *sql.Rows {
|
|
||||||
results, err := database.Query(sqlCode)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
return results
|
|
||||||
}
|
|
||||||
|
|
||||||
func ctdoConnect() *sql.DB {
|
|
||||||
dbValues := readDatabaseYML()
|
|
||||||
|
|
||||||
return dbConnect(dbValues.username, dbValues.password, dbValues.address, dbValues.port, dbValues.database)
|
|
||||||
}
|
|
||||||
|
|
||||||
func sqlClean(sqlString string) string {
|
|
||||||
sqlString = strings.ReplaceAll(sqlString, "'", "")
|
|
||||||
sqlString = strings.ReplaceAll(sqlString, "\"", "")
|
|
||||||
|
|
||||||
return sqlString
|
|
||||||
}
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li> <a href="index.php">home</a> </li>
|
||||||
|
<li> <a href="about.php">über uns</a> </li>
|
||||||
|
<li> <a href="treff.php">treff</a> </li>
|
||||||
|
<li> <a href="events.php">events</a> </li>
|
||||||
|
<li> <a href="kontakt.php">kontakt</a> </li>
|
||||||
|
<li> <a href="support.php">support</a> </li>
|
||||||
|
<li> <a href="verein.php">verein</a> </li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
75
events.go
|
@ -1,75 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
func getEvents() []event {
|
|
||||||
db := ctdoConnect()
|
|
||||||
defer dbClose(db)
|
|
||||||
|
|
||||||
rows := dbQuerry(db, "SELECT * FROM events;")
|
|
||||||
|
|
||||||
events := []event{}
|
|
||||||
|
|
||||||
for rows.Next() {
|
|
||||||
Event := new(event)
|
|
||||||
err := rows.Scan(&Event.id, &Event.title, &Event.description, &Event.media, &Event.date)
|
|
||||||
if err != nil {
|
|
||||||
panic(err.Error())
|
|
||||||
}
|
|
||||||
events = append(events, *Event)
|
|
||||||
}
|
|
||||||
|
|
||||||
return events
|
|
||||||
}
|
|
||||||
|
|
||||||
func getEventCount() int {
|
|
||||||
db := ctdoConnect()
|
|
||||||
defer dbClose(db)
|
|
||||||
|
|
||||||
row := dbQuerry(db, "SELECT COUNT(*) FROM events;")
|
|
||||||
|
|
||||||
count := 0
|
|
||||||
|
|
||||||
for row.Next() {
|
|
||||||
row.Scan(&count)
|
|
||||||
}
|
|
||||||
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
func addEvent(Event event) bool {
|
|
||||||
db := ctdoConnect()
|
|
||||||
defer dbClose(db)
|
|
||||||
|
|
||||||
if len(Event.title) > 80 || len(Event.description) > 500 || len(Event.media) == 10000 || len(Event.date) > 10 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlString := "insert into events (title, description, media, date) values ('" + sqlClean(Event.title) + "', '" + sqlClean(Event.description) + "', '" + sqlClean(Event.media) + "', '" + sqlClean(Event.date) + "');"
|
|
||||||
|
|
||||||
dbQuerry(db, sqlString)
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAdminKeys() []string {
|
|
||||||
db := ctdoConnect()
|
|
||||||
defer dbClose(db)
|
|
||||||
|
|
||||||
rows := dbQuerry(db, "select * from adminKeys;")
|
|
||||||
|
|
||||||
output := []string{}
|
|
||||||
|
|
||||||
for rows.Next() {
|
|
||||||
temp := ""
|
|
||||||
err := rows.Scan(&temp)
|
|
||||||
if err != nil {
|
|
||||||
panic(err.Error())
|
|
||||||
}
|
|
||||||
output = append(output, temp)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(output) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
48
file.go
|
@ -1,48 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func fileRead(src string) string {
|
|
||||||
content, err := ioutil.ReadFile(src)
|
|
||||||
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
return string(content)
|
|
||||||
}
|
|
||||||
|
|
||||||
func fileAddLine(input string, filepath string) {
|
|
||||||
_, err := os.Stat(filepath)
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
fileCreate(filepath)
|
|
||||||
}
|
|
||||||
|
|
||||||
var file *os.File
|
|
||||||
file, err = os.OpenFile(filepath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
_, err = file.WriteString(input + "\n")
|
|
||||||
errorPanic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func fileCreate(filepath string) {
|
|
||||||
_, err := os.Stat(filepath)
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
_, err := os.Create(filepath)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
logger("fileCreate : file created -> " + filepath)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func fileMkDir(folderpath string) {
|
|
||||||
_, err := os.Stat(folderpath)
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
err = os.Mkdir(folderpath, 0755)
|
|
||||||
errorPanic(err)
|
|
||||||
logger("fileMkDir : folder created -> " + folderpath)
|
|
||||||
}
|
|
||||||
}
|
|
42
func.go
|
@ -1,42 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringListContains(list []string, searched string) bool {
|
|
||||||
for _, item := range list {
|
|
||||||
if item == searched {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
5
go.mod
|
@ -1,5 +0,0 @@
|
||||||
module xoy.dev/ctdo
|
|
||||||
|
|
||||||
go 1.19
|
|
||||||
|
|
||||||
require github.com/go-sql-driver/mysql v1.7.0 // indirect
|
|
2
go.sum
|
@ -1,2 +0,0 @@
|
||||||
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
|
|
||||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
|
106
html.go
|
@ -1,106 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func htmlElement(tag string, innerHTML string, args string) string {
|
|
||||||
return "<" + tag + " " + args + ">" + innerHTML + "</" + tag + ">"
|
|
||||||
}
|
|
||||||
|
|
||||||
func htmlLinkElement(innerHTML string, destination string, blank bool, args string) string {
|
|
||||||
b := ""
|
|
||||||
if blank {
|
|
||||||
b = "target=\"_blank\" "
|
|
||||||
}
|
|
||||||
|
|
||||||
return htmlElement("a", innerHTML, " href=\""+destination+"\" "+b+args)
|
|
||||||
}
|
|
||||||
|
|
||||||
func htmlInputElement(name string, _type string, value string, args string) string {
|
|
||||||
return "<input name=\"" + name + "\" type=\"" + _type + "\" value=\"" + value + "\" " + args + ">"
|
|
||||||
}
|
|
||||||
|
|
||||||
func htmlNav(pages [][]string, activePage string) string {
|
|
||||||
output := ""
|
|
||||||
|
|
||||||
for _, page := range pages {
|
|
||||||
if page[1] == "/"+activePage || (page[1] == "/home" && activePage == "") {
|
|
||||||
output += htmlElement("li", htmlLinkElement(page[0], page[1], false, "class=\"active\""), "")
|
|
||||||
} else {
|
|
||||||
output += htmlElement("li", htmlLinkElement(page[0], page[1], false, ""), "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return htmlElement("nav", htmlElement("ul", output, ""), "")
|
|
||||||
}
|
|
||||||
|
|
||||||
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", "<p>Raumstatus: <b class=\"green-text\">offen</b></p>")
|
|
||||||
} else {
|
|
||||||
output = strings.ReplaceAll(output, "!RAUMSTATUS", "<p>Raumstatus: <b class=\"red-text\">geschlossen</b></p>")
|
|
||||||
}
|
|
||||||
|
|
||||||
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("p", htmlClean(Event.date), "class=\"date\"")
|
|
||||||
tempA += htmlElement("h2", htmlClean(Event.title), "class=\"title\"")
|
|
||||||
tempA += htmlElement("p", htmlClean(Event.description), "class=\"desc\"")
|
|
||||||
tempB += htmlLinkElement(htmlElement("div", tempA, "class=\"event\""), "/event/"+strconv.Itoa(Event.id), false, "class=\"event\"")
|
|
||||||
tempB += "!SPLIT"
|
|
||||||
}
|
|
||||||
output = strings.ReplaceAll(output, "!EVENTS", htmlElement("div", strings.ReplaceAll(tempB, "!SPLIT", ""), "class=\"eventList\""))
|
|
||||||
//tempC := strings.Split(tempB, "!SPLIT")
|
|
||||||
//output = strings.ReplaceAll(output, "!NEXTEVENTS", htmlElement("div", tempC[0]+tempC[1]+tempC[2]+tempC[3], "class=\"eventList\""))
|
|
||||||
}
|
|
||||||
|
|
||||||
output = strings.ReplaceAll(output, "!NEWBANNER", htmlNewBanner("Rundgang", "https://www.chaostreff-dortmund.de/rundgang/"))
|
|
||||||
|
|
||||||
if strings.Contains(activePage, "/addEvent") {
|
|
||||||
output = strings.ReplaceAll(output, "!ADMINKEY", activePage)
|
|
||||||
} else {
|
|
||||||
output = strings.ReplaceAll(output, "!ADMINKEY", activePage+"/addEvent")
|
|
||||||
}
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
|
|
||||||
func htmlClean(htmlString string) string {
|
|
||||||
htmlString = strings.ReplaceAll(htmlString, "<", "[")
|
|
||||||
htmlString = strings.ReplaceAll(htmlString, ">", "]")
|
|
||||||
return htmlString
|
|
||||||
}
|
|
110
http.go
|
@ -1,110 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func httpHandleFunc(urlPath string, filepath string, contentType string) {
|
|
||||||
urlPath = strings.ToLower(urlPath)
|
|
||||||
logger(readHttpYML() + "/" + urlPath + " <--> " + filepath + " <" + contentType + ">")
|
|
||||||
http.HandleFunc("/"+urlPath, func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
logger(r.Method + " request -> " + readHttpYML() + "/" + urlPath + " <" + contentType + ">")
|
|
||||||
|
|
||||||
w.Header().Add("Content-Type", contentType)
|
|
||||||
|
|
||||||
io.WriteString(w, htmlReplacer(fileRead(filepath), urlPath))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func httpHandleFuncWithPOST(urlPath string, filepath string, contentType string) {
|
|
||||||
Event := new(event)
|
|
||||||
logger(readHttpYML() + "/" + urlPath + " <--> " + filepath + " <" + contentType + ">")
|
|
||||||
http.HandleFunc("/"+urlPath, func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
if r.Method == "POST" {
|
|
||||||
logger(r.Method + " request -> " + readHttpYML() + "/" + urlPath + " <" + contentType + ">")
|
|
||||||
|
|
||||||
r.ParseMultipartForm(10 << 20)
|
|
||||||
err := r.ParseMultipartForm(200000)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
formdata := r.MultipartForm
|
|
||||||
|
|
||||||
files := formdata.File["media"]
|
|
||||||
|
|
||||||
if filepath == "./web/pages/admin/dashboard.html" {
|
|
||||||
logger("----------------ADD EVENT----------------")
|
|
||||||
title := formdata.Value["title"]
|
|
||||||
description := formdata.Value["description"]
|
|
||||||
media := formdata.File["media"]
|
|
||||||
mediaString := ""
|
|
||||||
date := formdata.Value["date"]
|
|
||||||
|
|
||||||
if title[0] != "" && description[0] != "" && media != nil && date[0] != "" {
|
|
||||||
logger("title: " + title[0])
|
|
||||||
logger("descrtiption: " + description[0])
|
|
||||||
logger("media: " + string(len(media)))
|
|
||||||
|
|
||||||
logger("files uploaded successfully: ")
|
|
||||||
|
|
||||||
for i, _ := range files {
|
|
||||||
if len(media) > 0 {
|
|
||||||
mediaString += ","
|
|
||||||
}
|
|
||||||
mediaString += "./web/images/" + files[i].Filename
|
|
||||||
|
|
||||||
logger("./web/images/" + files[i].Filename)
|
|
||||||
}
|
|
||||||
|
|
||||||
Event.id = -1
|
|
||||||
Event.title = title[0]
|
|
||||||
Event.description = description[0]
|
|
||||||
Event.media = mediaString
|
|
||||||
Event.date = date[0]
|
|
||||||
|
|
||||||
logger("date: " + date[0])
|
|
||||||
|
|
||||||
if addEvent(*Event) {
|
|
||||||
for i, _ := range files {
|
|
||||||
file, err := files[i].Open()
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
out, err := os.Create("./web/images/" + files[i].Filename)
|
|
||||||
errorPanic(err, "unable to create the file -> '"+"./web/images/"+files[i].Filename+"' : check your write access privilege")
|
|
||||||
|
|
||||||
_, err = io.Copy(out, file)
|
|
||||||
errorPanic(err)
|
|
||||||
}
|
|
||||||
logger("event added!")
|
|
||||||
handleImages()
|
|
||||||
} else {
|
|
||||||
logger("event not added!")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger("no formdata")
|
|
||||||
}
|
|
||||||
logger("----------------ADD END----------------")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Add("Content-Type", contentType)
|
|
||||||
|
|
||||||
io.WriteString(w, htmlReplacer(fileRead(filepath), urlPath))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func httpGetBody(url string) []byte {
|
|
||||||
c := &http.Client{Timeout: 10 * time.Second}
|
|
||||||
r, err := c.Get(url)
|
|
||||||
errorPanic(err)
|
|
||||||
defer r.Body.Close()
|
|
||||||
|
|
||||||
var body []byte
|
|
||||||
body, err = io.ReadAll(r.Body)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
return body
|
|
||||||
}
|
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
@ -4,17 +4,25 @@
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
<title>ctdo - home</title>
|
<title>ctdo - home</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="/style/main.css">
|
<link rel="stylesheet" href="/style/main.css">
|
||||||
<link rel="stylesheet" href="/style/home.css">
|
<link rel="stylesheet" href="/style/home.css">
|
||||||
<link rel="stylesheet" href="/style/events.css">
|
<link rel="stylesheet" href="/style/events.css">
|
||||||
|
|
||||||
|
<?php require 'php/generator.php'; ?>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
!NEWBANNER
|
<div class="newBanner">
|
||||||
|
Rundgang
|
||||||
|
</div>
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
<img src="/image/logo_ctdo.svg" alt="ctdo logo">
|
<img src="/image/logo_ctdo.svg" alt="ctdo logo">
|
||||||
!NAV
|
<?php print_element("nav"); ?>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<div class="rundgang">
|
<div class="rundgang">
|
||||||
<a href="https://www.chaostreff-dortmund.de/rundgang/" target="_blank" class="imgLink">
|
<a href="https://www.chaostreff-dortmund.de/rundgang/" target="_blank" class="imgLink">
|
21
logger.go
|
@ -1,21 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func logger(input string) {
|
|
||||||
fileMkDir("./log")
|
|
||||||
println("[" + time.Now().Format("15:04:05") + "] " + input)
|
|
||||||
fileAddLine("["+time.Now().Format("15:04:05")+"] "+input, "./log/"+time.Now().Format("2006-02-01")+".log")
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorPanic(err error, logBefore ...string) {
|
|
||||||
if err != nil {
|
|
||||||
for _, log := range logBefore {
|
|
||||||
logger(log)
|
|
||||||
}
|
|
||||||
logger(err.Error())
|
|
||||||
panic("\n----------------ERROR----------------\n")
|
|
||||||
}
|
|
||||||
}
|
|
158
main.go
|
@ -1,158 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Timezone = UTC
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
addr := readHttpYML()
|
|
||||||
|
|
||||||
logger("----------------START----------------")
|
|
||||||
logger("timezone = UTC")
|
|
||||||
logger("connection open with address " + addr)
|
|
||||||
|
|
||||||
handler()
|
|
||||||
|
|
||||||
err := http.ListenAndServe(addr, nil)
|
|
||||||
errorPanic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func handler() {
|
|
||||||
//reihenfolge ist wichtig!
|
|
||||||
|
|
||||||
//admin pages
|
|
||||||
logger("----------------HANDLE ADMIN LOGIN----------------")
|
|
||||||
keys := getAdminKeys()
|
|
||||||
if len(keys) > 0 {
|
|
||||||
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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger("----------------HANDLE END----------------")
|
|
||||||
|
|
||||||
//events
|
|
||||||
handleEvents()
|
|
||||||
|
|
||||||
//images
|
|
||||||
handleImages()
|
|
||||||
|
|
||||||
//styles
|
|
||||||
logger("----------------HANDLE STYLES----------------")
|
|
||||||
handleFilesInFolder("style/", "./web/styles/", false)
|
|
||||||
logger("----------------HANDLE END----------------")
|
|
||||||
|
|
||||||
//pages
|
|
||||||
logger("----------------HANDLE PAGES----------------")
|
|
||||||
httpHandleFunc("", "./web/pages/home.html", "text/html")
|
|
||||||
handleFilesInFolder("", "./web/pages/", true)
|
|
||||||
logger("----------------HANDLE END----------------")
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleEvents() {
|
|
||||||
if getEventCount() > 0 {
|
|
||||||
logger("----------------HANDLE EVENTS----------------")
|
|
||||||
events := getEvents()
|
|
||||||
for _, e := range events {
|
|
||||||
httpHandleFunc("event/"+strconv.Itoa(e.id), "./web/pages/event.html", "text/html")
|
|
||||||
}
|
|
||||||
logger("----------------HANDLE END----------------")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleImages() {
|
|
||||||
logger("----------------HANDLE IMAGES----------------")
|
|
||||||
handleFilesInFolder("image/", "./web/images/", false)
|
|
||||||
logger("----------------HANDLE END----------------")
|
|
||||||
}
|
|
||||||
|
|
||||||
var alreadyHandledFiles []string = []string{"./web/pages/admin/dashboard.html", "./web/pages/event.html"}
|
|
||||||
|
|
||||||
func handleFilesInFolder(urlPrefix string, folderpath string, handleWithoutFileSuffix bool) {
|
|
||||||
if folderpath[len(folderpath)-1] != '/' {
|
|
||||||
folderpath += "/"
|
|
||||||
}
|
|
||||||
files, err := ioutil.ReadDir(folderpath)
|
|
||||||
errorPanic(err)
|
|
||||||
|
|
||||||
for _, file := range files {
|
|
||||||
alreadyHandled := stringListContains(alreadyHandledFiles, folderpath+file.Name())
|
|
||||||
|
|
||||||
if !alreadyHandled {
|
|
||||||
if !file.IsDir() {
|
|
||||||
f := strings.Split(file.Name(), ".")
|
|
||||||
ContentType := f[len(f)-1]
|
|
||||||
filename := ""
|
|
||||||
|
|
||||||
if handleWithoutFileSuffix {
|
|
||||||
for index, item := range f {
|
|
||||||
if index < len(f)-1 {
|
|
||||||
filename += item
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
filename = file.Name()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ContentType {
|
|
||||||
case "png":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/png")
|
|
||||||
case "webp":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/webp")
|
|
||||||
case "svg":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/svg+xml")
|
|
||||||
case "jpeg":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/jpeg")
|
|
||||||
case "jpg":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/jpeg")
|
|
||||||
case "gif":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "image/gif")
|
|
||||||
case "css":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "text/css")
|
|
||||||
case "html":
|
|
||||||
httpHandleFunc(urlPrefix+filename, folderpath+file.Name(), "text/html")
|
|
||||||
default:
|
|
||||||
logger("handleFilesInFolder -> content-type unknown : " + folderpath + file.Name())
|
|
||||||
}
|
|
||||||
alreadyHandledFiles = append(alreadyHandledFiles, folderpath+file.Name())
|
|
||||||
} else {
|
|
||||||
childFolder := file.Name()
|
|
||||||
handleFilesInFolder(childFolder, folderpath+childFolder, handleWithoutFileSuffix)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger("handleFilesInFolder -> already handled : " + folderpath + file.Name())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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{"datenschutz", "/datenschutz"})
|
|
||||||
|
|
||||||
return output
|
|
||||||
}
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function print_element($element_name) {
|
||||||
|
print(file_get_contents("/elements/$element_name.html"));
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
28
structs.go
|
@ -1,28 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
type status struct {
|
|
||||||
state bool
|
|
||||||
lastchange int64
|
|
||||||
power int64
|
|
||||||
}
|
|
||||||
|
|
||||||
type event struct {
|
|
||||||
id int
|
|
||||||
title string
|
|
||||||
description string
|
|
||||||
media string
|
|
||||||
date string
|
|
||||||
}
|
|
||||||
|
|
||||||
type topic struct {
|
|
||||||
date string
|
|
||||||
days int
|
|
||||||
}
|
|
||||||
|
|
||||||
type database struct {
|
|
||||||
username string
|
|
||||||
password string
|
|
||||||
address string
|
|
||||||
port string
|
|
||||||
database string
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
func testFuncOutput(functionOutput any, rightOutput any) bool {
|
|
||||||
return functionOutput == rightOutput
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="de">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>ctdo - admin</title>
|
|
||||||
<link rel="stylesheet" href="/style/main.css">
|
|
||||||
<link rel="stylesheet" href="/style/dashboard.css">
|
|
||||||
<link rel="stylesheet" href="/style/events.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<img src="/image/logo_ctdo.svg" alt="ctdo logo">
|
|
||||||
!NAV
|
|
||||||
</header>
|
|
||||||
<main>
|
|
||||||
!RAUMSTATUS
|
|
||||||
!EVENTS
|
|
||||||
|
|
||||||
<form action="/!ADMINKEY" method="post" enctype="multipart/form-data">
|
|
||||||
<input type="text" name="title" placeholder="Titel"><br>
|
|
||||||
<input type="text" name="description" placeholder="Beschreibung"><br>
|
|
||||||
<label for="media">Bilder:</label><input type="file" name="media" id="media" multiple><br>
|
|
||||||
<label for="date">Datum:</label><input type="date" name="date" id="date"><br>
|
|
||||||
<input type="submit" value="Event Erstellen">
|
|
||||||
</form>
|
|
||||||
</main>
|
|
||||||
<footer>
|
|
||||||
!FOOTERNAV
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
55
yml.go
|
@ -1,55 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import "strings"
|
|
||||||
|
|
||||||
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 ""
|
|
||||||
}
|
|