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