Montag, 25 August 2025

Top 5 diese Woche

Ähnliche Tutorials

Stoned Chat

Lust auf etwas völlig Abgedrehtes? Mit unserem einzigartigen Chat-Script erleben Sie eine Chat-KI – Chat GPT, die so klingt, als wäre sie stoned oder leicht betrunken. Das Ergebnis: ulkige, verrückte und manchmal komplett sinnfreie Antworten – perfekt für Spaß, Unterhaltung oder als Gimmick auf Ihrer Website.

Highlights:

  • KI-ähnliche Antworten: Die Figur wirkt, als hätte sie einen Drink zu viel gehabt – locker, verspielt, manchmal verplant
  • Optisch professionelles Design: Modernes Layout, stylische UI, optimiert für Desktop und Smartphone
  • Echtzeit-Kommunikation: Dank AJAX und JS laufen die Chats flüssig ohne Reload
  • Sofort einsatzbereit: Alles in einer Datei, kein kompliziertes Setup
  • Humor & Entertainment pur: Ihre Besucher werden schmunzeln und lachen

Technische Details:

  • Entwickelt in PHP, AJAX und JavaScript
  • Keine externe Datenbank nötig, läuft direkt auf jedem gängigen Webserver
  • Responsive Design – funktioniert auf PC, Tablet und Smartphone
  • Sauberer Code, der wie aus einer professionellen Agentur wirkt

Einsatzmöglichkeiten:

  • Fun-Gadget auf Ihrer Website
  • Party- oder Entertainment-Seite
  • Überraschungsgag für Freunde, Communitys oder Social Media
<?php
/*******************************************************
 * Stoned Chat — Single-file PHP + AJAX + JS
 * Design: Agentur-Style (Glasmorphismus, Dark UI)
 * Speicher: PHP Session (optional: JSON persist)
 * Autor: Dreamcodes.NET
 *******************************************************/
declare(strict_types=1);
session_start();
header('X-Content-Type-Options: nosniff');

const APP_TITLE = 'Stoned Chat';
const BRAND_FOOTER = '© '.date('Y').' <a href="http://www.dreamcodes.net" target="_blank" class="underline decoration-dotted hover:no-underline">Dreamcodes</a>';

if (!isset($_SESSION['chat'])) {
  $_SESSION['chat'] = [];
}

/* ---------------- AJAX Router ---------------- */
if (isset($_GET['action'])) {
  header('Content-Type: application/json; charset=UTF-8');
  $action = $_GET['action'];

  if ($action === 'send') {
    $payload = json_decode(file_get_contents('php://input'), true) ?: [];
    $msg = trim((string)($payload['message'] ?? ''));
    $level = (int)($payload['level'] ?? 60); // 0..100
    $tone  = (string)($payload['tone'] ?? 'chill'); // chill | goofy | wise
    if ($msg === '') {
      echo json_encode(['ok'=>false,'error'=>'empty']); exit;
    }
    $reply = generate_stoned_reply($msg, $level, $tone);
    append_message('user', $msg);
    append_message('bot', $reply);
    echo json_encode(['ok'=>true,'reply'=>$reply,'history'=>$_SESSION['chat']]); exit;
  }

  if ($action === 'history') {
    echo json_encode(['ok'=>true,'history'=>$_SESSION['chat']]); exit;
  }

  if ($action === 'clear') {
    $_SESSION['chat'] = [];
    echo json_encode(['ok'=>true]); exit;
  }

  http_response_code(404);
  echo json_encode(['ok'=>false,'error'=>'unknown_action']); exit;
}

/* ---------------- Helpers ---------------- */
function append_message(string $role, string $text): void {
  $_SESSION['chat'][] = [
    'role'=>$role,
    'text'=>$text,
    'ts'=>time()
  ];
  // begrenzen
  if (count($_SESSION['chat']) > 200) array_shift($_SESSION['chat']);
}

function generate_stoned_reply(string $user, int $level, string $tone): string {
  $level = max(0, min(100, $level));
  $base = stoned_paraphrase($user, $level, $tone);
  $add  = stoned_addons($level, $tone);

  // kleine Leitplanken (keine Tipps zu Drogen/Alkohol)
  $safety = [
    "btw: bleib' safe ✌️ – Wasser trinken, frische Luft, Rest & Respekt.",
    "kleiner reality-check: immer verantwortungsvoll bleiben.",
    "kurze Erinnerung: Gesundheit > alles. Balance ist King.",
  ];
  $guard = $level > 40 ? "  \n\n_". $safety[array_rand($safety)] . "_" : "";

  return trim($base . " " . $add . $guard);
}

function stoned_paraphrase(string $in, int $level, string $tone): string {
  $in = preg_replace('/\s+/', ' ', $in);
  $prompts = [
    'chill'=>[
      "Yo, ich hör' %s und fühl' die Vibes…",
      "Mhm, also zu %s – lass mich kurz drüber gleiten…",
      "Okayyy, %s klingt nach einem Trip durch die Gedankenwolke…",
    ],
    'goofy'=>[
      "Hahaha, %s? Brooo, das ist wie wenn ein Lama Skateboard fährt.",
      "Warte, %s – ich brauch' kurz 'nen gedanklichen Snack.",
      "Oh wow, %s – mein Hirn macht gerade kleine Saltos.",
    ],
    'wise'=>[
      "%s – spannender Gedanke. Lass uns das sanft auseinanderfalten.",
      "Zu %s: Stell dir einen ruhigen See vor, ich werf' Steine rein… Kreise, Muster, Einsichten.",
      "%s – wir gehen Schritt für Schritt, easy und klar.",
    ],
  ];
  $tpl = $prompts[$tone][array_rand($prompts[$tone])];
  $lead = sprintf($tpl, htmlspecialchars($in, ENT_QUOTES));

  // Kernaussage generieren
  $cores = [
    "Kurz gesagt: %s.",
    "Im Kern heißt das: %s.",
    "Wenn man's runterbricht: %s.",
    "Der rote Faden: %s.",
  ];
  $coreTpl = $cores[array_rand($cores)];
  $summary = summarize_light($in);

  $body = " ".sprintf($coreTpl, $summary);

  // Slur/Dehnung anwenden je nach Level
  return slur_text($lead.$body, $level);
}

function summarize_light(string $in): string {
  // extrem simple "Zusammenfassung"
  $in = trim($in);
  if ($in === '') return "du willst eine schnelle Antwort";
  $in = preg_replace('/[^a-zA-Z0-9äöüÄÖÜß .,!?-]/u', '', $in);
  $words = preg_split('/\s+/', $in);
  if (!$words) return "kurz & knapp";
  $top = array_slice($words, 0, min(10, count($words)));
  return implode(' ', $top).(count($words)>10?' …':'');
}

function stoned_addons(int $level, string $tone): string {
  $emojis = ["😮‍💨","🌿","🫠","💫","✨","😵‍💫","😌","🌙","🍃","🌀","🤙","😏"];
  $hic = $level>60 ? " *hic* " : " ";
  $tails = [
    'chill'=>[
      "lass uns das entspannt angehen".$hic.implode('', array_rand_emojis($emojis,2)),
      "kein Stress – wir kriegen das smooth hin ".implode('', array_rand_emojis($emojis,3)),
      "ich drop' dir gleich konkrete Steps ".$hic.implode('', array_rand_emojis($emojis,2)),
    ],
    'goofy'=>[
      "Plot twist: ich erklär's wie einem Kaktus im Regen ".implode('', array_rand_emojis($emojis,3)),
      "Brain sagt: joaaaa, machbar ".$hic.implode('', array_rand_emojis($emojis,2)),
      "das wird 'ne wilde Rutsche, aber funny ".implode('', array_rand_emojis($emojis,2)),
    ],
    'wise'=>[
      "wir gehen strukturiert vor – ruhig atmen, klare Punkte.",
      "ich geb dir gleich eine kleine Liste – fokus & flow.",
      "kurz, klar, freundlich: das Ziel vor Augen.",
    ],
  ];
  return $tails[$tone][array_rand($tails[$tone])];
}

function array_rand_emojis(array $arr, int $n): array {
  $n = max(1, min($n, count($arr)));
  $keys = array_rand($arr, $n);
  if (!is_array($keys)) $keys = [$keys];
  return array_map(fn($k)=>$arr[$k], $keys);
}

function slur_text(string $t, int $level): string {
  if ($level <= 0) return $t;
  // Dehnungen
  $stretch = max(0, (int)floor($level/25)); // 0..4
  $t = preg_replace_callback('/([aeiouäöüAEIOUÄÖÜ])/', function($m) use($stretch){
    return str_repeat($m[1], 1 + (mt_rand(0,100) < 25 ? $stretch : 0));
  }, $t);
  // leichte Vertipper
  if ($level >= 40) {
    $t = preg_replace('/\b(und)\b/u','un~d',$t);
    $t = preg_replace('/\b(aber)\b/u','aaber',$t);
  }
  // Pausenpunkte
  if ($level >= 60) {
    $t = preg_replace('/, /u','… ',$t);
    $t = preg_replace('/\. /u','… ',$t);
  }
  return $t;
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dreamcodes - <?=htmlspecialchars(APP_TITLE)?></title>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;800&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<style>
  :root { color-scheme: dark; }
  html,body{height:100%}
  body{font-family:Inter,system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background:radial-gradient(1200px 800px at 80% -10%, #1e293b 0%, #0b1020 45%, #070b16 100%); color:#e9eef7;}
  .glass{background:rgba(13,18,34,.6); border:1px solid rgba(255,255,255,.08); backdrop-filter: blur(10px)}
  .card{border-radius:20px; box-shadow:0 20px 60px rgba(0,0,0,.45)}
  .btn{transition: transform .08s ease, box-shadow .2s ease}
  .btn:hover{transform: translateY(-1px)}
  .msg{animation: fadeIn .2s ease both}
  @keyframes fadeIn{from{opacity:0; transform:translateY(4px)} to{opacity:1; transform:translateY(0)}}
  .typing-dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px;opacity:.3;animation:bounce 1s infinite;}
  .typing-dot:nth-child(2){animation-delay:.15s}
  .typing-dot:nth-child(3){animation-delay:.3s}
  @keyframes bounce{0%,80%,100%{transform:translateY(0)}40%{transform:translateY(-4px)}}
</style>
</head>
<body class="antialiased selection:bg-sky-500/30 selection:text-white">

<header class="max-w-6xl mx-auto px-4 pt-8 pb-4">
  <div class="flex items-center justify-between">
    <div>
      <h1 class="text-2xl md:text-3xl font-extrabold tracking-tight">Stoned Chat <span class="text-sky-400">Parodie</span></h1>
      <p class="text-slate-300 mt-1">AI-Persona antwortet „stoned/goofy/wise“ – humorvoll, aber freundlich & verantwortungsbewusst.</p>
    </div>
    <button id="clearBtn" class="btn px-3 py-2 rounded-xl bg-slate-800/70 hover:bg-slate-800 text-slate-200 border border-white/10">Chat leeren</button>
  </div>
</header>

<main class="max-w-6xl mx-auto px-4 grid grid-cols-1 lg:grid-cols-3 gap-6 pb-16">
  <!-- Chat -->
  <section class="lg:col-span-2 glass card p-4 md:p-6">
    <div id="chat" class="space-y-4 max-h-[65vh] overflow-y-auto pr-1">
      <!-- Nachrichten erscheinen hier -->
    </div>
    <div class="mt-4 grid grid-cols-1 md:grid-cols-[1fr_auto] gap-3">
      <div class="flex items-center gap-3 glass rounded-2xl px-3 py-2">
        <input id="message" class="flex-1 bg-transparent outline-none placeholder:text-slate-400 text-[15px]" placeholder="Frag mich was… z. B. „Erklär mir Quantenkaffee“">
        <button id="sendBtn" class="btn px-4 py-2 rounded-xl bg-sky-500 text-slate-900 font-bold">Senden</button>
      </div>
      <div class="flex items-center gap-3">
        <label class="text-sm text-slate-300">„Stoned“-Level</label>
        <input id="level" type="range" min="0" max="100" value="60" class="w-32">
        <select id="tone" class="bg-slate-800/70 border border-white/10 rounded-xl px-3 py-2 text-sm">
          <option value="chill">Chill</option>
          <option value="goofy">Goofy</option>
          <option value="wise">Wise</option>
        </select>
      </div>
    </div>
    <p class="text-xs text-slate-500 mt-2">Parodie-Persona; keine Beratung zu Substanzen. Bitte verantwortungsvoll bleiben.</p>
  </section>

  <!-- Info/Persona -->
  <aside class="glass card p-4 md:p-6 space-y-4">
    <h2 class="text-lg font-bold">Persona-Einstellungen</h2>
    <ul class="text-sm text-slate-300 list-disc pl-5 space-y-1">
      <li><b>Chill:</b> locker, smooth, freundlich</li>
      <li><b>Goofy:</b> albern, bildhaft, überspitzt</li>
      <li><b>Wise:</b> ruhig, strukturiert, poetisch</li>
    </ul>
    <div class="rounded-xl bg-slate-900/40 border border-white/10 p-3 text-sm text-slate-300">
      <b>Pro-Tipp:</b> Höheres Level ⇒ gedehnte Vokale, „…“-Pausen, kleine *hic*s.  
    </div>
    <div class="text-xs text-slate-400"><?=BRAND_FOOTER?></div>
  </aside>
</main>

<footer class="max-w-6xl mx-auto text-center text-slate-400 pb-10 text-xs">
  Parodie-Projekt. Kein Echtzeit-LLM, Antworten werden lokal generiert.
</footer>

<script>
const chatEl = document.getElementById('chat');
const msgEl  = document.getElementById('message');
const sendEl = document.getElementById('sendBtn');
const clearEl= document.getElementById('clearBtn');
const lvlEl  = document.getElementById('level');
const toneEl = document.getElementById('tone');

function el(tag, cls, html){ const n=document.createElement(tag); if(cls) n.className=cls; if(html!==undefined) n.innerHTML=html; return n; }
function scrollChat(){ chatEl.scrollTop = chatEl.scrollHeight; }

function renderMessage(role, text, ts){
  const wrap = el('div','msg flex gap-3');
  const avatar = el('div','shrink-0 w-10 h-10 rounded-full bg-sky-500/20 border border-sky-500/20 flex items-center justify-center');
  avatar.innerHTML = role==='user' ? '🫵' : '🧠';
  const bubble = el('div','max-w-[80%] lg:max-w-[70%] px-4 py-3 rounded-2xl ' + (role==='user'?'bg-slate-800/70':'bg-sky-500/10 border border-sky-500/20'));
  bubble.innerHTML = `<div class="text-[13px] ${role==='user'?'text-slate-300':'text-sky-300'} mb-1">${role==='user'?'Du':'Stoned-AI'}</div>
                      <div class="text-[15px] leading-6 text-slate-100 whitespace-pre-wrap">${escapeHtml(text)}</div>`;
  wrap.appendChild(avatar); wrap.appendChild(bubble);
  chatEl.appendChild(wrap);
  scrollChat();
}

function renderTyping(){
  const wrap = el('div','msg flex gap-3','');
  wrap.id = 'typing';
  const avatar = el('div','shrink-0 w-10 h-10 rounded-full bg-sky-500/20 border border-sky-500/20 flex items-center justify-center','🧠');
  const bubble = el('div','max-w-[80%] lg:max-w-[70%] px-4 py-3 rounded-2xl bg-sky-500/10 border border-sky-500/20');
  bubble.innerHTML = `<span class="typing-dot"></span><span class="typing-dot"></span><span class="typing-dot"></span>`;
  wrap.appendChild(avatar); wrap.appendChild(bubble);
  chatEl.appendChild(wrap);
  scrollChat();
}
function removeTyping(){ const t=document.getElementById('typing'); if(t) t.remove(); }

function escapeHtml(s){ return s.replace(/[&<>"']/g, m=>({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[m])); }

async function loadHistory(){
  const r = await fetch('?action=history');
  const j = await r.json();
  chatEl.innerHTML='';
  (j.history||[]).forEach(m => renderMessage(m.role, m.text, m.ts));
}

async function send(){
  const text = msgEl.value.trim();
  if (!text) return;
  renderMessage('user', text, Date.now());
  msgEl.value = '';
  renderTyping();

  try{
    const r = await fetch('?action=send', {
      method:'POST',
      headers:{'Content-Type':'application/json'},
      body: JSON.stringify({ message: text, level: parseInt(lvlEl.value||'60'), tone: toneEl.value })
    });
    const j = await r.json();
    removeTyping();
    if (j.ok){
      // kleine „Tippen“-Verzögerung
      await new Promise(res=>setTimeout(res, 250 + Math.random()*600));
      renderMessage('bot', j.reply, Date.now());
    } else {
      renderMessage('bot', 'Uff… da ist was schief gelaufen. Versuch’s nochmal 🙏', Date.now());
    }
  } catch(e){
    removeTyping();
    renderMessage('bot', 'Netzwerk-Glitch. Einmal F5, bitte 🌀', Date.now());
  }
}

sendEl.addEventListener('click', send);
msgEl.addEventListener('keydown', e=>{ if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); send(); }});
clearEl.addEventListener('click', async ()=>{
  await fetch('?action=clear'); chatEl.innerHTML=''; renderMessage('bot','Neuer Start. Was liegt an? ✨',Date.now());
});

loadHistory().then(()=>{ renderMessage('bot','Heyyy… ich bin in „Stoned“-Laune – frag mich alles, aber bleib freundlich 😌',Date.now()); });
</script>
</body>
</html>
Vorheriges Tutorial
Nächstes Tutorial

Hier etwas für dich dabei?