305 lines
7.2 KiB
Go
305 lines
7.2 KiB
Go
![]() |
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
|
||
|
}
|