diff --git a/jarvis/cogs/gitlab.py b/jarvis/cogs/gitlab.py index 75f0e0f..28f8a04 100644 --- a/jarvis/cogs/gitlab.py +++ b/jarvis/cogs/gitlab.py @@ -2,17 +2,19 @@ from datetime import datetime, timedelta import gitlab -from ButtonPaginator import Paginator -from discord import Embed -from discord.ext import commands -from discord_slash import SlashContext, cog_ext -from discord_slash.model import ButtonStyle -from discord_slash.utils.manage_commands import create_choice, create_option +from dis_snek import InteractionContext, Snake +from dis_snek.ext.paginators import Paginator +from dis_snek.models.discord.embed import Embed, EmbedField +from dis_snek.models.snek.application_commands import ( + OptionTypes, + SlashCommandChoice, + slash_command, + slash_option, +) from jarvis.config import get_config from jarvis.utils import build_embed from jarvis.utils.cachecog import CacheCog -from jarvis.utils.field import Field guild_ids = [862402786116763668] @@ -20,21 +22,18 @@ guild_ids = [862402786116763668] class GitlabCog(CacheCog): """J.A.R.V.I.S. GitLab Cog.""" - def __init__(self, bot: commands.Bot): + def __init__(self, bot: Snake): super().__init__(bot) config = get_config() self._gitlab = gitlab.Gitlab("https://git.zevaryx.com", private_token=config.gitlab_token) # J.A.R.V.I.S. GitLab ID is 29 self.project = self._gitlab.projects.get(29) - @cog_ext.cog_subcommand( - base="gl", - name="issue", - description="Get an issue from GitLab", - guild_ids=guild_ids, - options=[create_option(name="id", description="Issue ID", option_type=4, required=True)], + @slash_command( + name="gl", sub_cmd_name="issue", description="Get an issue from GitLab", scopes=guild_ids ) - async def _issue(self, ctx: SlashContext, id: int) -> None: + @slash_option(name="id", description="Issue ID", option_type=OptionTypes.INTEGER, required=True) + async def _issue(self, ctx: InteractionContext, id: int) -> None: try: issue = self.project.issues.get(int(id)) except gitlab.exceptions.GitlabGetError: @@ -57,20 +56,20 @@ class GitlabCog(CacheCog): labels = "None" fields = [ - Field(name="State", value=issue.state[0].upper() + issue.state[1:]), - Field(name="Assignee", value=assignee), - Field(name="Labels", value=labels), + EmbedField(name="State", value=issue.state[0].upper() + issue.state[1:]), + EmbedField(name="Assignee", value=assignee), + EmbedField(name="Labels", value=labels), ] color = self.project.labels.get(issue.labels[0]).color - fields.append(Field(name="Created At", value=created_at)) + fields.append(EmbedField(name="Created At", value=created_at)) if issue.state == "closed": closed_at = datetime.strptime(issue.closed_at, "%Y-%m-%dT%H:%M:%S.%fZ").strftime( "%Y-%m-%d %H:%M:%S UTC" ) - fields.append(Field(name="Closed At", value=closed_at)) + fields.append(EmbedField(name="Closed At", value=closed_at)) if issue.milestone: fields.append( - Field( + EmbedField( name="Milestone", value=f"[{issue.milestone['title']}]({issue.milestone['web_url']})", inline=False, @@ -95,21 +94,16 @@ class GitlabCog(CacheCog): ) await ctx.send(embed=embed) - @cog_ext.cog_subcommand( - base="gl", - name="milestone", + @slash_command( + name="gl", + sub_cmd_name="milestone", description="Get a milestone from GitLab", - guild_ids=guild_ids, - options=[ - create_option( - name="id", - description="Milestone ID", - option_type=4, - required=True, - ) - ], + scopes=guild_ids, ) - async def _milestone(self, ctx: SlashContext, id: int) -> None: + @slash_option( + name="id", description="Milestone ID", option_type=OptionTypes.INTEGER, required=True + ) + async def _milestone(self, ctx: InteractionContext, id: int) -> None: try: milestone = self.project.milestones.get(int(id)) except gitlab.exceptions.GitlabGetError: @@ -121,20 +115,20 @@ class GitlabCog(CacheCog): ) fields = [ - Field( + EmbedField( name="State", value=milestone.state[0].upper() + milestone.state[1:], ), - Field(name="Start Date", value=milestone.start_date), - Field(name="Due Date", value=milestone.due_date), - Field(name="Created At", value=created_at), + EmbedField(name="Start Date", value=milestone.start_date), + EmbedField(name="Due Date", value=milestone.due_date), + EmbedField(name="Created At", value=created_at), ] if milestone.updated_at: updated_at = datetime.strptime(milestone.updated_at, "%Y-%m-%dT%H:%M:%S.%fZ").strftime( "%Y-%m-%d %H:%M:%S UTC" ) - fields.append(Field(name="Updated At", value=updated_at)) + fields.append(EmbedField(name="Updated At", value=updated_at)) if len(milestone.title) > 200: milestone.title = milestone.title[:200] + "..." @@ -156,21 +150,16 @@ class GitlabCog(CacheCog): ) await ctx.send(embed=embed) - @cog_ext.cog_subcommand( - base="gl", - name="mergerequest", - description="Get an merge request from GitLab", - guild_ids=guild_ids, - options=[ - create_option( - name="id", - description="Merge Request ID", - option_type=4, - required=True, - ) - ], + @slash_command( + name="gl", + sub_cmd_name="mr", + description="Get a merge request from GitLab", + scopes=guild_ids, ) - async def _mergerequest(self, ctx: SlashContext, id: int) -> None: + @slash_option( + name="id", description="Merge Request ID", option_type=OptionTypes.INTEGER, required=True + ) + async def _mergerequest(self, ctx: InteractionContext, id: int) -> None: try: mr = self.project.mergerequests.get(int(id)) except gitlab.exceptions.GitlabGetError: @@ -193,28 +182,28 @@ class GitlabCog(CacheCog): labels = "None" fields = [ - Field(name="State", value=mr.state[0].upper() + mr.state[1:]), - Field(name="Assignee", value=assignee), - Field(name="Labels", value=labels), + EmbedField(name="State", value=mr.state[0].upper() + mr.state[1:]), + EmbedField(name="Assignee", value=assignee), + EmbedField(name="Labels", value=labels), ] if mr.labels: color = self.project.labels.get(mr.labels[0]).color else: color = "#00FFEE" - fields.append(Field(name="Created At", value=created_at)) + fields.append(EmbedField(name="Created At", value=created_at)) if mr.state == "merged": merged_at = datetime.strptime(mr.merged_at, "%Y-%m-%dT%H:%M:%S.%fZ").strftime( "%Y-%m-%d %H:%M:%S UTC" ) - fields.append(Field(name="Merged At", value=merged_at)) + fields.append(EmbedField(name="Merged At", value=merged_at)) elif mr.state == "closed": closed_at = datetime.strptime(mr.closed_at, "%Y-%m-%dT%H:%M:%S.%fZ").strftime( "%Y-%m-%d %H:%M:%S UTC" ) - fields.append(Field(name="Closed At", value=closed_at)) + fields.append(EmbedField(name="Closed At", value=closed_at)) if mr.milestone: fields.append( - Field( + EmbedField( name="Milestone", value=f"[{mr.milestone['title']}]({mr.milestone['web_url']})", inline=False, @@ -248,7 +237,7 @@ class GitlabCog(CacheCog): fields = [] for item in api_list: fields.append( - Field( + EmbedField( name=f"[#{item.iid}] {item.title}", value=item.description + f"\n\n[View this {name}]({item.web_url})", inline=False, @@ -271,26 +260,21 @@ class GitlabCog(CacheCog): ) return embed - @cog_ext.cog_subcommand( - base="gl", - name="issues", - description="Get open issues from GitLab", - guild_ids=guild_ids, + @slash_command( + name="gl", sub_cmd_name="issues", description="Get issues from GitLab", scopes=guild_ids + ) + @slash_option( + name="state", + description="State of issues to get", + option_type=OptionTypes.STRING, + required=False, options=[ - create_option( - name="state", - description="State of issues to get", - option_type=3, - required=False, - choices=[ - create_choice(name="Open", value="opened"), - create_choice(name="Closed", value="closed"), - create_choice(name="All", value="all"), - ], - ) + SlashCommandChoice(name="Open", value="opened"), + SlashCommandChoice(name="Closed", value="closed"), + SlashCommandChoice(name="All", value="all"), ], ) - async def _issues(self, ctx: SlashContext, state: str = "opened") -> None: + async def _issues(self, ctx: InteractionContext, state: str = "opened") -> None: exists = self.check_cache(ctx, state=state) if exists: await ctx.defer(hidden=True) @@ -333,18 +317,7 @@ class GitlabCog(CacheCog): for i in range(0, len(issues), 5): pages.append(self.build_embed_page(issues[i : i + 5], t_state=t_state, name="issue")) - paginator = Paginator( - bot=self.bot, - ctx=ctx, - embeds=pages, - only=ctx.author, - timeout=60 * 5, # 5 minute timeout - disable_after_timeout=True, - use_extend=len(pages) > 2, - left_button_style=ButtonStyle.grey, - right_button_style=ButtonStyle.grey, - basic_buttons=["◀", "▶"], - ) + paginator = Paginator.create_from_embeds(self.bot, *pages, timeout=300) self.cache[hash(paginator)] = { "user": ctx.author.id, @@ -355,29 +328,26 @@ class GitlabCog(CacheCog): "paginator": paginator, } - await paginator.start() + await paginator.send(ctx) - @cog_ext.cog_subcommand( - base="gl", - name="mergerequests", - description="Get open issues from GitLab", - guild_ids=guild_ids, + @slash_command( + name="gl", + sub_cmd_name="mrs", + description="Get merge requests from GitLab", + scopes=guild_ids, + ) + @slash_option( + name="state", + description="State of merge requests to get", + option_type=OptionTypes.STRING, + required=False, options=[ - create_option( - name="state", - description="State of issues to get", - option_type=3, - required=False, - choices=[ - create_choice(name="Open", value="opened"), - create_choice(name="Closed", value="closed"), - create_choice(name="Merged", value="merged"), - create_choice(name="All", value="all"), - ], - ) + SlashCommandChoice(name="Open", value="opened"), + SlashCommandChoice(name="Closed", value="closed"), + SlashCommandChoice(name="All", value="all"), ], ) - async def _mergerequests(self, ctx: SlashContext, state: str = "opened") -> None: + async def _mergerequests(self, ctx: InteractionContext, state: str = "opened") -> None: exists = self.check_cache(ctx, state=state) if exists: await ctx.defer(hidden=True) @@ -422,18 +392,7 @@ class GitlabCog(CacheCog): self.build_embed_page(merges[i : i + 5], t_state=t_state, name="merge request") ) - paginator = Paginator( - bot=self.bot, - ctx=ctx, - embeds=pages, - only=ctx.author, - timeout=60 * 5, # 5 minute timeout - disable_after_timeout=True, - use_extend=len(pages) > 2, - left_button_style=ButtonStyle.grey, - right_button_style=ButtonStyle.grey, - basic_buttons=["◀", "▶"], - ) + paginator = Paginator.create_from_embeds(self.bot, *pages, timeout=300) self.cache[hash(paginator)] = { "user": ctx.author.id, @@ -444,15 +403,15 @@ class GitlabCog(CacheCog): "paginator": paginator, } - await paginator.start() + await paginator.send(ctx) - @cog_ext.cog_subcommand( - base="gl", - name="milestones", - description="Get open issues from GitLab", - guild_ids=guild_ids, + @slash_command( + name="gl", + sub_cmd_name="milestones", + description="Get milestones from GitLab", + scopes=guild_ids, ) - async def _milestones(self, ctx: SlashContext) -> None: + async def _milestones(self, ctx: InteractionContext) -> None: exists = self.check_cache(ctx) if exists: await ctx.defer(hidden=True) @@ -489,18 +448,7 @@ class GitlabCog(CacheCog): self.build_embed_page(milestones[i : i + 5], t_state=None, name="milestone") ) - paginator = Paginator( - bot=self.bot, - ctx=ctx, - embeds=pages, - only=ctx.author, - timeout=60 * 5, # 5 minute timeout - disable_after_timeout=True, - use_extend=len(pages) > 2, - left_button_style=ButtonStyle.grey, - right_button_style=ButtonStyle.grey, - basic_buttons=["◀", "▶"], - ) + paginator = Paginator.create_from_embeds(self.bot, *pages, timeout=300) self.cache[hash(paginator)] = { "user": ctx.author.id, @@ -510,10 +458,10 @@ class GitlabCog(CacheCog): "paginator": paginator, } - await paginator.start() + await paginator.send(ctx) -def setup(bot: commands.Bot) -> None: +def setup(bot: Snake) -> None: """Add GitlabCog to J.A.R.V.I.S. if Gitlab token exists.""" if get_config().gitlab_token: bot.add_cog(GitlabCog(bot))