Files
d4rkbot/src/gitea-api.js
T
D4rkst3randClaude Fable 5 f7b261c648 Branding-Tab: Name/Farben/Bot-Status/Avatar/Banner + Button-Farben für Rollen-Menüs
- 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>
2026-07-30 00:40:08 +02:00

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();
}