Стварэнне платформы матчаў CS2 для нашай кампаніі сяброў

У нас ёсць невялікая супольнасць CS2 — усяго жменька сяброў, якія рэгулярна гуляюць разам, — і стандартны матчмэйкінг ніколі па-сапраўднаму не адпавядаў таму, як мы хацелі гуляць. Таму я пабудаваў поўны стэк вакол гэтага: плагін для сервера CS2, вэб-платформу і мабільны дадатак, якія ўсе размаўляюць з адным бэкендам. Тры праекты, адна экасістэма.

Тры часткі

Плагін сервера CS2 (C# / .NET 8) — Пабудаваны на CounterStrikeSharp, гэты плагін працуе ўнутры вылучанага сервера CS2. Ён кіруе спаборніцкім працэсам матча: размінкай, сістэмай .ready, нажавымі раундамі, тэхнічнымі паўзамі, серыямі з некалькіх карт, зменай бакоў у перапынку і запасным «AIM-рэжымам», калі матч не актыўны. Ён атрымлівае канфігурацыю матча па URL, які дае вэб-бэкенд, і перадае кожную важную падзею — забойствы са зброяй і пазіцыяй, вынікі раундаў, чат, змены жыццёвага цыклу — у MySQL.

Вэб-платформа (Laravel 13 + Vue 3 + Tailwind v4) — мозг усёй сістэмы. Гульцы ўваходзяць праз Steam і Discord (Laravel Socialite), ствараюць лобі, праводзяць вета карт і глядзяць матчы ў прамым эфіры. На франтэндзе — ніякага HTTP-полінгу: кожнае змяненне стану — статус лобі, прагрэс запуску сервера, бан карты, жывое табло — адпраўляецца ў рэальным часе праз WebSockets з дапамогай Laravel Reverb і Laravel Echo. Планавальнік адпраўляе абнаўленні рахунку раз на хвіліну, апрацоўшчыкі чэргаў займаюцца трансляцыямі, а Sanctum абараняе мабільнае API. Гісторыя матчаў, статыстыка гульцоў і дэталі раундаў — усё гэта адлюстроўваецца з тых самых даных, якія плагін піша ў MySQL.

Мабільны дадатак (Kotlin Multiplatform + Compose Multiplatform) — адна кодавая база на Kotlin для Android і iOS. Ён размаўляе з бэкендам Laravel праз тое ж API, абароненае Sanctum, і падпісваецца на тыя ж каналы Reverb, што і сайт, таму бан карты, які адбываецца на чыімсьці наўтбуку, імгненна з'яўляецца на тэлефоне таварыша па камандзе. Push-апавяшчэнні адпраўляюцца праз FCM (Android) і APNs (iOS) для такіх падзей, як пачатак вета, гатоўнасць матча і пераходы жыццёвага цыклу — гэта апрацоўваюць laravel-notification-channels/fcm і …/apn на баку сервера.

Як гэта ўсё звязана

Плагін загружае канфігурацыю з бэкенду Laravel, калі пачынаецца матч, запісвае кожную падзею назад у MySQL, і тая ж база даных сілкуе як вэб-інтэрфейс, так і мабільны дадатак — абодва падпісаны на аднолькавыя каналы Reverb, таму ўсе кліенты застаюцца сінхранізаванымі без неабходнасці нешта абнаўляць уручную.

Тэхналагічны стэк коратка

Узровень Тэхналогія
Плагін ігравога сервера C#, .NET 8, CounterStrikeSharp, MySqlConnector
Бэкенд PHP 8.5, Laravel 13, Reverb, Sanctum, Socialite (Steam + Discord)
Франтэнд Vue 3, Tailwind v4, Vite, Laravel Echo, Chart.js, vue-i18n (EN/UK/PL/BE)
Мабільны дадатак Kotlin Multiplatform, Compose Multiplatform, FCM, APNs
Рэальны час Reverb (WebSockets) → Echo у вэбе + KMP-кліент
Тэставанне Pest 4 (PHP), Pint для фарматавання

Навошта гэта рабіць

Шчыра? Гэта проста дзеля забавы і для людзей, з якімі я гуляю. Але гэта ператварылася ў прыемную практыку ад пачатку да канца — натыўнае пашырэнне для ігравога сервера, вэб-дадатак рэальнага часу і кросплатформенны мабільны кліент, якія ўсе маюць адзіную крыніцу праўды. Кожны матч, які мы гуляем, таксама адначасова тэстуе кожны ўзровень стэка, і гэта найлепшы від зваротнай сувязі.

Скрыншоты

1 / 5