update dependencies
deploy / build-and-deploy (push) Failing after 10s

This commit is contained in:
bytedream committed 2026-10-29 13:04:33 +01:00
1 parent b11d25e64b
commit 0de6ee4ca2
21 files changed
+2752 -4326

No files matched your search

+2624 -4196
View File
File diff suppressed because it is too large. Load diff
+29 -24
View File
@@ -11,35 +11,40 @@
"format": "prettier --write ."
},
"dependencies": {
"@astrojs/node": "^9.5.1",
"@astrojs/svelte": "^7.2.4",
"@astrojs/node": "^11.1.9",
"@astrojs/svelte": "^9.1.2",
"@iconify-json/fa-brands": "^1.2.2",
"@iconify-json/heroicons": "^1.2.3",
"@iconify/tailwind4": "^1.2.0",
"@tailwindcss/vite": "^4.1.18",
"astro": "^5.16.6",
"@iconify/tailwind4": "^1.2.3",
"@tailwindcss/vite": "^4.3.3",
"astro": "^7.4.4",
"bcrypt": "^6.0.0",
"daisyui": "^5.5.14",
"drizzle-orm": "^0.45.1",
"mysql2": "^3.16.0",
"nanostores": "^1.1.0",
"pino": "^10.1.0",
"sass-embedded": "^1.97.1",
"skinview3d": "^3.4.1",
"tailwindcss": "^4.1.18",
"typescript": "^5.9.3"
"daisyui": "^5.7.50",
"drizzle-orm": "^0.45.4",
"mysql2": "^3.24.6",
"nanostores": "^1.5.5",
"pino": "^10.4.0",
"sass-embedded": "^1.107.0",
"skinview3d": "^3.4.2",
"tailwindcss": "^4.3.3",
"typescript": "^6.0.3"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@types/bcrypt": "^6.0.0",
"@typescript-eslint/parser": "^8.52.0",
"eslint": "^9.39.2",
"eslint-plugin-astro": "^1.5.0",
"eslint-plugin-svelte": "^3.13.1",
"globals": "^17.0.0",
"prettier": "^3.7.4",
"prettier-plugin-astro": "^0.14.1",
"prettier-plugin-svelte": "^3.4.1",
"svelte": "^5.46.1",
"typescript-eslint": "^8.52.0"
"@typescript-eslint/parser": "^8.72.1",
"eslint": "^10.13.0",
"eslint-plugin-astro": "^3.2.1",
"eslint-plugin-svelte": "^3.23.1",
"globals": "^17.13.0",
"prettier": "^3.9.10",
"prettier-plugin-astro": "^1.1.2",
"prettier-plugin-svelte": "^4.1.1",
"svelte": "^5.57.3",
"typescript-eslint": "^8.72.1"
},
"allowScripts": {
"@parcel/watcher": false,
"bcrypt": false
}
}
+1 -2
View File
@@ -136,8 +136,7 @@
onchange={(e) => {
entry.onChange(e.currentTarget.value);
changes = dynamicSettings.getChanges();
}}
></textarea>
}}></textarea>
{/if}
</div>
</label>
+18 -15
View File
@@ -84,10 +84,10 @@ const { signupDisabled, signupHash } = Astro.props;
<div class="divider">Spiel</div>
<div class="mx-2 grid grid-cols-1 sm:grid-cols-2 gap-x-4">
<Input id="username" type="text" label="Minecraft-Spielername" required dynamicWidth>
<span slot="notice" class="text-[.65rem]"
>Spielern der Bedrock-Edition wird empfohlen, ihren Microsoft-Account Namen einzugeben. Der
Bedrock-Spielername kann nicht immer einem Minecraft Account zugeordnet werden.</span
>
<span slot="notice" class="text-[.65rem]">
Spielern der Bedrock-Edition wird empfohlen, ihren Microsoft-Account Namen einzugeben. Der
Bedrock-Spielername kann nicht immer einem Minecraft Account zugeordnet werden.
</span>
</Input>
<Select
id="edition"
@@ -101,11 +101,10 @@ const { signupDisabled, signupHash } = Astro.props;
<div class="mx-2 grid gap-y-3 mb-6">
<Checkbox id="checkbox" required>
<span slot="label">
Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden. Siehe <a
class="link"
href="https://mhsl.eu/id.html"
target="_blank">Datenschutz</a
>
Ich bin mit der Speicherung meiner in der Anmeldung angegebenen, persönlichen Daten einverstanden. Siehe{' '}
<a class="link" href="https://mhsl.eu/id.html" target="_blank">
Datenschutz
</a>
</span>
</Checkbox>
<Checkbox id="logs" required>
@@ -120,11 +119,17 @@ const { signupDisabled, signupHash } = Astro.props;
</Checkbox>
<Checkbox id="rules" required>
<span slot="label">
Ich bin mit den <a class="link" onclick="">Regeln</a> einverstanden und achte sie
Ich bin mit den{' '}
<a class="link" onclick="">
Regeln
</a>{' '}
einverstanden und achte sie
</span>
</Checkbox>
</div>
<button id="send-btn" class="btn btn-neutral">Anmeldung absenden</button>
<button id="send-btn" class="btn btn-neutral">
Anmeldung absenden
</button>
</form>
</div>
</div>
@@ -143,14 +148,12 @@ const { signupDisabled, signupHash } = Astro.props;
newRegistrationAllowed={!signupHash}
/>
{
signupDisabled && (
{signupDisabled && (
<div class="absolute top-0 left-0 w-full h-full bg-black/50 backdrop-blur-sm z-10 rounded-xl flex justify-center items-center flex-col pt-20 lg:pt-0 text-2xl sm:text-4xl">
<h1>{signupDisabled.message}</h1>
<h3>{signupDisabled.subMessage}</h3>
</div>
)
}
)}
<script>
import { actions } from 'astro:actions';
+1 -4
View File
@@ -35,10 +35,7 @@
<SortableTh style="width: 1%" class="text-left">#</SortableTh>
{/if}
{#each keys as key (key.key)}
<SortableTh
class="text-left whitespace-nowrap lg:whitespace-normal"
key={key.sortable ? key.key : undefined}
>
<SortableTh class="text-left whitespace-nowrap lg:whitespace-normal" key={key.sortable ? key.key : undefined}>
{key.label}
</SortableTh>
{/each}
+1 -2
View File
@@ -31,6 +31,5 @@
bind:value
{required}
{rows}
{readonly}
></textarea>
{readonly}></textarea>
</fieldset>
+2 -4
View File
@@ -24,16 +24,14 @@ const { title, description, keywords, openGraph, viewTransition } = Astro.props;
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/png" href={favicon.src} />
<title>{title}</title>
{
openGraph && (
{openGraph && (
<>
<meta name="og:title" content={title} />
<meta property="og:url" content={Astro.url.pathname} />
<meta property="og:type" content="website" />
<meta property="og:image" content={logo512.src} />
</>
)
}
)}
<meta name="description" content={description} />
{keywords && <meta name="keywords" content={keywords.join(', ')} />}
<base href=`${BASE_PATH}/` />
+8 -18
View File
@@ -95,9 +95,7 @@ const adminTabs = [
<div class="navbar-center">
<a class="text-xl font-bold">{title}</a>
</div>
<div class="navbar-end">
<!-- Optional: Profile or logout shortcut -->
</div>
<div class="navbar-end"><!-- Optional: Profile or logout shortcut --></div>
</div>
<!-- Content Area -->
@@ -109,27 +107,22 @@ const adminTabs = [
<!-- Sidebar / Drawer Side -->
<div class="drawer-side z-20">
<label for="admin-drawer" aria-label="close sidebar" class="drawer-overlay"></label>
<aside
class="bg-base-200 w-max max-w-[85vw] h-full flex flex-col justify-between border-r border-base-300 overflow-y-auto"
>
<aside class="bg-base-200 w-max max-w-[85vw] h-full flex flex-col justify-between border-r border-base-300 overflow-y-auto">
<div class="flex flex-col min-w-max">
<div class="p-4 hidden lg:block border-b border-base-300">
<span class="text-xl font-bold">Admin Panel</span>
</div>
<ul class="menu p-2">
{
preTabs.map((tab) => (
{preTabs.map((tab) => (
<li>
<a href={tab.href}>
<span class="iconify" class:list={tab.iconClass} />
<span>{tab.name}</span>
</a>
</li>
))
}
))}
<div class="divider mx-1 my-1"></div>
{
adminTabs.map(
{adminTabs.map(
(tab) =>
tab.enabled && (
<li>
@@ -151,22 +144,19 @@ const adminTabs = [
)}
</li>
)
)
}
)}
</ul>
</div>
<div class="flex flex-col w-0 min-w-full">
<ul class="menu w-full p-2">
{
Astro.slots.has('actions') && (
{Astro.slots.has('actions') && (
<div class="mb-2">
<span class="menu-title px-2 uppercase text-xs font-semibold opacity-60">Actions</span>
<fieldset class="fieldset bg-base-300 border-base-100 rounded-box border p-2">
<slot name="actions" />
</fieldset>
</div>
)
}
)}
<div class="divider mx-1 my-0"></div>
<li>
<button id="logout" class="text-error whitespace-nowrap">
+6 -2
View File
@@ -26,8 +26,12 @@ const { title, description, footer = true } = Astro.props;
</div>
<div class="flex gap-12">
<div class="flex gap-4">
<a class="link" href="https://mhsl.eu/id.html" target="_blank">Impressum</a>
<a class="link" href="https://mhsl.eu/datenschutz.html" target="_blank">Datenschutz</a>
<a class="link" href="https://mhsl.eu/id.html" target="_blank">
Impressum
</a>
<a class="link" href="https://mhsl.eu/datenschutz.html" target="_blank">
Datenschutz
</a>
</div>
<div class="hidden sm:flex gap-2 items-center">
<a href="ts3server://mhsl.eu?port=9987" title="TeamSpeak" target="_blank">
+2 -3
View File
@@ -6,9 +6,8 @@ import WebsiteLayout from '@layouts/website/WebsiteLayout.astro';
<div class="flex flex-col justify-center items-center gap-4 h-full w-full absolute">
<h1 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl">404: Seite nicht gefunden</h1>
<p class="flex gap-2 text-center">
Es wurde keine Seite unter der URL <code class="contents mx-1 md:block md:my-0 md:whitespace-pre"
>{Astro.url.pathname}</code
> gefunden.
Es wurde keine Seite unter der URL{' '}
<code class="contents mx-1 md:block md:my-0 md:whitespace-pre">{Astro.url.pathname}</code> gefunden.
</p>
</div>
</WebsiteLayout>
+2 -4
View File
@@ -48,8 +48,7 @@ const team = [
<div class="m-auto flex flex-col justify-center items-center px-4 py-6 2xl:px-48 sm:py-12">
<h1 class="text-5xl mb-10">Die Admins</h1>
<div class="grid md:grid-cols-2 xl:grid-cols-3 gap-4 my-4 justify-center">
{
team.map((member) => (
{team.map((member) => (
<div class="card max-w-96 bg-base-200">
<div class="card-body px-4 py-6">
<div class="relative flex flex-col items-center">
@@ -87,8 +86,7 @@ const team = [
</div>
</div>
</div>
))
}
))}
</div>
</div>
</WebsiteLayout>
+3 -1
View File
@@ -15,7 +15,9 @@ import Input from '@components/input/Input.svelte';
<Textarea id="content" label="Feedback" dynamicWidth required rows={10} />
<Input id="email" type="email" label="Email" required />
</div>
<button id="send" class="btn">Senden</button>
<button id="send" class="btn">
Senden
</button>
</form>
</div>
</div>
+5 -5
View File
@@ -180,8 +180,7 @@ nicht gestattet.</p>`
<div class="mx-4 my-6 sm:mx-24 sm:my-12">
<h1 class="text-3xl lg:text-5xl mb-16 text-center">FAQ</h1>
<div class="grid lg:grid-cols-2 2xl:grid-cols-3 gap-10">
{
faq.map((questions) => (
{faq.map((questions) => (
<div>
<h2 class="text-4xl text-center mb-3">{questions.section}</h2>
<div>
@@ -199,11 +198,12 @@ nicht gestattet.</p>`
))}
</div>
</div>
))
}
))}
</div>
<div class="w-full flex justify-center mt-6 sm:mt-12">
<a class="btn" href="contact">Deine Frage ist nicht aufgeführt? Schreib uns!</a>
<a class="btn" href="contact">
Deine Frage ist nicht aufgeführt? Schreib uns!
</a>
</div>
</div>
</WebsiteLayout>
+2 -4
View File
@@ -120,8 +120,7 @@ sind aber weiterhin geschützt. Aktivieren kannst du den Modus mit <code>/pvp</c
<div class="mx-4 my-6 sm:mx-12 sm:my-12 xl:mx-32 2xl:mx-64">
<h1 class="text-3xl lg:text-5xl mb-16 text-center">Features</h1>
<div class="space-y-8 md:space-y-12">
{
features.map((feature, i) => (
{features.map((feature, i) => (
<div
class="flex flex-col gap-y-3 sm:gap-y-6 md:gap-x-6 lg:gap-x-18 xl:gap-x-24 2xl:gap-x-30 px-8 py-10 bg-base-200 rounded"
class:list={{ 'md:flex-row': i % 2 == 0, 'md:flex-row-reverse': i % 2 != 0 }}
@@ -145,8 +144,7 @@ sind aber weiterhin geschützt. Aktivieren kannst du den Modus mit <code>/pvp</c
<ImageCarousel images={feature.images} client:idle />
</div>
</div>
))
}
))}
</div>
</div>
</WebsiteLayout>
+3 -1
View File
@@ -30,7 +30,9 @@ if (!feedback) {
readonly={feedback.content !== null}
/>
</div>
<button id="send" class="btn" disabled>Feedback senden</button>
<button id="send" class="btn" disabled>
Feedback senden
</button>
</form>
</div>
</div>
+26 -24
View File
@@ -40,21 +40,19 @@ const information = [
<div>
<div class="divider"></div>
<div class="flex flex-col md:flex-row xl:flex-col gap-5">
{
information.map((info) => (
{information.map((info) => (
<div>
<h4 class="mb-1 font-bold">{info.title}</h4>
<p>{info.description}</p>
</div>
))
}
))}
</div>
<div class="divider"></div>
</div>
<div class="flex justify-center">
<a class="btn btn-outline btn-accent hover:bg-white" href="signup"
>{signupEnabled ? 'Jetzt registrieren' : 'Infos zur Anmeldung'}</a
>
<a class="btn btn-outline btn-accent hover:bg-white" href="signup">
{signupEnabled ? 'Jetzt registrieren' : 'Infos zur Anmeldung'}
</a>
</div>
{signupInfoMessage && <span class="text-center text-xs text-base-content/80 mt-3">{signupInfoMessage}</span>}
</div>
@@ -79,36 +77,36 @@ const information = [
<div>
<h2 class="text-3xl text-black dark:text-white mb-8">Über uns</h2>
<p>
Wir sind ein kleines <a class="link" href="admins">Team</a> von Minecraft-Enthusiasten, das bereits im 9. Jahr in
Folge Minecraft CraftAttack organisiert. Jahr für Jahr arbeiten wir daran, das Spielerlebnis zu verbessern und steigeren
die Teilnehmerzahl.
Wir sind ein kleines{' '}
<a class="link" href="admins">
Team
</a>{' '}
von Minecraft-Enthusiasten, das bereits im 9. Jahr in Folge Minecraft CraftAttack organisiert. Jahr für Jahr
arbeiten wir daran, das Spielerlebnis zu verbessern und steigeren die Teilnehmerzahl.
</p>
<p>
Unser Ziel bei diesem ab dem <span class="italic"
>{
new Date(START_DATE).toLocaleString('de-DE', {
Unser Ziel bei diesem ab dem{' '}
<span class="italic">
{new Date(START_DATE).toLocaleString('de-DE', {
day: '2-digit',
month: 'numeric',
year: 'numeric'
})
}</span
>
stattfindenden Projekts ist es, sicherzustellen, dass alle Spieler eine großartige Erfahrung haben und alles reibungslos
abläuft. Wir freuen uns immer über Anregungen und stehen Dir jederzeit zur Verfügung.
})}
</span>
stattfindenden Projekts ist es, sicherzustellen, dass alle Spieler eine großartige Erfahrung haben und alles
reibungslos abläuft. Wir freuen uns immer über Anregungen und stehen Dir jederzeit zur Verfügung.
</p>
</div>
</div>
</div>
<div class="flex flex-col justify-center items-center py-20 bg-base-100">
{
statisticsEnabled && (
{statisticsEnabled && (
<>
<LiveStats />
<div class="divider divider-horizontal mx-auto my-6 h-18" />
</>
)
}
)}
<div>
<h3 class="text-center text-2xl mb-6">2025/2026 in Zahlen</h3>
<div class="flex flex-col lg:flex-row gap-4">
@@ -119,7 +117,9 @@ const information = [
</div>
<div class="stat-title">Abgebaute Blöcke</div>
<div class="stat-value">1.41M</div>
<div class="stat-desc"><span class="underline">975K</span> davon Stein</div>
<div class="stat-desc">
<span class="underline">975K</span> davon Stein
</div>
</div>
<div class="stat">
<div class="stat-figure">
@@ -155,7 +155,9 @@ const information = [
</div>
<div class="stat-title">Spieler Tode</div>
<div class="stat-value">6351</div>
<div class="stat-desc"><span class="underline">348</span> davon durch andere Spieler</div>
<div class="stat-desc">
<span class="underline">348</span> davon durch andere Spieler
</div>
</div>
</div>
</div>
+7 -5
View File
@@ -16,10 +16,10 @@ const { report } = Astro.props;
<div class="flex justify-center items-center">
<div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg">
<h2 class="text-3xl text-center">
Report von <span class="underline">{report.reporter.username}</span> gegen <span
id="adversary-username"
class="underline">{report.reported?.username ?? 'unbekannt'}</span
>
Report von <span class="underline">{report.reporter.username}</span> gegen{' '}
<span id="adversary-username" class="underline">
{report.reported?.username ?? 'unbekannt'}
</span>
</h2>
<form id="report" data-url-hash={report.urlHash} data-adversary-username={report.reported?.username}>
<div class="space-y-4 my-4">
@@ -29,7 +29,9 @@ const { report } = Astro.props;
<Textarea id="body" value={report.body} label="Details" rows={10} dynamicWidth required />
<Dropzone maxFilesBytes={MAX_UPLOAD_BYTES} client:load />
</div>
<button id="send" class="btn" disabled={report.body}>Report senden</button>
<button id="send" class="btn" disabled={report.body}>
Report senden
</button>
</div>
</form>
</div>
+2 -4
View File
@@ -11,8 +11,7 @@ const { report } = Astro.props;
<div class="flex justify-center items-center">
<div class="mt-12 grid card w-11/12 xl:w-2/3 2xl:w-1/2 p-6 shadow-lg">
{
report.status?.status == null ? (
{report.status?.status == null ? (
<p>Dein Report wird in kürze bearbeitet</p>
) : report.status?.status === 'open' ? (
<p>Dein Report befindet sich in Bearbeitung</p>
@@ -27,7 +26,6 @@ const { report } = Astro.props;
readonly
/>
</>
)
}
)}
</div>
</div>
+2 -4
View File
@@ -17,8 +17,7 @@ import { rules } from '../rules';
</div>
<span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600"></span>
</div>
{
rules.sections.map((section, i) => (
{rules.sections.map((section, i) => (
<div>
<div class="collapse collapse-arrow">
<input type="checkbox" autocomplete="off" />
@@ -31,7 +30,6 @@ import { rules } from '../rules';
</div>
<span class="block w-full h-[1px] mx-auto mb-1 bg-gray-600" />
</div>
))
}
))}
</div>
</WebsiteLayout>
+4 -2
View File
@@ -10,9 +10,11 @@ if (!directSignup) return new Response(null, { status: 404 });
<Signup
signupHash={hash}
signupDisabled={directSignup.user
signupDisabled={
directSignup.user
? {
message: 'Es hat sich bereits jemand mit diesem Einladungslink registriert'
}
: undefined}
: undefined
}
/>
+4 -2
View File
@@ -14,10 +14,12 @@ const signupDisabledSubMessage = signupSetting[SettingKey.SignupDisabledSubMessa
---
<Signup
signupDisabled={signupEnabled
signupDisabled={
signupEnabled
? undefined
: {
message: signupDisabledMessage,
subMessage: signupDisabledSubMessage
}}
}
}
/>