Skip to content

Commit

Permalink
[utils] Move pagify + pagify help text (#403)
Browse files Browse the repository at this point in the history
* .

* Move pagify utils

* pagify help text

* precommit
  • Loading branch information
flaree authored Sep 13, 2024
1 parent abeaa6b commit fff8288
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 49 deletions.
50 changes: 2 additions & 48 deletions ballsdex/core/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from contextlib import redirect_stdout
from copy import copy
from io import BytesIO
from typing import TYPE_CHECKING, Iterable, Iterator, Sequence
from typing import TYPE_CHECKING, Iterable

import aiohttp
import discord
Expand All @@ -27,6 +27,7 @@
Trade,
TradeObject,
)
from ballsdex.core.utils.formatting import pagify

if TYPE_CHECKING:
from ballsdex.core.bot import BallsDexBot
Expand All @@ -42,53 +43,6 @@
"""


def escape(text: str, *, mass_mentions: bool = False, formatting: bool = False) -> str:
if mass_mentions:
text = text.replace("@everyone", "@\u200beveryone")
text = text.replace("@here", "@\u200bhere")
if formatting:
text = discord.utils.escape_markdown(text)
return text


def pagify(
text: str,
delims: Sequence[str] = ["\n"],
*,
priority: bool = False,
escape_mass_mentions: bool = True,
shorten_by: int = 8,
page_length: int = 2000,
) -> Iterator[str]:
in_text = text
page_length -= shorten_by
while len(in_text) > page_length:
this_page_len = page_length
if escape_mass_mentions:
this_page_len -= in_text.count("@here", 0, page_length) + in_text.count(
"@everyone", 0, page_length
)
closest_delim = (in_text.rfind(d, 1, this_page_len) for d in delims)
if priority:
closest_delim = next((x for x in closest_delim if x > 0), -1)
else:
closest_delim = max(closest_delim)
closest_delim = closest_delim if closest_delim != -1 else this_page_len
if escape_mass_mentions:
to_send = escape(in_text[:closest_delim], mass_mentions=True)
else:
to_send = in_text[:closest_delim]
if len(to_send.strip()) > 0:
yield to_send
in_text = in_text[closest_delim:]

if len(in_text.strip()) > 0:
if escape_mass_mentions:
yield escape(in_text, mass_mentions=True)
else:
yield in_text


def box(text: str, lang: str = "") -> str:
return f"```{lang}\n{text}\n```"

Expand Down
50 changes: 50 additions & 0 deletions ballsdex/core/utils/formatting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from typing import Iterator, Sequence

import discord


def pagify(
text: str,
delims: Sequence[str] = ["\n"],
*,
priority: bool = False,
escape_mass_mentions: bool = True,
shorten_by: int = 8,
page_length: int = 2000,
) -> Iterator[str]:
in_text = text
page_length -= shorten_by
while len(in_text) > page_length:
this_page_len = page_length
if escape_mass_mentions:
this_page_len -= in_text.count("@here", 0, page_length) + in_text.count(
"@everyone", 0, page_length
)
closest_delim = (in_text.rfind(d, 1, this_page_len) for d in delims)
if priority:
closest_delim = next((x for x in closest_delim if x > 0), -1)
else:
closest_delim = max(closest_delim)
closest_delim = closest_delim if closest_delim != -1 else this_page_len
if escape_mass_mentions:
to_send = escape(in_text[:closest_delim], mass_mentions=True)
else:
to_send = in_text[:closest_delim]
if len(to_send.strip()) > 0:
yield to_send
in_text = in_text[closest_delim:]

if len(in_text.strip()) > 0:
if escape_mass_mentions:
yield escape(in_text, mass_mentions=True)
else:
yield in_text


def escape(text: str, *, mass_mentions: bool = False, formatting: bool = False) -> str:
if mass_mentions:
text = text.replace("@everyone", "@\u200beveryone")
text = text.replace("@here", "@\u200bhere")
if formatting:
text = discord.utils.escape_markdown(text)
return text
7 changes: 6 additions & 1 deletion ballsdex/packages/info/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from ballsdex import __version__ as ballsdex_version
from ballsdex.core.models import Ball
from ballsdex.core.models import balls as countryballs
from ballsdex.core.utils.formatting import pagify
from ballsdex.core.utils.tortoise import row_count_estimate
from ballsdex.settings import settings

Expand Down Expand Up @@ -159,6 +160,10 @@ async def help(self, interaction: discord.Interaction):
content += f"{mention_app_command(app_command)}: {translated}\n"
if not content:
continue
embed.add_field(name=cog.qualified_name, value=content, inline=False)
pages = pagify(content, page_length=1024)
for i, page in enumerate(pages):
embed.add_field(
name=cog.qualified_name if i == 0 else "\u200b", value=page, inline=False
)

await interaction.response.send_message(embed=embed)

0 comments on commit fff8288

Please sign in to comment.