get_charset_collate(); $presence_table = $wpdb->prefix . AEROMC_FRIENDS_PRESENCE_TABLE; $friends_table = $wpdb->prefix . AEROMC_FRIENDS_FRIENDS_TABLE; $invites_table = $wpdb->prefix . AEROMC_FRIENDS_INVITES_TABLE; $sessions_table = $wpdb->prefix . AEROMC_FRIENDS_SESSIONS_TABLE; $shares_table = $wpdb->prefix . AEROMC_FRIENDS_SHARES_TABLE; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; // uuid ohne Bindestriche gespeichert (siehe aeromc_friends_normalize_uuid // in includes/routes.php) - vermeidet doppelte Zeilen durch // unterschiedliche Schreibweisen derselben UUID $sql_presence = "CREATE TABLE $presence_table ( uuid varchar(32) NOT NULL, username varchar(32) NOT NULL, instance_name varchar(128) DEFAULT NULL, server_label varchar(128) DEFAULT NULL, mc_version varchar(32) DEFAULT NULL, last_seen datetime NOT NULL, PRIMARY KEY (uuid) ) $charset_collate;"; dbDelta($sql_presence); $sql_friends = "CREATE TABLE $friends_table ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, uuid_a varchar(32) NOT NULL, uuid_b varchar(32) NOT NULL, status varchar(20) NOT NULL DEFAULT 'pending', created_at datetime NOT NULL, PRIMARY KEY (id), KEY uuid_a (uuid_a), KEY uuid_b (uuid_b) ) $charset_collate;"; dbDelta($sql_friends); // Einladungen "Komm auf meinen Server" - gelten nur ein paar Minuten $sql_invites = "CREATE TABLE $invites_table ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, from_uuid varchar(32) NOT NULL, to_uuid varchar(32) NOT NULL, server varchar(128) NOT NULL, mc_version varchar(32) DEFAULT NULL, created_at datetime NOT NULL, PRIMARY KEY (id), KEY to_uuid (to_uuid) ) $charset_collate;"; dbDelta($sql_invites); // Anmelde-Sitzungen: nur der SHA-256 des Tokens wird gespeichert $sql_sessions = "CREATE TABLE $sessions_table ( token_hash char(64) NOT NULL, uuid varchar(32) NOT NULL, username varchar(32) NOT NULL, created_at datetime NOT NULL, last_used datetime NOT NULL, PRIMARY KEY (token_hash), KEY uuid (uuid) ) $charset_collate;"; dbDelta($sql_sessions); // per Code geteilte Instanzen (Mod-Liste, keine Dateien) $sql_shares = "CREATE TABLE $shares_table ( code varchar(9) NOT NULL, uuid varchar(32) NOT NULL, manifest longtext NOT NULL, created_at datetime NOT NULL, PRIMARY KEY (code), KEY uuid (uuid) ) $charset_collate;"; dbDelta($sql_shares); // Kurznachrichten zwischen Freunden (werden nach einigen Tagen gelöscht) $messages_table = $wpdb->prefix . AEROMC_FRIENDS_MESSAGES_TABLE; $sql_messages = "CREATE TABLE $messages_table ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, from_uuid varchar(32) NOT NULL, to_uuid varchar(32) NOT NULL, text varchar(400) NOT NULL, image_url varchar(255) DEFAULT NULL, created_at datetime NOT NULL, read_at datetime DEFAULT NULL, PRIMARY KEY (id), KEY to_uuid (to_uuid), KEY from_uuid (from_uuid) ) $charset_collate;"; dbDelta($sql_messages); // Fehlerberichte aus dem Absturz-Assistenten (Ansicht: Werkzeuge → AeroMC Fehlerberichte) $reports_table = $wpdb->prefix . AEROMC_FRIENDS_REPORTS_TABLE; $sql_reports = "CREATE TABLE $reports_table ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, created_at datetime NOT NULL, uuid varchar(32) DEFAULT NULL, username varchar(32) DEFAULT NULL, launcher_version varchar(32) DEFAULT NULL, mc_version varchar(32) DEFAULT NULL, loader varchar(32) DEFAULT NULL, loader_version varchar(64) DEFAULT NULL, system varchar(128) DEFAULT NULL, funde text, mods longtext, bericht longtext, kommentar text, status varchar(20) NOT NULL DEFAULT 'neu', PRIMARY KEY (id), KEY status (status) ) $charset_collate;"; dbDelta($sql_reports); update_option('aeromc_friends_db_version', AEROMC_FRIENDS_VERSION); } register_activation_hook(__FILE__, 'aeromc_friends_install'); // Beim Ersetzen der Plugin-Dateien (Update per Upload) läuft der // Aktivierungs-Hook NICHT erneut - neue Spalten/Tabellen deshalb anlegen, // sobald die gespeicherte DB-Version nicht mehr zur Plugin-Version passt. add_action('plugins_loaded', function () { if (get_option('aeromc_friends_db_version') !== AEROMC_FRIENDS_VERSION) { aeromc_friends_install(); } }); require_once plugin_dir_path(__FILE__) . 'includes/routes.php'; if (is_admin()) { require_once plugin_dir_path(__FILE__) . 'includes/admin.php'; }