⚽
Football
Manager
Tracker
0
/
0
Görev
0%
Tamamlanan
Tümü
Yapılacak
Tamamlanan
📤 Dışa Aktar
📥 İçe Aktar
🔄 Sıfırla
📝 Notlar
📋 Kopyala
✕
Football Manager oyun projesi için geliştirme ortamını kur. GitHub repo: https://github.com/thorrangonak/football-manager Repo zaten oluşturuldu ve şu yapı mevcut: - src/shared, src/engine, src/services, src/bot, src/api, src/jobs, src/socket - prisma/, web/ - package.json, tsconfig.json, docker-compose.yml, .env.example Şimdi yapılacaklar: 1. **package.json'ı güncelle** — Tüm bağımlılıkları ekle: - Runtime: dotenv, zod - Bot: grammy - DB: @prisma/client, ioredis - API: express, cors, socket.io - Queue: bullmq - Cron: node-cron - Logger: winston - Utils: uuid - DevDeps: typescript, tsx, prisma, @types/*, eslint, prettier 2. **ESLint + Prettier konfigürasyonu oluştur:** - .eslintrc.json (TypeScript kuralları, import sıralaması) - .prettierrc (singleQuote, semi, tabWidth: 2, printWidth: 100) 3. **tsconfig.json'ı güncelle:** - Path alias'ları: @shared/*, @engine/*, @bot/*, @api/*, @services/*, @jobs/* - Strict mode, ES2022 target 4. **src/shared/config.ts** oluştur: - .env'den tüm değişkenleri oku (zod ile validasyon) - DATABASE_URL, REDIS_URL, BOT_TOKEN, API_PORT, JWT_SECRET vb. - Eksik değişken varsa hata fırlat 5. **src/shared/logger.ts** oluştur: - Winston logger: console + file transport - Log seviyeleri: error, warn, info, debug - Timestamp formatı, JSON formatında dosyaya yaz 6. **src/shared/types.ts** oluştur: - Temel TypeScript tipleri ve enum'lar: - Position enum: GK, CB, LB, RB, CDM, CM, CAM, LW, RW, ST, WB - Formation enum: F442, F433, F352, F532, F451, F343 - Tactic enum: ATTACK, BALANCED, DEFENSIVE, ALL_OUT_ATTACK - MatchEventType enum: GOAL, SHOT, FOUL, YELLOW_CARD, RED_CARD, INJURY, CORNER, PENALTY, SUBSTITUTION - MatchStatus enum: SCHEDULED, LIVE, FINISHED, CANCELLED - LeagueType enum: A_LEAGUE, B_LEAGUE Tüm dosyaları oluştur ve çalıştığını doğrula.
Football Manager projesi için altyapı servislerini kur. Mevcut dosyalar: src/shared/config.ts, src/shared/logger.ts, src/shared/types.ts Docker servisleri: docker-compose.yml (PostgreSQL 16 + Redis 7) hazır. Şimdi yapılacaklar: 1. **Prisma ORM kurulumu:** - prisma/schema.prisma dosyasını oluştur - Şimdilik sadece datasource ve generator tanımla - Modelleri henüz ekleme (Faz 1'de eklenecek) - src/shared/database.ts: PrismaClient singleton instance - Bağlantı testi fonksiyonu 2. **Redis bağlantısı:** - src/shared/redis.ts: ioredis ile Redis bağlantısı - Singleton pattern - Bağlantı/disconnection event handler'ları - Cache helper fonksiyonları: get, set (TTL destekli), del, exists 3. **BullMQ kurulumu:** - src/jobs/queue.ts: Match queue tanımı - src/jobs/worker.ts: Temel worker yapısı (boş processor, ileride maç simülasyonu eklenecek) - Queue bağlantı testi 4. **src/index.ts — Ana giriş noktası:** - Tüm servislerin başlatılması (DB, Redis, BullMQ, Bot, API) - Graceful shutdown handler (SIGINT, SIGTERM) - Startup log mesajları 5. **Bağlantı testleri:** - Docker compose up yapılınca tüm servislerin bağlanabildiğini doğrulayan test script - npm run dev ile başlatıldığında "✅ PostgreSQL connected", "✅ Redis connected", "✅ BullMQ ready" logları Her dosyada hata yakalama ve retry mekanizması olsun.
Football Manager projesi için Telegram bot'unun temel yapısını kur. Mevcut: src/shared/config.ts (BOT_TOKEN), src/shared/logger.ts Kullanılacak framework: grammy Şimdi yapılacaklar: 1. **src/bot/index.ts — Bot ana dosyası:** - grammy Bot instance oluştur (config.BOT_TOKEN ile) - Session middleware (in-memory veya Redis-based) - Error handler middleware (hataları logla, kullanıcıya "Bir hata oluştu" mesajı) - Logger middleware (her gelen mesajı logla: user_id, command, timestamp) 2. **src/bot/commands/start.ts:** - /start komutu handler - Şimdilik basit bir hoş geldin mesajı gönder: "⚽ Football Manager'a Hoş Geldin! Kendi futbol takımını kur, antrenman yap, transfer yap ve şampiyon ol! Kayıt olmak için takım ismini yaz:" - Kullanıcı metin girdiğinde "Takımın [İsim] oluşturuldu!" yanıtı (DB kaydı Faz 1'de) 3. **src/bot/keyboards/mainMenu.ts:** - Ana menü inline keyboard: [⚽ Kadro] [📊 Lig Tablosu] [🏋️ Antrenman] [💰 Transfer] [👤 Profil] [⚙️ Ayarlar] - Her buton callback_data tanımı 4. **src/bot/middleware/auth.ts:** - Kullanıcının kayıtlı olup olmadığını kontrol eden middleware - Kayıtlı değilse /start'a yönlendir 5. **Bot'u src/index.ts'e entegre et:** - Bot.start() ile polling başlat - Graceful stop ekle Bot'u başlat, /start komutunu test et, inline keyboard'un görünmesini sağla.
Football Manager projesi için Prisma veritabanı şemasını oluştur. Dosya: prisma/schema.prisma Aşağıdaki modelleri tanımla: 1. **User:** - id: Int @id @default(autoincrement()) - tgId: BigInt @unique (Telegram user ID) - username: String? (TG username) - level: Int @default(1) - xp: Int @default(0) - coins: Int @default(50000) - isNewPlayer: Boolean @default(true) (ilk 2 hafta koruma) - newPlayerUntil: DateTime? (koruma süresi) - lastDailyReward: DateTime? (günlük ödül) - notificationPrefs: Json? (bildirim tercihleri) - createdAt: DateTime @default(now()) - updatedAt: DateTime @updatedAt - İlişkiler: team (1-1), transactions 2. **Team:** - id: Int @id @default(autoincrement()) - userId: Int @unique - name: String @unique (takım adı, max 30 karakter) - formation: String @default("F442") (Formation enum) - tactic: String @default("BALANCED") (Tactic enum) - powerRating: Float @default(0) (ortalama overall) - stadiumLevel: Int @default(1) - stadiumMaintained: Boolean @default(true) - createdAt: DateTime @default(now()) - İlişkiler: user, players[], leagueTeams[], homeMatches[], awayMatches[], transfersFrom[], transfersTo[] 3. **Player (Futbolcu):** - id: Int @id @default(autoincrement()) - teamId: Int? (null = serbest oyuncu) - name: String - age: Int (17-38) - position: String (Position enum) - altPosition: String? (alternatif pozisyon) - isStarter: Boolean @default(false) (ilk 11'de mi) - jerseyNumber: Int? // 7 Ana Stat (1-99) - speed: Float @default(50) - shooting: Float @default(50) - passing: Float @default(50) - dribbling: Float @default(50) - defense: Float @default(50) - physical: Float @default(50) - goalkeeping: Float @default(50) // Overall - overall: Float @default(50) (pozisyona göre ağırlıklı hesaplama) // Dinamik Statlar - morale: Float @default(70) (0-100) - form: Float @default(50) (son 5 maç ortalaması) - fitness: Float @default(100) (kondisyon, 0-100) - injuryDuration: Int @default(0) (kalan sakatlık süresi, maç sayısı) - suspendedUntil: Int @default(0) (cezalı maç sayısı) - yellowCards: Int @default(0) (sezon toplam sarı) // Ekonomi - marketValue: Int @default(10000) - salary: Int @default(200) // Antrenman - lastTrainingAt: DateTime? - trainingCooldownUntil: DateTime? - createdAt: DateTime @default(now()) - İlişkiler: team, matchEvents[], goalsScoredIn[], assistsIn[] 4. **League:** - id: Int @id @default(autoincrement()) - name: String (örn: "A Ligi", "B Ligi") - type: String (A_LEAGUE / B_LEAGUE) - seasonId: Int - status: String @default("ACTIVE") (ACTIVE, FINISHED, TRANSFER_WINDOW) - İlişkiler: season, leagueTeams[], matches[] 5. **LeagueTeam (Lig-Takım bağlantısı):** - id: Int @id @default(autoincrement()) - leagueId: Int - teamId: Int - played: Int @default(0) - wins: Int @default(0) - draws: Int @default(0) - losses: Int @default(0) - goalsFor: Int @default(0) - goalsAgainst: Int @default(0) - points: Int @default(0) - @@unique([leagueId, teamId]) 6. **Match:** - id: Int @id @default(autoincrement()) - leagueId: Int? - seasonId: Int? - homeTeamId: Int - awayTeamId: Int - scheduledAt: DateTime - status: String @default("SCHEDULED") - homeScore: Int @default(0) - awayScore: Int @default(0) - matchWeek: Int? - isFriendly: Boolean @default(false) - matchData: Json? (detaylı maç istatistikleri) - İlişkiler: league, homeTeam, awayTeam, events[] 7. **MatchEvent:** - id: Int @id @default(autoincrement()) - matchId: Int - tick: Int (0-59) - minute: Int (1-90) - type: String (MatchEventType enum) - teamId: Int? - playerId: Int? - secondPlayerId: Int? (asist yapan, faul yapılan vb.) - detail: Json? (ek bilgi) - commentary: String? (Türkçe yorum) 8. **Transfer:** - id: Int @id @default(autoincrement()) - playerId: Int - fromTeamId: Int? - toTeamId: Int? - price: Int - status: String @default("PENDING") (PENDING, ACCEPTED, REJECTED, EXPIRED) - expiresAt: DateTime? - createdAt: DateTime @default(now()) 9. **Season:** - id: Int @id @default(autoincrement()) - number: Int (sezon numarası) - startDate: DateTime - endDate: DateTime - status: String @default("ACTIVE") - İlişkiler: leagues[], matches[] 10. **Transaction (Para hareketleri):** - id: Int @id @default(autoincrement()) - userId: Int - amount: Int (pozitif = gelir, negatif = gider) - type: String (MATCH_WIN, MATCH_DRAW, MATCH_LOSS, SALARY, TRAINING, TRANSFER_BUY, TRANSFER_SELL, DAILY_REWARD, LEVEL_UP, SEASON_PRIZE, STADIUM, MEDICAL) - description: String? - createdAt: DateTime @default(now()) Her modelde gerekli indexleri ekle (@index). İlişkilerde onDelete kurallarını belirle. Migration oluştur ve çalıştır: npx prisma migrate dev --name init Ardından npx prisma generate çalıştır.
Football Manager projesi için futbolcu oluşturma motorunu yaz. Dosya: src/engine/playerGenerator.ts Mevcut: prisma/schema.prisma (Player modeli), src/shared/types.ts (Position enum) Kurallar (Game Design Document'tan): **Pozisyona Göre Stat Dağılımı (ağırlıklı rastgele):** Her pozisyonun "güçlü" statları var, bunlar daha yüksek üretilir. - GK: goalkeeping ×2.0, physical ×1.3, defense ×1.2 - CB: defense ×2.0, physical ×1.5, speed ×0.8 - LB/RB: speed ×1.5, defense ×1.3, passing ×1.2 - CDM: defense ×1.5, passing ×1.3, physical ×1.3 - CM: passing ×1.8, dribbling ×1.2, shooting ×1.0 - CAM: passing ×1.5, dribbling ×1.5, shooting ×1.3 - LW/RW: speed ×1.8, dribbling ×1.5, shooting ×1.0 - ST: shooting ×2.0, speed ×1.3, dribbling ×1.2 - WB: speed ×1.5, defense ×1.2, passing ×1.2, physical ×1.2 Fonksiyonlar: 1. **generatePlayer(options):** - options: { position, minOvr?, maxOvr?, age? } - Base stat üret: minOvr-maxOvr aralığında hedef overall - Pozisyon ağırlıklarına göre 7 stat'ı dağıt - Her stat 1-99 arasında clamp et - Yaş: verilmezse rastgele 17-33 (ağırlıklı: 20-28 daha olası) - İsim: rastgele Türkçe isim havuzundan 2. **calculateOverall(player, position):** Pozisyona göre ağırlıklı ortalama: - GK: REF×0.45 + PHY×0.20 + DEF×0.15 + SPD×0.10 + PAS×0.10 - CB: DEF×0.35 + PHY×0.25 + SPD×0.15 + PAS×0.15 + SHT×0.10 - LB/RB: SPD×0.25 + DEF×0.25 + PAS×0.20 + PHY×0.15 + DRB×0.15 - CDM: DEF×0.30 + PAS×0.25 + PHY×0.25 + SPD×0.10 + DRB×0.10 - CM: PAS×0.30 + DRB×0.20 + SHT×0.15 + DEF×0.15 + PHY×0.10 + SPD×0.10 - CAM: PAS×0.25 + DRB×0.25 + SHT×0.25 + SPD×0.15 + PHY×0.10 - LW/RW: SPD×0.30 + DRB×0.25 + SHT×0.20 + PAS×0.15 + PHY×0.10 - ST: SHT×0.35 + SPD×0.20 + DRB×0.20 + PHY×0.15 + PAS×0.10 - WB: SPD×0.20 + DEF×0.20 + PAS×0.20 + PHY×0.20 + DRB×0.20 3. **calculateMarketValue(player):** - Base: overall² × 15 - Yaş çarpanı: 17-21 → ×1.4, 22-27 → ×1.0, 28-30 → ×0.7, 31-33 → ×0.4, 34+ → ×0.2 - Form bonus: (form / 50) çarpanı 4. **calculateSalary(marketValue):** - marketValue × 0.02 (haftalık) 5. **generateStarterPack():** - 18 futbolcu üret: - 2 GK (1 starter) - 2 CB (2 starter) + 1 yedek CB - 1 LB (starter) + 1 RB (starter) - 2 CM (starter) + 1 CDM (starter) - 1 CAM (yedek) - 1 LW (starter) + 1 RW (starter) - 2 ST (1 starter, 1 yedek) - 1 WB (yedek) - OVR aralığı: 45-60 - 1 yıldız oyuncu: 65-70 OVR garantisi (rastgele pozisyon) - Forma numaraları: 1-18 ata 6. **TÜRKÇE İSİM HAVUZU:** - En az 100 isim, 100 soyisim - Rastgele isim + soyisim kombinasyonu - Aynı takımda aynı isimde 2 oyuncu olmasın Tüm fonksiyonları export et ve test için bir test script (src/engine/__tests__/playerGenerator.test.ts) yaz: - 18 kişilik starter pack üret, overall'ların 45-70 arasında olduğunu doğrula - Her pozisyon tipinden en az 1 oyuncu olduğunu doğrula
Football Manager projesi için Telegram bot'unun kayıt ve takım yönetim komutlarını yaz. Mevcut: Prisma modelleri, playerGenerator.ts, bot temel yapısı (grammy) Komutlar: 1. **/start — Kayıt:** - DB'de user var mı kontrol et (tgId ile) - Yoksa: "⚽ Hoş geldin! Takımına bir isim ver:" → conversation/session ile isim al - İsim gelince: - User oluştur (coins: 50000) - Team oluştur (verilen isim) - generateStarterPack() ile 18 futbolcu oluştur ve team'e ata - Takım power_rating'ini hesapla - Hoş geldin mesajı + ana menü keyboard göster - Zaten kayıtlıysa: "Zaten bir takımın var: [Takım Adı]" + ana menü 2. **/kadro — Kadro Görüntüleme:** - Mevcut formasyon göster (örn: "📋 4-4-2") - İlk 11'i pozisyonlarına göre sıralı listele:
Football Manager projesi için maç simülasyon motorunu yaz. Dosya: src/engine/matchEngine.ts Bu projenin KALBİ — en önemli ve dikkatli yazılması gereken dosya. **GENEL YAPI:** - 60 tick = 1 maç = 90 oyun dakikası (1 tick = 1 saniye gerçek süre = 1.5 dk oyun) - Her tick'te %35 olay şansı - Sonuç: Match nesnesi (skor, olaylar listesi, istatistikler) **SINIFLAR VE FONKSİYONLAR:** 1. **MatchEngine class:** constructor(homeTeam: MatchTeam, awayTeam: MatchTeam, matchId: number) **MatchTeam tipi:**
Football Manager projesi için lig sistemi ve fikstür oluşturma motorunu yaz. Dosyalar: - src/engine/leagueManager.ts - src/engine/fixtureGenerator.ts - src/services/leagueService.ts **1. Fikstür Oluşturma (Round-Robin):** function generateFixtures(teamIds: number[]): Fixture[][] - Round-robin algoritması: Her takım birbirine 1 kez maç - N takım varsa N-1 hafta, her hafta N/2 maç - Tek sayı takım varsa bye sistemi (o hafta maçı yok) - Ev/deplasman dengeli olsun (mümkün olduğunca eşit) - Return tipi: Fixture[][] (hafta bazlı gruplanmış)
Football Manager projesi için ekonomi sistemini yaz. Dosyalar: - src/services/economyService.ts - src/services/transactionService.ts **EconomyService class:** 1. **addCoins(userId, amount, type, description):** - User.coins += amount - Transaction kaydı oluştur - Return: yeni bakiye 2. **removeCoins(userId, amount, type, description):** - Bakiye kontrolü: coins >= amount - Yetersiz bakiye → hata fırlat - User.coins -= amount - Transaction kaydı oluştur 3. **processMatchReward(userId, result: 'WIN' | 'DRAW' | 'LOSS'):** - WIN: +5000, DRAW: +2000, LOSS: +500 - Yeni oyuncu koruması varsa (isNewPlayer && kaybettiyse): ekstra +2000 4. **processWeeklySalaries():** - Tüm aktif takımlar için: - Toplam maaş = takımdaki tüm oyuncuların salary toplamı - coins >= toplamMaaş → öde - coins < toplamMaaş → ÖDEME YAPILAMADI: - Tüm oyunculara moral -30 - Log ve bildirim oluştur 5. **processStadiumMaintenance():** - Her takımdan haftalık 5000 coin - Ödenirse: stadiumMaintained = true (ev avantajı aktif) - Ödenmezse: stadiumMaintained = false (ev avantajı iptal) 6. **processDailyReward(userId):** - Son ödül tarihi kontrol: aynı gün mü? - Değilse: +1000 coin, lastDailyReward güncelle - Aynı günse: "Bugün zaten ödülünü aldın!" 7. **processSeasonPrize(userId, rank, leagueType):** - A Ligi: 1. → 100K, 2. → 60K, 3. → 35K, diğer → 10K - B Ligi: 1. → 50K, 2. → 30K, 3. → 20K, diğer → 5K 8. **processLevelUp(userId, newLevel):** - Ödül: 5000 × newLevel **Bot Komutları:** - /bakiye: Mevcut coin göster + son 10 işlem - /gunluk: Günlük ödül al - /gelir: Son 7 günlük gelir/gider özeti **Cron Job (src/jobs/weeklyCron.ts):** - Her Pazartesi 00:00: processWeeklySalaries() + processStadiumMaintenance()
Football Manager projesi için transfer pazarı sistemini yaz. Dosyalar: - src/services/transferService.ts - src/bot/commands/transfer.ts - src/bot/handlers/transferHandler.ts **TransferService class:** 1. **listMarketPlayers(filters?):** - Sistem tarafından üretilmiş NPC futbolcular (teamId = null) - Her gün 5-10 yeni NPC oyuncu üretilir (cron) - Filtreleme: pozisyon, min/max OVR, max fiyat - Fiyat = marketValue × (1 + talep çarpanı) 2. **buyFromMarket(userId, playerId):** - Oyuncu kontrolü: teamId == null (satışta mı?) - Bakiye kontrolü - Kadro limiti: max 25 oyuncu - Para kes, oyuncuyu takıma ata - Transfer kaydı oluştur 3. **sendTransferOffer(fromUserId, toPlayerId, offerPrice):** - Oyuncu sahibi kontrolü - Teklif fiyat kontrolü: min %50 marketValue (altı → blok, anti-abuse) - Yeni oyuncu ilk hafta transfer engeli kontrolü - Aynı 2 kullanıcı arasında günde max 1 transfer kontrolü - Transfer güçlü ligden zayıf lige: +%50 vergi - Transfer kaydı: status=PENDING, expiresAt=24 saat sonra - Karşı tarafa bildirim gönder 4. **acceptOffer(transferId, userId):** - Transfer sahibi mi kontrol - Bakiye kontrolü (alıcının) - Para transfer: alıcı → satıcı - Oyuncu team değiştir - Her iki taraf bildirim 5. **rejectOffer(transferId, userId):** - Status = REJECTED - Teklif sahibine bildirim 6. **sellPlayer(userId, playerId, price):** - Min 11 oyuncu kontrolü (11'den az satamaz) - Oyuncuyu serbest bırak (teamId = null, pazara düşür) - Para ekle 7. **expireTransfers():** - Cron: 24 saati geçmiş PENDING transferleri EXPIRED yap **Anti-Abuse Kuralları:** - Piyasa değerinin %50 altına satış/teklif → otomatik blok + uyarı - Aynı 2 kişi arasında günde max 1 transfer - Yeni oyuncu ilk 7 gün transfer yapamaz - Güçlü ligden zayıf lige transfer: +%50 vergi **Bot — /transfer komutu:** - Ana menü: [🛒 Pazar] [📤 Sat] [📨 Tekliflerim] [📩 Gelen Teklifler] - Pazar: Pozisyon filtreli oyuncu listesi, sayfalı, "Satın Al" butonu - Sat: Kendi oyuncularından seç, fiyat belirle - Tekliflerim: Gönderdiğim teklifler (bekleyen/kabul/red) - Gelen Teklifler: Bana gelen teklifler → [✅ Kabul] [❌ Red]
Football Manager projesi için antrenman ve gelişim sistemini yaz. Dosyalar: - src/services/trainingService.ts - src/engine/developmentEngine.ts - src/bot/commands/training.ts **Antrenman Tipleri:** | Tip | Maliyet | Etki | Cooldown | Yan Etki | |-----|---------|------|----------|----------| | Kondisyon Kampı | 500 | Kondisyon +30 | 12 saat | — | | Teknik Antrenman | 2000 | Seçilen stat +0.5 | 24 saat | Kondisyon -5 | | Fizik Antrenmanı | 2000 | PHY +0.5, SPD +0.3 | 24 saat | Kondisyon -10 | | Yoğun Kamp | 5000 | Seçilen stat +1.0 | 36 saat | Kondisyon -20 | | Elit Kamp | 10000 | 2 seçilen stat +1.0 | 48 saat | Kondisyon -25 | **Yaş Bazlı Gelişim Çarpanı:** - 17-21: ×1.5 - 22-27: ×1.0 - 28-30: ×0.6 - 31-33: ×0.3 - 34-36: ×0.0 (gelişim duraklar) - 37-38: ×-0.3 (gerileme, stat düşüşü) **Catchup Mekanizması (Düşük OVR hızlı gelişir):** - OVR 40-55: ×2.0 - OVR 56-65: ×1.5 - OVR 66-75: ×1.0 - OVR 76-85: ×0.7 - OVR 86-99: ×0.4 **TrainingService:** 1. **trainPlayer(userId, playerId, trainingType, targetStat?):** - Cooldown kontrolü (lastTrainingAt + cooldown > now → ret) - Bakiye kontrolü - Sakatlık kontrolü (sakatken antrenman yapılamaz) - Gelişim hesapla: statGain = baseGain × ageMultiplier × catchupMultiplier × (coachBonus || 1.0) - Stat güncelle (max 99, min 1) - Overall yeniden hesapla - Piyasa değeri yeniden hesapla - Kondisyon düşür - Cooldown başlat - Para kes - XP ekle: 50 × trainingType seviyesi 2. **processPassiveDevelopment(playerId, matchStats):** - Maç sonrası otomatik (her maç oynayan oyuncuya): - Rastgele 1-2 stat seç - +0.1 ile +0.3 arası gelişim (yaş/catchup çarpanı uygulanır) - Özel kurallar: - Gol atan ST/CAM → SHT +0.2 - Asist yapan → PAS +0.2 - Clean sheet GK → REF +0.2 - Clean sheet CB → DEF +0.2 3. **processAging(seasonEnd):** - Sezon sonunda tüm oyuncuların yaşı +1 - 34+ oyuncular: rastgele 2-3 stat'ta -0.5 ile -1.0 arası gerileme - 37+ oyuncular: daha sert gerileme (-1.0 ile -2.0) - Emeklilik: 38 yaşını geçen oyuncular emekli olabilir (%30 şans) **Antrenör Sistemi:** | Antrenör | Maliyet | Süre | Bonus | Ekstra | |----------|---------|------|-------|--------| | Bronz | 10.000 | 7 gün | +%20 antrenman | — | | Gümüş | 25.000 | 7 gün | +%40 antrenman | — | | Altın | 50.000 | 7 gün | +%60 antrenman | Sakatlık riski -%20 | 4. **hireCoach(userId, tier: 'bronze'|'silver'|'gold'):** - Bakiye kontrol, para kes - Coach kaydı: tier, expiresAt = now + 7 gün - Antrenman hesaplamalarında bonus uygula **Bot — /antrenman komutu:** - Oyuncu seç (inline keyboard, sayfalı) - Antrenman tipi seç - Teknik/Yoğun/Elit için stat seç (SPD/SHT/PAS/DRB/DEF/PHY/REF) - Onay: "[Oyuncu] için [Antrenman] yapılsın mı? 💰 [Maliyet]" - Sonuç: "✅ [Oyuncu]: SPD 62.3 → 63.1 (+0.8)"
Football Manager projesi için seviye ve XP sistemini yaz. Dosya: src/services/levelService.ts **XP Kazanma Kuralları:** | Aksiyon | XP | |---------|-----| | Maç oyna (sonuç fark etmez) | +100 | | Maç kazan | +200 | | Maç berabere | +100 | | Gol at (her gol) | +50 | | Clean sheet | +150 | | Antrenman yap | +50 | | Günlük giriş | +25 | | Transfer yap (al veya sat) | +75 | | Rehberi tamamla | +500 | **Seviye Formülü:** - requiredXP(level) = 1000 × level × (1 + level × 0.1) - Seviye 1→2: 1100 XP - Seviye 5→6: 8000 XP - Seviye 10→11: 21000 XP **Seviye Atlama Ödülleri:** - Coin: 5000 × newLevel - Her 5 seviyede bonus: Ücretsiz Yoğun Kamp hakkı **LevelService:** 1. addXP(userId, amount, source): XP ekle, seviye kontrolü yap 2. checkLevelUp(userId): XP yeterliyse seviye atla, ödül ver 3. getLevelInfo(userId): Mevcut seviye, XP, sonraki seviyeye kalan **Bot — /profil komutu:**
Football Manager projesi için sezon döngüsü ve otomatik maç zamanlama sistemini yaz. Dosyalar: - src/services/seasonService.ts - src/jobs/matchScheduler.ts - src/jobs/cronJobs.ts **Sezon Yapısı:** - 8 hafta toplam: 7 hafta lig + 1 hafta transfer dönemi - Haftada 2 maç günü: Çarşamba 20:00, Cuma 20:00 - Her maç günü aynı anda max 7-8 maç (5'er dk arayla: 20:00, 20:05, 20:10...) - Pazar 18:00: Şampiyonlar Ligi (Faz 5'te eklenecek) **SeasonService:** 1. **startNewSeason():** - Season kaydı oluştur (number++, startDate, endDate) - Takımları liglere dağıt: - A Ligi: Üst takımlar (powerRating sıralaması veya önceki sezon) - B Ligi: Alt takımlar + yeni oyuncular - İlk sezon: Tüm takımlar tek lige (B Ligi gibi davran) - Her lig için fikstür oluştur - Maçları zamanla (Çar+Cum, 20:00'den itibaren 5'er dk) - Tüm LeagueTeam istatistiklerini sıfırla - Duyuru gönder: "🏟️ Sezon [N] başladı!" 2. **endSeason(seasonId):** - Tüm maçlar oynandı mı kontrol - Sıralama finalize - Ödülleri dağıt (SeasonPrize) - Relegation/Promotion: - A Ligi son 2 → B Ligi - B Ligi ilk 2 → A Ligi - İstatistik ödülleri: Gol kralı, asist kralı vb. - Transfer dönemini başlat (1 hafta) - Yaşlandırma: Tüm oyuncuların yaşı +1 - Gerileme: 34+ oyuncularda stat düşüşü 3. **startTransferWindow():** - 7 gün serbest transfer dönemi - NPC oyuncu sayısını artır (normalin 2 katı) - Transfer dönemi sonu: otomatik kapat, yeni sezon başlat **Match Scheduler (BullMQ):** 1. **scheduleMatches():** - Gelecek haftanın maçlarını BullMQ'ya delayed job olarak ekle - Her maç için: - scheduledAt zamanında tetiklenecek job - Job data: matchId, homeTeamId, awayTeamId 2. **processMatch(job):** - Maç verilerini DB'den çek (takımlar, oyuncular, formasyonlar) - Sakatları ve cezalıları çıkar, yedekten tamamla - MatchEngine.simulateMatch() çalıştır - Sonuçları DB'ye kaydet - Lig tablosu güncelle - Ödülleri dağıt - Bildirimleri gönder - Match Tracker eventlerini emit et (Socket.IO, Faz 4'te) 3. **Worker yapısı:** - 3 worker paralel çalışır - Her worker 1 maçı sıralı işler - Maçlar 5'er dakika arayla başlar → çakışma yok **Cron Jobs (node-cron):** | Cron | İş | Zaman | |------|----|-------| | matchReminder1h | Maç 1 saat kala bildirim | Maç saatine göre dinamik | | matchReminder10m | Maç 10 dk kala bildirim | Maç saatine göre dinamik | | weeklySalaries | Maaş kesimi | Pazartesi 00:00 | | stadiumMaintenance | Stadyum bakımı | Pazartesi 00:00 | | dailyNPCRefresh | NPC transfer pazarını yenile | Her gün 06:00 | | expireTransfers | Süresi dolan transferleri iptal | Her saat başı | | fitnessRecovery | Kondisyon toparlanması | Her saat: +3 fitness (max 100) | Kondisyon toparlanması: Her saat başı tüm oyuncuların fitness'ı +3 artar (max 100).
Football Manager projesi için Telegram bildirim sistemini yaz. Dosya: src/services/notificationService.ts **NotificationService:** 1. **sendToUser(userId, message, keyboard?):** - TG Bot üzerinden DM gönder - Keyboard varsa inline button ekle 2. **sendToLeague(leagueId, message):** - Ligteki tüm oyunculara gönder 3. **Bildirim Türleri:** a) **matchReminder(matchId, minutesBefore):** - 60 dk: "⏰ Maçın 1 saat sonra! [Takımın] 🆚 [Rakip] — Kadronuzu kontrol edin!" - 10 dk: "🔔 Maçın 10 dakika sonra başlıyor! [Takımın] 🆚 [Rakip]" b) **matchStarted(matchId):** - "▶️ Maç başladı! [Ev] 🆚 [Deplasman] — /canli ile izle!" c) **goalScored(matchId, scorerName, score):** - "⚽ GOOOL! [Oyuncu] — [Ev] [skor] [Dep]" d) **matchEnded(matchId, result):** - "🏁 Maç Bitti!\n[Ev] [skor] [Dep]\n⚽ Goller: ...\n💰 Kazanç: +5.000" e) **transferOffer(fromTeam, toUser, player, price):** - "📨 Transfer Teklifi!\n[Takım] [Oyuncu] için 💰[Fiyat] teklif etti.\n[Kabul] [Red]" f) **weeklySalary(userId, totalSalary, success):** - Başarılı: "💰 Haftalık maaşlar ödendi: -[Tutar]" - Başarısız: "⚠️ Maaş ödenemedi! Bakiye yetersiz. Oyuncularınızın morali düştü!" g) **injuryNotification(playerId, duration):** - "🏥 [Oyuncu] sakatlandı! [N] maç süreyle oynayamayacak." h) **seasonEnd(userId, rank, prize):** - "🏆 Sezon Sonu!\nSıralamanız: #[rank]\nÖdül: 💰[prize]\n[detaylı istatistikler]" 4. **Bildirim Tercihleri:** - User.notificationPrefs JSON alanı: { matchReminders: true, goals: true, results: true, transfers: true, salaries: true } - /ayarlar komutu ile toggle edilebilir - Gönderim öncesi tercih kontrolü yap
Football Manager projesi için yeni oyuncu koruma ve dengeleme sistemini yaz. Dosya: src/services/newPlayerService.ts Kurallar: 1. İlk 2 hafta (14 gün) koruma kalkanı (User.isNewPlayer, User.newPlayerUntil) 2. Koruma süresince: - Maaşlar %50 indirimli - Antrenman ücretleri %50 indirimli - Mağlubiyet başına ekstra +2.000 teselli ödülü - Rakip eşleştirme: OVR farkı max 10 (fikstürde kontrol) 3. B Ligi ataması: Yeni oyuncular otomatik B Ligi'ne 4. Sezon ortası katılım: - Eğer sezon ortasındaysa: Sonraki sezon başına kadar sadece dostluk maçları - Dostluk maçlardan da XP ve pasif gelişim kazanır 5. Koruma süresi bitince: - isNewPlayer = false - Normal ekonomi kuralları uygulanır - "Koruma kalkanınız sona erdi! Artık gerçek bir menajersiniz! 💪" bildirimi
Football Manager projesi için Express API sunucusunu yaz. Dosyalar: - src/api/index.ts (Express app + Socket.IO) - src/api/middleware/auth.ts (JWT auth) - src/api/routes/teams.ts - src/api/routes/players.ts - src/api/routes/leagues.ts - src/api/routes/matches.ts - src/api/routes/transfers.ts - src/api/routes/users.ts **API Endpoints:** Auth: - POST /api/auth/telegram — Telegram Login Widget doğrulama → JWT token Teams: - GET /api/teams/:id — Takım detayı (oyuncularla birlikte) - GET /api/teams/:id/squad — Kadro (ilk 11 + yedekler) - PATCH /api/teams/:id/formation — Formasyon güncelle - PATCH /api/teams/:id/tactic — Taktik güncelle - PATCH /api/teams/:id/lineup — Kadro düzenle (swap) Players: - GET /api/players/:id — Oyuncu detay - GET /api/players/:id/stats — Oyuncu istatistikleri Leagues: - GET /api/leagues/:id — Lig bilgisi - GET /api/leagues/:id/standings — Puan tablosu - GET /api/leagues/:id/fixtures — Fikstür - GET /api/leagues/:id/results — Sonuçlar Matches: - GET /api/matches/:id — Maç detayı + olaylar - GET /api/matches/live — Şu an oynanan maçlar - GET /api/matches/upcoming — Gelecek maçlar Transfers: - GET /api/transfers/market — Transfer pazarı - POST /api/transfers/buy/:playerId — Pazar'dan satın al - POST /api/transfers/offer — Teklif gönder - PATCH /api/transfers/:id/accept — Teklif kabul - PATCH /api/transfers/:id/reject — Teklif red Users: - GET /api/users/me — Kendi profil - GET /api/users/me/transactions — Para hareketleri Middleware: JWT auth, rate limiting (60/dk), CORS, error handler, request logger.
Football Manager projesi için Socket.IO ile gerçek zamanlı match tracker yaz. Dosyalar: - src/socket/matchTracker.ts - src/socket/index.ts **Match Tracker Akışı:** 1. Maç başladığında: - MatchEngine her tick'te event üretir - Her event Socket.IO ile broadcast edilir - Room: "match:{matchId}" 2. **Socket Events:** Client → Server: - join_match: { matchId } → ilgili odaya katıl - leave_match: { matchId } → odadan ayrıl - get_live_matches → aktif maç listesi Server → Client: - match_tick: { matchId, tick, minute, events[], score, stats } - match_event: { matchId, event: MatchEventData } - match_start: { matchId, homeTeam, awayTeam } - match_halftime: { matchId, score, stats } - match_end: { matchId, finalScore, fullStats, manOfTheMatch } - live_matches_update: { matches[] } 3. **Maç Engine Entegrasyonu:** - simulateMatch() fonksiyonunu tick-by-tick çalıştır - Her tick arasında 1 saniye bekle (gerçek zamanlı izleme) - Her tick'te socket event emit et 4. **TG Bot Match Tracker:** - Maç başında mesaj gönder - Her önemli olay: editMessageText ile güncelle - Rate limit: min 3 saniye arayla edit - Sadece önemli olaylar güncellenir: GOL, KART, SAKATLIK, PENALTI, DEVRE, MAÇ SONU - Mesaj formatı:
Football Manager projesi için Next.js web arayüzünü yaz. Dizin: web/ Teknoloji: Next.js 14 (App Router), TailwindCSS, Socket.IO Client **Sayfalar:** 1. **/ (Dashboard):** - Takım özeti kartı (isim, OVR, formasyon, taktik) - Bakiye ve seviye - Yaklaşan maçlar (sonraki 3 maç) - Son sonuçlar - Hızlı aksiyonlar (Antrenman, Transfer, Kadro) 2. **/squad (Kadro):** - Formasyon görsel gösterimi (saha üzerinde oyuncular) - İlk 11 kartları (isim, pozisyon, OVR, kondisyon bar'ı) - Yedek listesi - Drag & drop kadro düzenleme - Formasyon ve taktik değiştirme dropdown'ları 3. **/player/[id] (Oyuncu Detay):** - Büyük oyuncu kartı (tüm statlar radar chart ile) - Form grafiği (son 10 maç) - Sezon istatistikleri - Antrenman butonu 4. **/league (Lig):** - Puan tablosu (renk kodlu: şampiyon, UCL, küme düşme) - Fikstür takvimi - Maç sonuçları 5. **/match/[id] (Match Tracker):** - Canlı skor (büyük, ortada) - Dakika sayacı - Olay akışı (timeline, yukarıdan aşağı) - Takım istatistikleri (possession bar, şut, faul vb.) - Eğer maç bitmişse: Tam istatistik + maçın adamı 6. **/transfers (Transfer Pazarı):** - Filtreler: Pozisyon, OVR aralığı, fiyat aralığı - Oyuncu kartları grid - Satın al butonu - Gelen/giden teklifler listesi 7. **/profile (Profil):** - Seviye ve XP bar'ı - Sezon istatistikleri - Başarılar (achievements) - Para hareketleri **Ortak Bileşenler:** - Navbar (logo, sayfalar, bakiye, bildirimler) - PlayerCard component - MatchScore component - StandingsTable component - Loading/Error states - Telegram Login butonu (auth) - Socket.IO provider (global connection) Tasarım: Koyu tema, futbol temalı yeşil aksanlar, modern ve responsive. TailwindCSS kullanarak mobil öncelikli tasarım.
Football Manager projesi için Şampiyonlar Ligi ve Kupa turnuva sistemini yaz. Dosyalar: - src/engine/tournamentManager.ts - src/services/tournamentService.ts **Şampiyonlar Ligi:** 1. Katılım: A Ligi ilk 4 takım 2. Format: - Grup aşaması: 2 grup × 4 takım, çift devreli (her takım 6 maç) - Her gruptan ilk 2 → yarı final - Yarı final: Tek maç - Final: Tek maç (Pazar 18:00) 3. Ödüller: Şampiyon 200K, Finalist 100K, Yarı finalist 50K, Gruptan çıkamayan 20K 4. Maç günleri: Pazar 18:00 **Kupa Turnuvası:** 1. Tüm takımlar katılır (A + B Ligi) 2. Knockout (tek maç eleme) 3. Kura: Pot sistemi (A Ligi = Pot 1, B Ligi = Pot 2) 4. Final ödülü: 75K 5. Sezon sonu: Süper Kupa (Lig şampiyonu vs Kupa şampiyonu) **TournamentManager:** - createChampionsLeague(seasonId, qualifiedTeamIds[]) - createCup(seasonId, allTeamIds[]) - drawGroups(teamIds, groupCount) - drawKnockout(teamIds, pots?) - advanceRound(tournamentId) - getTournamentBracket(tournamentId)
Football Manager projesi için sosyal özellikleri yaz. **1. Dostluk Maçı:** - /dostlukmaci @rakip_username - Günde max 3 dostluk maçı - Puan tablosunu etkilemez - XP ve pasif gelişim verir - Sonuç: Normal maç simülasyonu **2. Lig Sohbet Grubu:** - Her lig için otomatik TG grubu oluştur - Maç sonuçları otomatik paylaşılır - Haftalık özet mesajı (puan tablosu + haftanın sonuçları) **3. MVP Oylaması:** - Her hafta sonu: Haftanın en iyi performans gösteren oyuncuları listelenir - Lig üyeleri oy verir (inline keyboard) - Kazanan oyuncunun takımına +5 moral tüm kadro - /mvp komutu **4. All-Star Maçı:** - Sezon sonunda: A Ligi en iyi 11 vs B Ligi en iyi 11 - Eğlence maçı, ödül yok, sadece prestij **5. Liderlik Tabloları:** - /golkrali: Sezon gol sıralaması - /asistkrali: Sezon asist sıralaması - /eniyitakim: Takım OVR sıralaması - /liderlik: Genel liderlik tablosu **6. Başarı Sistemi:** - 20+ başarı: İlk galibiyet, 10 galibiyet, 50 gol, 5 galibiyet serisi, şampiyonluk, UCL kazanma, 100K coin biriktirme vb. - Her başarı XP + coin ödülü
Football Manager projesi için anti-cheat ve güvenlik önlemlerini yaz. Dosya: src/services/antiCheatService.ts **Kurallar:** 1. Çoklu hesap: TG hesap yaşı < 7 gün → kayıt engeli 2. IP kontrolü: Web'de aynı IP'den max 2 hesap 3. Transfer suistimali: Piyasa değerinin %50 altına satış → otomatik blok 4. Aynı 2 kişi arasında günde max 1 transfer 5. Rate limiting: Dakikada max 30 API çağrısı per kullanıcı 6. Bot davranış tespiti: Anormal aktivite pattern'i (1 dk'da 50+ komut) **Ceza Sistemi:** - 1. ihlal: Uyarı mesajı - 2. ihlal: 3 gün ban (tüm komutlar kilitlenir) - 3. ihlal: Sezon sonu hesap silme **Loglama:** - Her transfer, her büyük para hareketi loglanır - Şüpheli aktiviteler ayrı log dosyasına - Haftalık otomatik rapor (admin'e)
Football Manager projesi için yedekleme ve deployment yapılandırmasını yaz. **Yedekleme:** 1. PostgreSQL WAL: continuous archiving, 7 gün retention 2. Günlük pg_dump: Cron 04:00, sıkıştırılmış SQL → /backups/ dizini 3. Redis RDB: 15 dakikada bir snapshot 4. Kurtarma prosedürü dokümantasyonu **Deployment:** 1. VPS: 2 vCPU, 4GB RAM, Ubuntu 22.04 2. Docker Compose production yapısı: - PostgreSQL 16 + Redis 7 + Node.js app 3. PM2 process manager: - pm2.config.js: Bot + API + Worker süreçleri - Auto-restart, memory limit, log rotation 4. Nginx reverse proxy: - SSL (Let's Encrypt) - WebSocket proxy (Socket.IO için) - Static file serving (Next.js build) 5. Monitoring: - pm2 monit - Basit health check endpoint (/api/health) **Performans:** 1. Redis cache: Puan tablosu (TTL: 60s), oyuncu detay (TTL: 30s) 2. DB indexleri: Match.scheduledAt, Player.teamId, LeagueTeam.leagueId, Transfer.status 3. Connection pooling: Prisma default pool
Football Manager projesi için ekonomi dengeleme testi ve son dokunuşları yaz. **Simülasyon Testi:** 25-30 yapay takım oluştur ve 2 sezon simüle et. Kontrol listesi: 1. Ortalama takım bakiyesi sezon sonunda pozitif mi? 2. En zengin ve en fakir arasındaki fark makul mü? (max 5x) 3. Transfer pazarında enflasyon var mı? (ortalama fiyat artışı < %20/sezon) 4. Maaş toplamı gelirlerden düşük mü? (sürdürülebilir) 5. Yeni oyuncu 4 hafta sonra rekabetçi olabiliyor mu? 6. 34+ yaş oyuncular doğal olarak değer kaybediyor mu? **Ayarlama:** Dengesizlik varsa şu parametreleri ayarla: - Maç ödülleri (5K/2K/500) - Maaş çarpanı (0.02) - Antrenman maliyetleri - Transfer NPC fiyatları - Stadyum bakım ücreti **Son Dokunuşlar:** 1. Tüm hata mesajlarını Türkçeleştir 2. Bot komut listesini BotFather'a kaydet 3. README.md güncelle (son kurulum adımları) 4. Kullanıcı geri bildirim toplama: /geribildirm komutu
Football Manager projesinde [MODÜL] bölümünde şu hata var: [HATA MESAJI] Mevcut kod: [KOD] Bu hatayı düzelt. Düzeltirken: 1. Hatanın kök nedenini açıkla 2. Düzeltme kodunu yaz 3. Benzer hataları önlemek için ek kontroller öner
Football Manager projesine yeni bir özellik eklemek istiyorum: [ÖZELLİK AÇIKLAMASI] Mevcut yapı: - src/engine/ — Maç motoru, oyuncu oluşturma - src/services/ — İş mantığı servisleri - src/bot/ — Telegram bot komutları - src/api/ — REST API - prisma/schema.prisma — Veritabanı modelleri Bu özelliği: 1. Hangi dosyalara eklenmeli? 2. DB schema değişikliği gerekiyor mu? 3. Yeni endpoint/komut gerekiyor mu? 4. Mevcut sisteme etkisi ne? Kodu yaz ve mevcut yapıya entegre et.
Football Manager projesinde [BÖLÜM] yavaş çalışıyor. Mevcut durum: [AÇIKLAMA] Beklenen: [HEDEF] Optimize et: 1. Database sorgu optimizasyonu (N+1 problemi, index eksikliği) 2. Redis cache ekleme 3. Bulk işlem kullanma 4. Gereksiz DB çağrılarını kaldırma