Skip to content

Commit

Permalink
[feat]: 支持用户自定义热存储数据的序列化和反序列化 (eatmoreapple#222)
Browse files Browse the repository at this point in the history
  • Loading branch information
eatmoreapple authored Feb 1, 2023
1 parent e9c89f9 commit d77bb0a
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 7 deletions.
19 changes: 12 additions & 7 deletions bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package openwechat

import (
"context"
"encoding/json"
"errors"
"io"
"log"
Expand All @@ -20,13 +19,14 @@ type Bot struct {
SyncCheckCallback func(resp SyncCheckResponse) // 心跳回调
MessageHandler MessageHandler // 获取消息成功的handle
MessageErrorHandler func(err error) bool // 获取消息发生错误的handle, 返回true则尝试继续监听
Serializer Serializer // 序列化器, 默认为json
Storage *Storage
Caller *Caller
once sync.Once
err error
context context.Context
cancel context.CancelFunc
Caller *Caller
self *Self
Storage *Storage
hotReloadStorage HotReloadStorage
uuid string
loginUUID *string
Expand Down Expand Up @@ -296,7 +296,7 @@ func (b *Bot) DumpTo(writer io.Writer) error {
WechatDomain: b.Caller.Client.Domain,
UUID: b.uuid,
}
return json.NewEncoder(writer).Encode(item)
return b.Serializer.Encode(writer, item)
}

// IsHot returns true if is hot login otherwise false
Expand Down Expand Up @@ -328,8 +328,7 @@ func (b *Bot) reload() error {
return errors.New("hotReloadStorage is nil")
}
var item HotReloadStorageItem
err := json.NewDecoder(b.hotReloadStorage).Decode(&item)
if err != nil {
if err := b.Serializer.Decode(b.hotReloadStorage, &item); err != nil {
return err
}
b.Caller.Client.SetCookieJar(item.Jar)
Expand All @@ -347,7 +346,13 @@ func NewBot(c context.Context) *Bot {
// 默认行为为网页版微信模式
caller.Client.SetMode(normal)
ctx, cancel := context.WithCancel(c)
return &Bot{Caller: caller, Storage: &Storage{}, context: ctx, cancel: cancel}
return &Bot{
Caller: caller,
Storage: &Storage{},
Serializer: &JsonSerializer{},
context: ctx,
cancel: cancel,
}
}

// DefaultBot 默认的Bot的构造方法,
Expand Down
25 changes: 25 additions & 0 deletions serializer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package openwechat

import (
"encoding/json"
"io"
)

// Serializer is an interface for encoding and decoding data.
type Serializer interface {
Encode(writer io.Writer, v interface{}) error
Decode(reader io.Reader, v interface{}) error
}

// JsonSerializer is a serializer for json.
type JsonSerializer struct{}

// Encode encodes v to writer.
func (j JsonSerializer) Encode(writer io.Writer, v interface{}) error {
return json.NewEncoder(writer).Encode(v)
}

// Decode decodes data from reader to v.
func (j JsonSerializer) Decode(reader io.Reader, v interface{}) error {
return json.NewDecoder(reader).Decode(v)
}

0 comments on commit d77bb0a

Please sign in to comment.