From cc6ad77b1ea40036142830826bcada4604f8bb13 Mon Sep 17 00:00:00 2001 From: cay Date: Tue, 14 Apr 2026 19:06:29 +0100 Subject: [PATCH] fgnbgfd --- public/css/gildenhalle.css | 148 +++++++++++++++-------------- public/js/buildings/gildenhalle.js | 32 +++++-- routes/gildenhalle.route.js | 27 +++++- 3 files changed, 129 insertions(+), 78 deletions(-) diff --git a/public/css/gildenhalle.css b/public/css/gildenhalle.css index 89f967b..3be10b7 100644 --- a/public/css/gildenhalle.css +++ b/public/css/gildenhalle.css @@ -30,7 +30,7 @@ background: linear-gradient(135deg, #2a1a08, #1a0f04); border: 2px solid #6b4b2a; border-radius: 8px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 12px; font-weight: 600; @@ -39,9 +39,9 @@ text-align: left; white-space: nowrap; } -.mp-tab:hover { color: #fff; filter: brightness(1.2); } +.mp-tab:hover { color: var(--guild-text); filter: brightness(1.2); } .mp-tab.mp-tab-active { - color: #fff !important; + color: var(--guild-text) !important; border-color: #7a4a00 !important; background: linear-gradient(135deg, #4a3010, #2a1a08) !important; box-shadow: inset 0 0 10px rgba(0,0,0,0.5), 0 0 14px rgba(200,160,60,0.3); @@ -78,7 +78,7 @@ font-family: "Cinzel", serif; font-size: 15px; font-weight: 700; - color: #fff; + color: var(--guild-text); letter-spacing: 1px; text-transform: uppercase; padding: 10px 20px; @@ -128,7 +128,7 @@ font-size: 12px; } .gh-members-table th { - color: #fff; + color: #3a1a05; font-size: 10px; letter-spacing: 1px; text-transform: uppercase; @@ -139,7 +139,7 @@ .gh-members-table td { padding: 7px 10px; border-bottom: 1px solid rgba(139,106,42,.2); - color: #fff; + color: #1a0800; vertical-align: middle; } .gh-members-table tr:hover td { @@ -155,7 +155,7 @@ font-weight: bold; background: linear-gradient(#3a2810, #1a0f04); border: 1px solid var(--guild-border); - color: #fff; + color: #f0d060; white-space: nowrap; } .gh-rank-badge.leader { @@ -203,14 +203,14 @@ font-family: "Cinzel", serif; font-size: 12px; font-weight: bold; - color: #fff; + color: #f0d060; flex-shrink: 0; } .gh-guild-name { font-family: "Cinzel", serif; font-size: 13px; font-weight: bold; - color: #fff; + color: #f0d9a6; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -218,7 +218,7 @@ .gh-guild-desc { font-family: "Cinzel", serif; font-size: 10px; - color: #fff; + color: #c8a86a; line-height: 1.5; flex: 1; } @@ -227,14 +227,14 @@ justify-content: space-between; font-family: "Cinzel", serif; font-size: 10px; - color: #fff; + color: var(--guild-text); } .gh-guild-open { - color: #fff; + color: var(--guild-text); font-weight: bold; } .gh-guild-closed { - color: #fff; + color: var(--guild-text); font-weight: bold; } @@ -244,7 +244,7 @@ background: linear-gradient(#3a2810, #1a0f04); border: 2px solid var(--guild-border); border-radius: 6px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 11px; font-weight: bold; @@ -254,7 +254,7 @@ } .gh-join-btn:hover:not(:disabled) { border-color: #7a4a00; - color: #fff; + color: var(--guild-text); } .gh-join-btn:disabled { opacity: .45; @@ -262,7 +262,7 @@ } .gh-join-btn.pending { border-color: #6a3a00; - color: #fff; + color: var(--guild-text); } /* ── Gilde gründen ──────────────────────────────────────── */ @@ -281,7 +281,7 @@ .gh-form-label { font-family: "Cinzel", serif; font-size: 11px; - color: #fff; + color: var(--guild-text); letter-spacing: 1px; } .gh-form-input, @@ -290,7 +290,7 @@ background: rgba(0,0,0,.5); border: 2px solid var(--guild-border); border-radius: 7px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 13px; padding: 7px 10px; @@ -308,7 +308,7 @@ background: linear-gradient(#6b4b2a, #3c2414); border: 2px solid var(--guild-gold); border-radius: 8px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 13px; font-weight: bold; @@ -323,7 +323,7 @@ .gh-error-msg { font-family: "Cinzel", serif; font-size: 11px; - color: #fff; + color: var(--guild-text); text-align: center; } @@ -359,18 +359,18 @@ .gh-task-label { font-family: "Cinzel", serif; font-size: 13px; - color: #fff; + color: #f0d9a6; font-weight: bold; } .gh-task-reward { font-family: "Cinzel", serif; font-size: 11px; - color: #fff; + color: #f0d060; } .gh-task-done-badge { font-family: "Cinzel", serif; font-size: 11px; - color: #fff; + color: #7de87d; font-weight: bold; } @@ -398,7 +398,7 @@ .gh-task-progress-text { font-family: "Cinzel", serif; font-size: 10px; - color: #fff; + color: var(--guild-text); display: flex; justify-content: space-between; } @@ -423,13 +423,13 @@ .gh-request-name { font-family: "Cinzel", serif; font-size: 12px; - color: #fff; + color: #1a0800; flex: 1; } .gh-request-msg { font-family: "Cinzel", serif; font-size: 10px; - color: #fff; + color: #5a3010; font-style: italic; flex: 2; overflow: hidden; @@ -450,13 +450,13 @@ .gh-req-accept { background: linear-gradient(#1a4a18, #0f2a0e); border: 2px solid #4a8a3c; - color: #fff; + color: var(--guild-text); } .gh-req-accept:hover { border-color: #7ada60; } .gh-req-reject { background: linear-gradient(#4a1010, #2a0808); border: 2px solid #8a3030; - color: #fff; + color: var(--guild-text); } .gh-req-reject:hover { border-color: #ff6060; } @@ -474,7 +474,7 @@ font-family: "Cinzel", serif; font-size: 20px; font-weight: bold; - color: #fff; + color: var(--guild-text); background: linear-gradient(#6b4b2a, #3c2414); border: 2px solid var(--guild-gold); border-radius: 8px; @@ -484,12 +484,12 @@ font-family: "Cinzel", serif; font-size: 16px; font-weight: bold; - color: #fff; + color: #f0d9a6; } .gh-my-sub { font-family: "Cinzel", serif; font-size: 11px; - color: #fff; + color: #a08060; } .gh-leave-btn { margin-left: auto; @@ -497,13 +497,13 @@ background: linear-gradient(#3a1010, #1a0808); border: 2px solid #6a2020; border-radius: 7px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 11px; cursor: pointer; transition: .15s; } -.gh-leave-btn:hover { border-color: #cc4040; color: #fff; } +.gh-leave-btn:hover { border-color: #cc4040; color: var(--guild-text); } /* ── Suche ──────────────────────────────────────────────── */ .gh-search-bar { @@ -518,7 +518,7 @@ background: rgba(0,0,0,.5); border: 2px solid var(--guild-border); border-radius: 7px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 12px; padding: 6px 10px; @@ -530,7 +530,7 @@ background: linear-gradient(#3a2810, #1a0f04); border: 2px solid var(--guild-border); border-radius: 7px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 12px; cursor: pointer; @@ -547,7 +547,7 @@ height: 100%; gap: 12px; font-family: "Cinzel", serif; - color: #fff; + color: var(--guild-text); text-align: center; padding: 24px; } @@ -568,7 +568,7 @@ background: linear-gradient(#3a2810, #1a0f04); border: 1px solid var(--guild-border); border-radius: 5px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 11px; padding: 3px 10px; @@ -588,14 +588,14 @@ padding: 40px; font-family: "Cinzel", serif; font-size: 13px; - color: #fff; + color: #5a3010; } /* ── Section-Header innerhalb Panel ────────────────────── */ .gh-section-title { font-family: "Cinzel", serif; font-size: 12px; - color: #fff; + color: #4a2000; letter-spacing: 2px; text-transform: uppercase; padding: 8px 16px 4px; @@ -608,7 +608,7 @@ background: rgba(0,0,0,.5); border: 1px solid var(--guild-border); border-radius: 5px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 11px; padding: 2px 5px; @@ -619,7 +619,7 @@ background: linear-gradient(#4a1010, #2a0808); border: 1px solid #8a3030; border-radius: 5px; - color: #fff; + color: var(--guild-text); font-family: "Cinzel", serif; font-size: 10px; cursor: pointer; @@ -641,63 +641,73 @@ ══════════════════════════════════════════════ */ /* Gilden-Karte (dunkler Hintergrund) */ -.gh-guild-card .gh-guild-name { color: #fff !important; } -.gh-guild-card .gh-guild-desc { color: #fff !important; } -.gh-guild-card .gh-guild-meta { color: #fff !important; } -.gh-guild-card .gh-guild-open { color: #fff !important; } -.gh-guild-card .gh-guild-closed { color: #fff !important; } -.gh-guild-tag { color: #fff !important; } +.gh-guild-card .gh-guild-name { color: #f0d9a6 !important; } +.gh-guild-card .gh-guild-desc { color: #c8a86a !important; } +.gh-guild-card .gh-guild-meta { color: var(--guild-text) !important; } +.gh-guild-card .gh-guild-open { color: var(--guild-text) !important; } +.gh-guild-card .gh-guild-closed { color: var(--guild-text) !important; } +.gh-guild-tag { color: #f0d060 !important; } /* Eigene Gilde Info-Box (dunkler Hintergrund) */ -.gh-my-info .gh-my-name { color: #fff !important; } -.gh-my-info .gh-my-sub { color: #fff !important; } +.gh-my-info .gh-my-name { color: #f0d9a6 !important; } +.gh-my-info .gh-my-sub { color: #a08060 !important; } /* Rang-Badge */ -.gh-rank-badge { color: #fff !important; } +.gh-rank-badge { color: #f0d060 !important; } .gh-rank-badge.leader { color: #fff !important; } /* Mitglieder-Tabelle (Pergament) */ -.gh-members-table th { color: #fff !important; } -.gh-members-table td { color: #fff !important; } +.gh-members-table th { color: #3a1a05 !important; } +.gh-members-table td { color: #1a0800 !important; } /* Aufgaben-Karten (dunkler Hintergrund) */ -.gh-task-card .gh-task-label { color: #fff !important; } -.gh-task-card .gh-task-reward { color: #fff !important; } -.gh-task-card .gh-task-done-badge { color: #fff !important; } -.gh-task-card .gh-task-progress-text { color: #fff !important; } +.gh-task-card .gh-task-label { color: #f0d9a6 !important; } +.gh-task-card .gh-task-reward { color: #f0d060 !important; } +.gh-task-card .gh-task-done-badge { color: #7de87d !important; } +.gh-task-card .gh-task-progress-text { color: var(--guild-text) !important; } /* Suche (Pergament) */ -.gh-search-input { color: #fff !important; background: rgba(255,255,255,.5) !important; } -.gh-search-input::placeholder { color: #fff !important; } -.gh-search-btn { color: #fff !important; } +.gh-search-input { color: var(--guild-text) !important; background: rgba(255,255,255,.5) !important; } +.gh-search-input::placeholder { color: var(--guild-text) !important; } +.gh-search-btn { color: var(--guild-text) !important; } /* Formular (Pergament) */ -.gh-form-label { color: #fff !important; } +.gh-form-label { color: var(--guild-text) !important; } .gh-form-input, .gh-form-textarea, .gh-form-select { - color: #fff !important; + color: var(--guild-text) !important; background: rgba(255,255,255,.6) !important; } .gh-form-input::placeholder, -.gh-form-textarea::placeholder { color: #fff !important; } +.gh-form-textarea::placeholder { color: var(--guild-text) !important; } /* Section-Titel (Pergament) */ -.gh-section-title { color: #fff !important; } +.gh-section-title { color: #4a2000 !important; } /* Leer/Lade (Pergament) */ -.gh-loading, .gh-empty { color: #fff !important; } -.gh-no-guild { color: #fff !important; } +.gh-loading, .gh-empty { color: #5a3010 !important; } +.gh-no-guild { color: var(--guild-text) !important; } /* Anfragen (Pergament-Hintergrund) */ -.gh-request-name { color: #fff !important; } -.gh-request-msg { color: #fff !important; } +.gh-request-name { color: #1a0800 !important; } +.gh-request-msg { color: #5a3010 !important; } /* Pagination (Pergament) */ .gh-page-btn { - color: #fff !important; + color: var(--guild-text) !important; background: rgba(200,160,80,.2) !important; border-color: #8b6a3c !important; } .gh-page-btn.active { background: linear-gradient(#6b4b2a, #3c2414) !important; - color: #fff !important; + color: var(--guild-text) !important; } + +/* ── Gilde gründen Formular – weiße Schrift ─────────────── */ +.gh-create-form .gh-form-label { color: #fff !important; } +.gh-create-form .gh-form-input, +.gh-create-form .gh-form-textarea, +.gh-create-form .gh-form-select { color: #fff !important; background: rgba(0,0,0,.45) !important; } +.gh-create-form .gh-form-input::placeholder, +.gh-create-form .gh-form-textarea::placeholder { color: rgba(255,255,255,.5) !important; } +.gh-create-form .gh-error-msg { color: #ff9090 !important; } +.gh-create-form .mp-col-header { color: #f0d9a6 !important; } diff --git a/public/js/buildings/gildenhalle.js b/public/js/buildings/gildenhalle.js index 2451e8d..30f4e1a 100644 --- a/public/js/buildings/gildenhalle.js +++ b/public/js/buildings/gildenhalle.js @@ -5,7 +5,8 @@ let gh_initialized = false; let gh_page = 1; let gh_search = ''; -let gh_playerGuild = null; +let gh_playerGuild = null; +let gh_isGuildLeader = false; function ghLoadCSS() { if (!document.querySelector('link[href="/css/gildenhalle.css"]')) { @@ -51,7 +52,7 @@ function ghEnsurePopup() { placeholder="Gildennamen oder Tag suchen…" /> + style="border-color:var(--guild-text);color:var(--guild-text);">+ Gründen
Lade Gilden…
@@ -130,7 +131,24 @@ function ghEnsurePopup() { }); /* Gründen-Toggle */ +function ghUpdateCreateBtn() { + const btn = document.getElementById('gh-create-toggle-btn'); + if (!btn) return; + if (gh_isGuildLeader) { + btn.disabled = true; + btn.title = 'Gildenmeister können keine weitere Gilde gründen'; + btn.style.opacity = '0.4'; + btn.style.cursor = 'not-allowed'; + } else { + btn.disabled = false; + btn.title = ''; + btn.style.opacity = ''; + btn.style.cursor = ''; + } +} + document.getElementById('gh-create-toggle-btn').addEventListener('click', () => { + if (gh_isGuildLeader) return; document.getElementById('gh-create-form-wrap').style.display = 'block'; document.getElementById('gh-create-error').textContent = ''; }); @@ -183,7 +201,9 @@ async function ghLoadGuildList() { try { const res = await fetch(`/api/gildenhalle/list?search=${encodeURIComponent(gh_search)}&page=${gh_page}`); const data = await res.json(); - gh_playerGuild = data.playerGuildId; + gh_playerGuild = data.playerGuildId; + gh_isGuildLeader = data.isGuildLeader || false; + ghUpdateCreateBtn(); if (!data.guilds.length) { grid.innerHTML = '
Keine Gilden gefunden.
'; @@ -330,7 +350,7 @@ async function ghLoadMyGuild() { : `${m.rank_name || '–'}` } - + ${new Date(m.joined_at).toLocaleDateString('de-DE')} @@ -461,8 +481,8 @@ async function ghLoadTasks() { container.innerHTML = `
- Gemeinsame Aufgaben der Gilde ${data.guildName} + color:var(--guild-text);border-bottom:1px solid rgba(139,106,42,.25);"> + Gemeinsame Aufgaben der Gilde ${data.guildName}
${data.tasks.map(t => { diff --git a/routes/gildenhalle.route.js b/routes/gildenhalle.route.js index f69fe9e..2899f28 100644 --- a/routes/gildenhalle.route.js +++ b/routes/gildenhalle.route.js @@ -30,7 +30,7 @@ async function getPlayerGuild(userId) { async function createDefaultRanks(guildId) { const ranks = [ { name: 'Gildenmeister', sort_order: 1, can_invite: 1, can_kick: 1, can_manage_ranks: 1, can_manage_tasks: 1 }, - { name: 'Offizier', sort_order: 2, can_invite: 1, can_kick: 1, can_manage_ranks: 0, can_manage_tasks: 1 }, + { name: 'Stellv. Gildenmeister', sort_order: 2, can_invite: 1, can_kick: 1, can_manage_ranks: 0, can_manage_tasks: 1 }, { name: 'Veteran', sort_order: 3, can_invite: 1, can_kick: 0, can_manage_ranks: 0, can_manage_tasks: 0 }, { name: 'Mitglied', sort_order: 99, can_invite: 0, can_kick: 0, can_manage_ranks: 0, can_manage_tasks: 0 }, ]; @@ -109,6 +109,12 @@ router.get('/gildenhalle/list', requireLogin, async (req, res) => { const playerGuild = await getPlayerGuild(userId); + // Gildenmeister und Stellv. Gildenmeister dürfen keine weitere Gilde gründen + const leaderRanks = ['Gildenmeister', 'Stellv. Gildenmeister']; + const isGuildLeader = playerGuild + ? (playerGuild.leader_id === userId || leaderRanks.includes(playerGuild.rank_name)) + : false; + res.json({ guilds: guilds.map(g => ({ ...g, @@ -118,6 +124,7 @@ router.get('/gildenhalle/list', requireLogin, async (req, res) => { totalPages: Math.ceil(total / limit), page, playerGuildId: playerGuild?.id || null, + isGuildLeader, }); } catch (err) { console.error('[gildenhalle/list]', err); @@ -140,7 +147,14 @@ router.post('/gildenhalle/create', requireLogin, async (req, res) => { try { const existing = await getPlayerGuild(userId); - if (existing) return res.status(400).json({ error: 'Du bist bereits in einer Gilde.' }); + if (existing) { + // Gildenmeister oder Rang mit can_manage_ranks dürfen keine neue Gilde gründen + const leaderRanks = ['Gildenmeister', 'Stellv. Gildenmeister']; + if (existing.leader_id === userId || leaderRanks.includes(existing.rank_name)) { + return res.status(403).json({ error: 'Gildenmeister und Stellv. Gildenmeister können keine weitere Gilde gründen.' }); + } + return res.status(400).json({ error: 'Du bist bereits in einer Gilde.' }); + } const [result] = await db.query( `INSERT INTO guilds (name, tag, description, leader_id, open) @@ -181,7 +195,14 @@ router.post('/gildenhalle/join/:id', requireLogin, async (req, res) => { try { const existing = await getPlayerGuild(userId); - if (existing) return res.status(400).json({ error: 'Du bist bereits in einer Gilde.' }); + if (existing) { + // Gildenmeister oder Rang mit can_manage_ranks dürfen keine neue Gilde gründen + const leaderRanks = ['Gildenmeister', 'Stellv. Gildenmeister']; + if (existing.leader_id === userId || leaderRanks.includes(existing.rank_name)) { + return res.status(403).json({ error: 'Gildenmeister und Stellv. Gildenmeister können keine weitere Gilde gründen.' }); + } + return res.status(400).json({ error: 'Du bist bereits in einer Gilde.' }); + } const [[guild]] = await db.query('SELECT * FROM guilds WHERE id = ?', [guildId]); if (!guild) return res.status(404).json({ error: 'Gilde nicht gefunden.' });