From f930deaba899893482ae39ff455632329f02c4e0 Mon Sep 17 00:00:00 2001 From: bytedream <bytedream@protonmail.com> Date: Wed, 30 Oct 2024 01:35:11 +0100 Subject: [PATCH] add faq --- src/routes/+layout.svelte | 6 + src/routes/admin/settings/+page.server.ts | 3 + src/routes/admin/settings/+page.svelte | 10 ++ src/routes/admin/settings/+server.ts | 22 +-- src/routes/faq/+layout.svelte | 2 +- src/routes/faq/+page.server.ts | 8 + src/routes/faq/+page.svelte | 206 ++++++++++++++++++++-- src/routes/team/+page.svelte | 3 - static/img/menu-faq.png | Bin 0 -> 285 bytes 9 files changed, 236 insertions(+), 24 deletions(-) create mode 100644 src/routes/faq/+page.server.ts create mode 100644 static/img/menu-faq.png diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f8ca62c..87c0e04 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -22,6 +22,12 @@ sprite: `${env.PUBLIC_BASE_PATH}/img/menu-rules.png`, href: `${env.PUBLIC_BASE_PATH}/rules`, active: false + }, + { + name: 'FAQ', + sprite: `${env.PUBLIC_BASE_PATH}/img/menu-faq.png`, + href: `${env.PUBLIC_BASE_PATH}/faq`, + active: false } ]; diff --git a/src/routes/admin/settings/+page.server.ts b/src/routes/admin/settings/+page.server.ts index e47c981..5f731cf 100644 --- a/src/routes/admin/settings/+page.server.ts +++ b/src/routes/admin/settings/+page.server.ts @@ -22,6 +22,9 @@ export const load: PageServerLoad = async ({ parent, cookies }) => { return { settings: { + global: { + paypal_link: settings['global.paypal_link'] ?? '' + }, register: { enabled: settings['register.enabled'] ?? true, disabled_title: settings['register.disabled_title'] ?? 'Anmeldung geschlossen', diff --git a/src/routes/admin/settings/+page.svelte b/src/routes/admin/settings/+page.svelte index 0dbec79..d8c9de9 100644 --- a/src/routes/admin/settings/+page.svelte +++ b/src/routes/admin/settings/+page.svelte @@ -8,6 +8,9 @@ await fetch(`${env.PUBLIC_BASE_PATH}/admin/settings`, { method: 'POST', body: JSON.stringify({ + global: { + paypal_link: returnIfNoDup(settings.global.paypal_link, data.settings.global.paypal_link) + }, register: { enabled: returnIfNoDup(settings.register.enabled, data.settings.register.enabled), disabled_title: returnIfNoDup( @@ -32,6 +35,13 @@ <div class="h-full flex flex-col items-center justify-between"> <div class="grid grid-cols-3 w-full [&>*]:mx-8"> + <div> + <div class="divider">Global</div> + <label class="label"> + <span class="label-text">PayPal-Spendenlink</span> + <input type="text" class="input input-bordered" bind:value={settings.global.paypal_link} /> + </label> + </div> <div> <div class="divider">Anmeldung</div> <label class="label cursor-pointer"> diff --git a/src/routes/admin/settings/+server.ts b/src/routes/admin/settings/+server.ts index cc87c33..f51ddf3 100644 --- a/src/routes/admin/settings/+server.ts +++ b/src/routes/admin/settings/+server.ts @@ -13,16 +13,18 @@ export const POST = (async ({ request, cookies }) => { const settings: PageData['settings'] = await request.json(); - for (const [key, value] of Object.entries(settings.register)) { - const setting = await Settings.findOne({ where: { key: `register.${key}` } }); - if (setting) { - setting.value = JSON.stringify(value); - await setting.save(); - } else { - await Settings.create({ - key: `register.${key}`, - value: JSON.stringify(value) - }); + for (const [group, entries] of Object.entries(settings)) { + for (const [key, value] of Object.entries(entries)) { + const setting = await Settings.findOne({ where: { key: `${group}.${key}` } }); + if (setting) { + setting.value = JSON.stringify(value); + await setting.save(); + } else { + await Settings.create({ + key: `${group}.${key}`, + value: JSON.stringify(value) + }); + } } } diff --git a/src/routes/faq/+layout.svelte b/src/routes/faq/+layout.svelte index 8f75643..cf738e3 100644 --- a/src/routes/faq/+layout.svelte +++ b/src/routes/faq/+layout.svelte @@ -1,3 +1,3 @@ -<div class="mx-4 my-6 sm:mx-3 sm:my-12"> +<div class="mx-4 my-6 sm:mx-24 sm:my-12"> <slot /> </div> diff --git a/src/routes/faq/+page.server.ts b/src/routes/faq/+page.server.ts new file mode 100644 index 0000000..db0a81b --- /dev/null +++ b/src/routes/faq/+page.server.ts @@ -0,0 +1,8 @@ +import type { PageServerLoad } from './$types'; +import { Settings } from '$lib/server/database'; + +export const load: PageServerLoad = async () => { + return { + paypal_link: (await Settings.findOne({ where: { key: 'global.paypal_link' } }))?.value ?? '' + }; +}; diff --git a/src/routes/faq/+page.svelte b/src/routes/faq/+page.svelte index 29f4d2a..7ad8577 100644 --- a/src/routes/faq/+page.svelte +++ b/src/routes/faq/+page.svelte @@ -1,16 +1,202 @@ <script lang="ts"> - let questions = [ + import type { PageData } from './$types'; + + export let data: PageData; + + let faq = [ { - title: '', - content: '' + section: 'Anmeldung', + questions: [ + { + title: 'Wann startet CraftAttack 7?', + content: `<p>Der Start von CraftAttack 7 findet gemeinsam am 27.12.2024 um 14:00 Uhr statt. Am besten +bist du schon einige Minuten vorher auf dem Server. Natürlich kannst du aber auch danach +jederzeit dazustoßen.</p>` + }, + { + title: 'Wer kann alles mitspielen?', + content: `<p>Jeder, der entweder Minecraft Java oder Bedrock (Handy und Konsole) besitzt und +mindestens 6 Jahre alt ist, kann mitspielen.</p>` + }, + { + title: 'Wie kann ich mitspielen?', + content: `<p>Um mitzuspielen, musst du dich einfach hier auf der Website anmelden und der WhatsApp- +Gruppe beitreten.</p>` + }, + { + title: 'Auf welcher Version läuft der Server?', + content: `<p>Gespielt wird immer auf der neuesten Version, also laut aktuellem Stand Version 1.21.3.</p>` + }, + { + title: 'Kann ich auch als Bedrock-Spieler (Handy oder Konsole) mitspielen?', + content: `<p>Ja, auch als Bedrock-Spieler kannst du mitspielen, sofern du anderen Servern beitreten kannst.</p>` + }, + { + title: 'Ich kann mich nicht anmelden, was kann ich tun?', + content: `<p>Wenn du dich nicht anmelden kannst, solltest du Folgendes überprüfen:</p> +<ol class="list-decimal pl-8 py-3"> +<li>Ist dein Spielername korrekt geschrieben?</li> +<li>Hast du dich bereits angemeldet? Es ist nur ein Account pro Spieler erlaubt.</li> +<li>Hast du die richtige Spieledition ausgewählt?</li> +</ol> +<p>Falls du dich aus unerklärlichen Gründen trotzdem nicht anmelden kannst, kannst du +dich jederzeit beim Admin-Team melden.</p>` + }, + { + title: 'Ich komme nicht auf den Server, was kann ich tun?', + content: `<p>Wenn du dem Server nicht beitreten kannst, überprüfe Folgendes:</p> +<ol class="list-decimal pl-8 py-3"> +<li>Hast du die korrekte IP verwendet? Sie lautet craftattack.mhsl.eu.</li> +<li>Hast du Leerzeichen verwendet, insbesondere vor oder hinter der IP, oder dich vertippt?</li> +<li>Kommst du auf andere Server, oder ist es nur ein Problem beim CraftAttack-Server?</li> +<li>Hast du dich korrekt auf der Webseite angemeldet?</li> +</ol> +<p>Falls du trotzdem nicht beitreten kannst, melde dich beim Admin-Team und halte die +Fehlermeldung bereit.</p>` + }, + { + title: 'Was ist die Server-IP?', + content: `<p>Die Serveradresse lautet: <span class="underline italic">craftattack.mhsl.eu</span></p>` + }, + { + title: 'Ist es kostenlos mitzuspielen?', + content: `<p>Ja, die Teilnahme ist selbstverständlich kostenlos. Wir freuen uns aber, wenn du das Projekt +mit einer Spende nach der Anmeldung unterstützen würdest.<\br> +Hier kannst du für das Projekt spenden: <a class="link" href=${data.paypal_link}>${data.paypal_link}</a></p>` + }, + { + title: + 'Die Anmeldefrist ist vorbei, aber ich möchte mich trotzdem noch anmelden. Was kann ich tun?', + content: `Generell solltest du dich immer während des Anmeldezeitraums anmelden. Falls die +Anmeldung allerdings bereits geschlossen ist, kannst du einen Admin kontaktieren, der dich +im Fall der Fälle noch nachträglich anmelden kann.` + }, + { + title: 'Ist ein 2. Account erlaubt?', + content: `<p>Nein, pro Teilnehmer ist nur ein Account zugelassen.</p>` + } + ] + }, + { + section: 'Anderes', + questions: [ + { + title: 'Wie kann ich einen Admin kontaktieren?', + content: `<p>Einen Admin kannst du im Chat, über WhatsApp, per Teamspeak (<span class="underline italic">mhsl.eu</span>) oder Discord kontaktieren.</p>` + }, + { + title: 'Wer ist eigentlich Organisator und warum?', + content: `<p>Wir sind ein kleines Team von Minecraft-Enthusiasten, das bereits im siebten Jahr in Folge +Minecraft CraftAttack organisiert. Jedes Jahr arbeiten wir daran, das Spielerlebnis zu +verbessern und die Teilnehmerzahl zu steigern. Weitere Infos findest du auf der Teamseite.</p>` + }, + { + title: 'Wie lange bleibt der Server online?', + content: `<p>Der Server wird traditionell so lange online bleiben, wie noch aktiv darauf gespielt wird.</p>` + }, + { + title: 'Warum benötigt ihr meine Daten bei der Anmeldung?', + content: `<p>Deine Daten werden nur intern gespeichert und dienen den Admins rein zur Organisation +des Projekts.</p>` + }, + { + title: 'Gibt es einen Teamspeak-Server?', + content: `<p>Ja, den offiziellen Teamspeak-Server erreichst du unter der IP <span class="underline italic">mhsl.eu</span>.</p>` + }, + { + title: 'Wozu dient die CraftAttack-WhatsApp-Gruppe?', + content: `<p>In der WhatsApp-Gruppe erhältst du alle wichtigen Infos bezüglich CraftAttack.</p>` + } + ] + }, + { + section: 'Ingame', + questions: [ + { + title: 'Wo kann ich meinen Shop errichten?', + content: `<p>Generell darfst du Shops überall errichten, aber es bietet sich an, alle Shops in einem +Shopping-District nahe des Spawns anzusiedeln.</p>` + }, + { + title: 'Sind Farmen erlaubt?', + content: `<p>Ja, Farmen sind generell erlaubt. Allerdings sind lag-erzeugende Maschinen, Farmen (Zero- +Tick-Farmen etc.) oder andere Bauten, die den Spielfluss stören könnten, verboten.</p>` + }, + { + title: 'Was und wann sind Events?', + content: `<p>Abends, meist gegen 18 Uhr, finden gelegentlich Events statt, bei denen du Items gewinnen +kannst und in kleinen Minispielen gegen deine Mitspieler antrittst. Die genauen Abläufe +siehst du, wenn du abends auf dem Server bist.</p>` + }, + { + title: 'Wo und wie kann ich einen Regelverstoß melden?', + content: `<p>Wenn du einen Regelverstoß melden willst, kannst du ingame den Befehl /report nutzen, um +einen Admin zu kontaktieren.</p>` + }, + { + title: 'Was hat es mit dem Blutmond auf sich?', + content: `<p>Alle dreißig ingame-Tage solltest du nachts auf der Hut sein, denn die Monster sind in dieser +Nacht deutlich stärker als üblich, droppen aber auch besseren Loot.</p>` + }, + { + title: 'Was hat es mit dem Vogelfrei-Modus auf sich?', + content: `CraftAttack ist grundsätzlich ein friedliches Projekt. Falls du jedoch kein Problem damit hast, +angegriffen zu werden, kannst du dich mit /vogelfrei in den Vogelfrei-Modus setzen. +Dadurch sehen andere Spieler, dass du für einen Kampf offen bist. Der Vogelfrei-Modus kann +allerdings erst nach einigen Stunden wieder beendet werden.` + }, + { + title: 'Was hat es mit dem Rang „Langzeitspieler“ auf sich?', + content: `Spieler, die seit über drei Jahren am Projekt teilnehmen, erhalten den Langzeitrang. Dieser +wirkt sich allerdings nicht auf das Spielgeschehen aus.` + }, + { + title: 'Was gibt es für neue coole Features?', + content: `<ul class="list-disc pl-8"> +<li>Miniböcke, die du selbst gestalten kannst</li> +<li>Neue Event-Spiele</li> +<li>Einige Quality-of-Life-Features, die du mit <code>/settings</code> erreichst</li> +<li>Langzeitrang</li> +</ul>` + }, + { + title: 'Wann wird das End geöffnet?', + content: `<p>Das End wird gemeinsam am <span class="underline">03.01.2025</span> um <span class="underline">19:00 Uhr</span> geöffnet, und wir besiegen +gemeinsam den Enderdrachen.</p>` + }, + { + title: 'Darf ich andere Spieler töten?', + content: `<p>Andere Spieler zu töten ist generell verboten. Wenn es jedoch nur zum Spaß und mit dem +anderen Spieler abgesprochen ist, haben wir nichts dagegen einzuwenden. Außerdem ist es +erlaubt, vogelfreie Spieler zu töten.</p>` + }, + { + title: 'Welche Minecraft-Clients sind erlaubt?', + content: `<p>Jegliche Clientmodifikationen, die deutliche Vorteile gegenüber anderen Spielern bringen, +sind nicht gestattet.</p>` + } + ] } ]; </script> -{#each questions as question} - <div class="collapse collapse-plus bg-base-200"> - <input type="radio" /> - <div class="collapse-title text-xl font-medium">{question.title}</div> - <div class="collapse-content">{@html question.content}</div> - </div> -{/each} +<h1 class="text-3xl lg:text-5xl mb-16 text-center">FAQ</h1> +<div class="flex flex-row gap-10"> + {#each faq as questions} + <div> + <h2 class="text-4xl text-center mb-3">{questions.section}</h2> + <div> + {#each questions.questions as question} + <div class="collapse collapse-arrow"> + <input type="checkbox" autocomplete="off" /> + <div class="collapse-title">{question.title}</div> + <div class="collapse-content"> + <div class="ml-2">{@html question.content}</div> + </div> + </div> + <span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" /> + {/each} + </div> + </div> + {/each} +</div> diff --git a/src/routes/team/+page.svelte b/src/routes/team/+page.svelte index 192d111..157b193 100644 --- a/src/routes/team/+page.svelte +++ b/src/routes/team/+page.svelte @@ -76,6 +76,3 @@ </div> {/each} </div> - -<style> -</style> diff --git a/static/img/menu-faq.png b/static/img/menu-faq.png new file mode 100644 index 0000000000000000000000000000000000000000..1016fe3b92da35dc599b0cd90f92875c76bf3fb1 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}cz{ocE0CU2<glsRe@TN+O`=(v zzxFI;<*k$AmNofq?F~o|(3w`^cyNAJU6OgZ0efkmU|bRJL_xu=RfdMii<322-9v<T zOo`t&H`CEj>fC<KJz`>hO6*#GRZ(2teL$lbOM?7@862M7NCR?8JY5_^DsF`y-0sNW zD8OQHcHjAz`(5|!->>TCr6}ubveJ*CWcdx7h_!1cHZ4DPO}eUcp3$o6Srb!Vu3J{R z>(-`COaacD7#gfU#y_yiKl$@lUz64KsrNZqjTh%QG@k$4u{xpk*Wa~<OhsG2u&`!_ eegDO~O}c)1wO+(ap#Vjo{S2P2elF{r5}E*0rfOOM literal 0 HcmV?d00001