Skip to content

Commit f24c3de

Browse files
committed
feat: extra formatting on webhooks
1 parent 809c3e3 commit f24c3de

File tree

5 files changed

+49
-39
lines changed

5 files changed

+49
-39
lines changed

app/components/github_integration/webhooks/commits.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ async def _(event: events.CommitComment) -> None:
4141
event.comment.body,
4242
),
4343
Footer("commit", f"Commit {sha}: {commit_title}"),
44+
origin_repo=event.repository,
4445
)

app/components/github_integration/webhooks/discussions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ async def _(event: events.DiscussionCreated) -> None:
6565
discussion_footer(discussion, emoji="discussion"),
6666
color="gray",
6767
feed_type="discussions",
68+
origin_repo=event.repository,
6869
)
6970

7071
@webhook.event.discussion.closed
@@ -106,6 +107,7 @@ async def _(event: events.DiscussionAnswered) -> None:
106107
discussion_footer(discussion, emoji="discussion_answered"),
107108
color="green",
108109
feed_type="discussions",
110+
origin_repo=event.repository,
109111
)
110112

111113
@webhook.event.discussion.unanswered
@@ -177,4 +179,5 @@ async def _(event: events.DiscussionCommentCreated) -> None:
177179
discussion_embed_content(discussion, "commented on", event.comment.body),
178180
discussion_footer(discussion),
179181
feed_type="discussions",
182+
origin_repo=event.repository,
180183
)

app/components/github_integration/webhooks/issues.py

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import re
4-
from functools import partial
54
from typing import TYPE_CHECKING, Any, Protocol, cast
65

76
from loguru import logger
@@ -15,51 +14,18 @@
1514

1615
if TYPE_CHECKING:
1716
from githubkit.typing import Missing
18-
from githubkit.versions.latest.models import RepositoryWebhooks
1917
from monalisten import Monalisten, events
2018

2119
from app.bot import EmojiName, GhosttyBot
2220

2321

24-
GITHUB_DISCUSSION_URL = re.compile(
25-
# Ignore if already inside a link block
26-
r"(?<!\()"
27-
r"https://github\.com/"
28-
r"(?P<owner>\b[a-zA-Z0-9\-]+/)"
29-
r"(?P<repo>\b[a-zA-Z0-9\-\._]+)"
30-
r"(?P<sep>/(?:issues|pull|discussions)/)"
31-
r"(?P<number>\d+)"
32-
r"(?!\))"
33-
) # fmt: skip
34-
SUP_HTML = re.compile(r"\s*<sup>((?:.|\s)+?)</sup>\s*")
3522
DISUCSSION_DIV_TAG = re.compile(
3623
r"\s*<div type='discussions-op-text'>((?:.|\s)*?)\s*</div>\s*", re.MULTILINE
3724
)
3825

3926

40-
def shorten_same_repo_links(
41-
origin_repo: RepositoryWebhooks, matchobj: re.Match[str]
42-
) -> str:
43-
if (
44-
matchobj.group("owner") == origin_repo.owner.name
45-
and matchobj.group("repo") == origin_repo.name
46-
):
47-
# Only short hand if link comes from same repo
48-
return f"[#{matchobj.group('number')}]({matchobj.group()})"
49-
return matchobj.group()
50-
51-
52-
def reformat_converted_discussion_header(
53-
body: str | None, repo: RepositoryWebhooks
54-
) -> str | None:
55-
if not body:
56-
return body
57-
body = SUP_HTML.sub(
58-
lambda x: "".join(f"\n-# {line}\n" for line in x.group(1).splitlines()), body
59-
)
60-
body = DISUCSSION_DIV_TAG.sub(r"\g<1>", body)
61-
body = GITHUB_DISCUSSION_URL.sub(partial(shorten_same_repo_links, repo), body)
62-
return body # noqa: RET504
27+
def remove_discussion_div(body: str | None) -> str | None:
28+
return DISUCSSION_DIV_TAG.sub(r"\g<1>", body) if body else body
6329

6430

6531
class IssueLike(Protocol):
@@ -94,13 +60,14 @@ def register_hooks(bot: GhosttyBot, webhook: Monalisten) -> None:
9460
@webhook.event.issues.opened
9561
async def _(event: events.IssuesOpened) -> None:
9662
issue = event.issue
97-
body = reformat_converted_discussion_header(issue.body, event.repository)
63+
body = remove_discussion_div(issue.body)
9864
await send_embed(
9965
bot,
10066
event.sender,
10167
issue_embed_content(issue, "opened {}", body),
10268
issue_footer(issue, emoji="issue_open"),
10369
color="green",
70+
origin_repo=event.repository,
10471
)
10572

10673
@webhook.event.issues.closed
@@ -206,4 +173,5 @@ async def _(event: events.IssueCommentCreated) -> None:
206173
event.sender,
207174
EmbedContent(title, event.comment.html_url, event.comment.body),
208175
Footer(emoji, f"{entity}: {issue.title}"),
176+
origin_repo=event.repository,
209177
)

app/components/github_integration/webhooks/prs.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ async def _(event: events.PullRequestOpened) -> None:
5858
pr_embed_content(pr, "opened {}", pr.body),
5959
pr_footer(pr, emoji="pull_open"),
6060
color="green",
61+
origin_repo=event.repository,
6162
)
6263

6364
@webhook.event.pull_request.closed
@@ -70,6 +71,7 @@ async def _(event: events.PullRequestClosed) -> None:
7071
pr_embed_content(pr, f"{action} {{}}"),
7172
pr_footer(pr, emoji="pull_" + action),
7273
color=color,
74+
origin_repo=event.repository,
7375
)
7476

7577
@webhook.event.pull_request.reopened
@@ -154,6 +156,7 @@ async def _(event: events.PullRequestReviewRequestRemoved) -> None:
154156
event.sender,
155157
pr_embed_content(pr, "removed review request for {}", content),
156158
pr_footer(pr),
159+
origin_repo=event.repository,
157160
)
158161

159162
@webhook.event.pull_request_review.submitted
@@ -186,6 +189,7 @@ async def _(event: events.PullRequestReviewSubmitted) -> None:
186189
EmbedContent(f"{title} PR #{pr.number}", review.html_url, review.body),
187190
pr_footer(pr, emoji=emoji),
188191
color=color,
192+
origin_repo=event.repository,
189193
)
190194

191195
@webhook.event.pull_request_review.dismissed
@@ -227,6 +231,7 @@ async def _(event: events.PullRequestReviewCommentCreated) -> None:
227231
content,
228232
),
229233
pr_footer(pr, from_review=True),
234+
origin_repo=event.repository,
230235
)
231236

232237

app/components/github_integration/webhooks/utils.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datetime as dt
44
import difflib
55
import re
6+
from functools import partial
67
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, Protocol, TypedDict
78

89
import discord as dc
@@ -12,12 +13,23 @@
1213
from app.utils import truncate
1314

1415
if TYPE_CHECKING:
15-
from githubkit.versions.latest.models import SimpleUser
16+
from githubkit.versions.latest.models import RepositoryWebhooks, SimpleUser
1617

1718
from app.bot import EmojiName, GhosttyBot
1819
from app.config import WebhookFeedType
1920

2021
CODEBLOCK = re.compile(r"`{3,}")
22+
SUP_HTML = re.compile(r"\s*<su[pb]>(.+?)</su[pb]>\s*")
23+
GITHUB_DISCUSSION_URL = re.compile(
24+
# Ignore if already inside a link block
25+
r"(?<!\()"
26+
r"https://github\.com/"
27+
r"(?P<owner>\b[a-zA-Z0-9\-]+/)"
28+
r"(?P<repo>\b[a-zA-Z0-9\-\._]+)"
29+
r"(?P<sep>/(?:issues|pull|discussions)/)"
30+
r"(?P<number>\d+)"
31+
r"(?!\))"
32+
) # fmt: skip
2133

2234
type EmbedColor = Literal["green", "red", "purple", "gray", "orange", "blue"]
2335

@@ -127,6 +139,18 @@ async def send_edit_difference(
127139
)
128140

129141

142+
def _shorten_same_repo_links(
143+
origin_repo: RepositoryWebhooks, matchobj: re.Match[str]
144+
) -> str:
145+
if (
146+
matchobj.group("owner") == origin_repo.owner.name
147+
and matchobj.group("repo") == origin_repo.name
148+
):
149+
# Only short hand if link comes from same repo
150+
return f"[#{matchobj.group('number')}]({matchobj.group()})"
151+
return matchobj.group()
152+
153+
130154
async def send_embed( # noqa: PLR0913
131155
bot: GhosttyBot,
132156
actor: SimpleUser,
@@ -135,10 +159,19 @@ async def send_embed( # noqa: PLR0913
135159
*,
136160
color: EmbedColor | None = None,
137161
feed_type: WebhookFeedType = "main",
162+
origin_repo: RepositoryWebhooks | None = None,
138163
) -> None:
164+
content_dict = content.dict
165+
if origin_repo and (body := content_dict.get("description")):
166+
body = SUP_HTML.sub(r"\n-# \g<1>", body)
167+
body = GITHUB_DISCUSSION_URL.sub(
168+
partial(_shorten_same_repo_links, origin_repo), body
169+
)
170+
content_dict["description"] = body
171+
139172
author = GitHubUser(**actor.model_dump())
140173
embed = (
141-
dc.Embed(color=color and EMBED_COLORS.get(color), **content.dict)
174+
dc.Embed(color=color and EMBED_COLORS.get(color), **content_dict)
142175
.set_footer(**footer.dict(bot))
143176
.set_author(**author.model_dump())
144177
)

0 commit comments

Comments
 (0)