$1', $text); $text = preg_replace('/\[i\](.*?)\[\/i\]/i', '$1', $text); return $text; } // 🔹 Holt alle Benutzer mit gültiger E-Mail function get_all_user_emails($conn) { $stmt = mysqli_prepare($conn, "SELECT id, username, email FROM users WHERE email IS NOT NULL AND email != ''"); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $users = []; while ($row = mysqli_fetch_assoc($result)) { $users[] = $row; } mysqli_stmt_close($stmt); return $users; } $is_admin = ($_SESSION['role'] === 'admin'); $message = ''; $message_type = ''; $edit_mode = false; $edit_release = null; if ($is_admin) { if (isset($_GET['action']) && $_GET['action'] === 'publish' && isset($_GET['id'])) { $id = (int)$_GET['id']; $stmt_data = mysqli_prepare($conn, "SELECT version, release_date, features, bugfixes, improvements FROM releases WHERE id = ?"); mysqli_stmt_bind_param($stmt_data, "i", $id); mysqli_stmt_execute($stmt_data); $release_data = mysqli_fetch_assoc(mysqli_stmt_get_result($stmt_data)); mysqli_stmt_close($stmt_data); if (!$release_data) { $_SESSION['message'] = "Version nicht gefunden."; $_SESSION['message_type'] = 'danger'; header("Location: version.php"); exit(); } $stmt = mysqli_prepare($conn, "UPDATE releases SET is_draft = 0 WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); $success = mysqli_stmt_execute($stmt); mysqli_stmt_close($stmt); if ($success) { $all_users = get_all_user_emails($conn); if (!empty($all_users) && file_exists(__DIR__ . '/vendor/autoload.php')) { require_once __DIR__ . '/vendor/autoload.php'; $version = htmlspecialchars($release_data['version']); $release_date_raw = date('d.m.Y', strtotime($release_data['release_date'])); $version_url = APP_URL . '/version.php'; $app_url = APP_URL; $features = array_filter(array_map('trim', explode("\n", $release_data['features'] ?? ''))); $bugs = array_filter(array_map('trim', explode("\n", $release_data['bugfixes'] ?? ''))); $improvements = array_filter(array_map('trim', explode("\n", $release_data['improvements'] ?? ''))); foreach ($all_users as $user) { $recipient_email = $user['email']; $recipient_name = $user['username'] ?? 'Benutzer'; try { $mail = new \PHPMailer\PHPMailer\PHPMailer(true); $mail->CharSet = 'UTF-8'; $mail->isSMTP(); $mail->Host = SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = SMTP_USERNAME; $mail->Password = SMTP_PASSWORD; $mail->SMTPSecure = SMTP_ENCRYPTION; $mail->Port = SMTP_PORT; $mail->setFrom(MAIL_FROM_ADDRESS, MAIL_FROM_NAME); // Text-Version $text_body = "Hallo $recipient_name,\n\n"; $text_body .= "Es wurde soeben eine neue Version in DoMiLi veröffentlicht:\n\n"; $text_body .= "Version: $version\n"; $text_body .= "Veröffentlicht am: $release_date_raw\n"; $text_body .= "Details: $version_url\n\n"; if (!empty($features)) { $text_body .= "Neue Features:\n"; foreach ($features as $f) { $text_body .= "- " . strip_tags(parse_formatting($f)) . "\n"; } $text_body .= "\n"; } if (!empty($improvements)) { $text_body .= "Verbesserungen:\n"; foreach ($improvements as $i) { $text_body .= "- " . strip_tags(parse_formatting($i)) . "\n"; } $text_body .= "\n"; } if (!empty($bugs)) { $text_body .= "Behobene Fehler:\n"; foreach ($bugs as $b) { $text_body .= "- " . strip_tags(parse_formatting($b)) . "\n"; } $text_body .= "\n"; } $text_body .= "Direkt zur App: $app_url\n\n"; $text_body .= "Dein DoMiLi-Admin"; // HTML-Version $html_features = ''; if (!empty($features)) { $html_features .= "
Neue Features:
\nVerbesserungen:
\nBehobene Fehler:
\nHallo $recipient_name,
Es wurde soeben eine neue Version in DoMiLi veröffentlicht:
Dein DoMiLi-Admin
"; $mail->isHTML(true); $mail->Subject = "DoMiLi: Neue Version veröffentlicht – " . $release_data['version']; $mail->Body = $html_body; $mail->AltBody = $text_body; $mail->addAddress($recipient_email); $mail->send(); } catch (Exception $e) { error_log("PHPMailer Fehler beim Senden an $recipient_email: " . $mail->ErrorInfo); } } } $_SESSION['message'] = "Version veröffentlicht!"; $_SESSION['message_type'] = 'success'; } else { $_SESSION['message'] = "Fehler beim Freigeben."; $_SESSION['message_type'] = 'danger'; } header("Location: version.php"); exit(); } if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) { $id = (int)$_GET['id']; $stmt = mysqli_prepare($conn, "DELETE FROM releases WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); if (mysqli_stmt_execute($stmt)) { $_SESSION['message'] = "Version gelöscht!"; $_SESSION['message_type'] = 'success'; } else { $_SESSION['message'] = "Fehler beim Löschen."; $_SESSION['message_type'] = 'danger'; } mysqli_stmt_close($stmt); header("Location: version.php"); exit(); } if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) { $id = (int)$_GET['id']; $stmt = mysqli_prepare($conn, "SELECT id, version, release_date, features, bugfixes, improvements, is_draft FROM releases WHERE id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); mysqli_stmt_execute($stmt); $edit_release = mysqli_fetch_assoc(mysqli_stmt_get_result($stmt)); mysqli_stmt_close($stmt); $edit_mode = true; if (!$edit_release) { $_SESSION['message'] = "Version nicht gefunden."; $_SESSION['message_type'] = 'warning'; } } if ($_SERVER["REQUEST_METHOD"] === "POST") { $version = trim($_POST['version'] ?? ''); $date = trim($_POST['date'] ?? ''); $features = trim($_POST['features'] ?? ''); $bugfixes = trim($_POST['bugfixes'] ?? ''); $improvements = trim($_POST['improvements'] ?? ''); $id = !empty($_POST['id']) ? (int)$_POST['id'] : null; if (empty($version) || empty($date)) { $_SESSION['message'] = "Versionsnummer und Datum sind erforderlich."; $_SESSION['message_type'] = 'danger'; } elseif (!preg_match('/^v\d+\.\d+\.\d+$/', $version)) { $_SESSION['message'] = "Ungültiges Versionsformat. Beispiel: v1.4.2"; $_SESSION['message_type'] = 'danger'; } elseif (!strtotime($date)) { $_SESSION['message'] = "Ungültiges Datum."; $_SESSION['message_type'] = 'danger'; } else { if ($id) { $stmt = mysqli_prepare($conn, "UPDATE releases SET version = ?, release_date = ?, features = ?, bugfixes = ?, improvements = ? WHERE id = ?"); mysqli_stmt_bind_param($stmt, "sssssi", $version, $date, $features, $bugfixes, $improvements, $id); } else { $stmt = mysqli_prepare($conn, "INSERT INTO releases (version, release_date, features, bugfixes, improvements, is_draft) VALUES (?, ?, ?, ?, ?, 1)"); mysqli_stmt_bind_param($stmt, "sssss", $version, $date, $features, $bugfixes, $improvements); } if (mysqli_stmt_execute($stmt)) { $_SESSION['message'] = $id ? "Version aktualisiert!" : "Entwurf gespeichert!"; $_SESSION['message_type'] = 'success'; mysqli_stmt_close($stmt); header("Location: version.php"); exit(); } else { $_SESSION['message'] = "Fehler beim Speichern."; $_SESSION['message_type'] = 'danger'; } mysqli_stmt_close($stmt); } } } if (isset($_SESSION['message'])) { $message = $_SESSION['message']; $message_type = $_SESSION['message_type']; unset($_SESSION['message'], $_SESSION['message_type']); } if ($is_admin) { $result = mysqli_query($conn, "SELECT id, version, release_date, features, bugfixes, improvements, is_draft FROM releases ORDER BY release_date DESC, id DESC"); } else { $result = mysqli_query($conn, "SELECT id, version, release_date, features, bugfixes, improvements FROM releases WHERE is_draft = 0 ORDER BY release_date DESC, id DESC"); } $releases = []; while ($row = mysqli_fetch_assoc($result)) { $row['features_list'] = array_filter(array_map('trim', explode("\n", $row['features'] ?? ''))); $row['bugfixes_list'] = array_filter(array_map('trim', explode("\n", $row['bugfixes'] ?? ''))); $row['improvements_list'] = array_filter(array_map('trim', explode("\n", $row['improvements'] ?? ''))); $releases[] = $row; } $latest_published_version = null; foreach ($releases as $rel) { if (($rel['is_draft'] ?? 0) == 0) { $latest_published_version = $rel['version']; break; } } require_once('inc/header.php'); ?>Keine veröffentlichten Release Notes vorhanden.