Skip to content

Commit 8869370

Browse files
feat: enable repos and users in github info command
1 parent 6f4302b commit 8869370

3 files changed

Lines changed: 108 additions & 10 deletions

File tree

monty/exts/info/github/_handlers.py

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import dataclasses
44
import datetime
55
import enum
6+
import re
67
from abc import abstractmethod
78
from typing import Generic, Literal, NamedTuple, TypeVar, overload
89

@@ -84,13 +85,19 @@ def titlize_issue(issue: githubkit.rest.Issue) -> str:
8485

8586

8687
def is_mannequin_user(
87-
user: githubkit.rest.SimpleUser | githubkit.rest.DiscussionPropUser | graphql_models.DiscussionCommentUser,
88+
user: githubkit.rest.SimpleUser
89+
| githubkit.rest.PublicUser
90+
| githubkit.rest.DiscussionPropUser
91+
| graphql_models.DiscussionCommentUser,
8892
) -> bool:
8993
return bool(user.type and user.type.casefold() == "mannequin")
9094

9195

9296
def get_user_display_name(
93-
user: githubkit.rest.SimpleUser | githubkit.rest.DiscussionPropUser | graphql_models.DiscussionCommentUser,
97+
user: githubkit.rest.SimpleUser
98+
| githubkit.rest.PublicUser
99+
| githubkit.rest.DiscussionPropUser
100+
| graphql_models.DiscussionCommentUser,
94101
*,
95102
include_login_alias: bool = False,
96103
include_html_url: bool = False,
@@ -213,12 +220,50 @@ def render_tiny(
213220

214221
def render_ogp(self, obj: githubkit.rest.PublicUser, *, context: ghretos.User) -> disnake.Embed:
215222
embed = disnake.Embed(
216-
title=obj.name or obj.login,
223+
title=f"`{obj.login}`'s GitHub profile info",
224+
description=f"```{obj.bio}```\n" if obj.bio else "",
225+
colour=disnake.Colour.blurple(),
217226
url=obj.html_url,
218-
description=obj.bio,
219-
color=disnake.Color(0),
227+
timestamp=obj.created_at,
220228
)
221229
embed.set_thumbnail(url=obj.avatar_url)
230+
embed.set_footer(text="Account created at")
231+
232+
if obj.type == "User":
233+
embed.add_field(
234+
name="Followers",
235+
value=f"[{obj.followers}]({obj.html_url}?tab=followers)",
236+
inline=True,
237+
)
238+
embed.add_field(
239+
name="Following",
240+
value=f"[{obj.following}]({obj.html_url}?tab=following)",
241+
inline=True,
242+
)
243+
elif obj.type == "Organization":
244+
embed.add_field(
245+
name="Followers",
246+
value=f"[{obj.followers}](https://github.com/orgs/{obj.login}/followerss)",
247+
inline=True,
248+
)
249+
250+
embed.add_field(
251+
name="Public repos",
252+
value=f"[{obj.public_repos}]({obj.html_url}?tab=repositories)",
253+
)
254+
255+
if obj.type == "User":
256+
embed.add_field(
257+
name="Gists",
258+
value=f"[{obj.public_gists}]({obj.html_url}/gists)",
259+
)
260+
261+
if obj.blog:
262+
blog = obj.blog
263+
if not re.match(r"^https?:\/\/", blog):
264+
blog = f"https://{blog}"
265+
embed.add_field(name="Website", value=blog)
266+
222267
return embed
223268

224269
def render_ogp_cv2(self, obj: githubkit.rest.PublicUser, *, context: ghretos.User) -> disnake.ui.Container:
@@ -272,6 +317,53 @@ def render_tiny(
272317
) -> str:
273318
return f"📦 [{obj.name}](<{obj.html_url}>)"
274319

320+
def render_ogp(
321+
self,
322+
obj: githubkit.rest.Repository | githubkit.rest.FullRepository | githubkit.rest.RepoSearchResultItem,
323+
*,
324+
context: ghretos.Repo,
325+
) -> disnake.Embed:
326+
html_url = obj.html_url
327+
description = obj.description or ""
328+
embed = disnake.Embed(
329+
title=obj.name,
330+
colour=disnake.Colour.blurple(),
331+
url=html_url,
332+
)
333+
334+
# If it's a fork, then it will have a parent key
335+
if isinstance(obj, githubkit.rest.FullRepository) and obj.parent:
336+
parent = obj.parent
337+
description += f"\n\nForked from [{parent.full_name}]({parent.html_url})"
338+
339+
if repo_owner := obj.owner:
340+
embed.set_author(
341+
name=repo_owner.login,
342+
url=repo_owner.html_url,
343+
icon_url=repo_owner.avatar_url,
344+
)
345+
346+
repo_created_at = obj.created_at and obj.created_at.strftime("%d/%m/%Y")
347+
last_pushed = obj.pushed_at and obj.pushed_at.strftime("%d/%m/%Y at %H:%M")
348+
349+
embed.set_footer(
350+
text=(
351+
f"{obj.forks_count} ⑂ "
352+
f"• {obj.stargazers_count} ⭐ "
353+
f"• Created At {repo_created_at} "
354+
f"• Last Commit {last_pushed}"
355+
)
356+
)
357+
358+
# mirrors have a mirror_url key. See google/skia as an example.
359+
if obj.mirror_url:
360+
mirror_url = obj.mirror_url
361+
description += f"\n\nMirrored from <{mirror_url}>."
362+
363+
embed.description = description
364+
365+
return embed
366+
275367
def render_ogp_cv2(
276368
self,
277369
obj: githubkit.rest.Repository | githubkit.rest.FullRepository | githubkit.rest.RepoSearchResultItem,
@@ -609,6 +701,9 @@ def render_ogp(
609701
ghretos.PullRequestComment: IssueCommentRenderer,
610702
ghretos.PullRequestReviewComment: IssueCommentRenderer,
611703
ghretos.DiscussionComment: IssueCommentRenderer,
704+
# Non-autolinked
705+
ghretos.User: UserRenderer,
706+
ghretos.Repo: RepoRenderer,
612707
}
613708

614709
# GitHub supports url redirects on the frontend side for certain resources.

monty/exts/info/github/cog.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ def get_command_matcher_settings(self) -> ghretos.MatcherSettings:
301301
matcher_settings = self._get_base_matcher_settings()
302302
matcher_settings.shorthand = True
303303
matcher_settings.short_numberables = True
304+
matcher_settings.short_repo = True
305+
matcher_settings.short_bare_username = True
306+
304307
matcher_settings.issues = True
305308
matcher_settings.pull_requests = True
306309
matcher_settings.issue_comments = True
@@ -469,11 +472,11 @@ async def github_user(self, ctx: commands.Context, user: str) -> None:
469472
raise commands.UserInputError(msg) from e
470473
raise
471474
components: list[disnake.ui.Container | disnake.ui.ActionRow] = []
472-
components.append(github_handlers.UserRenderer().render_ogp_cv2(obj, context=context))
475+
embed = github_handlers.UserRenderer().render_ogp(obj, context=context)
473476
components.append(
474477
disnake.ui.ActionRow(DeleteButton(allow_manage_messages=True, user=ctx.author, initial_message=ctx.message))
475478
)
476-
await ctx.send(components=components)
479+
await ctx.send(embed=embed, components=components)
477480

478481
@github_group.command(name="repo", aliases=("repository", "repo_info"))
479482
async def github_repo(self, ctx: commands.Context, user_and_repo: str, repo: str = "") -> None:
@@ -513,11 +516,11 @@ async def github_repo(self, ctx: commands.Context, user_and_repo: str, repo: str
513516
raise
514517

515518
components: list[disnake.ui.Container | disnake.ui.ActionRow] = []
516-
components.append(github_handlers.RepoRenderer().render_ogp_cv2(obj, context=context))
519+
embed = github_handlers.RepoRenderer().render_ogp(obj, context=context)
517520
components.append(
518521
disnake.ui.ActionRow(DeleteButton(allow_manage_messages=True, user=ctx.author, initial_message=ctx.message))
519522
)
520-
await ctx.send(components=components)
523+
await ctx.send(embed=embed, components=components)
521524

522525
@github_group.command(name="ratelimit", aliases=("rl",), hidden=True)
523526
@commands.is_owner()

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)