feat: Introduce core application structure, configuration, monitoring, and team management features.
This commit is contained in:
@@ -155,12 +155,15 @@ func HandleTeamProcess(w http.ResponseWriter, r *http.Request) {
|
||||
req.Proxy = config.Global.GetProxy() // 使用新的代理获取方法
|
||||
}
|
||||
if req.Proxy != "" {
|
||||
normalized, err := proxyutil.Normalize(req.Proxy)
|
||||
if err != nil {
|
||||
Error(w, http.StatusBadRequest, fmt.Sprintf("代理格式错误: %v", err))
|
||||
return
|
||||
// 如果是模式字符串(pool:random, pool:id:N),跳过 Normalize
|
||||
if !strings.HasPrefix(req.Proxy, "pool:") && req.Proxy != "[RANDOM]" {
|
||||
normalized, err := proxyutil.Normalize(req.Proxy)
|
||||
if err != nil {
|
||||
Error(w, http.StatusBadRequest, fmt.Sprintf("代理格式错误: %v", err))
|
||||
return
|
||||
}
|
||||
req.Proxy = normalized
|
||||
}
|
||||
req.Proxy = normalized
|
||||
}
|
||||
|
||||
// 初始化状态
|
||||
@@ -466,7 +469,9 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
|
||||
// Step 1: 获取 Team ID(优先使用已存储的 account_id)
|
||||
var teamID string
|
||||
inviter := invite.NewWithProxy(owner.Token, req.Proxy)
|
||||
// Resolve proxy for inviter
|
||||
resolvedProxy := database.Instance.ResolveProxy(req.Proxy)
|
||||
inviter := invite.NewWithProxy(owner.Token, resolvedProxy)
|
||||
|
||||
if owner.AccountID != "" {
|
||||
// 直接使用数据库中存储的 account_id
|
||||
@@ -581,7 +586,7 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
|
||||
// 入库单个成员的函数
|
||||
doS2A := func(memberIdx int, memberEmail, memberPassword string) bool {
|
||||
memberLogPrefix := fmt.Sprintf("%s [成员 %d]", logPrefix, memberIdx+1)
|
||||
memberLogPrefix := fmt.Sprintf("%s [Member %d]", logPrefix, memberIdx+1)
|
||||
memberStartTime := time.Now()
|
||||
|
||||
// 获取入库信号量
|
||||
@@ -598,15 +603,21 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
logger.Warning(fmt.Sprintf("%s 入库重试 (第%d次)", memberLogPrefix, attempt+1), memberEmail, "team")
|
||||
}
|
||||
|
||||
// 创建日志回调
|
||||
// 创建日志回调 - 只显示关键步骤
|
||||
authLogger := auth.NewAuthLogger(memberEmail, logPrefix, memberIdx+1, func(entry auth.AuthLogEntry) {
|
||||
if entry.IsError {
|
||||
logger.Error(fmt.Sprintf("%s %s", memberLogPrefix, entry.Message), memberEmail, "team")
|
||||
} else {
|
||||
// 只显示关键步骤:提交邮箱、验证密码、选择工作区、授权成功
|
||||
switch entry.Step {
|
||||
case auth.StepNavigate, auth.StepInputEmail, auth.StepInputPassword,
|
||||
auth.StepComplete, auth.StepConsent, auth.StepSelectWorkspace:
|
||||
logger.Info(fmt.Sprintf("%s %s", memberLogPrefix, entry.Message), memberEmail, "team")
|
||||
case auth.StepInputEmail:
|
||||
logger.Info(fmt.Sprintf("%s 提交邮箱: %s", memberLogPrefix, memberEmail), memberEmail, "team")
|
||||
case auth.StepInputPassword:
|
||||
logger.Info(fmt.Sprintf("%s 验证密码...", memberLogPrefix), memberEmail, "team")
|
||||
case auth.StepSelectWorkspace:
|
||||
logger.Info(fmt.Sprintf("%s 选择工作区: %s", memberLogPrefix, teamID), memberEmail, "team")
|
||||
case auth.StepComplete:
|
||||
logger.Info(fmt.Sprintf("%s 授权成功,获取到授权码", memberLogPrefix), memberEmail, "team")
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -622,10 +633,9 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
// 根据配置选择授权方式
|
||||
var code string
|
||||
if config.Global.AuthMethod == "api" {
|
||||
proxyToUse := req.Proxy
|
||||
if poolProxy, poolErr := database.Instance.GetRandomCodexProxy(); poolErr == nil && poolProxy != "" {
|
||||
proxyToUse = poolProxy
|
||||
logger.Info(fmt.Sprintf("%s 使用代理池: %s", memberLogPrefix, getProxyDisplay(poolProxy)), memberEmail, "team")
|
||||
proxyToUse := database.Instance.ResolveProxy(req.Proxy)
|
||||
if proxyToUse != req.Proxy && proxyToUse != "" {
|
||||
logger.Info(fmt.Sprintf("%s 使用解析代理: %s", memberLogPrefix, getProxyDisplay(proxyToUse)), memberEmail, "team")
|
||||
}
|
||||
code, err = auth.CompleteWithCodexAPI(memberEmail, memberPassword, teamID, s2aResp.Data.AuthURL, s2aResp.Data.SessionID, proxyToUse, authLogger)
|
||||
if proxyToUse != req.Proxy && proxyToUse != "" {
|
||||
@@ -681,7 +691,7 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
registerAndS2AMember := func(memberIdx int, email, password string) bool {
|
||||
name := register.GenerateName()
|
||||
birthdate := register.GenerateBirthdate()
|
||||
memberLogPrefix := fmt.Sprintf("%s [成员 %d]", logPrefix, memberIdx+1)
|
||||
memberLogPrefix := fmt.Sprintf("%s [Member %d]", logPrefix, memberIdx+1)
|
||||
regStartTime := time.Now()
|
||||
|
||||
for attempt := 0; attempt < 2; attempt++ { // 最多尝试2次(首次+1次重试)
|
||||
@@ -764,7 +774,7 @@ func processSingleTeam(idx int, req TeamProcessRequest) (result TeamProcessResul
|
||||
}
|
||||
email := mail.GenerateEmail()
|
||||
password := register.GeneratePassword()
|
||||
logger.Info(fmt.Sprintf("%s [成员 %d] 邮箱: %s | 密码: %s", logPrefix, idx+1, email, password), email, "team")
|
||||
logger.Info(fmt.Sprintf("%s [Member %d] Email: %s | Password: %s", logPrefix, idx+1, email, password), email, "team")
|
||||
registerAndS2AMember(idx, email, password)
|
||||
}(i)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user