Files
chatlog/internal/wechat/manager.go
2025-04-01 19:41:40 +08:00

111 lines
2.3 KiB
Go

package wechat
import (
"context"
"runtime"
"github.com/sjzar/chatlog/internal/errors"
"github.com/sjzar/chatlog/internal/wechat/model"
"github.com/sjzar/chatlog/internal/wechat/process"
)
var DefaultManager *Manager
func init() {
DefaultManager = NewManager()
DefaultManager.Load()
}
func Load() error {
return DefaultManager.Load()
}
func GetAccount(name string) (*Account, error) {
return DefaultManager.GetAccount(name)
}
func GetProcess(name string) (*model.Process, error) {
return DefaultManager.GetProcess(name)
}
func GetAccounts() []*Account {
return DefaultManager.GetAccounts()
}
// Manager 微信管理器
type Manager struct {
detector process.Detector
accounts []*Account
processMap map[string]*model.Process
}
// NewManager 创建新的微信管理器
func NewManager() *Manager {
return &Manager{
detector: process.NewDetector(runtime.GOOS),
accounts: make([]*Account, 0),
processMap: make(map[string]*model.Process),
}
}
// Load 加载微信进程信息
func (m *Manager) Load() error {
// 查找微信进程
processes, err := m.detector.FindProcesses()
if err != nil {
return err
}
// 转换为账号信息
accounts := make([]*Account, 0, len(processes))
processMap := make(map[string]*model.Process, len(processes))
for _, p := range processes {
account := NewAccount(p)
accounts = append(accounts, account)
if account.Name != "" {
processMap[account.Name] = p
}
}
m.accounts = accounts
m.processMap = processMap
return nil
}
// GetAccount 获取指定名称的账号
func (m *Manager) GetAccount(name string) (*Account, error) {
p, err := m.GetProcess(name)
if err != nil {
return nil, err
}
return NewAccount(p), nil
}
func (m *Manager) GetProcess(name string) (*model.Process, error) {
p, ok := m.processMap[name]
if !ok {
return nil, errors.WeChatAccountNotFound(name)
}
return p, nil
}
// GetAccounts 获取所有账号
func (m *Manager) GetAccounts() []*Account {
return m.accounts
}
// DecryptDatabase 便捷方法:通过账号名解密数据库
func (m *Manager) DecryptDatabase(ctx context.Context, accountName, dbPath, outputPath string) error {
// 获取账号
account, err := m.GetAccount(accountName)
if err != nil {
return err
}
// 使用账号解密数据库
return account.DecryptDatabase(ctx, dbPath, outputPath)
}