BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Доводы спортивной мафии: результаты турниров, календарь года, зачёты серийных лиг и разборы данных.
Translation pending
Sports & fitnessHTML · PythonGitHub @ValeriiSczOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Самодокументирующий README для GitHub. Полная внутренняя версия:
../МЕТОДОЛОГИЯ_new_ce634_v1.0.md. Обновлять при существенных изменениях. Эталон «new»/мобильной версии —ce634.html.
Статический сайт статистики мафия-турниров. Без сборки (no build): чистые HTML+CSS+JS. Прод — Vercel (mafgamestat.vercel.app). Каждый турнир имеет id (напр. 634 = Чемпионат Европы 2026).
Два вида страниц турнира:
tournament.html, participants.html, seating{id}.html, cards{id}.html, standings.html, results.html, roles.html, player.html). Десктоп-ориентированы.ce{id}.html (эталон ce634.html). Мобайл-фёрст, esports-раскладка, всё в одном файле поверх ТЕХ ЖЕ данных.site/)index.html хаб турниров (список, статусы, постеры)
tournament.html страница турнира (?t=id) — меню разделов классики
participants.html состав + рейтинг markery (универсальная, ?t=id)
seating{id}.html интерактивная рассадка (классика)
cards{id}.html карточки игроков (классика)
standings.html сводная (?t=id) · roles.html (?t=id) · results.html · player.html
ce{id}.html «new»/мобильная версия (эталон ce634.html)
data/
tournaments.js РЕЕСТР всех турниров (статусы, постеры, accent, разделы, порядок)
live.js LIVE-движок: тянет игры с mafgame через прокси /mafgame/*, парсит, защищает снимок
streams.js ссылки на трансляции
tournament_{id}.json мета турнира (in_progress, games_total, prize_eur, stars, accent, referees, format)
participants_{id}.json ростер + рейтинг markery (nick,uid,real,av,status,markery_id,ms,r_tier,r_elo_cur,r_elo_2026,r_rank_eu_2026)
avatars_{id}.json {avatars:{nick:url}, judges:{"1":{name,tg,avatar},...}}
elo_{id}.json {players:{nick:{global,tournaments}}}
skip_{id}.json {nick: номер игры отдыха}
games_{id}_current.json {games:[{title,stage,tables:[{table_num,judge,winner,seats:[{seat,name,role,marker,aps,wpts,ci,result}]}]}]}
_snapshots/ снимки рейтинга markery по датам
assets/ постеры (bonn{id}.jpg — широкий, bonn{id}_card.jpg — 16:9 для hero), фавикон
vercel.json rewrite /mafgame/:path* -> https://mafgame.org/:path* (прокси для live)
tournaments.js (window.TOURNAMENTS_DB.tournaments[]) — что за турниры, статусы, постеры, accent, разделы.data/ (см. выше).tournament_{id}.json.in_progress===true, live.js loadGames(id) при каждом открытии тянет /mafgame/tournaments/{id}/game_results (Vercel проксирует на mafgame.org), парсит Inertia-данные (convertInertia), сравнивает с сохранённым в localStorage снимком и не затирает хорошие данные пустыми (snapScore/notRegression). До старта / для завершённых — отдаёт локальный games_{id}_current.json.results mafgame (red_win/black_win), не из очков.Источники: mafgame.org (ростер uid, протоколы, рассадка, результаты — HTML Inertia), markery.online (ELO/тиры/места — ведём через Excel-базу, снимок в _snapshots/), mafiastats.com (REST, сверка).
ce634.html)Загрузчик → объект D → computeSeating()+computeStats() → NAV (4 группы) строит sidebar(desktop)/tabbar(mobile) → RENDER[section]()+afterRender().
@media(max-width:1024px) (ловит и раскрытый Fold). Таб-бар снизу, всплывающее меню, тумблер Компактно/Подробно, залипший ник.statFull (Компактно/Подробно), myPlayer+viewMode (localStorage), демо-режим (makeDemo — полный случайный бракет для проверки статы до старта).Статус задаётся в tournaments.js (status) + флаг in_progress в tournament_{id}.json. Порядок на главной — поле phase.
status:"gathering", phase:4, in_progress:false. Показываем анонс/заявки.status:"upcoming", phase:3. Доступны рассадка/карточки/участники; игр ещё нет. in_progress:false до дня старта.tournament_{id}.json.in_progress:true, status:"live", phase:2. live.js при каждом открытии подтягивает game_results через прокси.
in_progress:true постоянно (лишняя нагрузка на mafgame + риск подтянуть кривое/пустое). Включаем на дни турнира, после — выключаем.in_progress:false, status:"finished", phase:1. Данные заморожены, турнир уходит в архив (главная сортирует по дате start).tournament_{id}.json → standings (total/final/qualification), awards, чемпион/подиум. Сверить с сайтом mafgame до цента — итог и расшифровка обязаны биться.games_{id}_current.json (роли, очки, победители столов) как есть на конец турнира.tournament_{id}.json.in_progress:false; в tournaments.js status:"finished", phase:1.tournament_{id}.json.final_coef (напр. 1.3) — live.js (v2.1) умножает баллы стадии «Финал» на лету, а при заморозке коэффициент вшивается в games_{id}_current.json. Сверка 694: квалификация 30/30 и финал 10/10 — 1:1. Для завершённых источник истины — всё равно таблица mafgame.data/*_{newid}* (participants/tournament/avatars/elo/skip/games_current) по схемам выше. Добавить запись в tournaments.js.ce634.html → ce{newid}.html, заменить 634→{newid}, тексты (название/город/даты), START-дату, постер assets/*_card.jpg (16:9).stagesPanel() и группировку селектора игр (День/стадии) под реальный формат. Число игр — из данных, не хардкод.tournament.html?t={newid} (условие по t.id).cd site
zip -r ../Uploaded/mafgamestat_vN_upload.zip . \
-x "_Архив/*" -x "data/_snapshots/*" -x "SPEC.md" -x "*.DS_Store" -x "*.bak" -x "* *"
→ содержимое залить в GitHub (github.com/ValeriiScz/bitvachempionov2026) → Vercel автодеплой. Zip кладёт содержимое site/ в корень (без префикса). Перед сборкой zip: поднять CACHE_VERSION в sw.js (иначе у установивших PWA код обновится только со 2-го открытия).
.seatgrid/сетки: repeat(N,minmax(0,1fr)) + min-width:0 — иначе min-content колонок вылезает.live.js (localStorage snapScore/notRegression) — она бережёт данные при глюках mafgame._Архив/.node --check / jsdom-прогон (проверять кликами, не только вызовом функций), баланс {} в CSS, десктоп-скриншот.Сайт устанавливается как приложение: manifest.json (standalone, палитра Bonn) + sw.js (service worker) + иконки assets/icons/ (эмблема mafgame внутри чемпионского кубка, золото на navy; any/maskable 192/512 + apple-touch-icon 180) + PWA-блок в <head> всех страниц (манифест, theme-color, iOS-меты, регистрация SW — только по http(s), локальный file:// просмотр не падает) + промо-плашка установки на всех страницах: iPhone — инструкция Safari→«На экран “Домой”», Android — кнопка «Установить» (beforeinstallprompt) или инструкция про меню Chrome; не показывается внутри установленного приложения и 14 дней после «Позже» (localStorage mgs_pwa_promo_hide_until).
Стратегии кэша (sw.js):
/mafgame/* — только сеть (кэш обходится): live всегда свежий, защита снимка в live.js не задета;data/*.json — network-first (офлайн — из кэша);⚠️ При каждом деплое поднять CACHE_VERSION в sw.js (…-v12.1, …-v13) — на activate старые кэши удаляются. Установка: iPhone — Safari → Поделиться → «На экран "Домой"»; Android — Chrome → меню ⋮ → «Установить приложение». Полноэкранный standalone-запуск заодно навсегда лечит баг «Версии для ПК».
Нативное приложение (Swift/Kotlin) — избыточно: та же зависимость от mafgame, магазины, поддержка.