Rollen-Menüs (Carl-Bot-Ersatz) + Setup-Redesign mit Tab-Sidebar
- Rollen-Menüs: Builder im Webinterface (Titel, Beschreibung, Kanal, Emoji/Label/Rolle, Exklusiv-Modus = max. 1 Rolle pro Menü), Bot postet Button-Embeds; Klick = Rolle nehmen/abgeben (ephemeres Feedback), Update editiert den Discord-Post in place, Löschen räumt ihn mit auf - Bewusst Buttons statt klassischer Emoji-Reaktionen: kein Reaction-Spam am Post, kein Custom-Emoji-Parsing, exklusive Menüs möglich; halbfertige Reaction-Variante aus abgebrochener Session entfernt und konsolidiert - Setup-Seite: komplett neu strukturiert in 8 Tabs mit sticky Sidebar (Status/Feeds/Community/Rollen/Support/Composer/System/API), Feedback als Toast - Modern-Polish: weiche Radien auf Karten/Inputs/Buttons, ruhigere Input-Flächen mit Fokus-Glow, Sektions-Hover; JSON-Parser akzeptiert leere Bodies - API: /api/rolemenus CRUD + publish (Admin), README aktualisiert Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -252,6 +252,38 @@ export function commitHeatmap() {
|
||||
.all();
|
||||
}
|
||||
|
||||
// Rollen-Menüs (Carl-Bot-Ersatz): selbst zuweisbare Rollen per Button-Post
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS role_menus (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
channel_id TEXT,
|
||||
message_id TEXT,
|
||||
exclusive INTEGER NOT NULL DEFAULT 0,
|
||||
entries TEXT NOT NULL DEFAULT '[]'
|
||||
);
|
||||
`);
|
||||
const insertRoleMenu = db.prepare(`
|
||||
INSERT INTO role_menus (title, description, channel_id, exclusive, entries)
|
||||
VALUES (@title, @description, @channel_id, @exclusive, @entries)
|
||||
`);
|
||||
const updateRoleMenuStmt = db.prepare(`
|
||||
UPDATE role_menus SET title = @title, description = @description,
|
||||
channel_id = @channel_id, exclusive = @exclusive, entries = @entries
|
||||
WHERE id = @id
|
||||
`);
|
||||
const setRoleMenuMessageStmt = db.prepare('UPDATE role_menus SET message_id = ? WHERE id = ?');
|
||||
const getRoleMenuStmt = db.prepare('SELECT * FROM role_menus WHERE id = ?');
|
||||
const listRoleMenusStmt = db.prepare('SELECT * FROM role_menus ORDER BY id');
|
||||
const deleteRoleMenuStmt = db.prepare('DELETE FROM role_menus WHERE id = ?');
|
||||
export const createRoleMenu = (m) => insertRoleMenu.run(m).lastInsertRowid;
|
||||
export const updateRoleMenu = (m) => updateRoleMenuStmt.run(m).changes > 0;
|
||||
export const setRoleMenuMessage = (id, messageId) => setRoleMenuMessageStmt.run(messageId, id);
|
||||
export const getRoleMenu = (id) => getRoleMenuStmt.get(id) ?? null;
|
||||
export const listRoleMenus = () => listRoleMenusStmt.all();
|
||||
export const deleteRoleMenu = (id) => deleteRoleMenuStmt.run(id).changes > 0;
|
||||
|
||||
// Ticket-System (Button → privater Thread)
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS tickets (
|
||||
|
||||
Reference in New Issue
Block a user