Projeler

Gooldu — Canlı Futbol Skorları

Maçları canlı takip ettiren, gol olduğu anda ekranda haber veren hızlı bir skor sitesi. Skorlar Firestore'dan gerçek zamanlı akıyor.

Tarih
Son güncelleme
Rolüm
Tasarım + geliştirme
Durum
Yayında
Teknolojiler
Vite · JavaScript · Firebase · Node.js

Amaç

Açtığımda şu an oynanan maçları hemen gösteren, gol olunca da haber veren sade bir skor sayfası. Adı da oradan geliyor: Gol oldu!

Neler yapıyor?

  • Şimdi oynanıyor şeridi: canlı maçlar en üstte, dakikayla birlikte.
  • Gol anı: Skor değişince maç satırı yanıp sönüyor ve "GOOOL!" bildirimi çıkıyor.
  • Gün seçici ve takvim, lig çipleri (Süper Lig, Premier League, La Liga, Şampiyonlar Ligi…), ülke ve lig çekmecesi, takım ya da lig arama.
  • Maç detayı: olay akışı (gol, kart, değişiklik, VAR), istatistikler ve kadrolar.
  • Favoriler: Favori maçlar tarayıcıda saklanıyor, hesap gerekmiyor.
  • Adresin sonuna ?demo ekleyince örnek verilerle çalışıyor; bu sayfayı bu şekilde gezebilirsin.

Gooldu'nun güncel görünümü: şimdi oynanan maçlar, gün seçici ve lig listesi

Bağlantılar

Nasıl çalışıyor?

İki parçadan oluşuyor:

  1. Ön yüz (Vite + düz JavaScript): Firestore'daki matches koleksiyonunu onSnapshot ile dinliyor. Veri değişince sayfa kendiliğinden güncelleniyor, yenilemeye gerek yok.
  2. Senkron betiği (Node.js): Skor sağlayıcısının API'sinden maçları çekip Firestore'a yazıyor. İstemci yalnızca okuyabiliyor; yazma yetkisi sadece bu betikte (Admin SDK), güvenlik kuralları da bunu zorluyor:
match /matches/{id} {
  allow read: if true;    // herkes skorları görebilir
  allow write: if false;  // yazma sadece sunucudan
}

Skor kaynağı değiştirilebilir: betik hem API-Football hem football-data.org için yazıldı, hangisinin kullanılacağı ortam değişkeniyle seçiliyor.

Zorlandığım yer: istek kotası

Skor API'lerinin günlük istek hakkı sınırlı; ücretsiz planda günde yalnızca 100. Her dakika güncellemek bu hakkı saatler içinde bitirir. Betiğe kota farkında bir döngü yazdım:

  • Canlı maç varken "şu an oynananlar" tek istekle güncelleniyor; canlı maç yokken günün listesi daha seyrek yenileniyor.
  • Kalan hak her cevabın başlığından okunuyor. Hak azaldıkça güncelleme aralığı otomatik uzuyor ve bir miktar istek her zaman yedekte tutuluyor. Ücretsiz planda aralık kendiliğinden birkaç dakikaya çıkıyor, ücretli planda 60 saniyede kalıyor.
  • Biten maçın detayı bir kez "final" olarak kaydediliyor ve bir daha istenmiyor.

Öğrendiklerim

  • Yazma ve okumayı ayırmak: İstemci yalnızca okuyunca güvenlik kuralları çok basit kaldı ve anahtarlar sunucu tarafında saklandı.
  • Sınırlı kaynağı kodla yönetmek: Kota gibi bir sınırı "ya yetmezse" diye düşünmek yerine, döngünün kendisinin kotaya göre davranmasını sağlamak sorunu çözdü.
  • Gerçek zamanlı hissi: Gol anında ekrana küçük bir animasyon koymak, rakamı değiştirmekten çok daha "canlı" hissettirdi.