Skip to content

Multiplayer History Format

Alea Farrel edited this page Jan 15, 2026 · 1 revision

πŸ“ Multiplayer History JSON Format

Halaman ini menjelaskan format penyimpanan riwayat pertandingan multiplayer di Rapid Texter GUI. Fitur ini eksklusif untuk versi GUI dan tidak tersedia di versi TUI.


πŸ“‹ Daftar Isi


πŸ“ Lokasi File

File riwayat multiplayer disimpan di lokasi berikut:

OS Path
Windows %APPDATA%\RapidTexter\multiplayer_history.json
Linux ~/.local/share/RapidTexter/multiplayer_history.json

Note

File ini terpisah dari riwayat single player yang digunakan bersama dengan versi TUI.


πŸ“Š Struktur JSON

Root Object

{
  "entries": [
    // Array of MultiplayerHistoryEntry
  ]
}

Entry Object

Setiap entry merepresentasikan satu pertandingan multiplayer:

{
  "timestamp": "01/01/2026 12:00:00",
  "hostName": "Player1",
  "players": [
    // Array of PlayerResult
  ]
}

Player Result Object

Data performa masing-masing pemain:

{
  "name": "Player1",
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "wpm": 85,
  "accuracy": 97.5,
  "errors": 3,
  "duration": 45.2,
  "position": 1,
  "isLocal": true,
  "hasLeft": false
}

πŸ“ Penjelasan Field

Entry Fields

Field Tipe Keterangan
timestamp String Waktu pertandingan (format: dd/MM/yyyy HH:mm:ss)
hostName String Nama pembuat room (host)
players Array Daftar hasil semua pemain dalam pertandingan

Player Result Fields

Field Tipe Keterangan
name String Nama pemain
uuid String UUID unik pemain untuk identifikasi
wpm Integer Words Per Minute yang dicapai pemain
accuracy Double Persentase akurasi mengetik (0-100)
errors Integer Jumlah total kesalahan ketik
duration Double Durasi menyelesaikan race dalam detik
position Integer Peringkat finish (1 = juara 1, 2 = juara 2, dst.)
isLocal Boolean true jika ini adalah pemain lokal (user)
hasLeft Boolean true jika pemain disconnect sebelum race selesai

πŸ“– Contoh Lengkap

Berikut adalah contoh file multiplayer_history.json dengan beberapa entry:

{
  "entries": [
    {
      "timestamp": "15/01/2026 16:30:00",
      "hostName": "Alea",
      "players": [
        {
          "name": "Alea",
          "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "wpm": 92,
          "accuracy": 98.5,
          "errors": 1,
          "duration": 38.5,
          "position": 1,
          "isLocal": true,
          "hasLeft": false
        },
        {
          "name": "Budi",
          "uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
          "wpm": 85,
          "accuracy": 96.0,
          "errors": 4,
          "duration": 42.3,
          "position": 2,
          "isLocal": false,
          "hasLeft": false
        },
        {
          "name": "Citra",
          "uuid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
          "wpm": 78,
          "accuracy": 94.2,
          "errors": 6,
          "duration": 48.1,
          "position": 3,
          "isLocal": false,
          "hasLeft": false
        }
      ]
    },
    {
      "timestamp": "15/01/2026 15:00:00",
      "hostName": "Dani",
      "players": [
        {
          "name": "Dani",
          "uuid": "d4e5f6a7-b8c9-0123-defa-234567890123",
          "wpm": 88,
          "accuracy": 97.0,
          "errors": 2,
          "duration": 40.0,
          "position": 1,
          "isLocal": false,
          "hasLeft": false
        },
        {
          "name": "Alea",
          "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "wpm": 82,
          "accuracy": 95.5,
          "errors": 4,
          "duration": 43.2,
          "position": 2,
          "isLocal": true,
          "hasLeft": false
        },
        {
          "name": "Eva",
          "uuid": "e5f6a7b8-c9d0-1234-efab-345678901234",
          "wpm": 0,
          "accuracy": 0,
          "errors": 0,
          "duration": 0,
          "position": 3,
          "isLocal": false,
          "hasLeft": true
        }
      ]
    }
  ]
}

Penjelasan Contoh

  1. Entry Pertama (15/01/2026 16:30):

    • 3 pemain dalam pertandingan
    • User (Alea) menang dengan WPM 92, akurasi 98.5%
    • Semua pemain menyelesaikan race (hasLeft: false)
  2. Entry Kedua (15/01/2026 15:00):

    • 3 pemain dalam pertandingan
    • User (Alea) berada di posisi ke-2
    • Eva disconnect sebelum selesai (hasLeft: true)
    • Statistik Eva adalah 0 karena tidak menyelesaikan race

πŸ”„ Sorting Options

Riwayat dapat di-sort berdasarkan:

Sort By Keterangan
date Tanggal pertandingan (default)
wpm WPM pemain lokal
rank Peringkat pemain lokal

Setiap opsi sorting dapat diatur ascending (naik) atau descending (turun).

Contoh Penggunaan dari QML

// Mengakses data riwayat
MultiplayerHistoryManager.historyData

// Mengatur sorting
MultiplayerHistoryManager.sortBy = "wpm"
MultiplayerHistoryManager.sortAscending = false  // Tertinggi dulu

// Mendapatkan total entry
MultiplayerHistoryManager.totalEntries

// Menghapus semua riwayat
MultiplayerHistoryManager.clearHistory()

πŸ—‚οΈ Data Structure (C++)

MultiplayerPlayerResult

struct MultiplayerPlayerResult {
    QString name;      // Nama pemain
    QString uuid;      // UUID unik pemain
    int wpm;           // Words per minute
    double accuracy;   // Akurasi (0-100)
    int errors;        // Jumlah kesalahan
    double duration;   // Durasi dalam detik
    int position;      // Peringkat (1, 2, 3, ...)
    bool isLocal;      // true jika pemain lokal
    bool hasLeft;      // true jika disconnect
};

MultiplayerHistoryEntry

struct MultiplayerHistoryEntry {
    QString timestamp;   // Format: dd/MM/yyyy HH:mm:ss
    QString hostName;    // Nama host/pembuat room
    std::vector<MultiplayerPlayerResult> players;
    
    // Cached untuk quick display
    int localWpm;   // WPM pemain lokal
    int localRank;  // Rank pemain lokal
};

πŸ“š Catatan Penting

Important

Fitur Eksklusif GUI

Riwayat multiplayer hanya tersedia di versi GUI. Versi TUI tidak memiliki fitur multiplayer.

Tip

Backup Data

File multiplayer_history.json dapat di-backup secara manual. Cukup salin file tersebut ke lokasi aman.

Warning

Jangan Edit Manual

Mengedit file JSON secara manual dapat menyebabkan error saat loading. Jika file corrupt, aplikasi akan gagal memuat riwayat.


πŸ”— Navigasi