init
This commit is contained in:
169
web/templates/attacks.html
Normal file
169
web/templates/attacks.html
Normal file
@@ -0,0 +1,169 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Attacks - A/D Infrastructure Control{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<h1>Attacks Monitor <i class="bi bi-arrow-clockwise refresh-btn" id="refreshAttacks"></i></h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="col-12">
|
||||
<div class="btn-group" role="group">
|
||||
<button type="button" class="btn btn-outline-primary active" id="filterAll">All Attacks</button>
|
||||
<button type="button" class="btn btn-outline-success" id="filterOur">Our Attacks</button>
|
||||
<button type="button" class="btn btn-outline-danger" id="filterAgainstUs">Attacks to Us</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5>Attacks by Service</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Service</th>
|
||||
<th>Total</th>
|
||||
<th>Our Attacks</th>
|
||||
<th>Against Us</th>
|
||||
<th>Points Gained</th>
|
||||
<th>Points Lost</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="serviceStatsTable">
|
||||
<tr>
|
||||
<td colspan="6" class="text-center">Loading...</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5>Recent Attacks</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover table-sm">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Time</th>
|
||||
<th>Attacker</th>
|
||||
<th>Victim</th>
|
||||
<th>Service</th>
|
||||
<th>Points</th>
|
||||
<th>Type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="attacksTable">
|
||||
<tr>
|
||||
<td colspan="6" class="text-center">Loading...</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
let currentFilter = 'all';
|
||||
|
||||
function loadServiceStats() {
|
||||
$.get('/api/attacks/by-service', function (data) {
|
||||
if (data && data.length > 0) {
|
||||
let html = '';
|
||||
data.forEach(stat => {
|
||||
html += `
|
||||
<tr>
|
||||
<td><strong>${stat.service_name}</strong></td>
|
||||
<td>${stat.total_attacks}</td>
|
||||
<td><span class="text-success">${stat.our_attacks}</span></td>
|
||||
<td><span class="text-danger">${stat.attacks_to_us}</span></td>
|
||||
<td><span class="text-success">+${stat.points_gained.toFixed(2)}</span></td>
|
||||
<td><span class="text-danger">-${stat.points_lost.toFixed(2)}</span></td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
$('#serviceStatsTable').html(html);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadAttacks() {
|
||||
let url = '/api/attacks?limit=100';
|
||||
if (currentFilter === 'our') {
|
||||
url += '&our_attacks=true';
|
||||
} else if (currentFilter === 'against') {
|
||||
url += '&attacks_to_us=true';
|
||||
}
|
||||
|
||||
$.get(url, function (data) {
|
||||
if (data && data.length > 0) {
|
||||
let html = '';
|
||||
data.forEach(attack => {
|
||||
let typeLabel = '';
|
||||
if (attack.is_our_attack) {
|
||||
typeLabel = '<span class="badge bg-success">Our Attack</span>';
|
||||
} else if (attack.is_attack_to_us) {
|
||||
typeLabel = '<span class="badge bg-danger">Against Us</span>';
|
||||
}
|
||||
|
||||
html += `
|
||||
<tr>
|
||||
<td>${new Date(attack.timestamp).toLocaleString()}</td>
|
||||
<td>Team ${attack.attacker_team_id}</td>
|
||||
<td>Team ${attack.victim_team_id}</td>
|
||||
<td>${attack.service_name}</td>
|
||||
<td>${attack.points ? attack.points.toFixed(2) : '-'}</td>
|
||||
<td>${typeLabel}</td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
$('#attacksTable').html(html);
|
||||
} else {
|
||||
$('#attacksTable').html('<tr><td colspan="6" class="text-center text-muted">No attacks</td></tr>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function setFilter(filter) {
|
||||
currentFilter = filter;
|
||||
$('.btn-group button').removeClass('active');
|
||||
$(`#filter${filter.charAt(0).toUpperCase() + filter.slice(1)}`).addClass('active');
|
||||
loadAttacks();
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
loadServiceStats();
|
||||
loadAttacks();
|
||||
$('#refreshAttacks').click(function () {
|
||||
loadServiceStats();
|
||||
loadAttacks();
|
||||
});
|
||||
|
||||
$('#filterAll').click(() => setFilter('all'));
|
||||
$('#filterOur').click(() => setFilter('our'));
|
||||
$('#filterAgainstUs').click(() => setFilter('against'));
|
||||
|
||||
setInterval(loadAttacks, 5000); // Auto-refresh every 5 seconds
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user