diff --git a/bot.go b/bot.go index 4f0d5f5..29d409f 100644 --- a/bot.go +++ b/bot.go @@ -253,7 +253,7 @@ func (bot *Bot) Connect() *Bot { time.Sleep(2 * time.Second) // 等待两秒后重新连接 continue } - bot.ready, err = payload.GetEventReady() + bot.ready, bot.seq, err = payload.GetEventReady() if err != nil { log.Warnln(getLogHeader(), "解析 EventReady 时出现错误:", err) _ = conn.Close() @@ -358,13 +358,12 @@ func (bot *Bot) Listen() { continue } log.Debug(getLogHeader(), " 接收到第 ", payload.S, " 个事件: ", payload.Op, ", 类型: ", payload.T, ", 数据: ", BytesToString(payload.D)) - if payload.S <= bot.seq { - log.Warn(getLogHeader(), " 忽略重复编号: ", payload.S, ", 事件: ", payload.Op, ", 类型: ", payload.T) - continue - } - bot.seq = payload.S switch payload.Op { case OpCodeDispatch: // Receive + if payload.S <= bot.seq { + log.Warn(getLogHeader(), " 忽略重复编号: ", payload.S, ", 事件: ", payload.Op, ", 类型: ", payload.T) + continue + } switch payload.T { case "RESUMED": log.Infoln(getLogHeader(), bot.ready.User.Username, "的网关连接恢复完成") @@ -396,6 +395,9 @@ func (bot *Bot) Listen() { default: log.Warn(getLogHeader(), " 忽略未知事件, 序号: ", payload.S, ", Op: ", payload.Op, ", 类型: ", payload.T, ", 数据: ", BytesToString(payload.D)) } + if payload.S > bot.seq { + bot.seq = payload.S + } } } diff --git a/payload.go b/payload.go index 0d01d53..f4eafcc 100644 --- a/payload.go +++ b/payload.go @@ -55,7 +55,7 @@ type EventReady struct { } // GetEventReady OpCodeDispatch READY -func (wp *WebsocketPayload) GetEventReady() (er EventReady, err error) { +func (wp *WebsocketPayload) GetEventReady() (er EventReady, seq uint32, err error) { if wp.Op != OpCodeDispatch { err = errors.New(getThisFuncName() + " unexpected OpCode " + strconv.Itoa(int(wp.Op)) + ", T: " + wp.T + ", D: " + BytesToString(wp.D)) return @@ -64,6 +64,7 @@ func (wp *WebsocketPayload) GetEventReady() (er EventReady, err error) { err = errors.New(getThisFuncName() + " unexpected event type " + wp.T + ", T: " + wp.T + ", D: " + BytesToString(wp.D)) return } + seq = wp.S err = json.Unmarshal(wp.D, &er) return }