DELULUS-Logo

DELULUS

Die Schweizer TCG- & Gaming-Community
Pokémon TCG · Riftbound · Events · Giveaways · Trade Nights

talitells

Illustration von talitells mit Mew und Celebi

Pokémon TCG Collector • all things cozy • no AI
Founder of DELULUS

delulu-community

Deine Schweizer Community für Pokémon TCG, Riftbound & Gaming. Events, Giveaways, Trade Nights und mehr.

(() => { const count = document.getElementById("delulus-member-count"); if (!count || count.dataset.ready) return; count.dataset.ready = "true"; fetch("https://discord.com/api/v10/invites/DtpgFf69MX?with_counts=true", { headers: { Accept: "application/json" }, credentials: "omit", referrerPolicy: "no-referrer" }) .then(response => { if (!response.ok) throw new Error("Discord count unavailable"); return response.json(); }) .then(data => { const members = Number(data && data.approximate_member_count); if (!Number.isFinite(members) || members < 0) throw new Error("Invalid member count"); count.textContent = new Intl.NumberFormat("de-CH").format(members); }) .catch(() => { count.textContent = "700+"; }); })(); (() => { const placeArtwork = () => { const card = document.getElementById("delulus-member-card"); const artwork = document.getElementById("image01"); if (!card || !artwork || artwork.dataset.memberArtwork) return; artwork.dataset.memberArtwork = "true"; artwork.classList.add("delulus-member-art"); card.prepend(artwork); }; if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", placeArtwork, { once: true }); } else { placeArtwork(); } window.addEventListener("load", placeArtwork, { once: true }); })();
Überraschter gelber Delulu-Charakter

Delulu-Events

Unsere eigenen Community-Events

Events werden geladen …
(() => { const root = document.getElementById('delulu-live-events'); if (!root || root.dataset.loaded) return; root.dataset.loaded = 'true'; const API = 'https://deluluevents.home.l10n.ch'; const FALLBACK = 'https://discord.com/channels/1406678380304404603'; const LIMIT = 6; const dateFormat = new Intl.DateTimeFormat('de-CH', { timeZone: 'Europe/Zurich', day: '2-digit', month: 'short', year: 'numeric' }); const timeFormat = new Intl.DateTimeFormat('de-CH', { timeZone: 'Europe/Zurich', hour: '2-digit', minute: '2-digit', hour12: false }); const el = (tag, className, text) => { const item = document.createElement(tag); if (className) item.className = className; if (text != null) item.textContent = String(text); return item; }; const validDate = value => value && !Number.isNaN(new Date(value).getTime()); const publicUrl = value => { try { const url = new URL(value); return url.protocol === 'https:' && ['discord.com','discord.gg'].includes(url.hostname) ? url.href : FALLBACK; } catch { return FALLBACK; } }; const cleanText = (value, max) => typeof value === 'string' ? value.trim().slice(0, max) : ''; const imageUrl = value => { try { const url = new URL(value); return url.protocol === 'https:' ? url.href : ''; } catch { return ''; } }; const normalize = event => ({ name: cleanText(event && event.name, 160), description: cleanText(event && event.description, 5000), image: imageUrl(event && event.image), start: event && event.start, end: event && event.end, location: cleanText(event && event.location, 120), interested: Number.isFinite(Number(event && event.interested)) ? Math.max(0, Number(event.interested)) : 0, url: publicUrl(event && event.url) }); const parts = value => { const formatted = dateFormat.formatToParts(new Date(value)); const get = type => (formatted.find(part => part.type === type) || {}).value || ''; return { day: get('day'), month: get('month').replace('.', ''), year: get('year') }; }; const endLabel = event => { if (!validDate(event.end)) return ''; const start = parts(event.start); const end = parts(event.end); if (start.day === end.day && start.month === end.month && start.year === end.year) return ''; return '–' + end.day + (start.month === end.month && start.year === end.year ? '' : ' ' + end.month); }; const times = event => { const start = timeFormat.format(new Date(event.start)); if (!validDate(event.end)) return start + ' Uhr'; const end = timeFormat.format(new Date(event.end)); return endLabel(event) ? 'ab ' + start + ' · bis ' + end + ' Uhr' : start + '–' + end + ' Uhr'; }; const formatName = value => value.replace(/:\s*/, ':\n').replace(/\s+-\s+/g, '\n'); const formatLocation = value => value.split(',').map(part => part.trim()).filter(Boolean).join('\n'); const card = event => { const date = parts(event.start); const link = el('a','delulu-card'); link.href = event.url; link.target = '_blank'; link.rel = 'noopener noreferrer'; link.setAttribute('aria-label', event.name + ' auf Discord öffnen'); const dateBox = el('span','delulu-date'); dateBox.append(el('span','delulu-month',date.month), el('span','delulu-day',date.day)); const rangeEnd = endLabel(event); if (rangeEnd) dateBox.append(el('span','delulu-end',rangeEnd)); const copy = el('span','delulu-copy'); copy.append(el('span','delulu-time',times(event)), el('strong','delulu-title',formatName(event.name))); const meta = el('span','delulu-meta'); if (event.location) meta.append(el('span','',formatLocation(event.location))); copy.append(meta); link.append(dateBox,copy,el('span','delulu-arrow','↗')); return link; }; const message = text => root.replaceChildren(el('div','delulu-status',text)); const addStructuredData = events => { const script = el('script'); script.type = 'application/ld+json'; script.textContent = JSON.stringify(events.map(event => ({ '@context':'https://schema.org', '@type':'Event', name:event.name, ...(event.description ? { description:event.description } : {}), ...(event.image ? { image:[event.image] } : {}), organizer:{ '@type':'Organization', name:'DELULUS', url:'https://delulus.ch/' }, startDate:new Date(event.start).toISOString(), ...(validDate(event.end) ? { endDate:new Date(event.end).toISOString() } : {}), ...(event.location ? { location:{ '@type':'Place', name:event.location } } : {}), eventAttendanceMode:'https://schema.org/OfflineEventAttendanceMode', eventStatus:'https://schema.org/EventScheduled', url:event.url }))); root.append(script); }; fetch(API + root.dataset.endpoint, { headers: { Accept:'application/json' }, credentials:'omit', referrerPolicy:'no-referrer' }) .then(response => { if (!response.ok) throw new Error(); return response.json(); }) .then(data => { if (!Array.isArray(data)) throw new Error(); const events = data.map(normalize).filter(event => event.name && validDate(event.start)).slice(0,LIMIT); if (!events.length) return message('Keine kommenden Events – schau bald wieder vorbei.'); const grid = el('div','delulu-grid'); grid.append(...events.map(card)); root.replaceChildren(grid); addStructuredData(events); }) .catch(() => message('Events konnten gerade nicht geladen werden. Den aktuellen Stand findest du auf Discord.')); })();

eventkalender
schweiz

TCG-Events, Conventions & LAN-Partys in der Schweiz

Events werden geladen …
(() => { const root=document.getElementById('other-live-events'); if(!root||root.dataset.loaded)return; root.dataset.loaded='true'; const API='https://deluluevents.home.l10n.ch', FALLBACK='https://discord.com/channels/1406678380304404603', LIMIT=8; const df=new Intl.DateTimeFormat('de-CH',{timeZone:'Europe/Zurich',day:'2-digit',month:'short',year:'numeric'}), tf=new Intl.DateTimeFormat('de-CH',{timeZone:'Europe/Zurich',hour:'2-digit',minute:'2-digit',hour12:false}); const el=(tag,cls,text)=>{const x=document.createElement(tag);if(cls)x.className=cls;if(text!=null)x.textContent=String(text);return x;}; const valid=value=>value&&!Number.isNaN(new Date(value).getTime()); const safeUrl=value=>{try{const u=new URL(value);return u.protocol==='https:'&&['discord.com','discord.gg'].includes(u.hostname)?u.href:FALLBACK;}catch{return FALLBACK;}}; const clean=(value,max)=>typeof value==='string'?value.trim().slice(0,max):''; const imageUrl=value=>{try{const u=new URL(value);return u.protocol==='https:'?u.href:'';}catch{return '';}}; const normalize=e=>({name:clean(e&&e.name,160),description:clean(e&&e.description,5000),image:imageUrl(e&&e.image),start:e&&e.start,end:e&&e.end,location:clean(e&&e.location,120),interested:Number.isFinite(Number(e&&e.interested))?Math.max(0,Number(e.interested)):0,url:safeUrl(e&&e.url)}); const date=value=>{const p=df.formatToParts(new Date(value)),get=t=>(p.find(x=>x.type===t)||{}).value||'';return{day:get('day'),month:get('month').replace('.',''),year:get('year')};}; const endLabel=e=>{if(!valid(e.end))return '';const start=date(e.start),end=date(e.end);if(start.day===end.day&&start.month===end.month&&start.year===end.year)return '';return '–'+end.day+(start.month===end.month&&start.year===end.year?'':' '+end.month);}; const times=e=>{const start=tf.format(new Date(e.start));if(!valid(e.end))return start+' Uhr';const end=tf.format(new Date(e.end));return endLabel(e)?'ab '+start+' · bis '+end+' Uhr':start+'–'+end+' Uhr';}; const formatLocation=value=>value.split(',').map(part=>part.trim()).filter(Boolean).join('\n'); const card=e=>{const d=date(e.start),a=el('a','delulu-card');a.href=e.url;a.target='_blank';a.rel='noopener noreferrer';a.setAttribute('aria-label',e.name+' auf Discord öffnen');const db=el('span','delulu-date');db.append(el('span','delulu-month',d.month),el('span','delulu-day',d.day));const rangeEnd=endLabel(e);if(rangeEnd)db.append(el('span','delulu-end',rangeEnd));const copy=el('span','delulu-copy');copy.append(el('span','delulu-time',times(e)),el('strong','delulu-title',e.name));const meta=el('span','delulu-meta');if(e.location)meta.append(el('span','',formatLocation(e.location)));copy.append(meta);a.append(db,copy,el('span','delulu-arrow','↗'));return a;}; const message=text=>root.replaceChildren(el('div','delulu-status',text)); const structured=events=>{const s=el('script');s.type='application/ld+json';s.textContent=JSON.stringify(events.map(e=>({'@context':'https://schema.org','@type':'Event',name:e.name,...(e.description?{description:e.description}:{}),...(e.image?{image:[e.image]}:{}),startDate:new Date(e.start).toISOString(),...(valid(e.end)?{endDate:new Date(e.end).toISOString()}:{}),...(e.location?{location:{'@type':'Place',name:e.location}}:{}),eventAttendanceMode:'https://schema.org/OfflineEventAttendanceMode',eventStatus:'https://schema.org/EventScheduled',url:e.url})));root.append(s);}; fetch(API+root.dataset.endpoint,{headers:{Accept:'application/json'},credentials:'omit',referrerPolicy:'no-referrer'}).then(r=>{if(!r.ok)throw new Error();return r.json();}).then(data=>{if(!Array.isArray(data))throw new Error();const events=data.map(normalize).filter(e=>e.name&&valid(e.start)).slice(0,LIMIT);if(!events.length)return message('Keine kommenden Events - schau bald wieder vorbei.');const grid=el('div','delulu-grid');grid.append(...events.map(card));root.replaceChildren(grid);structured(events);}).catch(()=>message('Events konnten gerade nicht geladen werden. Den aktuellen Stand findest du auf Discord.')); })();

schreib mir

Du willst mit mir zusammenarbeiten?
Du hast eine Frage? Eine Idee? Möchtest dein Event eintragen? Mir sonst etwas sagen?

danke für deine nachricht.
ich melde mich so bald wie möglich bei dir zurück. :)

© 2026 DELULUS