wechatDataBackup/app.go

305 lines
7.2 KiB
Go
Raw Normal View History

2024-08-26 22:56:29 +08:00
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"path/filepath"
"wechatDataBackup/pkg/utils"
"wechatDataBackup/pkg/wechat"
"github.com/spf13/viper"
"github.com/wailsapp/wails/v2/pkg/runtime"
)
const (
defaultConfig = "config"
configDefaultUserKey = "userConfig.defaultUser"
configUsersKey = "userConfig.users"
appVersion = "v1.0.0"
)
// App struct
type App struct {
ctx context.Context
info wechat.WeChatInfo
provider *wechat.WechatDataProvider
defaultUser string
users []string
}
type WeChatInfo struct {
ProcessID uint32 `json:"PID"`
FilePath string `json:"FilePath"`
AcountName string `json:"AcountName"`
Version string `json:"Version"`
Is64Bits bool `json:"Is64Bits"`
DBKey string `json:"DBkey"`
}
// NewApp creates a new App application struct
func NewApp() *App {
a := &App{}
viper.SetConfigName(defaultConfig)
viper.SetConfigType("json")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err == nil {
a.defaultUser = viper.GetString(configDefaultUserKey)
a.users = viper.GetStringSlice(configUsersKey)
// log.Println(a.defaultUser)
// log.Println(a.users)
} else {
log.Println("not config exist")
}
return a
}
// startup is called when the app starts. The context is saved
// so we can call the runtime methods
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
func (a *App) beforeClose(ctx context.Context) (prevent bool) {
dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{
Type: runtime.QuestionDialog,
Title: "Quit?",
Message: "Are you sure you want to quit?",
})
if err != nil || dialog == "Yes" {
a.provider.WechatWechatDataProviderClose()
a.provider = nil
return false
}
return true
}
func (a *App) GetWeChatAllInfo() string {
a.info, _ = wechat.GetWeChatAllInfo()
var info WeChatInfo
info.ProcessID = a.info.ProcessID
info.FilePath = a.info.FilePath
info.AcountName = a.info.AcountName
info.Version = a.info.Version
info.Is64Bits = a.info.Is64Bits
info.DBKey = a.info.DBKey
infoStr, _ := json.Marshal(info)
log.Println(string(infoStr))
return string(infoStr)
}
func (a *App) ExportWeChatAllData(full bool) {
if a.provider != nil {
a.provider.WechatWechatDataProviderClose()
a.provider = nil
}
progress := make(chan string)
go func() {
_, err := os.Stat(".\\User")
if err != nil {
os.Mkdir(".\\User", os.ModeDir)
}
expPath := ".\\User\\" + a.info.AcountName
_, err = os.Stat(expPath)
if err == nil {
if !full {
os.RemoveAll(expPath + "\\Msg")
} else {
os.RemoveAll(expPath)
}
}
_, err = os.Stat(expPath)
if err != nil {
os.Mkdir(expPath, os.ModeDir)
}
go wechat.ExportWeChatAllData(a.info, expPath, progress)
for p := range progress {
log.Println(p)
runtime.EventsEmit(a.ctx, "exportData", p)
}
if len(a.defaultUser) == 0 {
a.defaultUser = a.info.AcountName
}
hasUser := false
for _, user := range a.users {
if user == a.info.AcountName {
hasUser = true
break
}
}
if !hasUser {
a.users = append(a.users, a.info.AcountName)
}
a.setCurrentConfig()
}()
}
func (a *App) createWechatDataProvider(resPath string) error {
if a.provider != nil && a.provider.SelfInfo != nil && filepath.Base(resPath) == a.provider.SelfInfo.UserName {
log.Println("WechatDataProvider not need create:", a.provider.SelfInfo.UserName)
return nil
}
provider, err := wechat.CreateWechatDataProvider(resPath)
if err != nil {
log.Println("CreateWechatDataProvider failed:", resPath)
return err
}
a.provider = provider
// infoJson, _ := json.Marshal(a.provider.SelfInfo)
// runtime.EventsEmit(a.ctx, "selfInfo", string(infoJson))
return nil
}
func (a *App) WeChatInit() {
expPath := ".\\User\\" + a.defaultUser
if a.createWechatDataProvider(expPath) == nil {
infoJson, _ := json.Marshal(a.provider.SelfInfo)
runtime.EventsEmit(a.ctx, "selfInfo", string(infoJson))
}
}
func (a *App) GetWechatSessionList(pageIndex int, pageSize int) string {
expPath := ".\\User\\" + a.defaultUser
if a.createWechatDataProvider(expPath) != nil {
return ""
}
log.Printf("pageIndex: %d\n", pageIndex)
list, err := a.provider.WeChatGetSessionList(pageIndex, pageSize)
if err != nil {
return ""
}
listStr, _ := json.Marshal(list)
log.Println("GetWechatSessionList:", list.Total)
return string(listStr)
}
func (a *App) GetWechatMessageListByTime(userName string, time int64, pageSize int, direction string) string {
log.Println("GetWechatMessageList:", userName, pageSize, time, direction)
if len(userName) == 0 {
return "{\"Total\":0, \"Rows\":[]}"
}
dire := wechat.Message_Search_Forward
if direction == "backward" {
dire = wechat.Message_Search_Backward
} else if direction == "both" {
dire = wechat.Message_Search_Both
}
list, err := a.provider.WeChatGetMessageListByTime(userName, time, pageSize, dire)
if err != nil {
log.Println("WeChatGetMessageList failed:", err)
return ""
}
listStr, _ := json.Marshal(list)
log.Println("GetWechatMessageList:", list.Total)
return string(listStr)
}
func (a *App) GetWechatMessageListByKeyWord(userName string, time int64, keyword string, msgType string, pageSize int) string {
log.Println("GetWechatMessageListByKeyWord:", userName, pageSize, time, msgType)
if len(userName) == 0 {
return "{\"Total\":0, \"Rows\":[]}"
}
list, err := a.provider.WeChatGetMessageListByKeyWord(userName, time, keyword, msgType, pageSize)
if err != nil {
log.Println("WeChatGetMessageListByKeyWord failed:", err)
return ""
}
listStr, _ := json.Marshal(list)
log.Println("WeChatGetMessageListByKeyWord:", list.Total, list.KeyWord)
return string(listStr)
}
func (a *App) GetWechatMessageDate(userName string) string {
log.Println("GetWechatMessageDate:", userName)
if len(userName) == 0 {
return "{\"Total\":0, \"Date\":[]}"
}
messageData, err := a.provider.WeChatGetMessageDate(userName)
if err != nil {
log.Println("GetWechatMessageDate:", err)
return ""
}
messageDataStr, _ := json.Marshal(messageData)
log.Println("GetWechatMessageDate:", messageData.Total)
return string(messageDataStr)
}
func (a *App) setCurrentConfig() {
viper.Set(configDefaultUserKey, a.defaultUser)
viper.Set(configUsersKey, a.users)
err := viper.SafeWriteConfig()
if err != nil {
log.Println(err)
}
}
type userList struct {
Users []string `json:"Users"`
}
func (a *App) GetWeChatUserList() string {
l := userList{}
l.Users = a.users
usersStr, _ := json.Marshal(l)
str := string(usersStr)
log.Println("users:", str)
return str
}
func (a *App) OpenFileOrExplorer(filePath string, explorer bool) string {
// if root, err := os.Getwd(); err == nil {
// filePath = root + filePath[1:]
// }
// log.Println("OpenFileOrExplorer:", filePath)
err := utils.OpenFileOrExplorer(filePath, explorer)
if err != nil {
return "{\"result\": \"OpenFileOrExplorer failed\", \"status\":\"failed\"}"
}
return fmt.Sprintf("{\"result\": \"%s\", \"status\":\"OK\"}", "")
}
func (a *App) GetWeChatRoomUserList(roomId string) string {
userlist, err := a.provider.WeChatGetChatRoomUserList(roomId)
if err != nil {
log.Println("WeChatGetChatRoomUserList:", err)
return ""
}
userListStr, _ := json.Marshal(userlist)
return string(userListStr)
}
func (a *App) GetAppVersion() string {
return appVersion
}