Skip to content

Commit 1c5ca33

Browse files
authored
refactor: 重新定义 MessageErrorHandler 行为 (#349)
1 parent 9de96d8 commit 1c5ca33

3 files changed

Lines changed: 39 additions & 28 deletions

File tree

bot.go

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Bot struct {
1717
UUIDCallback func(uuid string) // 获取UUID的回调函数
1818
SyncCheckCallback func(resp SyncCheckResponse) // 心跳回调
1919
MessageHandler MessageHandler // 获取消息成功的handle
20-
MessageErrorHandler func(err error) bool // 获取消息发生错误的handle, 返回true则尝试继续监听
20+
MessageErrorHandler MessageErrorHandler // 获取消息发生错误的handle, 返回err == nil 则尝试继续监听
2121
Serializer Serializer // 序列化器, 默认为json
2222
Caller *Caller
2323
Storage *Session
@@ -102,7 +102,7 @@ func (b *Bot) Logout() error {
102102
if err := b.Caller.Logout(info); err != nil {
103103
return err
104104
}
105-
b.Exit()
105+
b.ExitWith(ErrUserLogout)
106106
return nil
107107
}
108108
return errors.New("user not login")
@@ -171,18 +171,15 @@ func (b *Bot) webInit() error {
171171

172172
go func() {
173173
if b.MessageErrorHandler == nil {
174-
b.MessageErrorHandler = defaultSyncCheckErrHandler(b)
174+
b.MessageErrorHandler = defaultMessageErrorHandler
175175
}
176176
for {
177-
err = b.syncCheck()
178-
if err == nil {
179-
continue
180-
}
181-
// 判断是否继续, 如果不继续则退出
182-
if goon := b.MessageErrorHandler(err); !goon {
183-
b.err = err
184-
b.Exit()
185-
break
177+
if err = b.syncCheck(); err != nil {
178+
// 判断是否继续, 如果不继续则退出
179+
if err = b.MessageErrorHandler(err); err != nil {
180+
b.ExitWith(err)
181+
return
182+
}
186183
}
187184
}
188185
}()
@@ -292,6 +289,12 @@ func (b *Bot) Exit() {
292289
}
293290
}
294291

292+
// ExitWith 主动退出并且设置退出原因, 可以通过 `CrashReason` 获取退出原因
293+
func (b *Bot) ExitWith(err error) {
294+
b.err = err
295+
b.Exit()
296+
}
297+
295298
// CrashReason 获取当前Bot崩溃的原因
296299
func (b *Bot) CrashReason() error {
297300
return b.err
@@ -400,21 +403,6 @@ func DefaultBot(prepares ...BotPreparer) *Bot {
400403
return bot
401404
}
402405

403-
// defaultSyncCheckErrHandler 默认的SyncCheck错误处理函数
404-
func defaultSyncCheckErrHandler(bot *Bot) func(error) bool {
405-
return func(err error) bool {
406-
var ret Ret
407-
if errors.As(err, &ret) {
408-
switch ret {
409-
case failedLoginCheck, cookieInvalid, failedLoginWarn:
410-
_ = bot.Logout()
411-
return false
412-
}
413-
}
414-
return true
415-
}
416-
}
417-
418406
// GetQrcodeUrl 通过uuid获取登录二维码的url
419407
func GetQrcodeUrl(uuid string) string {
420408
return qrcode + uuid

errors.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ var (
3535

3636
// ErrWebWxDataTicketNotFound define webwx_data_ticket not found error
3737
ErrWebWxDataTicketNotFound = errors.New("webwx_data_ticket not found")
38+
39+
// ErrUserLogout define user logout error
40+
ErrUserLogout = errors.New("user logout")
3841
)
3942

4043
// Error impl error interface

message_handle.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package openwechat
22

3-
import "strings"
3+
import (
4+
"errors"
5+
"strings"
6+
)
47

58
// MessageHandler 消息处理函数
69
type MessageHandler func(msg *Message)
@@ -283,3 +286,20 @@ func SenderNickNameContainsMatchFunc(nickname string) MatchFunc {
283286
func SenderRemakeNameContainsFunc(remakeName string) MatchFunc {
284287
return SenderMatchFunc(func(user *User) bool { return strings.Contains(user.RemarkName, remakeName) })
285288
}
289+
290+
// MessageErrorHandler 获取消息时发生了错误的处理函数
291+
// 参数err为获取消息时发生的错误,返回值为处理后的错误
292+
// 如果返回nil,则表示忽略该错误,否则将继续传递该错误
293+
type MessageErrorHandler func(err error) error
294+
295+
// defaultMessageErrorHandler 默认的SyncCheck错误处理函数
296+
func defaultMessageErrorHandler(err error) error {
297+
var ret Ret
298+
if errors.As(err, &ret) {
299+
switch ret {
300+
case failedLoginCheck, cookieInvalid, failedLoginWarn:
301+
return ret
302+
}
303+
}
304+
return nil
305+
}

0 commit comments

Comments
 (0)