Skip to content

Commit baa4c35

Browse files
committed
Attach some long code links in files.
1 parent 8c21cd4 commit baa4c35

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

app/components/github_integration/code_links.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import string
33
import urllib.parse
44
from collections.abc import AsyncIterator
5+
from io import BytesIO
56
from typing import NamedTuple
67

78
import discord
@@ -96,7 +97,7 @@ async def get_snippets(content: str) -> AsyncIterator[Snippet]:
9697
)
9798

9899

99-
def _format_snippet(snippet: Snippet) -> str:
100+
def _format_snippet(snippet: Snippet, *, include_body: bool = True) -> str:
100101
repo_url = f"https://github.com/{snippet.repo}"
101102
tree_url = f"{repo_url}/tree/{snippet.rev}"
102103
file_url = f"{repo_url}/blob/{snippet.rev}/{snippet.path}"
@@ -115,37 +116,46 @@ def _format_snippet(snippet: Snippet) -> str:
115116
f"[`{unquoted_path}`](<{file_url}>), {range_info}"
116117
f"\n-# Repo: [`{snippet.repo}`](<{repo_url}>),"
117118
f" {ref_type}: [`{snippet.rev}`](<{tree_url}>)"
118-
f"\n```{snippet.lang}\n{snippet.body}\n```"
119-
)
119+
) + (f"\n```{snippet.lang}\n{snippet.body}\n```" * include_body)
120120

121121

122-
async def snippet_message(message: discord.Message) -> tuple[str, int]:
122+
async def snippet_message(
123+
message: discord.Message,
124+
) -> tuple[tuple[str, list[discord.File]], int]:
123125
snippets = [s async for s in get_snippets(message.content)]
124126
if not snippets:
125-
return "", 0
127+
return ("", []), 0
126128

127129
blobs = list(map(_format_snippet, snippets))
128130

131+
if len(blobs) == 1 and len(blobs[0]) > 2000:
132+
# When there is only a single blob which goes over the limit, upload it
133+
# as a file instead.
134+
fp = BytesIO(snippets[0].body.encode())
135+
file = discord.File(fp, filename=f"code.{snippets[0].lang}")
136+
return (_format_snippet(snippets[0], include_body=False), [file]), 1
137+
129138
if len("\n\n".join(blobs)) > 2000:
130139
while len("\n\n".join(blobs)) > 1970: # Accounting for omission note
131140
blobs.pop()
132141
if not blobs:
133-
return "", -1 # Signal that all snippets were omitted
142+
return ("", []), -1 # Signal that all snippets were omitted
134143
blobs.append("-# Some snippets were omitted")
135-
return "\n".join(blobs), len(snippets)
144+
return ("\n".join(blobs), []), len(snippets)
136145

137146

138147
async def reply_with_code(message: discord.Message) -> None:
139148
if message.author.bot:
140149
return
141-
msg_content, snippet_count = await snippet_message(message)
150+
(msg_content, files), snippet_count = await snippet_message(message)
142151
if snippet_count != 0:
143152
await message.edit(suppress=True)
144153
if snippet_count < 1:
145154
return
146155

147156
sent_message = await message.reply(
148157
msg_content,
158+
files=files,
149159
suppress_embeds=True,
150160
mention_author=False,
151161
allowed_mentions=discord.AllowedMentions.none(),

0 commit comments

Comments
 (0)