package main import ( "context" "flag" "log" "net/http" "os" "strconv" "strings" handler "git.pengzhan.dev/aimaren/internal/bothandler" "git.pengzhan.dev/aimaren/internal/config" "git.pengzhan.dev/aimaren/internal/storage" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { // ---- parse flags ---- modeFlag := flag.String("mode", "unsafe", "Bot mode: unsafe | whitelist | blacklist") listFlag := flag.String("list", "", "Comma-separated chat IDs for whitelist/blacklist") flag.Parse() mode := parseMode(*modeFlag) list := parseList(*listFlag) log.Printf("🔧 Bot starting with mode=%s list=%v", *modeFlag, list) // ---- load config ---- cfg, err := config.Load() if err != nil { log.Fatalf("❌ config load: %v", err) } store, err := storage.NewFirestoreClient(context.Background(), cfg.GCPProjectID) if err != nil { log.Fatalf("❌ store init: %v", err) } defer store.Close() bot, err := tgbotapi.NewBotAPI(cfg.Telegram.Token) if err != nil { log.Fatalf("❌ bot init: %v", err) } log.Printf("✅ Authorized on account %s", bot.Self.UserName) // 👉 Set webhook ONCE manually: // curl -F "url=https:///" https://api.telegram.org/bot/setWebhook http.Handle("/", handler.NewBotHandler(bot, store, mode, list)) port := os.Getenv("PORT") if port == "" { port = "8080" } log.Printf("✅ Listening on :%s (Cloud Run HTTPS handled by platform)", port) log.Fatal(http.ListenAndServe(":"+port, nil)) } // parseMode converts string to BotMode func parseMode(s string) handler.BotMode { switch strings.ToLower(s) { case "whitelist": return handler.WhiteListMode case "blacklist": return handler.BlackListMode default: return handler.UnsafeMode } } // parseList converts comma-separated chat IDs to []int64 func parseList(s string) []int64 { if s == "" { return nil } parts := strings.Split(s, ",") var ids []int64 for _, p := range parts { p = strings.TrimSpace(p) if p == "" { continue } v, err := strconv.ParseInt(p, 10, 64) if err != nil { log.Printf("⚠️ invalid chatID in list: %s (ignored)", p) continue } ids = append(ids, v) } return ids }