70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
import os
|
|
|
|
import discord
|
|
from discord import app_commands
|
|
|
|
import httpx
|
|
from client import client, tree
|
|
|
|
|
|
GUILD_ID = os.getenv("GUILD_ID")
|
|
GITEA_API_KEY = os.getenv("GITEA_API_KEY")
|
|
|
|
gitea_url = "https://git.epicsparrow.com/api/v1"
|
|
|
|
GITEA_PROJECTS = {}
|
|
|
|
auth_headers = {"Authorization": f"token {GITEA_API_KEY}"}
|
|
|
|
|
|
def init_gitea_projects():
|
|
res = httpx.get(gitea_url + "/repos/search", headers=auth_headers)
|
|
if res.status_code == 200:
|
|
GITEA_PROJECTS.update(
|
|
{
|
|
str(project["id"]): {
|
|
"name": project["name"],
|
|
"owner": project["owner"]["login"],
|
|
}
|
|
for project in res.json()["data"]
|
|
}
|
|
)
|
|
return [(project["name"], project["id"]) for project in res.json()["data"]]
|
|
else:
|
|
return []
|
|
|
|
|
|
init_gitea_projects()
|
|
|
|
|
|
@tree.command(
|
|
name="gitea-issue",
|
|
description="Create issues to gitea",
|
|
)
|
|
@app_commands.describe(
|
|
title="Issue title", project="The project where the issue is created"
|
|
)
|
|
@app_commands.choices(
|
|
project=[
|
|
app_commands.Choice(name=project["name"], value=id_)
|
|
for id_, project in GITEA_PROJECTS.items()
|
|
]
|
|
)
|
|
async def gitea(interaction: discord.Interaction, project: str, title: str):
|
|
embed = discord.Embed(title="Gitea issue")
|
|
embed.add_field(name="Project", value=GITEA_PROJECTS[project]["name"])
|
|
embed.add_field(name="Title", value=title)
|
|
embed.add_field(name="Created by", value=interaction.user.mention)
|
|
|
|
creation_url = f"{gitea_url}/repos/{GITEA_PROJECTS[project]['owner']}/{GITEA_PROJECTS[project]['name']}/issues"
|
|
creation_data = {
|
|
"title": title,
|
|
"body": f"Created by {interaction.user.nick or interaction.user.name} from Discord.",
|
|
}
|
|
res = httpx.post(creation_url, headers=auth_headers, data=creation_data)
|
|
if res.status_code == 201:
|
|
embed.add_field(name="Issue created", value=res.json()["html_url"])
|
|
else:
|
|
embed.add_field(name="Error", value=res.text)
|
|
await interaction.response.send_message(embed=embed)
|