diff --git a/command.go b/command.go index d4a3eed..f1e98ff 100644 --- a/command.go +++ b/command.go @@ -55,6 +55,38 @@ func (app *App) Poll(since int) (num int, err error) { return num, nil } +func (app *App) Skip(since int) (num int, err error) { + if _, err := fmt.Fprintf(app.conn, "SKIP %d\n", since); err != nil { + return 0, err + } + + if !app.scanner.Scan() { + return 0, app.scanner.Err() + } + num, err = strconv.Atoi(app.scanner.Text()) + if err != nil { + return 0, err + } + + for range num { + if !app.scanner.Scan() { + return 0, err + } + app.incoming <- Message(app.scanner.Text()) + } + + if !app.scanner.Scan() { + return 0, app.scanner.Err() + } + last, err := strconv.Atoi(app.scanner.Text()) + if err != nil { + return 0, err + } + app.incoming <- Last(last) + + return num, nil +} + func (app *App) Last(n int) (num int, err error) { if n == 0 { return 0, nil diff --git a/event.go b/event.go index aba052f..b7de590 100644 --- a/event.go +++ b/event.go @@ -30,7 +30,11 @@ func (p Poll) HandleOutgoing(app *App) error { if err != nil { return err } - num, err = app.Last(num) + if num == 0 { + return nil + } + + num, err = app.Skip(app.last) if err != nil { return err } @@ -48,7 +52,11 @@ func (p ManualPoll) HandleOutgoing(app *App) error { return err } app.incoming <- ManualPoll(num) - num, err = app.Last(num) + if num == 0 { + return nil + } + + num, err = app.Skip(app.last) if err != nil { return err }