// 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) } }