diff --git a/go.mod b/go.mod index 5c1baa6..b0e9391 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ module go.balki.me/tglistbot -go 1.20 +go 1.21 -require go.balki.me/anyhttp v0.2.0 +require go.balki.me/anyhttp v0.3.0 diff --git a/go.sum b/go.sum index 200c761..50912eb 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -go.balki.me/anyhttp v0.2.0 h1:W6aGcmjF5CMJvJYtbYCywxnYoErFhFc76vwaqUG5FAQ= -go.balki.me/anyhttp v0.2.0/go.mod h1:JhfekOIjgVODoVqUCficjpIgmB3wwlB7jhN0eN2EZ/s= +go.balki.me/anyhttp v0.3.0 h1:WtBQ0rnkg567sX/O4ij/+qBbdCIUt5VURSe718sITBY= +go.balki.me/anyhttp v0.3.0/go.mod h1:JhfekOIjgVODoVqUCficjpIgmB3wwlB7jhN0eN2EZ/s= diff --git a/main.go b/main.go index c838eae..8da2a22 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" + "context" "encoding/json" "fmt" "io" @@ -16,6 +17,7 @@ import ( "time" "go.balki.me/anyhttp" + "go.balki.me/anyhttp/idle" "go.balki.me/tglistbot/glist" ) @@ -25,9 +27,10 @@ var apiToken string var usage string = `Telegram List bot Environment variables: -TGLB_API_TOKEN (required): See https://core.telegram.org/bots#how-do-i-create-a-bot -TGLB_PORT (default 28923): Set numerical port or unix//run/path.sock for unix socket -TGLB_DATA_PATH (default .): Directory path where list data is stored +TGLB_API_TOKEN (required) : See https://core.telegram.org/bots#how-do-i-create-a-bot +TGLB_ADDR (default 28923) : See https://pkg.go.dev/go.balki.me/anyhttp#readme-address-syntax +TGLB_DATA_PATH (default .) : Directory path where list data is stored +TGLB_TIMEOUT (default 30m) : Timeout to auto shutdown if using systemd-fd, See https://pkg.go.dev/time#ParseDuration ` func main() { @@ -60,6 +63,18 @@ func main() { return dataPath }() + timeout := func() time.Duration { + timeoutStr := os.Getenv("TGLB_TIMEOUT") + if timeoutStr == "" { + return 30 * time.Minute + } + timeout, err := time.ParseDuration(timeoutStr) + if err != nil { + log.Panicf("Invalid timeout: %q\n", timeoutStr) + } + return timeout + }() + glist.DataPath = dataPath version := func() string { @@ -154,7 +169,24 @@ func main() { } }) - log.Panicln(anyhttp.ListenAndServe(addr, nil)) + addrType, server, done, err := anyhttp.Serve(addr, idle.WrapHandler(nil)) + if err != nil { + log.Panicln(err) + } + if addrType == anyhttp.SystemdFD { + log.Println("server started") + if err := idle.Wait(timeout); err != nil { + log.Panicln(err) + } + log.Printf("server idle for %v, shutting down\n", timeout) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) // Don't want any stuck connections + defer cancel() + if err := server.Shutdown(ctx); err != nil { + log.Panicln(err) + } + } else { + <-done + } } func handleTextAdded(gl *glist.GList, text string) {