1 Commits
Author SHA1 Message Date
dsql 536e73dacf release: 1.0.0
first stable release. pre-1.0.0 verification complete: all surviving MED regressions and
gaps resolved and independently re-fired, tree audited clean across the suite.

Signed-off-by: disqualifier <dev@disqualifier.me>
2026-07-06 21:21:00 -04:00
3 changed files with 13 additions and 19 deletions

No files matched your search

+4 -5
View File
@@ -9,18 +9,18 @@ buttons) behind previous / jump / next navigation, with an optional cache button
`requirements.txt`: `requirements.txt`:
``` ```
dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v1.2.0 dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.8
``` ```
Direct: Direct:
```bash ```bash
pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v1.2.0" pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.8"
``` ```
Requires `discord.py` (pulled transitively). Requires `discord.py` (pulled transitively).
Drop the `@v1.2.0` suffix from the line above to install the latest unpinned. Drop the `@v0.1.8` suffix from the line above to install the latest unpinned.
## Basic usage ## Basic usage
@@ -149,8 +149,7 @@ through.
- `timeout` — seconds before the view stops (default 180) - `timeout` — seconds before the view stops (default 180)
- `delete_message_after` — delete the message on timeout - `delete_message_after` — delete the message on timeout
- `per_page` — entries per page (default 1) - `per_page` — entries per page (default 1)
- `mentions_allowed` — `AllowedMentions` for sends (default `AllowedMentions(everyone=False)`: - `mentions_allowed` — `AllowedMentions` for sends (default `.all()`)
no @everyone/@here, user/role pings and the bot-wide settings still apply)
- `ephemeral` — send/edit ephemerally - `ephemeral` — send/edit ephemerally
- `page_text` — format string for the jump button label - `page_text` — format string for the jump button label
- `emojis` — override navigation emojis - `emojis` — override navigation emojis
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project] [project]
name = "dpy_paginator" name = "dpy_paginator"
version = "1.2.0" version = "1.0.0"
description = "Button-navigated paginator for discord.py — config-free, injectable emojis, installable." description = "Button-navigated paginator for discord.py — config-free, injectable emojis, installable."
requires-python = ">=3.10" requires-python = ">=3.10"
dependencies = [ dependencies = [
+8 -13
View File
@@ -85,8 +85,7 @@ class JumpToPageModal(discord.ui.Modal, title="Jump to Page"):
"""modal that lets a user jump to a specific page""" """modal that lets a user jump to a specific page"""
def __init__(self, paginator: "DPYPaginator"): def __init__(self, paginator: "DPYPaginator"):
# share the paginator's timeout so a dismissed modal leaves discord.py's ViewStore super().__init__()
super().__init__(timeout=paginator.timeout)
self.paginator = paginator self.paginator = paginator
self.page_number = discord.ui.TextInput( self.page_number = discord.ui.TextInput(
label="Enter page number", label="Enter page number",
@@ -143,8 +142,7 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
timeout: seconds before the view stops timeout: seconds before the view stops
delete_message_after: delete the message on timeout delete_message_after: delete the message on timeout
per_page: how many entries render per page per_page: how many entries render per page
mentions_allowed: AllowedMentions for sends (default: no @everyone/@here; mentions_allowed: AllowedMentions for sends (defaults to all)
user/role pings and the bot-wide settings still apply)
ephemeral: send/edit ephemerally ephemeral: send/edit ephemerally
page_text: format string for the jump button label page_text: format string for the jump button label
emojis: override navigation emojis (keys: previous/next/cache) emojis: override navigation emojis (keys: previous/next/cache)
@@ -157,7 +155,7 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
raise ValueError("per_page must be >= 1") raise ValueError("per_page must be >= 1")
self.author_id: Optional[int] = author_id self.author_id: Optional[int] = author_id
self.delete_message_after: bool = delete_message_after self.delete_message_after: bool = delete_message_after
self.mentions_allowed = mentions_allowed or discord.AllowedMentions(everyone=False) self.mentions_allowed = mentions_allowed or discord.AllowedMentions.all()
self.ephemeral: bool = ephemeral self.ephemeral: bool = ephemeral
self.current_page: int = 0 self.current_page: int = 0
self.per_page: int = per_page self.per_page: int = per_page
@@ -387,10 +385,8 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
await self.message.edit(**kwargs) await self.message.edit(**kwargs)
except (discord.NotFound, discord.Forbidden): except (discord.NotFound, discord.Forbidden):
pass pass
except discord.HTTPException as exc: except discord.HTTPException:
# swallowed best-effort cleanup that recovers - no traceback (exc_info belongs log.warning("paginator cache_button: failed to refresh message", exc_info=True)
# on terminal/unhandled paths); the reason is folded in for diagnosis.
log.warning("paginator cache_button: failed to refresh message: %s", exc)
@discord.ui.button(style=discord.ButtonStyle.blurple) @discord.ui.button(style=discord.ButtonStyle.blurple)
async def next_page(self, interaction: Interaction, _: discord.ui.Button[Self]) -> None: async def next_page(self, interaction: Interaction, _: discord.ui.Button[Self]) -> None:
@@ -468,10 +464,9 @@ class DPYPaginator(Generic[PageT_co], discord.ui.View):
await self.message.delete() await self.message.delete()
except (discord.NotFound, discord.Forbidden): except (discord.NotFound, discord.Forbidden):
pass pass
except discord.HTTPException as exc: except discord.HTTPException:
# best-effort cleanup task; log rather than raise into an unretrieved task. no # best-effort cleanup task; log rather than raise into an unretrieved task
# traceback (exc_info belongs on terminal/unhandled paths) - fold the reason in. log.warning("paginator on_timeout: failed to delete message", exc_info=True)
log.warning("paginator on_timeout: failed to delete message: %s", exc)
# back-compat alias: the class was originally named ButtonPaginator; DPYPaginator is # back-compat alias: the class was originally named ButtonPaginator; DPYPaginator is