Initial commit

This commit is contained in:
2026-08-08 11:04:45 +02:00
commit 4137962252
10 changed files with 1322 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
package main
import (
"flag"
"fmt"
"os"
"billboard/internal/server"
"billboard/internal/state"
"billboard/internal/tui"
)
func main() {
if len(os.Args) < 2 {
usage()
os.Exit(2)
}
switch os.Args[1] {
case "server":
serverCmd(os.Args[2:])
case "display":
displayCmd(os.Args[2:])
default:
usage()
os.Exit(2)
}
}
func usage() {
fmt.Fprintf(os.Stderr, `usage:
billboard server [-addr :8080] [-width 64] [-height 32] [-snapshot billboard.json]
billboard display [-server http://localhost:8080] [-tty /dev/tty2]
env:
BILLBOARD_TOKEN if set on the server, POST requests need "Authorization: Bearer <token>"
`)
}
func serverCmd(args []string) {
fs := flag.NewFlagSet("server", flag.ExitOnError)
addr := fs.String("addr", ":8080", "listen address")
width := fs.Int("width", 64, "canvas width in pixels")
height := fs.Int("height", 32, "canvas height in pixels")
snapshot := fs.String("snapshot", "billboard.json", "snapshot file (loaded if it exists)")
fs.Parse(args)
var st *state.State
if loaded, err := state.Load(*snapshot); err == nil {
st = loaded
fmt.Printf("loaded snapshot %s (%dx%d)\n", *snapshot, st.Width, st.Height)
} else {
st = state.New(*width, *height)
}
srv := server.New(st, server.Config{
Addr: *addr,
Token: os.Getenv("BILLBOARD_TOKEN"),
SnapshotPath: *snapshot,
})
if err := srv.Run(); err != nil {
fmt.Fprintln(os.Stderr, "server:", err)
os.Exit(1)
}
}
func displayCmd(args []string) {
fs := flag.NewFlagSet("display", flag.ExitOnError)
serverAddr := fs.String("server", "http://localhost:8080", "billboard server URL")
tty := fs.String("tty", "", "tty device to render on (e.g. /dev/tty2); default stdout")
fs.Parse(args)
if err := tui.Run(*serverAddr, *tty); err != nil {
fmt.Fprintln(os.Stderr, "display:", err)
os.Exit(1)
}
}