- Alle Embeds nutzen jetzt brandName/brandColor/brandColor2/brandFooter aus den Settings (Codemod über 20 Module) — Farbe & Name serverweit per Klick änderbar - Bot-Status (Presence): Typ (Spielt/Schaut/Hört/Status) + Text, sofort angewendet; Server-Monitor nutzt die Presence nur noch, wenn kein eigener Status gesetzt ist - Avatar-/Banner-Upload direkt aufs Bot-Profil (Base64, 8-MB-Limit, Discord-Rate-Limit sauber gemeldet) - Env-Verlagerung: GITEA_API_TOKEN (write-only Setting) und DISCORD_GUILD_ID jetzt auch über den Brand-Tab pflegbar — weniger Redeploys - Rollen-Menüs: Button-Farbe pro Eintrag wählbar (Grau/Blau/Grün/Rot) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51 lines
1.8 KiB
JavaScript
51 lines
1.8 KiB
JavaScript
// Minimaler Gitea-API-Client (Token-Auth) — für /bug → Issues
|
|
|
|
import { giteaUrl, giteaApiToken } from './runtime-settings.js';
|
|
|
|
function headers(extra = {}) {
|
|
return {
|
|
Authorization: `token ${giteaApiToken()}`,
|
|
Accept: 'application/json',
|
|
...extra,
|
|
};
|
|
}
|
|
|
|
/** Issue anlegen; gibt { number, html_url } zurück */
|
|
export async function createIssue(repo, title, body) {
|
|
const res = await fetch(`${giteaUrl()}/api/v1/repos/${repo}/issues`, {
|
|
method: 'POST',
|
|
headers: headers({ 'Content-Type': 'application/json' }),
|
|
body: JSON.stringify({ title, body }),
|
|
});
|
|
if (!res.ok) {
|
|
throw new Error(`Gitea createIssue ${res.status}: ${(await res.text()).slice(0, 200)}`);
|
|
}
|
|
const issue = await res.json();
|
|
return { number: issue.number, html_url: issue.html_url };
|
|
}
|
|
|
|
/** Milestones eines Repos (für die Roadmap-Seite); Token optional bei öffentlichen Repos */
|
|
export async function getMilestones(repo) {
|
|
const res = await fetch(`${giteaUrl()}/api/v1/repos/${repo}/milestones?state=all&per_page=50`, {
|
|
headers: giteaApiToken() ? headers() : { Accept: 'application/json' },
|
|
});
|
|
if (!res.ok) {
|
|
throw new Error(`Gitea getMilestones ${res.status}`);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
/** Datei (z. B. Screenshot) als Issue-Attachment hochladen */
|
|
export async function uploadIssueAsset(repo, issueNumber, filename, buffer) {
|
|
const form = new FormData();
|
|
form.append('attachment', new Blob([buffer]), filename);
|
|
const res = await fetch(
|
|
`${giteaUrl()}/api/v1/repos/${repo}/issues/${issueNumber}/assets?name=${encodeURIComponent(filename)}`,
|
|
{ method: 'POST', headers: headers(), body: form }
|
|
);
|
|
if (!res.ok) {
|
|
throw new Error(`Gitea uploadIssueAsset ${res.status}`);
|
|
}
|
|
return res.json();
|
|
}
|