feat: 初始化 ChatGPT Team 管理机器人
核心功能: - 实现基于 Telegram Inline Button 交互的后台面板与用户端 - 支持通过账密登录和 RT (Refresh Token) 方式添加 ChatGPT Team 账号 - 支持管理、拉取和删除待处理邀请,支持一键清空多余邀请 - 支持按剩余容量自动生成邀请兑换码,支持分页查看与一键清空未使用兑换码 - 随机邀请功能:成功拉人后自动核销兑换码 - 定时检测 Token 状态,实现自动续订/刷新并拦截封禁账号 (处理 401/402 错误) 系统与配置: - 使用 PostgreSQL 数据库管理账号、邀请和兑换记录 - 支持在端内动态添加、移除管理员 - 完善 Docker 部署配置与 .gitignore 规则
This commit is contained in:
86
internal/config/config.go
Normal file
86
internal/config/config.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/joho/godotenv"
|
||||
)
|
||||
|
||||
// Config holds all application configuration.
|
||||
type Config struct {
|
||||
DatabaseURL string
|
||||
TelegramBotToken string
|
||||
TelegramAdminIDs []int64
|
||||
ProxyURL string
|
||||
TokenCheckInterval int // minutes
|
||||
TeamCapacity int
|
||||
OAuthCallbackPort int
|
||||
}
|
||||
|
||||
// Load reads configuration from environment variables / .env file.
|
||||
func Load() *Config {
|
||||
_ = godotenv.Load()
|
||||
|
||||
cfg := &Config{
|
||||
DatabaseURL: getEnv("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/teamhelper?sslmode=disable"),
|
||||
TelegramBotToken: getEnv("TELEGRAM_BOT_TOKEN", ""),
|
||||
ProxyURL: getEnv("PROXY_URL", ""),
|
||||
TokenCheckInterval: getEnvInt("TOKEN_CHECK_INTERVAL", 30),
|
||||
TeamCapacity: getEnvInt("TEAM_CAPACITY", 6),
|
||||
OAuthCallbackPort: getEnvInt("OAUTH_CALLBACK_PORT", 1455),
|
||||
}
|
||||
|
||||
raw := getEnv("TELEGRAM_ADMIN_IDS", "")
|
||||
if raw != "" {
|
||||
for _, s := range strings.Split(raw, ",") {
|
||||
s = strings.TrimSpace(s)
|
||||
if s == "" {
|
||||
continue
|
||||
}
|
||||
id, err := strconv.ParseInt(s, 10, 64)
|
||||
if err != nil {
|
||||
log.Printf("[Config] 无法解析管理员ID '%s': %v", s, err)
|
||||
continue
|
||||
}
|
||||
cfg.TelegramAdminIDs = append(cfg.TelegramAdminIDs, id)
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.TelegramBotToken == "" {
|
||||
log.Fatal("[Config] TELEGRAM_BOT_TOKEN 未配置")
|
||||
}
|
||||
|
||||
return cfg
|
||||
}
|
||||
|
||||
// IsAdmin checks if the given Telegram user ID is an admin.
|
||||
func (c *Config) IsAdmin(userID int64) bool {
|
||||
for _, id := range c.TelegramAdminIDs {
|
||||
if id == userID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func getEnv(key, fallback string) string {
|
||||
if v := os.Getenv(key); v != "" {
|
||||
return v
|
||||
}
|
||||
return fallback
|
||||
}
|
||||
|
||||
func getEnvInt(key string, fallback int) int {
|
||||
v := os.Getenv(key)
|
||||
if v == "" {
|
||||
return fallback
|
||||
}
|
||||
i, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
return fallback
|
||||
}
|
||||
return i
|
||||
}
|
||||
Reference in New Issue
Block a user