Skip to content

Commit 0421ab7

Browse files
Merge branch 'object-Object:main' into embed-colours
2 parents 73693ef + d863400 commit 0421ab7

File tree

7 files changed

+83
-78
lines changed

7 files changed

+83
-78
lines changed

CHANGELOG.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,19 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Pydantic's HISTORY.md](https://github.com/pydantic/pydantic/blob/main/HISTORY.md), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7-
## `0.1.1`
7+
## [UNRELEASED]
8+
9+
### Added
10+
11+
* GitHub Utils now uses [Fluent](https://projectfluent.org/) to localize command/parameter descriptions.
12+
* Added `/gh user`, by [mercurialworld](https://github.com/mercurialworld) in [#2](https://github.com/object-Object/discord-github-utils/pull/2).
13+
14+
### Changed
15+
16+
* Changed the repository search algorithm to allow fuzzy owner searches (eg. `object/discord` will now suggest `object-Object/discord-github-utils`).
17+
* `/gh_config[_admin] set default_repo` will now return an error if the repository does not exist.
18+
19+
## `0.1.1` - 2024-11-09
820

921
### Changed
1022

@@ -14,6 +26,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
1426

1527
* Added a workaround for the delete button not working in servers or DMs where the bot is not present (ie. user installs).
1628

17-
## `0.1.0`
29+
## `0.1.0` - 2024-11-05
1830

1931
Initial release.

bot/src/ghutils/cogs/app_commands/config/admin.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
from ghutils.core.cog import GHUtilsCog, SubGroup
99
from ghutils.db.config import get_guild_config
10-
from ghutils.utils.discord.transformers import RepositoryNameOption
10+
from ghutils.utils.discord.transformers import RepositoryOption
11+
from ghutils.utils.github import RepositoryName
1112

1213
type ServerConfigOption = Literal[
1314
"default_repo",
@@ -77,12 +78,13 @@ class Set(SubGroup):
7778
async def default_repo(
7879
self,
7980
interaction: Interaction,
80-
value: RepositoryNameOption,
81+
value: RepositoryOption,
8182
):
83+
new_value = RepositoryName.parse(value.full_name)
8284
with self._update_config(interaction) as config:
8385
old_value = config.default_repo
84-
config.default_repo = value
85-
await _send_updated(interaction, "default_repo", old_value, value)
86+
config.default_repo = new_value
87+
await _send_updated(interaction, "default_repo", old_value, new_value)
8688

8789
@contextmanager
8890
def _update_config(self, interaction: Interaction):

bot/src/ghutils/cogs/app_commands/config/user.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
from ghutils.core.cog import GHUtilsCog, SubGroup
1010
from ghutils.db.config import get_user_config, get_user_guild_config
11-
from ghutils.utils.discord.transformers import RepositoryNameOption
11+
from ghutils.utils.discord.transformers import RepositoryOption
12+
from ghutils.utils.github import RepositoryName
1213

1314
type UserConfigOption = Literal[
1415
"default_repo",
@@ -90,12 +91,13 @@ class Set(SubGroup):
9091
async def default_repo(
9192
self,
9293
interaction: Interaction,
93-
value: RepositoryNameOption,
94+
value: RepositoryOption,
9495
):
96+
new_value = RepositoryName.parse(value.full_name)
9597
with self._update_config(interaction) as config:
9698
old_value = config.default_repo
97-
config.default_repo = value
98-
await _send_updated(interaction, "default_repo", old_value, value)
99+
config.default_repo = new_value
100+
await _send_updated(interaction, "default_repo", old_value, new_value)
99101

100102
@contextmanager
101103
def _update_config(self, interaction: Interaction):

bot/src/ghutils/cogs/app_commands/github.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@
2727
UserGitHubTokens,
2828
UserLogin,
2929
)
30-
from ghutils.utils import l10n
3130
from ghutils.utils.discord.embeds import set_embed_author
3231
from ghutils.utils.discord.references import (
3332
CommitReference,
3433
IssueReference,
3534
PRReference,
3635
)
37-
from ghutils.utils.discord.transformers import FullRepositoryOption, UserOption
36+
from ghutils.utils.discord.transformers import RepositoryOption, UserOption
3837
from ghutils.utils.discord.visibility import MessageVisibility, respond_with_visibility
3938
from ghutils.utils.github import (
4039
CommitCheckState,
@@ -57,7 +56,6 @@ class GitHubCog(GHUtilsCog, GroupCog, group_name="gh"):
5756

5857
@app_commands.command()
5958
@app_commands.rename(reference="issue")
60-
@l10n.describe_common("visibility")
6159
async def issue(
6260
self,
6361
interaction: Interaction,
@@ -72,7 +70,6 @@ async def issue(
7270

7371
@app_commands.command()
7472
@app_commands.rename(reference="pr")
75-
@l10n.describe_common("visibility")
7673
async def pr(
7774
self,
7875
interaction: Interaction,
@@ -87,7 +84,6 @@ async def pr(
8784

8885
@app_commands.command()
8986
@app_commands.rename(reference="commit")
90-
@l10n.describe_common("visibility")
9187
async def commit(
9288
self,
9389
interaction: Interaction,
@@ -128,11 +124,10 @@ async def commit(
128124
await respond_with_visibility(interaction, visibility, embed=embed)
129125

130126
@app_commands.command()
131-
@l10n.describe_common("visibility")
132127
async def repo(
133128
self,
134129
interaction: Interaction,
135-
repo: FullRepositoryOption,
130+
repo: RepositoryOption,
136131
visibility: MessageVisibility = "private",
137132
):
138133
async with self.bot.github_app(interaction) as (github, _):
@@ -164,7 +159,6 @@ async def repo(
164159
await respond_with_visibility(interaction, visibility, embed=embed)
165160

166161
@app_commands.command()
167-
@l10n.describe_common("visibility")
168162
async def user(
169163
self,
170164
interaction: Interaction,
@@ -265,7 +259,6 @@ async def logout(self, interaction: Interaction):
265259
)
266260

267261
@app_commands.command()
268-
@l10n.describe_common("visibility")
269262
async def status(
270263
self,
271264
interaction: Interaction,
@@ -324,11 +317,10 @@ async def status(
324317

325318
class Search(SubGroup):
326319
@app_commands.command()
327-
@l10n.describe_common("visibility")
328320
async def files(
329321
self,
330322
interaction: Interaction,
331-
repo: FullRepositoryOption,
323+
repo: RepositoryOption,
332324
query: Range[str, 1, 128],
333325
ref: Range[str, 1, 255] | None = None,
334326
exact: bool = False,

bot/src/ghutils/resources/l10n/en-US/main.ftl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
# common parameters
88

9-
parameter-description_common_visibility =
9+
-parameter-description_visibility =
1010
Whether the message should be visible to everyone, or just you.
1111
1212
# /gh issue
@@ -17,6 +17,9 @@ command-description_gh-issue =
1717
parameter-description_gh-issue_reference =
1818
Issue to look up (`owner/repo#123` or `#123`). Use `/gh login` to get autocomplete.
1919
20+
parameter-description_gh-issue_visibility =
21+
{-parameter-description_visibility}
22+
2023
# /gh pr
2124

2225
command-description_gh-pr =
@@ -25,6 +28,9 @@ command-description_gh-pr =
2528
parameter-description_gh-pr_reference =
2629
Pull request to look up (`owner/repo#123` or `#123`). Use `/gh login` to get autocomplete.
2730
31+
parameter-description_gh-pr_visibility =
32+
{-parameter-description_visibility}
33+
2834
# /gh commit
2935

3036
command-description_gh-commit =
@@ -33,16 +39,31 @@ command-description_gh-commit =
3339
parameter-description_gh-commit_reference =
3440
Commit SHA to look up (`owner/repo@sha` or `@sha`). Use `/gh login` to get autocomplete.
3541
42+
parameter-description_gh-commit_visibility =
43+
{-parameter-description_visibility}
44+
3645
# /gh repo
3746

3847
command-description_gh-repo =
3948
Get a link to a GitHub repository.
4049
50+
parameter-description_gh-repo_repo =
51+
Repository to look up (`owner/repo`). Use `/gh login` to get autocomplete.
52+
53+
parameter-description_gh-repo_visibility =
54+
{-parameter-description_visibility}
55+
4156
# /gh user
4257

4358
command-description_gh-user =
4459
Get a link to a GitHub user.
4560
61+
parameter-description_gh-repo_user =
62+
Username to look up. Use `/gh login` to get autocomplete.
63+
64+
parameter-description_gh-user_visibility =
65+
{-parameter-description_visibility}
66+
4667
# /gh login
4768

4869
command-description_gh-login =
@@ -58,6 +79,9 @@ command-description_gh-logout =
5879
command-description_gh-status =
5980
Show information about GitHub Utils.
6081
82+
parameter-description_gh-status_visibility =
83+
{-parameter-description_visibility}
84+
6185
# /gh search
6286

6387
command-description_gh-search =
@@ -82,3 +106,6 @@ parameter-description_gh-search-files_exact =
82106
83107
parameter-description_gh-search-files_limit =
84108
Maximum number of results to show.
109+
110+
parameter-description_gh-search-files_visibility =
111+
{-parameter-description_visibility}

bot/src/ghutils/utils/discord/transformers.py

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

33
import logging
4-
from typing import Any
54

65
from discord import Interaction
76
from discord.app_commands import Transform, Transformer
@@ -19,20 +18,29 @@
1918
logger = logging.getLogger(__name__)
2019

2120

22-
class RepositoryNameTransformer(Transformer):
23-
async def transform(self, interaction: Interaction, value: str) -> Any:
24-
return RepositoryName.parse(value)
21+
class RepositoryTransformer(Transformer):
22+
async def transform(self, interaction: Interaction, value: str) -> FullRepository:
23+
repo = RepositoryName.parse(value)
24+
async with GHUtilsBot.github_app_of(interaction) as (github, _):
25+
try:
26+
return await gh_request(
27+
github.rest.repos.async_get(repo.owner, repo.repo)
28+
)
29+
except GitHubException as e:
30+
match e:
31+
case RequestFailed(response=Response(status_code=404)):
32+
raise ValueError("Repository not found")
33+
case _:
34+
logger.warning(e)
35+
raise ValueError(f"Failed to get repository: {e}")
2536

2637
async def autocomplete( # pyright: ignore[reportIncompatibleMethodOverride]
2738
self,
2839
interaction: Interaction,
2940
value: str,
3041
) -> list[Choice[str]]:
3142
value = value.strip()
32-
if "/" in value:
33-
owner, rest = value.split("/", maxsplit=1)
34-
query = f"{rest} user:{owner} in:name fork:true"
35-
elif value:
43+
if value:
3644
query = f"{value} in:name fork:true"
3745
else:
3846
with GHUtilsBot.db_session_of(interaction) as session:
@@ -64,25 +72,12 @@ async def autocomplete( # pyright: ignore[reportIncompatibleMethodOverride]
6472
]
6573

6674

67-
class FullRepositoryTransformer(RepositoryNameTransformer):
68-
async def transform(self, interaction: Interaction, value: str):
69-
repo = RepositoryName.parse(value)
70-
async with GHUtilsBot.github_app_of(interaction) as (github, _):
71-
try:
72-
return await gh_request(
73-
github.rest.repos.async_get(repo.owner, repo.repo)
74-
)
75-
except GitHubException as e:
76-
match e:
77-
case RequestFailed(response=Response(status_code=404)):
78-
raise ValueError("Repository not found")
79-
case _:
80-
logger.warning(e)
81-
raise ValueError(f"Failed to get repository: {e}")
82-
83-
8475
class UserTransformer(Transformer):
85-
async def transform(self, interaction: Interaction, value: str):
76+
async def transform(
77+
self,
78+
interaction: Interaction,
79+
value: str,
80+
) -> PrivateUser | PublicUser:
8681
async with GHUtilsBot.github_app_of(interaction) as (github, _):
8782
try:
8883
return await gh_request(github.rest.users.async_get_by_username(value))
@@ -95,7 +90,9 @@ async def transform(self, interaction: Interaction, value: str):
9590
raise ValueError(f"Failed to get user: {e}")
9691

9792
async def autocomplete( # pyright: ignore[reportIncompatibleMethodOverride]
98-
self, interaction: Interaction, value: str
93+
self,
94+
interaction: Interaction,
95+
value: str,
9996
) -> list[Choice[str]]:
10097
async with GHUtilsBot.github_app_of(interaction) as (github, state):
10198
if state != LoginState.LOGGED_IN:
@@ -122,8 +119,6 @@ async def autocomplete( # pyright: ignore[reportIncompatibleMethodOverride]
122119
return [Choice(name=user.login, value=user.login) for user in result.items]
123120

124121

125-
UserOption = Transform[PrivateUser | PublicUser, UserTransformer]
126-
127-
RepositoryNameOption = Transform[RepositoryName, RepositoryNameTransformer]
122+
RepositoryOption = Transform[FullRepository, RepositoryTransformer]
128123

129-
FullRepositoryOption = Transform[FullRepository, FullRepositoryTransformer]
124+
UserOption = Transform[PrivateUser | PublicUser, UserTransformer]

bot/src/ghutils/utils/l10n.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
"""Localization helpers."""
22

33
import re
4-
from typing import Mapping
54

6-
from discord import app_commands
75
from discord.app_commands import locale_str
86

97
type StrIterable = list[str] | tuple[str, ...]
@@ -30,28 +28,5 @@ def parameter_description(command: str | None, parameter: str):
3028
return locale_str("...", id=parameter_description_id(command, parameter))
3129

3230

33-
def describe_common(*parameters: str):
34-
return describe(common=parameters)
35-
36-
37-
def describe(
38-
dict_args: Mapping[str, StrIterable] | None = None,
39-
**kwargs: StrIterable,
40-
):
41-
"""Localize app command parameters.
42-
43-
Key: command to localize parameters for.
44-
45-
Value: parameter names.
46-
"""
47-
if dict_args:
48-
kwargs |= dict_args
49-
return app_commands.describe(**{
50-
parameter: parameter_description(command, parameter)
51-
for command, parameters in kwargs.items()
52-
for parameter in parameters
53-
})
54-
55-
5631
def _format_identifier(command: str):
5732
return _SEPARATOR_PATTERN.sub("-", command).replace("/", "")

0 commit comments

Comments
 (0)