diff --git a/client/client.go b/client/client.go index 4b74831..3bcb973 100644 --- a/client/client.go +++ b/client/client.go @@ -80,6 +80,7 @@ func (c *Client) listen() { default: msgType, data, err := c.conn.ReadMessage() if err != nil { + log.Info("reconnect") time.Sleep(time.Duration(3) * time.Millisecond) _ = c.Connect() continue @@ -144,6 +145,6 @@ func (c *Client) sendEnterPacket() error { if err = c.conn.WriteMessage(websocket.BinaryMessage, pkt); err != nil { return err } - log.Debugf("send: EnterPacket: %v", pkt) + log.Debugf("send: EnterPacket") return nil } diff --git a/client/handler.go b/client/handler.go index e9963b4..14fb83e 100644 --- a/client/handler.go +++ b/client/handler.go @@ -1,12 +1,10 @@ package client import ( - "bytes" - "fmt" "github.com/Akegarasu/blivedm-go/message" "github.com/Akegarasu/blivedm-go/packet" + "github.com/Akegarasu/blivedm-go/utils" log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" "runtime/debug" "strings" ) @@ -60,12 +58,12 @@ func (c *Client) OnLive(f func(*message.Live)) { func (c *Client) Handle(p packet.Packet) { switch p.Operation { case packet.Notification: - sb := bytes.NewBuffer(p.Body).String() - cmd := gjson.Get(sb, "cmd").String() + cmd := parseCmd(p.Body) + sb := utils.BytesToString(p.Body) // 新的弹幕 cmd 可能带参数 - if strings.Contains(cmd, ":") { - index := strings.Index(cmd, ":") - cmd = cmd[:index] + ind := strings.Index(cmd, ":") + if ind != -1 { + cmd = cmd[:ind] } // 优先执行自定义 eventHandler ,会覆盖库内自带的 handler f, ok := (*c.customEventHandlers)[cmd] @@ -119,10 +117,24 @@ func (c *Client) Handle(p packet.Packet) { } } +func parseCmd(d []byte) string { + // {"cmd":"DANMU_MSG", ... + l := len(d) + pos := 8 + s := byte('"') + for pos <= l { + if d[pos] == s { + break + } + pos++ + } + return utils.BytesToString(d[8:pos]) +} + func cover(f func()) { defer func() { if pan := recover(); pan != nil { - fmt.Printf("event error: %v\n%s", pan, debug.Stack()) + log.Errorf("event error: %v\n%s", pan, debug.Stack()) } }() f()