Migrate gitlab, closes #96

This commit is contained in:
Zeva Rose 2022-02-03 05:49:50 -07:00
parent d4fd670cc9
commit c69c21e9d4

View file

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