openwechat/stroage.go
2022-11-14 11:05:54 +08:00

74 lines
1.6 KiB
Go

package openwechat
import (
"encoding/json"
"errors"
"io"
"net/http"
"os"
)
// Storage 身份信息, 维持整个登陆的Session会话
type Storage struct {
LoginInfo *LoginInfo
Request *BaseRequest
Response *WebInitResponse
}
type HotReloadStorageItem struct {
Cookies map[string][]*http.Cookie
BaseRequest *BaseRequest
LoginInfo *LoginInfo
WechatDomain WechatDomain
UUID string
}
// HotReloadStorage 热登陆存储接口
type HotReloadStorage io.ReadWriter
// JsonFileHotReloadStorage 实现HotReloadStorage接口
// 默认以json文件的形式存储
type JsonFileHotReloadStorage struct {
FileName string
file *os.File
}
func (j *JsonFileHotReloadStorage) Read(p []byte) (n int, err error) {
if j.file == nil {
j.file, err = os.Open(j.FileName)
if err != nil {
return 0, err
}
}
return j.file.Read(p)
}
func (j *JsonFileHotReloadStorage) Write(p []byte) (n int, err error) {
if j.file == nil {
j.file, err = os.Create(j.FileName)
if err != nil {
return 0, err
}
}
return j.file.Write(p)
}
// NewJsonFileHotReloadStorage 创建JsonFileHotReloadStorage
func NewJsonFileHotReloadStorage(filename string) HotReloadStorage {
return &JsonFileHotReloadStorage{FileName: filename}
}
var _ HotReloadStorage = (*JsonFileHotReloadStorage)(nil)
func NewHotReloadStorageItem(storage HotReloadStorage) (*HotReloadStorageItem, error) {
if storage == nil {
return nil, errors.New("storage can't be nil")
}
var item HotReloadStorageItem
if err := json.NewDecoder(storage).Decode(&item); err != nil {
return nil, err
}
return &item, nil
}