Paginate long responses

This commit is contained in:
Nexus 2023-07-12 18:32:40 +01:00
parent 73e2ac469b
commit 7a9459f89a
Signed by: nex
GPG key ID: 0FA334385D0B689F
2 changed files with 36 additions and 7 deletions

View file

@ -383,7 +383,6 @@ class Events(commands.Cog):
for a in message.attachments for a in message.attachments
] ]
} }
# dumped = json.dumps(payload, separators=(",", ":"))
self.bot.bridge_queue.put_nowait(payload) self.bot.bridge_queue.put_nowait(payload)
print("Added %s to queue" % payload) print("Added %s to queue" % payload)

View file

@ -1,6 +1,7 @@
import asyncio import asyncio
import ipaddress import ipaddress
import sys import sys
import textwrap
import discord import discord
import os import os
@ -287,8 +288,9 @@ async def verify(code: str):
) )
@app.post("/bridge", include_in_schema=False) @app.post("/bridge", include_in_schema=False, status_code=201)
async def bridge(req: Request): async def bridge(req: Request):
from discord.ext.commands import Paginator
body = await req.json() body = await req.json()
if body["secret"] != app.state.bot.http.token: if body["secret"] != app.state.bot.http.token:
raise HTTPException( raise HTTPException(
@ -296,17 +298,45 @@ async def bridge(req: Request):
detail="Invalid secret." detail="Invalid secret."
) )
channel = app.state.bot.get_channel(1032974266527907901) channel = app.state.bot.get_channel(1032974266527907901) # type: discord.TextChannel | None
if not channel: if not channel:
raise HTTPException( raise HTTPException(
status_code=404, status_code=404,
detail="Channel does not exist." detail="Channel does not exist."
) )
await channel.send( if len(body["message"]) > 6000:
f"**{body['sender']}**:\n>>> {body['message']}" raise HTTPException(
) status_code=400,
return {"status": "ok"} detail="Message too long."
)
paginator = Paginator(prefix="", suffix="", max_size=1990)
for line in body["message"].splitlines():
try:
paginator.add_line(line)
except ValueError:
paginator.add_line(textwrap.shorten(line, width=1900, placeholder="<...>"))
if len(paginator.pages) > 1:
msg = await channel.send(
f"**{body['sender']}**:"
)
m = len(paginator.pages)
for n, page in enumerate(paginator.pages, 1):
await channel.send(
f"[{n}/{m}]\n>>> {page}",
allowed_mentions=discord.AllowedMentions.none(),
reference=msg,
silent=True,
suppress=True
)
else:
await channel.send(
f"**{body['sender']}**:\n>>> {body['message']}"[:2000],
allowed_mentions=discord.AllowedMentions.none(),
silent=True,
suppress=True
)
return {"status": "ok", "pages": len(paginator.pages)}
@app.websocket('/bridge/recv') @app.websocket('/bridge/recv')