Turnamen & Kompetisi
Penjelasan mendalam fitur pembuatan kompetisi, penyeleksian semifinalis, pembagian babak (Rounds), promosi grup otomatis, pengumuman landing page, serta pengamanan Whitelist ruangan game.
Turnamen & Kompetisi
Sistem Turnamen (/competition dan /manage-competitions) adalah fitur utama yang memungkinkan administrator membuat kompetisi kuis berhadiah, menyeleksi semifinalis, mengatur babak penyisihan hingga final, serta mengendalikan peserta yang boleh masuk ke dalam lobi permainan.
1. Pembuatan & Status Kompetisi (/competition)
Untuk menyelenggarakan turnamen baru, admin mengonfigurasi parameter berikut pada form kompetisi:
- Poster Turnamen: Banner promosi kompetisi.
- Biaya Registrasi: Diintegrasikan dengan gateway pembayaran Xendit. Pemain harus membayar nominal ini via landing page sebelum status mereka berubah menjadi terdaftar (
is_paid = true). - Prize Pool: Total hadiah yang diperebutkan.
- Siklus Tanggal: Mengatur masa registrasi, masa babak kualifikasi (
qualification_start_date&qualification_end_date), hingga tanggal pelaksanaan babak final. - Manajemen Status Publikasi (
status):draft: Kompetisi hanya terlihat oleh admin. Sistem landing page secara otomatis memblokir akses publik ke kompetisi berstatusdraft.published/coming_soon/finished: Kompetisi dibuka untuk publik dan secara otomatis dirender secara dinamis (realtime sync) pada portalgameforsmart.com.
2. Penyeleksian Semifinalis (is_finalist) & Integrasi Landing Page
Setelah babak kualifikasi online selesai, admin menyeleksi peserta terbaik untuk masuk ke babak semifinal:
- Toggle Semifinalis:
- Pada tab Qualification di
/manage-competitions/[id], admin mengeklik tombol ⭐ di samping nama peserta. - Aksi ini mengeksekusi Server Action untuk memperbarui kolom
is_finalist = truepada tabelcompetition_participants. - Admin juga dapat menggunakan fitur Batch Action (pilih banyak peserta sekaligus → "Tandai Finalis").
- Pada tab Qualification di
- Sistem Pengumuman Emas di Landing Page:
- Portal publik
gameforsmart.com/competitions/[slug]/participantssecara otomatis mengambil daftar peserta dengan statusis_finalist = true. - Visibility Gate: Pengumuman emas bertema 🏆 PENGUMUMAN SEMIFINALIS hanya akan muncul di publik jika tanggal kualifikasi (
qualification_end_date) sudah terlewati DAN admin telah menandai minimal 1 peserta sebagai semifinalis. - Pengumuman dilengkapi dengan indikator statistik per jenjang (SD/MI, SMP/MTs, SMA/SMK/MA) serta filter kategori interaktif.
- Portal publik
3. Manajemen Babak, Klasemen, & Promosi Otomatis
Turnamen besar membutuhkan pemisahan babak dan pembagian klasemen pemain untuk menyederhanakan antrean game lobi.
A. Babak Turnamen (Rounds) & Penugasan Kuis
- Kompetisi dapat memiliki banyak babak (misalnya: Group Stage, Semifinal, Final, Champion).
- Admin menugaskan kuis spesifik (Assign Quiz) yang wajib dimainkan oleh grup tersebut.
- Setiap anggota grup (
GroupMember) mencatat skor permainan, catatan waktu selesai (time_seconds), dan status kelulusan ke babak berikutnya (is_advanced).
B. Promosi Peserta Otomatis Antar-Grup (Source Group Syncing)
- Saat pertandingan grup semifinal selesai (misal: Grup Semifinal A dan Grup Semifinal B masing-masing 20 orang), admin mencentang opsi "Lolos" (
isAdvanced = true) pada 10 peserta terbaik dari masing-masing grup. - Ketika admin membuat grup baru untuk babak
Finaldan memilih grup-grup Semifinal tersebut sebagai Grup Sumber (sources), sistem diPhaseGroupStagesecara otomatis memindahkan peserta yang lolos (isAdvanced = true) menjadi anggota grup Final tanpa perlu memasukkan nama secara manual.
C. Alur Sinkronisasi Database Real-Time & Pembersihan Cascading
- Penyimpanan data klasemen standings dan penugasan kuis langsung diarahkan ke server actions
saveGroupRoundsToDatabaseyang mengupdate kolom JSONBroundspada tabel databasecompetition_groups. - Trigger Hapus Bersih (Cleanups): Jika admin menghapus babak atau klasemen grup dari dashboard, sistem secara otomatis menjalankan query untuk menghapus data terkait di database:
- Menghapus data anggota klasemen di
competition_group_members. - Menghapus sesi permainan game aktif di
game_sessions(atau tabelsessions). - Menghapus data lobi chat terkait di tabel
groups. Ini mencegah penumpukan data sampah (orphaned data) di database Supabase.
- Menghapus data anggota klasemen di
4. Sistem Whitelist Room Game (allowed_user_ids)
Turnamen formal melarang pemain yang tidak terdaftar menyusup ke dalam ruangan game. Sistem mengatasinya dengan filter keamanan Whitelist:
- Saat lobi game disiapkan oleh admin dashboard, daftar ID user unik dari seluruh peserta yang terdaftar di dalam grup/babak tersebut dimasukkan ke dalam kolom array
allowed_user_idspada tabelsessions(ataugame_sessions). - Ketika pemain membuka game client (AstroLearn, CrazyRace, Memory-Game, NitroQuiz, Zombie-Rawr) dan mencoba bergabung menggunakan game PIN:
- Game client mengambil data session dari database.
- Jika
allowed_user_idsmemiliki data (tidak kosong), sistem membandingkan ID profile pemain yang sedang login dengan daftar ID di whitelist. - Jika ID pemain tidak tercantum, proses join langsung ditolak. Pemain akan melihat layar Access Denied / Akses Ditolak sesuai dengan gaya visual game masing-masing.
- Host Bypass: Pembuat kompetisi (Host Admin) secara khusus dibebaskan dari whitelist check (
isHost: trueflag) agar admin dapat masuk ke ruangan kapan saja untuk memonitor jalannya kompetisi.