93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
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
|
|
}
|