diff options
Diffstat (limited to 'bot/utils')
| -rw-r--r-- | bot/utils/decorators.py | 2 | ||||
| -rw-r--r-- | bot/utils/pagination.py | 4 | ||||
| -rw-r--r-- | bot/utils/randomization.py | 23 | 
3 files changed, 26 insertions, 3 deletions
| diff --git a/bot/utils/decorators.py b/bot/utils/decorators.py index 519e61a9..9e6ef73d 100644 --- a/bot/utils/decorators.py +++ b/bot/utils/decorators.py @@ -285,7 +285,7 @@ def locked() -> t.Union[t.Callable, None]:                  embed = Embed()                  embed.colour = Colour.red() -                log.debug(f"User tried to invoke a locked command.") +                log.debug("User tried to invoke a locked command.")                  embed.description = (                      "You're already using this command. Please wait until "                      "it is done before you use it again." diff --git a/bot/utils/pagination.py b/bot/utils/pagination.py index 9a7a0382..a4d0cc56 100644 --- a/bot/utils/pagination.py +++ b/bot/utils/pagination.py @@ -128,7 +128,7 @@ class LinePaginator(Paginator):          if not lines:              if exception_on_empty_embed: -                log.exception(f"Pagination asked for empty lines iterable") +                log.exception("Pagination asked for empty lines iterable")                  raise EmptyPaginatorEmbed("No lines to paginate")              log.debug("No lines to add to paginator, adding '(nothing to display)' message") @@ -335,7 +335,7 @@ class ImagePaginator(Paginator):          if not pages:              if exception_on_empty_embed: -                log.exception(f"Pagination asked for empty image list") +                log.exception("Pagination asked for empty image list")                  raise EmptyPaginatorEmbed("No images to paginate")              log.debug("No images to add to paginator, adding '(no images to display)' message") diff --git a/bot/utils/randomization.py b/bot/utils/randomization.py new file mode 100644 index 00000000..8f47679a --- /dev/null +++ b/bot/utils/randomization.py @@ -0,0 +1,23 @@ +import itertools +import random +import typing as t + + +class RandomCycle: +    """ +    Cycles through elements from a randomly shuffled iterable, repeating indefinitely. + +    The iterable is reshuffled after each full cycle. +    """ + +    def __init__(self, iterable: t.Iterable) -> None: +        self.iterable = list(iterable) +        self.index = itertools.cycle(range(len(iterable))) + +    def __next__(self) -> t.Any: +        idx = next(self.index) + +        if idx == 0: +            random.shuffle(self.iterable) + +        return self.iterable[idx] | 
