prefix . AEROMC_FRIENDS_REPORTS_TABLE;
$neu = (int) $wpdb->get_var("SELECT COUNT(*) FROM $table WHERE status = 'neu'");
$titel = 'AeroMC Fehler' . ($neu ? ' ' . $neu . '' : '');
add_menu_page('AeroMC Fehlerberichte', $titel, 'manage_options', 'aeromc-reports', 'aeromc_friends_reports_page', 'dashicons-sos', 81);
});
function aeromc_friends_reports_page() {
global $wpdb;
if (!current_user_can('manage_options')) {
return;
}
$table = $wpdb->prefix . AEROMC_FRIENDS_REPORTS_TABLE;
$basis = admin_url('admin.php?page=aeromc-reports');
// Löschen (einzeln oder alle erledigten)
if (isset($_POST['aeromc_loeschen']) && check_admin_referer('aeromc_reports')) {
$id = (int) $_POST['aeromc_loeschen'];
$wpdb->delete($table, ['id' => $id]);
echo '
Bericht #' . esc_html($id) . ' gelöscht.
';
}
if (isset($_POST['aeromc_status'], $_POST['aeromc_id']) && check_admin_referer('aeromc_reports')) {
$status = in_array($_POST['aeromc_status'], ['neu', 'gelesen', 'erledigt'], true) ? $_POST['aeromc_status'] : 'gelesen';
$wpdb->update($table, ['status' => $status], ['id' => (int) $_POST['aeromc_id']]);
}
echo 'AeroMC Fehlerberichte
';
// Detailansicht
if (isset($_GET['report'])) {
$id = (int) $_GET['report'];
$r = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id));
if (!$r) {
echo '
Bericht nicht gefunden.
';
return;
}
if ($r->status === 'neu') {
$wpdb->update($table, ['status' => 'gelesen'], ['id' => $id]);
$r->status = 'gelesen';
}
echo '← Zur Liste
';
echo 'Bericht #' . esc_html($r->id) . '
';
echo '';
$zeile = function ($k, $v) {
echo '| ' . esc_html($k) . ' | ' . esc_html($v !== null && $v !== '' ? $v : '–') . ' |
';
};
$zeile('Eingegangen (UTC)', $r->created_at);
$zeile('Spieler', $r->username ? $r->username . ' (' . $r->uuid . ')' : 'anonym');
$zeile('Launcher-Version', $r->launcher_version);
$zeile('Minecraft', $r->mc_version);
$zeile('Loader', trim($r->loader . ' ' . $r->loader_version));
$zeile('System', $r->system);
$zeile('Status', $r->status);
echo '
';
if ($r->kommentar) {
echo 'Kommentar
' . esc_html($r->kommentar) . '
';
}
$funde = json_decode((string) $r->funde, true) ?: [];
echo 'Erkannte Ursachen (' . count($funde) . ')
';
if ($funde) {
echo '';
foreach ($funde as $f) {
echo '- ' . esc_html($f['titel'] ?? '') . ' – ' . esc_html($f['text'] ?? '') . '
';
}
echo '
';
} else {
echo 'Keine – der Assistent konnte die Ursache nicht eindeutig erkennen.
';
}
$mods = json_decode((string) $r->mods, true) ?: [];
echo 'Mods (' . count($mods) . ')
';
if ($mods) {
echo '| Datei | Name | Version | Aktiv |
';
foreach ($mods as $m) {
echo '| ' . esc_html($m['datei'] ?? '') . ' | ' . esc_html($m['name'] ?? '') . ' | '
. esc_html($m['version'] ?? '') . ' | ' . (!empty($m['aktiv']) ? 'ja' : 'nein') . ' |
';
}
echo '
';
}
echo 'Bericht / Protokoll
';
echo '';
return;
}
// Liste
$rows = $wpdb->get_results("SELECT id, created_at, username, launcher_version, mc_version, loader, funde, kommentar, status FROM $table ORDER BY id DESC LIMIT 200");
if (!$rows) {
echo 'Noch keine Fehlerberichte eingegangen.
';
return;
}
echo '| # | Eingegangen (UTC) | Spieler | Launcher | Minecraft | Erkannte Ursache | Kommentar | Status |
';
foreach ($rows as $r) {
$funde = json_decode((string) $r->funde, true) ?: [];
$ursache = $funde ? ($funde[0]['titel'] ?? '') . (count($funde) > 1 ? ' (+' . (count($funde) - 1) . ')' : '') : '–';
$fett = $r->status === 'neu' ? 'font-weight:600' : '';
echo '| #' . esc_html($r->id) . ' | '
. '' . esc_html($r->created_at) . ' | '
. '' . esc_html($r->username ?: 'anonym') . ' | '
. '' . esc_html($r->launcher_version) . ' | '
. '' . esc_html(trim($r->mc_version . ' ' . $r->loader)) . ' | '
. '' . esc_html($ursache) . ' | '
. '' . esc_html(mb_strimwidth((string) $r->kommentar, 0, 60, '…')) . ' | '
. '' . esc_html($r->status) . ' |
';
}
echo '
';
}