Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 74 additions & 4 deletions front/src/static/miminet_animation.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,47 @@ var PacketPlayer = (function () {
var animation_guid = uid();
var animation_packets = [];
var traffic = [];
var network_cy = null;
var original_traffic = [];
var player_pause = 0;
var player_play = 0;
var pkts_on_the_fly = 0;
var network_cy = null;

var animation_traffic_step_callback = function(){};

var instance;

const isArpPacket = function(packet) {
if (!packet || !packet.config || !packet.config.type) {
return false;
}
const packetType = packet.config.type.toLowerCase();
return packetType.includes('arp-request') || packetType.includes('arp-response');
};

const applyArpFilter = function() {
const arpFilterCheckbox = document.getElementById('arpFilterCheckbox');
if (!arpFilterCheckbox || !original_traffic) {
traffic = original_traffic ? JSON.parse(JSON.stringify(original_traffic)) : [];
return;
}

if (arpFilterCheckbox.checked) {
traffic = original_traffic.map(step => {
if (!Array.isArray(step)) return step;
return step.filter(packet => !isArpPacket(packet));
}).filter(step => step.length > 0);
} else {
traffic = JSON.parse(JSON.stringify(original_traffic));
}
};

const InitPlayer = function(packet){

setTraffic(packet);
original_traffic = packet ? JSON.parse(JSON.stringify(packet)) : [];

applyArpFilter();

setAnimationTrafficStep(0);
clearAnimationPackets();
setPlayerPause(0);
Expand Down Expand Up @@ -284,6 +313,10 @@ var PacketPlayer = (function () {
return;
}

const getFilteredTraffic = function () {
return traffic;
}

const setCy = function (cy) {
network_cy = cy;
return;
Expand Down Expand Up @@ -337,6 +370,27 @@ var PacketPlayer = (function () {
return animation_traffic_step_callback;
}

// Function to update filter and refresh animation
const updateArpFilter = function() {
const wasPlaying = getPlayerPlay();
const currentStep = getAnimationTrafficStep();

if (wasPlaying) {
StopPlayer();
}

applyArpFilter();

// Adjust current step if needed
const newStep = Math.min(currentStep, Math.max(0, traffic.length - 1));
setAnimationTrafficStep(newStep);

// Restart if was playing
if (wasPlaying && traffic.length > 0) {
setTimeout(() => StartPlayer(network_cy), 50);
}
};

const createInstance = function () {

return {
Expand All @@ -349,7 +403,9 @@ var PacketPlayer = (function () {
setAnimationTrafficStepCallback: setAnimationTrafficStepCallback,
resetAnimationTrafficStepCallback: resetAnimationTrafficStepCallback,
getAnimationTrafficStep: getAnimationTrafficStep,
setAnimationTrafficStep: setAnimationTrafficStep
setAnimationTrafficStep: setAnimationTrafficStep,
updateArpFilter: updateArpFilter,
getFilteredTraffic: getFilteredTraffic
}
}

Expand All @@ -358,4 +414,18 @@ var PacketPlayer = (function () {
return instance || (instance = createInstance());
}
}
})();
})();

// Global function to update slider display with current traffic
window.updateSliderDisplay = function(x) {
const currentTraffic = PacketPlayer.getInstance().getFilteredTraffic();
if (!currentTraffic || currentTraffic.length === 0){
$('#NetworkPlayerLabel').text('0 пакетов');
return;
}
const stepData = currentTraffic[x-1] || [];
const NumWord = window.NumWord || function(n, words) {
return words[n % 10 === 1 && n % 100 !== 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2];
};
$('#NetworkPlayerLabel').text('Шаг: ' + x + '/' + currentTraffic.length + ' (' + stepData.length + ' ' + NumWord(stepData.length, ['пакет', 'пакета', 'пакетов']) + ')');
};
50 changes: 45 additions & 5 deletions front/src/static/netfront_f.js
Original file line number Diff line number Diff line change
Expand Up @@ -1836,8 +1836,25 @@ const SetNetworkPlayerState = function(simultaion_id)
tooltips: false,
});

// Show Slider on
// Show Slider and filters
$('#PacketSliderInput').show();
$('#AnimationFilters').show();

// Setup ARP filter checkbox
$('#arpFilterCheckbox').off('change').on('change', function() {
PacketPlayer.getInstance().updateArpFilter();

const currentTraffic = PacketPlayer.getInstance().getFilteredTraffic();
if (currentTraffic) {
$('#PacketSliderInput')[0].noUiSlider.updateOptions({
range: { 'min': 1, 'max': Math.max(1, currentTraffic.length) }
});

const currentStep = parseInt($('#PacketSliderInput')[0].noUiSlider.get());
const stepData = currentTraffic[currentStep-1] || [];
$('#NetworkPlayerLabel').text('Шаг: ' + currentStep + '/' + currentTraffic.length + ' (' + stepData.length + ' ' + NumWord(stepData.length, ['пакет', 'пакета', 'пакетов']) + ')');
}
});

const pkt_count = packets.reduce((currentCount, row) => currentCount + row.length, 0);
$('#NetworkPlayerLabel').text(packets.length + ' ' + NumWord(packets.length, ['шаг', 'шага', 'шагов']) + ' / ' + pkt_count + ' ' + NumWord(pkt_count, ['пакет', 'пакета', 'пакетов']));
Expand All @@ -1855,7 +1872,7 @@ const SetNetworkPlayerState = function(simultaion_id)
$('#NetworkPlayerLabel').text('0 пакетов');
return;
}
$('#NetworkPlayerLabel').text('Шаг: ' + x + '/' + packets.length + ' (' + packets[x-1].length + ' ' + NumWord(packets[x-1].length, ['пакет', 'пакета', 'пакетов']) + ')');
window.updateSliderDisplay(x);
});

// Set click handlers
Expand Down Expand Up @@ -1920,8 +1937,10 @@ const SetNetworkPlayerState = function(simultaion_id)
{
$('#NetworkPlayer').empty();
$('#PacketSliderInput').hide();
$('#AnimationFilters').hide();
$('#NetworkPlayer').append('<button type="button" class="btn btn-primary w-100" id="NetworkEmulateButton" disabled>Эмулируется...</button>');
InsertWaitingTime()

InsertWaitingTime();
CheckSimulation(simultaion_id);
return;
}
Expand All @@ -1930,6 +1949,7 @@ const SetNetworkPlayerState = function(simultaion_id)
// Add emulation button.
$('#NetworkPlayer').empty();
$('#PacketSliderInput').hide();
$('#AnimationFilters').hide();
$('#NetworkPlayer').append('<button type="button" class="btn btn-primary w-100" id="NetworkEmulateButton">Эмулировать</button>');
$('#NetworkPlayerLabel').empty();

Expand Down Expand Up @@ -1957,6 +1977,8 @@ const SetNetworkPlayerState = function(simultaion_id)

$('#NetworkPlayer').empty();
$('#NetworkPlayer').append('<button type="button" class="btn btn-primary w-100" id="NetworkEmulateButton" disabled>Эмулируется...</button>');
$('#AnimationFilters').hide();

InsertWaitingTime();
return;
});
Expand Down Expand Up @@ -1995,8 +2017,25 @@ const SetSharedNetworkPlayerState = function()
tooltips: false,
});

// Show Slider on
// Show Slider and filters
$('#PacketSliderInput').show();
$('#AnimationFilters').show();

// Setup ARP filter checkbox
$('#arpFilterCheckbox').off('change').on('change', function() {
PacketPlayer.getInstance().updateArpFilter();

const currentTraffic = PacketPlayer.getInstance().getFilteredTraffic();
if (currentTraffic) {
$('#PacketSliderInput')[0].noUiSlider.updateOptions({
range: { 'min': 1, 'max': Math.max(1, currentTraffic.length) }
});

const currentStep = parseInt($('#PacketSliderInput')[0].noUiSlider.get());
const stepData = currentTraffic[currentStep-1] || [];
$('#NetworkPlayerLabel').text('Шаг: ' + currentStep + '/' + currentTraffic.length + ' (' + stepData.length + ' ' + NumWord(stepData.length, ['пакет', 'пакета', 'пакетов']) + ')');
}
});

const pkt_count = packets.reduce((currentCount, row) => currentCount + row.length, 0);
$('#NetworkPlayerLabel').text(packets.length + ' ' + NumWord(packets.length, ['шаг', 'шага', 'шагов']) + ' / ' + pkt_count + ' ' + NumWord(pkt_count, ['пакет', 'пакета', 'пакетов']));
Expand All @@ -2014,7 +2053,7 @@ const SetSharedNetworkPlayerState = function()
$('#NetworkPlayerLabel').text('0 пакетов');
return;
}
$('#NetworkPlayerLabel').text('Шаг: ' + x + '/' + packets.length + ' (' + packets[x-1].length + ' ' + NumWord(packets[x-1].length, ['пакет', 'пакета', 'пакетов']) + ')');
window.updateSliderDisplay(x);
});

// Set click handlers
Expand Down Expand Up @@ -2075,6 +2114,7 @@ const SetSharedNetworkPlayerState = function()
// Add info button
$('#NetworkPlayer').empty();
$('#PacketSliderInput').hide();
$('#AnimationFilters').hide();
$('#NetworkPlayerLabel').empty();
$('#NetworkPlayer').append('<button type="button" class="btn btn-primary w-100" id="NetworkEmulateButton" disabled>Нет эмуляции</button>');
return;
Expand Down
10 changes: 10 additions & 0 deletions front/src/templates/network.html
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,16 @@
<input class="form-control range-slider-value-min" type="hidden">
</div>
</div>
<div id="AnimationFilters" style="display:none;">
<div class="d-flex justify-content-center pt-2">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="arpFilterCheckbox">
<label class="form-check-label text-muted" for="arpFilterCheckbox" style="font-size: 0.875rem !important;">
Скрыть ARP пакеты
</label>
</div>
</div>
</div>
<small id="NetworkPlayerLabel" class="d-flex justify-content-center text-muted text-center">Ожидание 10-30 сек.</small>
</div>

Expand Down
16 changes: 12 additions & 4 deletions front/src/templates/network_shared.html
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
</div>
</div>

<div class="position-absolute start-0 bottom-0" style="margin: 17px; font-weight: 500;">
<div class="position-absolute start-0 bottom-0" style="margin: 17px; font-weight: 500;">
<div class="d-flex justify-content-center ws-shadow" id="NetworkPlayer">
<button type="button" class="btn btn-primary w-100" id="NetworkRunButton" disabled>Проверка эмуляции</button>
</div>
Expand All @@ -100,10 +100,18 @@
<input class="form-control range-slider-value-min" type="hidden">
</div>
</div>
<div id="AnimationFilters" style="display:none;">
<div class="d-flex justify-content-center pt-2">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="arpFilterCheckbox">
<label class="form-check-label text-muted" for="arpFilterCheckbox" style="font-size: 0.875rem !important;">
Скрыть ARP пакеты
</label>
</div>
</div>
</div>
<small id="NetworkPlayerLabel" class=" d-flex justify-content-center text-muted text-center">Ожидание 10-30 сек.</small>
</div>

<a href="https://t.me/MimiNetCommunity" target="_blank" class="position-absolute bottom-0 end-0 ws-ask-link">
</div> <a href="https://t.me/MimiNetCommunity" target="_blank" class="position-absolute bottom-0 end-0 ws-ask-link">
<div id="NetworkRunButtonHelpLabel" class="ws-ask-button">
<img src="{{ url_for('static', filename='/images/tg_logo.png') }}" width="24" style="margin-right: 8px;"/>Задать вопрос
</div>
Expand Down
Loading