2026-01-26 02:13:06 +08:00
|
|
|
{% extends "base.html" %}
|
|
|
|
|
|
|
|
|
|
{% block content %}
|
|
|
|
|
<div class="space-y-6">
|
|
|
|
|
<!-- Header -->
|
|
|
|
|
<div class="bg-white dark:bg-slate-800 shadow rounded-lg p-6">
|
|
|
|
|
<div class="flex justify-between items-center">
|
|
|
|
|
<div>
|
|
|
|
|
<h1 class="text-3xl font-bold text-gray-900 dark:text-white">{{ match.map_name }}</h1>
|
|
|
|
|
<p class="text-sm text-gray-500 mt-1">Match ID: {{ match.match_id }} | {{ match.start_time }}</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="text-center">
|
|
|
|
|
<div class="text-4xl font-black text-gray-900 dark:text-white">
|
|
|
|
|
<span class="{% if match.winner_team == 1 %}text-green-600{% endif %}">{{ match.score_team1 }}</span>
|
|
|
|
|
:
|
|
|
|
|
<span class="{% if match.winner_team == 2 %}text-green-600{% endif %}">{{ match.score_team2 }}</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<a href="{{ url_for('matches.raw_json', match_id=match.match_id) }}" target="_blank" class="text-sm text-yrtv-600 hover:underline">Download Raw JSON</a>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Team 1 Stats -->
|
|
|
|
|
<div class="bg-white dark:bg-slate-800 shadow rounded-lg overflow-hidden">
|
|
|
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-slate-700">
|
|
|
|
|
<h3 class="text-lg font-medium text-gray-900 dark:text-white">Team 1</h3>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="overflow-x-auto">
|
|
|
|
|
<table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
|
|
|
<thead class="bg-gray-50 dark:bg-slate-700">
|
|
|
|
|
<tr>
|
|
|
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">Player</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">K</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">D</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">A</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">+/-</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">ADR</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">KAST</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">Rating</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody class="bg-white dark:bg-slate-800 divide-y divide-gray-200 dark:divide-gray-700">
|
|
|
|
|
{% for p in team1_players %}
|
|
|
|
|
<tr>
|
|
|
|
|
<td class="px-6 py-4 whitespace-nowrap">
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
<div class="flex-shrink-0 h-8 w-8">
|
2026-01-26 02:53:31 +08:00
|
|
|
{% if p.avatar_url %}
|
|
|
|
|
<img class="h-8 w-8 rounded-full" src="{{ p.avatar_url }}" alt="">
|
|
|
|
|
{% else %}
|
|
|
|
|
<div class="h-8 w-8 rounded-full bg-yrtv-100 flex items-center justify-center text-yrtv-600 font-bold text-xs border border-yrtv-200">
|
|
|
|
|
{{ (p.username or p.steam_id_64)[:2] | upper }}
|
|
|
|
|
</div>
|
|
|
|
|
{% endif %}
|
2026-01-26 02:13:06 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="ml-4">
|
2026-01-26 02:53:31 +08:00
|
|
|
<div class="flex items-center space-x-2">
|
|
|
|
|
<a href="{{ url_for('players.detail', steam_id=p.steam_id_64) }}" class="text-sm font-medium text-gray-900 dark:text-white hover:text-yrtv-600">
|
|
|
|
|
{{ p.username or p.steam_id_64 }}
|
|
|
|
|
</a>
|
|
|
|
|
{% if p.party_size > 1 %}
|
|
|
|
|
{% set pc = p.party_size %}
|
|
|
|
|
{% set p_color = 'bg-blue-100 text-blue-800' %}
|
|
|
|
|
{% if pc == 2 %}{% set p_color = 'bg-indigo-100 text-indigo-800' %}
|
|
|
|
|
{% elif pc == 3 %}{% set p_color = 'bg-blue-100 text-blue-800' %}
|
|
|
|
|
{% elif pc == 4 %}{% set p_color = 'bg-purple-100 text-purple-800' %}
|
|
|
|
|
{% elif pc >= 5 %}{% set p_color = 'bg-orange-100 text-orange-800' %}
|
|
|
|
|
{% endif %}
|
|
|
|
|
<span class="inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium {{ p_color }} dark:bg-opacity-20" title="Roster Party of {{ p.party_size }}">
|
|
|
|
|
<svg class="mr-1 h-3 w-3" fill="currentColor" viewBox="0 0 20 20">
|
|
|
|
|
<path d="M13 6a3 3 0 11-6 0 3 3 0 016 0zM18 8a2 2 0 11-4 0 2 2 0 014 0zM14 15a4 4 0 00-8 0v3h8v-3zM6 8a2 2 0 11-4 0 2 2 0 014 0zM16 18v-3a5.972 5.972 0 00-.75-2.906A3.005 3.005 0 0119 15v3h-3zM4.75 12.094A5.973 5.973 0 004 15v3H1v-3a3 3 0 013.75-2.906z" />
|
|
|
|
|
</svg>
|
|
|
|
|
{{ p.party_size }}
|
|
|
|
|
</span>
|
|
|
|
|
{% endif %}
|
|
|
|
|
</div>
|
2026-01-26 02:13:06 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-900 dark:text-white">{{ p.kills }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ p.deaths }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ p.assists }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right font-medium {% if (p.kills - p.deaths) >= 0 %}text-green-600{% else %}text-red-600{% endif %}">
|
|
|
|
|
{{ p.kills - p.deaths }}
|
|
|
|
|
</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ "%.1f"|format(p.adr or 0) }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ "%.1f"|format(p.kast or 0) }}%</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right font-bold text-gray-900 dark:text-white">{{ "%.2f"|format(p.rating or 0) }}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
{% endfor %}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Team 2 Stats -->
|
|
|
|
|
<div class="bg-white dark:bg-slate-800 shadow rounded-lg overflow-hidden">
|
|
|
|
|
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-slate-700">
|
|
|
|
|
<h3 class="text-lg font-medium text-gray-900 dark:text-white">Team 2</h3>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="overflow-x-auto">
|
|
|
|
|
<table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
|
|
|
<thead class="bg-gray-50 dark:bg-slate-700">
|
|
|
|
|
<tr>
|
|
|
|
|
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">Player</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">K</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">D</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">A</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">+/-</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">ADR</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">KAST</th>
|
|
|
|
|
<th class="px-4 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider">Rating</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody class="bg-white dark:bg-slate-800 divide-y divide-gray-200 dark:divide-gray-700">
|
|
|
|
|
{% for p in team2_players %}
|
|
|
|
|
<tr>
|
|
|
|
|
<td class="px-6 py-4 whitespace-nowrap">
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
<div class="flex-shrink-0 h-8 w-8">
|
2026-01-26 02:53:31 +08:00
|
|
|
{% if p.avatar_url %}
|
|
|
|
|
<img class="h-8 w-8 rounded-full" src="{{ p.avatar_url }}" alt="">
|
|
|
|
|
{% else %}
|
|
|
|
|
<div class="h-8 w-8 rounded-full bg-yrtv-100 flex items-center justify-center text-yrtv-600 font-bold text-xs border border-yrtv-200">
|
|
|
|
|
{{ (p.username or p.steam_id_64)[:2] | upper }}
|
|
|
|
|
</div>
|
|
|
|
|
{% endif %}
|
2026-01-26 02:13:06 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="ml-4">
|
2026-01-26 02:53:31 +08:00
|
|
|
<div class="flex items-center space-x-2">
|
|
|
|
|
<a href="{{ url_for('players.detail', steam_id=p.steam_id_64) }}" class="text-sm font-medium text-gray-900 dark:text-white hover:text-yrtv-600">
|
|
|
|
|
{{ p.username or p.steam_id_64 }}
|
|
|
|
|
</a>
|
|
|
|
|
{% if p.party_size > 1 %}
|
|
|
|
|
{% set pc = p.party_size %}
|
|
|
|
|
{% set p_color = 'bg-blue-100 text-blue-800' %}
|
|
|
|
|
{% if pc == 2 %}{% set p_color = 'bg-indigo-100 text-indigo-800' %}
|
|
|
|
|
{% elif pc == 3 %}{% set p_color = 'bg-blue-100 text-blue-800' %}
|
|
|
|
|
{% elif pc == 4 %}{% set p_color = 'bg-purple-100 text-purple-800' %}
|
|
|
|
|
{% elif pc >= 5 %}{% set p_color = 'bg-orange-100 text-orange-800' %}
|
|
|
|
|
{% endif %}
|
|
|
|
|
<span class="inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium {{ p_color }} dark:bg-opacity-20" title="Roster Party of {{ p.party_size }}">
|
|
|
|
|
<svg class="mr-1 h-3 w-3" fill="currentColor" viewBox="0 0 20 20">
|
|
|
|
|
<path d="M13 6a3 3 0 11-6 0 3 3 0 016 0zM18 8a2 2 0 11-4 0 2 2 0 014 0zM14 15a4 4 0 00-8 0v3h8v-3zM6 8a2 2 0 11-4 0 2 2 0 014 0zM16 18v-3a5.972 5.972 0 00-.75-2.906A3.005 3.005 0 0119 15v3h-3zM4.75 12.094A5.973 5.973 0 004 15v3H1v-3a3 3 0 013.75-2.906z" />
|
|
|
|
|
</svg>
|
|
|
|
|
{{ p.party_size }}
|
|
|
|
|
</span>
|
|
|
|
|
{% endif %}
|
|
|
|
|
</div>
|
2026-01-26 02:13:06 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-900 dark:text-white">{{ p.kills }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ p.deaths }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ p.assists }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right font-medium {% if (p.kills - p.deaths) >= 0 %}text-green-600{% else %}text-red-600{% endif %}">
|
|
|
|
|
{{ p.kills - p.deaths }}
|
|
|
|
|
</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ "%.1f"|format(p.adr or 0) }}</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right text-gray-500 dark:text-gray-400">{{ "%.1f"|format(p.kast or 0) }}%</td>
|
|
|
|
|
<td class="px-4 py-4 whitespace-nowrap text-sm text-right font-bold text-gray-900 dark:text-white">{{ "%.2f"|format(p.rating or 0) }}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
{% endfor %}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
{% endblock %}
|