111 lines
2.3 KiB
Go
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)
|
|
}
|