radchat/main.go
2025-09-04 19:42:02 -05:00

83 lines
2.4 KiB
Go

package main
// main is the entrypoint for RadChat. It parses flags, prepares storage,
// configures middleware and routes, and starts the HTTP server. See README for
// the flag reference and architecture overview.
import (
"flag"
"fmt"
"log"
"net/http"
"path/filepath"
"radchat/server"
"time"
)
func main() {
var ip = flag.String("ip", "localhost", "Server address (e.g., 192.168.1.1)")
var port = flag.Int("port", 8080, "Server port")
var bufSize = flag.Int("bufsize", 256, "Channel buffer size")
var gzipEnabled = flag.Bool("gzip-enable", false, "Enable gzip compression")
var cachingDisabled = flag.Bool("cache-disable", false, "Disable caching")
var filesDirectory = flag.String("files", "./files", "Directory to store upload files")
var filesTimeout = flag.Int("files-timeout", 3600, "File timeout in seconds")
var origin = flag.String("origin", "", "Origin to allow (e.g. example.com), leave blank to allow all")
var help = flag.Bool("help", false, "Show help")
flag.Parse()
if *help {
flag.PrintDefaults()
return
}
filesDir := filepath.Clean(*filesDirectory)
_ = DeleteDirContents(filesDir)
err := MakeDir(filesDir)
if err != nil {
log.Fatal(err)
}
address := fmt.Sprintf("%s:%d", *ip, *port)
hub := server.NewHub(*bufSize, server.Upgrader(*origin, *origin == ""))
go Run(hub)
mux := http.NewServeMux()
mux.HandleFunc("/files", func(w http.ResponseWriter, r *http.Request) {
HandleFileUpload(hub, filesDir, time.Duration(*filesTimeout)*time.Second, w, r)
})
mux.HandleFunc("/files/", func(w http.ResponseWriter, r *http.Request) {
HandleFileDownload(filesDir, w, r)
})
mux.HandleFunc("/user-count", func(w http.ResponseWriter, r *http.Request) {
HandleUserCountCheck(hub, w, r)
})
mux.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
HandleWebSocket(hub, w, r)
})
mux.HandleFunc("/check-username", func(w http.ResponseWriter, r *http.Request) {
HandleUsernameCheck(hub, w, r)
})
var middleware []func(http.Handler) http.Handler
if *cachingDisabled {
middleware = append(middleware, server.CacheDisableMiddleware)
}
if *gzipEnabled {
middleware = append(middleware, server.GzipMiddleware)
}
fileServer := http.FileServer(http.Dir("./static/"))
mux.Handle("/", server.MiddlewareChain(middleware...)(fileServer))
log.Printf("Voice chat server starting on %s...\n", address)
log.Fatal(http.ListenAndServe(address, mux))
}