Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions bot/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
from contextlib import suppress

import discord
from discord import Member
from discord.abc import User
from discord.ext.commands import Context, Paginator

from bot import constants
from bot.constants import MODERATION_ROLES

FIRST_EMOJI = "\u23EE" # [:track_previous:]
LEFT_EMOJI = "\u2B05" # [:arrow_left:]
Expand Down Expand Up @@ -210,6 +212,9 @@ async def paginate(

Pagination will also be removed automatically if no reaction is added for five minutes (300 seconds).

The interaction will be limited to `restrict_to_user` (ctx.author by default) or
to any user with a moderation role.

Example:
>>> embed = discord.Embed()
>>> embed.set_author(name="Some Operation", url=url, icon_url=icon)
Expand All @@ -218,10 +223,10 @@ async def paginate(
def event_check(reaction_: discord.Reaction, user_: discord.Member) -> bool:
"""Make sure that this reaction is what we want to operate on."""
no_restrictions = (
# Pagination is not restricted
not restrict_to_user
Comment thread
MarkKoz marked this conversation as resolved.
# The reaction was by a whitelisted user
or user_.id == restrict_to_user.id
user_.id == restrict_to_user.id
# The reaction was by a moderator
or isinstance(user_, Member) and any(role.id in MODERATION_ROLES for role in user_.roles)
)

return (
Expand All @@ -242,6 +247,9 @@ def event_check(reaction_: discord.Reaction, user_: discord.Member) -> bool:
scale_to_size=scale_to_size)
current_page = 0

if not restrict_to_user:
restrict_to_user = ctx.author

if not lines:
Comment thread
TeamSpen210 marked this conversation as resolved.
if exception_on_empty_embed:
log.exception("Pagination asked for empty lines iterable")
Expand Down
6 changes: 5 additions & 1 deletion bot/utils/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from discord.ext.commands import Context

import bot
from bot.constants import Emojis, NEGATIVE_REPLIES
from bot.constants import Emojis, MODERATION_ROLES, NEGATIVE_REPLIES

log = logging.getLogger(__name__)

Expand All @@ -22,12 +22,15 @@ async def wait_for_deletion(
deletion_emojis: Sequence[str] = (Emojis.trashcan,),
timeout: float = 60 * 5,
attach_emojis: bool = True,
allow_moderation_roles: bool = True
) -> None:
"""
Wait for up to `timeout` seconds for a reaction by any of the specified `user_ids` to delete the message.

An `attach_emojis` bool may be specified to determine whether to attach the given
`deletion_emojis` to the message in the given `context`.
An `allow_moderation_roles` bool may also be specified to allow anyone with a role in `MODERATION_ROLES` to delete
the message.
"""
if message.guild is None:
raise ValueError("Message must be sent on a guild")
Expand All @@ -46,6 +49,7 @@ def check(reaction: discord.Reaction, user: discord.Member) -> bool:
reaction.message.id == message.id
and str(reaction.emoji) in deletion_emojis
and user.id in user_ids
or allow_moderation_roles and any(role.id in MODERATION_ROLES for role in user.roles)
)

with contextlib.suppress(asyncio.TimeoutError):
Expand Down