升级版本并改用内部账号存储
This commit is contained in:
+7
-1
@@ -42,7 +42,7 @@ type App struct {
|
||||
products []types.Product
|
||||
productsAt time.Time
|
||||
|
||||
// accountsMu 串行化账号文件修改,避免并发导入、编辑或删除互相覆盖。
|
||||
// accountsMu 串行化内部账号库修改,避免并发导入、编辑或删除互相覆盖。
|
||||
accountsMu sync.Mutex
|
||||
|
||||
closeLog func()
|
||||
@@ -123,8 +123,14 @@ func (a *App) Startup(ctx context.Context) {
|
||||
a.ctx = ctx
|
||||
|
||||
a.paths = config.DefaultAppPaths()
|
||||
configMigrated, configMigrationErr := config.MigrateLegacyFile(a.paths.ConfigFile, a.paths.LegacyConfigFile)
|
||||
a.logStore = logger.NewMemoryLogStore(800)
|
||||
a.closeLog = logger.InitLogging(a.logStore, a.paths.LogDir)
|
||||
if configMigrationErr != nil {
|
||||
logger.LogEvent("配置", "warn", "旧配置迁移失败: %s: %v", a.paths.LegacyConfigFile, configMigrationErr)
|
||||
} else if configMigrated {
|
||||
logger.LogEvent("配置", "success", "已迁移旧配置到应用内部目录: %s", a.paths.ConfigFile)
|
||||
}
|
||||
|
||||
// 加载配置并应用运行时设置
|
||||
a.cfg = config.LoadConfig(a.paths.ConfigFile)
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"douyu_go/internal/types"
|
||||
)
|
||||
|
||||
// ImportAccounts 将剪贴板中的账号行追加到账号文件。每行格式必须为
|
||||
// ImportAccounts 将剪贴板中的账号行追加到内部账号库。每行格式必须为
|
||||
// 账号名----密码----Cookie,账号名不能与已有账号重复。
|
||||
func (a *App) ImportAccounts(content string) types.AccountMutationResult {
|
||||
entries, err := parseAccountImport(content)
|
||||
@@ -22,7 +22,7 @@ func (a *App) ImportAccounts(content string) types.AccountMutationResult {
|
||||
accountFile := a.scheduler.AccountFilePath()
|
||||
lines, err := parseAccountFile(accountFile)
|
||||
if err != nil {
|
||||
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
|
||||
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
|
||||
}
|
||||
|
||||
existingNames := make(map[string]struct{}, len(lines))
|
||||
@@ -46,7 +46,7 @@ func (a *App) ImportAccounts(content string) types.AccountMutationResult {
|
||||
return types.AccountMutationResult{Success: true, Count: len(entries)}
|
||||
}
|
||||
|
||||
// UpdateAccount 更新账号名或 Cookie。newCookie 留空时保留文件中的原 Cookie。
|
||||
// UpdateAccount 更新账号名或 Cookie。newCookie 留空时保留内部账号库中的原 Cookie。
|
||||
func (a *App) UpdateAccount(originalName, newName, newCookie string) types.AccountMutationResult {
|
||||
originalName = strings.TrimSpace(originalName)
|
||||
newName = strings.TrimSpace(newName)
|
||||
@@ -64,7 +64,7 @@ func (a *App) UpdateAccount(originalName, newName, newCookie string) types.Accou
|
||||
accountFile := a.scheduler.AccountFilePath()
|
||||
lines, err := parseAccountFile(accountFile)
|
||||
if err != nil {
|
||||
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
|
||||
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
|
||||
}
|
||||
|
||||
targetIndex := -1
|
||||
@@ -108,7 +108,7 @@ func (a *App) UpdateAccount(originalName, newName, newCookie string) types.Accou
|
||||
return types.AccountMutationResult{Success: true, Count: 1}
|
||||
}
|
||||
|
||||
// DeleteAccounts 从账号文件中删除指定账号,可一次删除多个账号。
|
||||
// DeleteAccounts 从内部账号库中删除指定账号,可一次删除多个账号。
|
||||
func (a *App) DeleteAccounts(accountNames []string) types.AccountMutationResult {
|
||||
nameSet := make(map[string]struct{}, len(accountNames))
|
||||
for _, name := range accountNames {
|
||||
@@ -126,7 +126,7 @@ func (a *App) DeleteAccounts(accountNames []string) types.AccountMutationResult
|
||||
accountFile := a.scheduler.AccountFilePath()
|
||||
lines, err := parseAccountFile(accountFile)
|
||||
if err != nil {
|
||||
return types.AccountMutationResult{Error: "读取账号文件失败: " + err.Error()}
|
||||
return types.AccountMutationResult{Error: "读取内部账号库失败: " + err.Error()}
|
||||
}
|
||||
kept := make([]accountLine, 0, len(lines))
|
||||
deleted := 0
|
||||
@@ -194,7 +194,7 @@ func (a *App) saveAccountLines(accountFile string, lines []accountLine) error {
|
||||
content += "\r\n"
|
||||
}
|
||||
if _, err := writeFileWithBackup(accountFile, []byte(content)); err != nil {
|
||||
return fmt.Errorf("更新账号文件失败: %w", err)
|
||||
return fmt.Errorf("更新内部账号库失败: %w", err)
|
||||
}
|
||||
a.scheduler.LoadAccounts()
|
||||
return nil
|
||||
|
||||
@@ -53,7 +53,7 @@ func (a *App) ExportAccounts(accountNames []string, filename string) types.Expor
|
||||
accountFile := a.scheduler.AccountFilePath()
|
||||
lines, err := parseAccountFile(accountFile)
|
||||
if err != nil {
|
||||
return types.ExportAccountsResult{Error: "读取账号文件失败: " + err.Error()}
|
||||
return types.ExportAccountsResult{Error: "读取内部账号库失败: " + err.Error()}
|
||||
}
|
||||
|
||||
nameSet := make(map[string]bool)
|
||||
@@ -79,7 +79,10 @@ func (a *App) ExportAccounts(accountNames []string, filename string) types.Expor
|
||||
exportPath := filepath.Join(filepath.Dir(accountFile), filename)
|
||||
content := strings.Join(matchedLines, "\n") + "\n"
|
||||
|
||||
if err := os.WriteFile(exportPath, []byte(content), 0644); err != nil {
|
||||
if err := os.MkdirAll(filepath.Dir(exportPath), 0700); err != nil {
|
||||
return types.ExportAccountsResult{Error: "创建导出目录失败: " + err.Error()}
|
||||
}
|
||||
if err := os.WriteFile(exportPath, []byte(content), 0600); err != nil {
|
||||
return types.ExportAccountsResult{Error: "写入文件失败: " + err.Error()}
|
||||
}
|
||||
|
||||
@@ -137,7 +140,7 @@ func (a *App) OrganizeAccounts(commodityID, commodityName string, startTime, end
|
||||
accountFile := a.scheduler.AccountFilePath()
|
||||
lines, err := parseAccountFile(accountFile)
|
||||
if err != nil {
|
||||
return types.OrganizeAccountsResult{Error: "读取账号文件失败: " + err.Error()}
|
||||
return types.OrganizeAccountsResult{Error: "读取内部账号库失败: " + err.Error()}
|
||||
}
|
||||
|
||||
missSet := make(map[string]bool)
|
||||
@@ -160,9 +163,9 @@ func (a *App) OrganizeAccounts(commodityID, commodityName string, startTime, end
|
||||
newContent := strings.Join(keepLines, "\r\n") + "\r\n"
|
||||
backupPath, err := writeFileWithBackup(accountFile, []byte(newContent))
|
||||
if err != nil {
|
||||
return types.OrganizeAccountsResult{Error: "更新账号文件失败: " + err.Error()}
|
||||
return types.OrganizeAccountsResult{Error: "更新内部账号库失败: " + err.Error()}
|
||||
}
|
||||
logger.LogEvent("整理", "success", "账号文件已安全更新,备份=%s", backupPath)
|
||||
logger.LogEvent("整理", "success", "内部账号库已安全更新,备份=%s", backupPath)
|
||||
|
||||
// 重新加载账号
|
||||
a.scheduler.LoadAccounts()
|
||||
|
||||
@@ -55,7 +55,7 @@ func (a *App) GetAccounts() []types.AccountView {
|
||||
return list
|
||||
}
|
||||
|
||||
// ReloadAccounts 重新加载账号文件。
|
||||
// ReloadAccounts 重新加载内部账号库。
|
||||
func (a *App) ReloadAccounts() types.ReloadAccountsResult {
|
||||
a.scheduler.LoadAccounts()
|
||||
return types.ReloadAccountsResult{Success: true, Count: a.scheduler.AccountCount()}
|
||||
|
||||
Reference in New Issue
Block a user