feat: Scaffolding bot

This commit is contained in:
2025-07-26 17:18:41 -07:00
parent 4acfd33eae
commit 8d3bcbc01d
10 changed files with 443 additions and 18 deletions
+92
View File
@@ -0,0 +1,92 @@
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://<your-cloudrun-url>/" https://api.telegram.org/bot<token>/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
}