Проверить доступность сайта
CURL-запрос выполнен без ошибок.
Время распознавания ДНС-имени: 0.116721
IP-адрес сервера: 144.31.230.35
Время соединения с сервером: 0.152864
Время установления SSL-соединения: 0.192696
Время перед началом ответа: 0.226293
Общее время выполнения запроса: 0.268612
Код HTTP-ответа сервера: 200 ( Ok )
Принято байт всего: 29470
Код HTTP-ответа среди заданных: Да
Цепочка сертификатов:
- доверие к цепочке: Да
- даты сертификатов валидны: Да
- имя сервера в сертификате: Да
Время распознавания ДНС-имени: 0.116721
IP-адрес сервера: 144.31.230.35
Время соединения с сервером: 0.152864
Время установления SSL-соединения: 0.192696
Время перед началом ответа: 0.226293
Общее время выполнения запроса: 0.268612
Код HTTP-ответа сервера: 200 ( Ok )
Принято байт всего: 29470
Код HTTP-ответа среди заданных: Да
Цепочка сертификатов:
- доверие к цепочке: Да
- даты сертификатов валидны: Да
- имя сервера в сертификате: Да
Subject: CN = sweden.netwave.today
SubjectAltNames: DNS:sweden.netwave.today
Valid from: Mar 12 18:08:31 2026 GMT
Valid to: Jun 10 18:08:30 2026 GMT
Issuer: C = US, O = Let's Encrypt, CN = E8
- Date valid: Yes
- Trusted localy: No
- Signer chain ID: 1
SubjectAltNames: DNS:sweden.netwave.today
Valid from: Mar 12 18:08:31 2026 GMT
Valid to: Jun 10 18:08:30 2026 GMT
Issuer: C = US, O = Let's Encrypt, CN = E8
- Date valid: Yes
- Trusted localy: No
- Signer chain ID: 1
Subject: C = US, O = Let's Encrypt, CN = E8
Valid from: Mar 13 00:00:00 2024 GMT
Valid to: Mar 12 23:59:59 2027 GMT
Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
- Date valid: Yes
- Trusted localy: Yes
- Signer chain ID: Not in chain
Valid from: Mar 13 00:00:00 2024 GMT
Valid to: Mar 12 23:59:59 2027 GMT
Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1
- Date valid: Yes
- Trusted localy: Yes
- Signer chain ID: Not in chain
HTTP/2 200
accept-ranges: bytes
alt-svc: h3=":8443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "dh14wc6l9nggmiv"
last-modified: Thu, 12 Mar 2026 21:50:22 GMT
server: Caddy
vary: Accept-Encoding
content-length: 29191
date: Fri, 13 Mar 2026 16:52:17 GMT
accept-ranges: bytes
alt-svc: h3=":8443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "dh14wc6l9nggmiv"
last-modified: Thu, 12 Mar 2026 21:50:22 GMT
server: Caddy
vary: Accept-Encoding
content-length: 29191
date: Fri, 13 Mar 2026 16:52:17 GMT
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Статус подключения | NETWAVE.TODAY</title>
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<style>
:root {
/* Ультра-темный фон */
--bg-dark: #0a0510;
--card-bg: rgba(255, 255, 255, 0.02);
/* Палитра */
--accent-purple: #9d4edd;
--accent-burgundy: #e01e37;
--accent-orange: #ff7900;
--accent-green: #2ecc71;
--telegram-blue: #24A1DE;
/* Цвета текста и бордеры */
--text-main: #ffffff;
--text-dim: #a3a3a3;
--flat-border: rgba(255, 255, 255, 0.05);
--nav-height: 70px;
}
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-font-smoothing: antialiased; }
html { scroll-behavior: smooth; height: 100%; }
body {
font-family: 'Inter', sans-serif;
background-color: var(--bg-dark);
color: var(--text-main);
overflow-x: hidden;
line-height: 1.6;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
display: flex;
flex-direction: column;
min-height: 100vh;
}
/* --- ИНДИКАТОР ЗАГРУЗКИ (LOADER) --- */
.top-loader {
position: fixed; top: 0; left: 0; width: 0%; height: 3px;
background: linear-gradient(90deg, var(--accent-orange), var(--accent-burgundy), var(--accent-purple));
z-index: 9999; box-shadow: 0 0 10px var(--accent-orange);
animation: page-load 1.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes page-load { 0% { width: 0%; opacity: 1; } 80% { width: 100%; opacity: 1; } 100% { width: 100%; opacity: 0; display: none; } }
/* --- ЖИВОЙ ФОН И СЕТКА --- */
.bg-wrapper { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; background: var(--bg-dark); overflow: hidden; }
.bg-wrapper::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle at center, transparent 30%, var(--bg-dark) 100%); z-index: 2; pointer-events: none; }
.orb { position: absolute; border-radius: 50%; filter: blur(120px); will-change: transform; z-index: 0; pointer-events: none; opacity: 0.2; }
.orb-1 { top: 10%; left: 10%; width: 40vw; height: 40vw; min-width: 400px; min-height: 400px; background: var(--accent-purple); animation: move-orb-1 20s infinite alternate ease-in-out; }
.orb-2 { top: 50%; right: 10%; width: 45vw; height: 45vw; min-width: 450px; min-height: 450px; background: var(--accent-orange); animation: move-orb-2 25s infinite alternate ease-in-out; }
.orb-3 { bottom: 10%; left: 30%; width: 50vw; height: 50vw; min-width: 500px; min-height: 500px; background: var(--accent-burgundy); animation: move-orb-3 22s infinite alternate ease-in-out; }
@keyframes move-orb-1 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(50vw, 30vh) scale(1.1); } 100% { transform: translate(20vw, 60vh) scale(0.9); } }
@keyframes move-orb-2 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(-50vw, -20vh) scale(1.15); } 100% { transform: translate(-20vw, 40vh) scale(0.85); } }
@keyframes move-orb-3 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(40vw, -50vh) scale(1.2); } 100% { transform: translate(-30vw, -20vh) scale(0.95); } }
.grid-overlay {
position: absolute; top: -80px; left: 0; width: 100%; height: calc(100% + 80px);
background-image: linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
background-size: 80px 80px; mask-image: radial-gradient(circle at center, black 40%, transparent 100%);
-webkit-mask-image: radial-gradient(circle at center, black 40%, transparent 100%); animation: grid-scroll 4s linear infinite; z-index: 1;
}
@keyframes grid-scroll { 0% { transform: translateY(0); } 100% { transform: translateY(80px); } }
.gradient-text {
background: linear-gradient(90deg, var(--accent-orange), var(--accent-burgundy), var(--accent-purple), var(--accent-orange));
background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; color: transparent; animation: gradient-move 4s linear infinite;
}
@keyframes gradient-move { 0% { background-position: 0% center; } 100% { background-position: 200% center; } }
/* --- HEADER --- */
header {
position: fixed; top: 20px; left: 50%; transform: translateX(-50%); width: calc(100% - 40px); max-width: 1150px; height: var(--nav-height);
z-index: 2000; display: flex; align-items: center; justify-content: space-between; padding: 0 20px;
background: rgba(10, 5, 16, 0.85); border: 1px solid var(--flat-border); border-radius: 20px;
transition: 0.4s ease; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
-webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
}
header.scrolled { top: 10px; height: 60px; background: rgba(10, 5, 16, 0.95); }
.logo-group { display: flex; align-items: center; gap: 12px; }
.logo { font-size: 28px; font-weight: 900; text-decoration: none; letter-spacing: 0.5px; }
.system-status { display: flex; align-items: center; gap: 6px; font-size: 8px; text-transform: uppercase; letter-spacing: 1.2px; color: var(--accent-green); font-weight: 800; padding: 5px 12px; border: 1px solid rgba(46, 204, 113, 0.3); border-radius: 50px; background: rgba(46, 204, 113, 0.05); }
@keyframes pulse { 0% { transform: scale(1); opacity: 1; } 100% { transform: scale(3); opacity: 0; } }
.status-dot { width: 5px; height: 5px; background: var(--accent-green); border-radius: 50%; position: relative; }
.status-dot::after { content: ''; position: absolute; width: 100%; height: 100%; background: var(--accent-green); border-radius: 50%; animation: pulse 2s infinite; }
.nav-menu { display: flex; align-items: center; gap: 24px; }
.nav-links { display: flex; align-items: center; gap: 6px; }
.nav-btn {
display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px;
border-radius: 12px; color: var(--text-dim); text-decoration: none; font-size: 13px; font-weight: 600;
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); border: 1px solid transparent; transform-origin: center;
}
header.scrolled .nav-btn { padding: 6px 10px; }
.nav-btn:hover { color: #fff; background: rgba(255, 255, 255, 0.05); transform: scale(1.03); border-color: rgba(255, 255, 255, 0.1); }
@keyframes icon-wiggle {
0% { transform: rotate(0deg); }
25% { transform: rotate(-12deg); }
50% { transform: rotate(10deg); }
75% { transform: rotate(-8deg); }
100% { transform: rotate(0deg); }
}
.nav-btn svg { transition: color 0.3s ease; }
.nav-btn:hover svg { animation: icon-wiggle 0.6s ease-in-out infinite; color: var(--accent-purple); }
.btn-support-style { background: rgba(224, 30, 55, 0.1) !important; border: 1px solid rgba(224, 30, 55, 0.4) !important; color: #ff4d6d !important; animation: support-red-pulse 2s infinite; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) !important; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 8px 16px; border-radius: 12px; font-weight: 700; transform-origin: center; }
header.scrolled .btn-support-style { padding: 6px 14px; }
.btn-support-style:hover { background: rgba(224, 30, 55, 0.25) !important; border-color: rgba(224, 30, 55, 0.8) !important; color: #fff !important; transform: scale(1.05); box-shadow: 0 8px 25px rgba(224, 30, 55, 0.5); animation: none; }
@keyframes gear-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
.btn-support-style:hover svg { animation: gear-spin 4s linear infinite; color: #fff; }
@keyframes support-red-pulse { 0% { box-shadow: 0 0 0 0 rgba(224, 30, 55, 0.5); } 70% { box-shadow: 0 0 0 12px rgba(224, 30, 55, 0); } 100% { box-shadow: 0 0 0 0 rgba(224, 30, 55, 0); } }
/* --- СЕКЦИЯ КОНТЕНТА --- */
.message-container {
flex-grow: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center;
padding: 160px 20px 40px; position: relative; z-index: 10;
}
.message-container h1 {
font-size: clamp(40px, 8vw, 70px); font-weight: 900; line-height: 1.1; margin-bottom: 20px; letter-spacing: -2px; text-transform: uppercase;
}
.message-container p.lead {
color: var(--text-dim); font-size: 18px;
max-width: 900px;
margin: 0 auto 48px; line-height: 1.8;
}
.highlight { color: #fff; font-weight: 700; }
/* --- ТЕРМИНАЛ --- */
.terminal-block {
width: 100%; max-width: 800px; margin: 0 auto;
background: #060309; border: 1px solid var(--flat-border); border-radius: 12px;
overflow: hidden; text-align: left; box-shadow: 0 15px 40px rgba(0,0,0,0.6);
display: flex; flex-direction: column;
}
.terminal-header-info {
background: rgba(255, 255, 255, 0.03); border-bottom: 1px solid var(--flat-border);
padding: 12px 24px; display: flex; justify-content: space-between; align-items: center;
font-family: 'Courier New', Courier, monospace; font-size: 13px; color: var(--accent-purple); font-weight: 700; letter-spacing: 0.5px;
}
.terminal-header-info .val { color: #fff; }
.terminal-wrap {
padding: 20px 24px;
background: transparent;
}
.terminal-window {
/* Строгая высота: ровно 14 строк по 24px = 336px */
height: 336px;
overflow-y: hidden;
position: relative;
font-family: 'Courier New', Courier, monospace; font-size: 14px;
color: var(--accent-green);
}
.t-line {
margin: 0; padding: 0;
line-height: 24px; height: 24px;
/* Запрещаем перенос строк, чтобы не сбивалась высота скролла */
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.t-time { color: #555; margin-right: 8px; }
/* Цвета для логов терминала */
.t-purple { color: var(--accent-purple); }
.t-orange { color: var(--accent-orange); }
.t-white { color: #ffffff; }
.t-green { color: var(--accent-green); }
.t-red { color: #ff5f56; }
.t-dim { color: #888; }
.cursor {
display: inline-block; width: 8px; height: 15px; background-color: var(--accent-green);
vertical-align: middle; margin-left: 4px; animation: blink 1s step-end infinite;
}
@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
/* --- ПОДВАЛ И КОНТАКТЫ --- */
.main-footer { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 0 15px; color: var(--text-dim); font-size: 11px; position: relative; z-index: 10; margin-top: auto; }
.footer-contacts { display: flex; gap: 20px; flex-wrap: wrap; justify-content: center; width: 100%; margin-bottom: 25px; }
.contact-box {
position: relative; display: inline-flex; align-items: center; justify-content: center; width: 270px; max-width: 100%; height: 48px; border: 1px solid var(--flat-border); border-radius: 50px; background: var(--card-bg); color: #ffffff; cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); box-sizing: border-box; overflow: hidden; text-decoration: none;
}
.contact-box:hover { transform: translateY(-2px); }
.contact-box:active { transform: scale(0.95); }
.contact-box.email-box:hover { border-color: rgba(157, 78, 221, 0.5); background: rgba(157, 78, 221, 0.1); }
.contact-box.tg-box:hover { border-color: rgba(36, 161, 222, 0.5); background: rgba(36, 161, 222, 0.1); }
.state-default, .state-success { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; gap: 10px; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); font-size: 13px; letter-spacing: 0.5px; }
.state-default { opacity: 1; transform: translateY(0); font-weight: 500; }
.state-success { opacity: 0; transform: translateY(15px); font-weight: 700; color: var(--accent-green); pointer-events: none; }
.contact-box svg { width: 20px; height: 20px; flex-shrink: 0; transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), color 0.3s; }
@keyframes contact-wiggle { 0% { transform: rotate(0deg); } 15% { transform: rotate(-15deg); } 30% { transform: rotate(10deg); } 45% { transform: rotate(-10deg); } 60% { transform: rotate(5deg); } 75%, 100% { transform: rotate(0deg); } }
.email-box .state-default svg { color: var(--accent-purple); animation: contact-wiggle 3s infinite ease-in-out; }
.tg-box .state-default svg { color: var(--telegram-blue); animation: contact-wiggle 3s infinite ease-in-out 1.5s; }
.contact-box.copied { border-color: var(--accent-green); background: rgba(46, 204, 113, 0.1); pointer-events: none; box-shadow: 0 0 15px rgba(46, 204, 113, 0.2); }
.contact-box.copied .state-default { opacity: 0; transform: translateY(-15px); }
.contact-box.copied .state-success { opacity: 1; transform: translateY(0); }
@keyframes envelope-success-flip { 0% { transform: rotate(0deg); } 40% { transform: rotate(15deg); } 70% { transform: rotate(-10deg); } 100% { transform: rotate(0deg); } }
.contact-box.copied .state-success svg { animation: envelope-success-flip 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; }
.footer-copyright { display: flex; align-items: center; justify-content: center; width: 100%; }
.footer-copyright span { opacity: 0.5; font-size: 11px; letter-spacing: 0.5px; }
/* --- МОБИЛЬНАЯ АДАПТАЦИЯ --- */
@media (max-width: 768px) {
header { width: calc(100% - 20px); padding: 0 12px; }
.nav-links { display: none; }
.nav-menu { width: auto; justify-content: flex-end; gap: 0; }
.nav-menu .btn-support-style { padding: 10px 16px !important; gap: 8px !important; }
.nav-menu .btn-support-style span { display: inline-block; font-size: 13px; }
.nav-menu .btn-support-style svg { width: 18px !important; height: 18px !important; }
.system-status { display: none; }
.logo { font-size: 22px; }
.message-container { padding-top: 130px; padding-bottom: 20px; }
.message-container h1 { font-size: clamp(32px, 8vw, 42px); }
.message-container p.lead { font-size: 16px; padding: 0 10px; margin-bottom: 35px; }
.terminal-header-info { font-size: 11px; padding: 10px 15px; }
.terminal-wrap { padding: 15px; }
/* Строгая высота для мобильных: ровно 12 строк по 24px = 288px */
.terminal-window { height: 288px; font-size: 12px; }
.orb-1, .orb-2, .orb-3 { min-width: 350px; min-height: 350px; }
.main-footer { padding: 0 0 15px; }
.footer-contacts { flex-direction: column; align-items: center; gap: 15px; margin-bottom: 30px; }
.contact-box { width: 100%; max-width: 320px; }
}
</style>
</head>
<body>
<div class="top-loader"></div>
<div class="bg-wrapper">
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="orb orb-3"></div>
<div class="grid-overlay"></div>
</div>
<header id="main-header">
<div class="logo-group">
<a href="/" class="logo gradient-text">NETWAVE.TODAY</a>
<div class="system-status"><div class="status-dot"></div>Все системы ONLINE</div>
</div>
<nav class="nav-menu">
<a href="https://t.me/netwavetoday" class="btn-support-style">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06-.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
<span>Поддержка</span>
</a>
</nav>
</header>
<section class="message-container">
<h1>СТАТУС УЗЛА <span class="gradient-text">АКТИВЕН</span></h1>
<p class="lead">
Прямое соединение с серверной инфраструктурой успешно установлено.
</p>
<div class="terminal-block">
<div class="terminal-header-info">
<div>IP-АДРЕС: <span class="val" id="stat-ip">ОПРЕДЕЛЕНИЕ...</span></div>
<div>ПИНГ: <span class="val" id="stat-ping">-- мс</span></div>
</div>
<div class="terminal-wrap">
<div class="terminal-window" id="term-box">
<span class="cursor" id="term-cursor"></span>
</div>
</div>
</div>
</section>
<footer class="main-footer">
<div class="footer-contacts">
<a href="https://t.me/netwavetoday" target="_blank" class="contact-box tg-box">
<div class="state-default">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.665 3.717l-17.73 6.837c-1.21.486-1.203 1.161-.222 1.462l4.552 1.42 10.532-6.645c.498-.303.953-.14.579.192l-8.533 7.701h-.002l.002.001-.314 4.692c.46 0 .663-.211.921-.46l2.211-2.15 4.599 3.397c.848.467 1.457.227 1.668-.785l3.026-14.239c.309-1.239-.473-1.8-1.282-1.43z"/></svg>
<span>@netwavetoday</span>
</div>
</a>
<div class="contact-box email-box" onclick="copyEmailText('netwave.today@gmail.com', this)">
<div class="state-default">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
<span>netwave.today@gmail.com</span>
</div>
<div class="state-success">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
<span>Скопировано!</span>
</div>
</div>
</div>
<div class="footer-copyright">
<span>© 2026 NETWAVE.TODAY | ВСЕ ПРАВА ЗАЩИЩЕНЫ</span>
</div>
</footer>
<script>
// Анимация хедера при скролле
window.addEventListener('scroll', () => {
const header = document.getElementById('main-header');
if (window.scrollY > 40) header.classList.add('scrolled');
else header.classList.remove('scrolled');
});
// Копирование почты
function copyEmailText(email, el) {
if(el.classList.contains('copied')) return;
navigator.clipboard.writeText(email).then(() => {
el.classList.add('copied');
setTimeout(() => { el.classList.remove('copied'); }, 2500);
}).catch(err => {
console.error('Ошибка копирования: ', err);
});
}
// --- ЛОГИКА ТЕРМИНАЛА ---
document.addEventListener('DOMContentLoaded', async () => {
const termBox = document.getElementById('term-box');
const cursor = document.getElementById('term-cursor');
// Получаем IP пользователя (Российский сервис SypexGeo)
let userIP = "ОПРЕДЕЛЕНИЕ...";
try {
const response = await fetch('https://api.sypexgeo.net/json/');
const data = await response.json();
userIP = data.ip;
document.getElementById('stat-ip').innerText = userIP;
} catch (e) {
userIP = "192.168.1.1 (Скрыт)";
document.getElementById('stat-ip').innerText = userIP;
}
// Форматирование времени для логов
function getTime() {
const now = new Date();
return `${now.getHours().toString().padStart(2,'0')}:${now.getMinutes().toString().padStart(2,'0')}:${now.getSeconds().toString().padStart(2,'0')}.${now.getMilliseconds().toString().padStart(3,'0')}`;
}
// --- РЕАЛЬНЫЙ ПИНГ С TCP-АППРОКСИМАЦИЕЙ ---
let estimatedTcpPing = '--';
async function updatePing() {
const start = performance.now();
try {
await fetch(window.location.href.split('?')[0] + '?_t=' + Date.now(), { method: 'HEAD', cache: 'no-store' });
let httpPing = performance.now() - start;
// Формула: 80% от HTTP-времени + случайный джиттер от -2 до +2 мс
let baseTcp = httpPing * 0.8;
let jitter = (Math.random() * 4) - 2;
estimatedTcpPing = Math.max(1, Math.round(baseTcp + jitter));
document.getElementById('stat-ping').innerText = estimatedTcpPing + ' мс';
} catch (e) {
console.warn("Сбой проверки пинга");
}
}
// Вызываем первый замер сразу, затем каждые 2 секунды
updatePing();
setInterval(updatePing, 2000);
// Фаза 1: Стартовая загрузка
// Используем стрелочные функции () => для захвата актуального пинга во время отрисовки
const bootLines = [
{ text: () => "[INIT] Ядро маршрутизации NetWave запущено...", class: "t-dim", delay: 400 },
{ text: () => `[AUTH] Идентификация клиента: <span class="t-white">${userIP}</span>`, class: "t-green", delay: 600 },
{ text: () => "[SECURE] Проверка протоколов шифрования: УСПЕШНО", class: "t-green", delay: 400 },
{ text: () => `[INFO] Оптимальный узел маршрутизации найден. Пинг: ${estimatedTcpPing !== '--' ? estimatedTcpPing : '...'} мс`, class: "t-white", delay: 800 },
{ text: () => "[OK] Соединение стабильно. Переход в режим мониторинга.", class: "t-purple", delay: 500 }
];
// Фаза 2: Бесконечные логи (некоторые тоже подхватывают живой пинг)
const loopCommands = [
{ text: () => "Переадресация TCP потока через порт 443", color: "t-white" },
{ text: () => "Очистка памяти завершена. Освобождено 12MB", color: "t-dim" },
{ text: () => "Пакет зашифрован (AES-256-GCM)", color: "t-green" },
{ text: () => "Отклонен поврежденный UDP пакет от пира", color: "t-red" },
{ text: () => `Ответ от узла получен за: ${estimatedTcpPing} мс`, color: "t-purple" },
{ text: () => "Обмен ключами успешно верифицирован", color: "t-green" },
{ text: () => "Выделение буфера для входящего трафика", color: "t-white" },
{ text: () => "Применены правила шейпинга трафика (Класс A)", color: "t-purple" },
{ text: () => "Синхронизация состояния узла с главным кластером...", color: "t-orange" },
{ text: () => "Рукопожатие с целевым хостом установлено", color: "t-green" },
{ text: () => `Задержка системного пульса: ${Math.max(1, (estimatedTcpPing === '--' ? 5 : estimatedTcpPing) - Math.floor(Math.random()*3))} мс`, color: "t-dim" },
{ text: () => "Правило брандмауэра #104: РАЗРЕШИТЬ", color: "t-dim" }
];
// Функция добавления одной строки
function appendLog(htmlContent, cssClass = "") {
const lineDiv = document.createElement('div');
lineDiv.className = 't-line ' + cssClass;
lineDiv.innerHTML = `<span class="t-time">[${getTime()}]</span> ` + htmlContent;
termBox.insertBefore(lineDiv, cursor);
// Вычисляем максимум строк динамически
const currentMaxLines = window.innerWidth <= 768 ? 12 : 14;
const allLines = termBox.querySelectorAll('.t-line');
if(allLines.length > currentMaxLines) {
allLines[0].remove();
}
// Прокрутка в самый низ
termBox.scrollTop = termBox.scrollHeight;
}
// Запуск стартовой загрузки
async function runBootSequence() {
for (let i = 0; i < bootLines.length; i++) {
await new Promise(r => setTimeout(r, bootLines[i].delay));
appendLog(bootLines[i].text(), bootLines[i].class);
}
runInfiniteLogs();
}
// Функция бесконечной генерации
function runInfiniteLogs() {
const randomDelay = Math.floor(Math.random() * 2000) + 200;
setTimeout(() => {
const cmd = loopCommands[Math.floor(Math.random() * loopCommands.length)];
appendLog(`<span class="${cmd.color}">${cmd.text()}</span>`);
runInfiniteLogs();
}, randomDelay);
}
setTimeout(runBootSequence, 500);
});
</script>
</body>
</html>
Спасибо!