Migrate gitlab, closes #96
This commit is contained in:
parent
d4fd670cc9
commit
c69c21e9d4
1 changed files with 90 additions and 142 deletions
|
@ -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,
|
|
||||||
)
|
)
|
||||||
],
|
@slash_option(
|
||||||
|
name="id", description="Milestone ID", option_type=OptionTypes.INTEGER, required=True
|
||||||
)
|
)
|
||||||
async def _milestone(self, ctx: SlashContext, id: int) -> None:
|
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,
|
|
||||||
)
|
)
|
||||||
],
|
@slash_option(
|
||||||
|
name="id", description="Merge Request ID", option_type=OptionTypes.INTEGER, required=True
|
||||||
)
|
)
|
||||||
async def _mergerequest(self, ctx: SlashContext, id: int) -> None:
|
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,
|
|
||||||
options=[
|
|
||||||
create_option(
|
|
||||||
name="state",
|
name="state",
|
||||||
description="State of issues to get",
|
description="State of issues to get",
|
||||||
option_type=3,
|
option_type=OptionTypes.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
choices=[
|
options=[
|
||||||
create_choice(name="Open", value="opened"),
|
SlashCommandChoice(name="Open", value="opened"),
|
||||||
create_choice(name="Closed", value="closed"),
|
SlashCommandChoice(name="Closed", value="closed"),
|
||||||
create_choice(name="All", value="all"),
|
SlashCommandChoice(name="All", value="all"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
async def _issues(self, ctx: InteractionContext, state: str = "opened") -> None:
|
||||||
)
|
|
||||||
async def _issues(self, ctx: SlashContext, 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,
|
||||||
options=[
|
)
|
||||||
create_option(
|
@slash_option(
|
||||||
name="state",
|
name="state",
|
||||||
description="State of issues to get",
|
description="State of merge requests to get",
|
||||||
option_type=3,
|
option_type=OptionTypes.STRING,
|
||||||
required=False,
|
required=False,
|
||||||
choices=[
|
options=[
|
||||||
create_choice(name="Open", value="opened"),
|
SlashCommandChoice(name="Open", value="opened"),
|
||||||
create_choice(name="Closed", value="closed"),
|
SlashCommandChoice(name="Closed", value="closed"),
|
||||||
create_choice(name="Merged", value="merged"),
|
SlashCommandChoice(name="All", value="all"),
|
||||||
create_choice(name="All", value="all"),
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
async def _mergerequests(self, ctx: InteractionContext, state: str = "opened") -> None:
|
||||||
)
|
|
||||||
async def _mergerequests(self, ctx: SlashContext, 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))
|
||||||
|
|
Loading…
Add table
Reference in a new issue