2026-06-21 21:49:51 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2026-06-25 23:52:42 +08:00
|
|
|
"context"
|
2026-06-21 21:49:51 +08:00
|
|
|
"log"
|
|
|
|
|
"net/http"
|
2026-06-25 23:52:42 +08:00
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
|
|
|
|
"syscall"
|
|
|
|
|
"time"
|
2026-06-21 21:49:51 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
config := LoadConfig()
|
|
|
|
|
|
2026-06-25 23:52:42 +08:00
|
|
|
// 可选初始化 MySQL
|
|
|
|
|
var db *PromptDB
|
|
|
|
|
if config.MySQLDSN != "" {
|
|
|
|
|
var err error
|
|
|
|
|
db, err = NewPromptDB(config.MySQLDSN)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalf("failed to init mysql: %v", err)
|
|
|
|
|
}
|
|
|
|
|
log.Println("mysql prompt recording enabled")
|
|
|
|
|
} else {
|
|
|
|
|
log.Println("mysql not configured, prompt recording disabled")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handler := NewHookHandler(config, db)
|
2026-06-21 21:49:51 +08:00
|
|
|
|
2026-06-25 23:52:42 +08:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
|
mux.HandleFunc("/hooks", handler.HandleHook)
|
|
|
|
|
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
|
2026-06-21 21:49:51 +08:00
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
|
|
w.Write([]byte(`{"status":"ok"}`))
|
|
|
|
|
})
|
|
|
|
|
|
2026-06-25 23:52:42 +08:00
|
|
|
srv := &http.Server{
|
|
|
|
|
Addr: config.Port,
|
|
|
|
|
Handler: mux,
|
|
|
|
|
ReadTimeout: 10 * time.Second,
|
|
|
|
|
WriteTimeout: 10 * time.Second,
|
|
|
|
|
IdleTimeout: 60 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 优雅关闭
|
|
|
|
|
go func() {
|
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
|
|
|
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
|
<-sigCh
|
|
|
|
|
log.Println("shutting down...")
|
|
|
|
|
|
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
if err := srv.Shutdown(ctx); err != nil {
|
|
|
|
|
log.Printf("server shutdown error: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if db != nil {
|
|
|
|
|
db.Close()
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
2026-06-21 21:49:51 +08:00
|
|
|
log.Printf("cc-hook service starting on %s", config.Port)
|
|
|
|
|
log.Printf("gotify endpoint: %s", config.GotifyURL)
|
|
|
|
|
|
2026-06-25 23:52:42 +08:00
|
|
|
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
|
2026-06-21 21:49:51 +08:00
|
|
|
log.Fatalf("server failed: %v", err)
|
|
|
|
|
}
|
2026-06-25 23:52:42 +08:00
|
|
|
log.Println("server stopped")
|
2026-06-21 21:49:51 +08:00
|
|
|
}
|