Pycord-Development / pycord

Pycord is a modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python
https://docs.pycord.dev
MIT License
2.71k stars 459 forks source link

Paginator error upon failed interaction #2447

Closed BobDotCom closed 3 months ago

BobDotCom commented 3 months ago

Summary

If a paginator update fails inside callback, the paginator can enter an un-recoverable state

Reproduction Steps

  1. Create a paginator with 2 pages
  2. Click the right arrow/next page button
    • The interaction must fail, you can trigger this by adding a debug breakpoint or a sleep function inside Paginator.goto_page, or by throttling your network connection
  3. Observe the error inside the console: discord.errors.NotFound: 404 Not Found (error code: 10062): Unknown interaction
  4. Press the same button again
  5. Observe this error in your console:
    page = self.pages[page_number]
           ~~~~~~~~~~^^^^^^^^^^^^^
    IndexError: list index out of range

Minimal Reproducible Code

import os

from discord import Bot
from discord.ext.pages import Paginator
from discord.flags import Intents

bot = Bot(
    intents=Intents.default(),
)

@bot.command()
async def test(ctx):
    paginator = Paginator(
        pages=["page 1", "page 2"],
    )
    await paginator.respond(ctx.interaction)

bot.run(os.getenv("DISCORD_TOKEN"))

Expected Results

The paginator should fallback to its previous state in the event of a failure, so the second update should be a retry of the first.

Actual Results

There is a silent failure, current_page is updated but the paginator is not.

Intents

Intents.default()

System Information

Checklist

Additional Context

No response