aboutsummaryrefslogtreecommitdiff
path: root/main.go
blob: 78ccbc81b854370f611e84a9650c1f8aaf9fc60c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// ideez is a web application that allows people to post their ideas, it is meant to help
// brainstorming.
package main

import (
	"crypto/rand"
	"encoding/hex"
	"errors"
	"html/template"
	"log"
	"net/http"
	"os"
	"strings"

	_ "embed"
)

type ServersPageData struct {
	Address template.URL
	Error   string
}

const (
	// Name of the directory where the data files are stored
	DATA_DIR = "ideez_servers"
)

var address string = "localhost:15118"

//go:embed templates/servers.html
var servers_html string

// All servers that are currently managed
var Ideezes []Ideez

// Directory path where the data files are stored
var DataDir string

func getAddress(r *http.Request) template.URL {
	p, ok := r.Header["X-Forwarded-Proto"]
	if ok {
		return template.URL(p[0] + "://" + r.Host)
	}
	if r.TLS == nil {
		return template.URL("http://" + r.Host)
	} else {
		return template.URL("https://" + r.Host)
	}
}

func main() {
	var (
		logger = log.New(os.Stdout, "Ideez: ", log.Ldate)
	)

	mux := http.NewServeMux()

	fs := http.FileServer(http.Dir("assets/"))
	mux.Handle("/static/", http.StripPrefix("/static/", fs))

	tmpl, err := template.New("servers").Parse(servers_html)

	// list servers
	mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
		tmpl.ExecuteTemplate(w, "servers", ServersPageData{getAddress(r), ""})
	})

	// create a new server
	mux.HandleFunc("POST /server/create/", func(w http.ResponseWriter, r *http.Request) {
		addr := getAddress(r)
		name := r.FormValue("name")
		logger.Println("Create server", name)
		if name == "" {
			tmpl.ExecuteTemplate(w, "servers", ServersPageData{addr, "You must provide a title"})
			return
		}

		bytes := make([]byte, SERVER_ID_BYTES)
		_, err := rand.Read(bytes)
		if err != nil {
			panic(err)
		}
		id := hex.EncodeToString(bytes)

		server := NewIdeez(mux, name, id)
		Ideezes = append(Ideezes, server)
		http.Redirect(w, r, "/server/"+id, http.StatusMovedPermanently)
	})

	// import the servers from the data files
	{
		p := os.Getenv("XDG_CACHE_HOME")
		if p == "" {
			p = "."
		}
		DataDir = p + "/" + DATA_DIR
		if err := os.Mkdir(DataDir, 0755); err == nil {
			logger.Println("Directory does not exist, creating " + DataDir)
		} else if !errors.Is(err, os.ErrExist) {
			panic(err)
		}

		entries, err := os.ReadDir(DataDir)
		if err != nil {
			panic(err)
		}
		counter := 0
		for _, file := range entries {
			if !strings.HasSuffix(file.Name(), ".data") {
				continue
			}
			id := strings.TrimSuffix(file.Name(), ".data")
			ideez := NewIdeez(mux, "", id)
			Ideezes = append(Ideezes, ideez)
			counter++
		}
		logger.Printf("Imported %d Ideezes\n", counter)
	}

	logger.Println("Listening on http://" + address)
	err = http.ListenAndServe(address, mux)
	if err != nil {
		panic(err)
	}
}