Telegram / SOCKS5
-Прокси уже сохраняется в SQLite. Следующий шаг — подключить Telegraf bridge и отправлять сообщения сайта операторам.
+Источник настроек: SQLite через API. Сверяйте блок диагностики выше: API URL, DB path и bridge status.
From 7567571210f9c8fc3e8db6f37bac268fab91ef34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?=
<78488229+viktor138irk@users.noreply.github.com>
Date: Fri, 8 May 2026 19:10:01 +0900
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82?=
=?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8?=
=?UTF-8?q?=D0=BA=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?=
=?UTF-8?q?=20=D0=B2=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
admin-panel/src/main.jsx | 62 ++++++++++++++++++++++++++++++++++++----
1 file changed, 57 insertions(+), 5 deletions(-)
diff --git a/admin-panel/src/main.jsx b/admin-panel/src/main.jsx
index cbde8fc..7871876 100644
--- a/admin-panel/src/main.jsx
+++ b/admin-panel/src/main.jsx
@@ -5,6 +5,7 @@ import {
Bot,
CheckCircle,
Clock,
+ Database,
KeyRound,
MessageCircle,
PlugZap,
@@ -61,12 +62,14 @@ function App() {
const [stats, setStats] = useState(null);
const [messages, setMessages] = useState([]);
const [telegramSettings, setTelegramSettings] = useState(emptyTelegramSettings);
+ const [telegramBridge, setTelegramBridge] = useState(null);
const [telegramDirty, setTelegramDirty] = useState(false);
const [loading, setLoading] = useState(false);
const [savingTelegram, setSavingTelegram] = useState(false);
const [testingProxy, setTestingProxy] = useState(false);
const [lastUpdate, setLastUpdate] = useState(null);
const [error, setError] = useState('');
+ const [telegramError, setTelegramError] = useState('');
const [telegramNotice, setTelegramNotice] = useState('');
const [proxyTestResult, setProxyTestResult] = useState(null);
@@ -104,10 +107,12 @@ function App() {
async function loadTelegramSettings({ force = false } = {}) {
if (telegramDirty && !force) return;
+ setTelegramError('');
const response = await fetch(API_URL + '/api/admin/telegram/settings');
const data = await response.json();
if (!data.ok) throw new Error(data.error || 'Telegram settings load failed');
setTelegramSettings(data.settings || emptyTelegramSettings);
+ setTelegramBridge(data.bridge || null);
setTelegramDirty(false);
}
@@ -131,9 +136,15 @@ function App() {
setHealth(healthData);
setStats(statsData.stats || null);
setMessages(Array.isArray(messagesData.messages) ? messagesData.messages : []);
+ if (healthData.telegram) setTelegramBridge(healthData.telegram);
+ if (statsData.telegram) setTelegramBridge(statsData.telegram);
if (includeTelegram) {
- await loadTelegramSettings({ force: false });
+ try {
+ await loadTelegramSettings({ force: false });
+ } catch (telegramRequestError) {
+ setTelegramError(telegramRequestError.message);
+ }
}
setLastUpdate(new Date());
@@ -149,6 +160,7 @@ function App() {
event.preventDefault();
setSavingTelegram(true);
setTelegramNotice('');
+ setTelegramError('');
setProxyTestResult(null);
try {
@@ -171,8 +183,9 @@ function App() {
const data = await response.json();
if (!data.ok) throw new Error(data.error || 'Save failed');
setTelegramSettings(data.settings || emptyTelegramSettings);
+ setTelegramBridge(data.bridge || telegramBridge);
setTelegramDirty(false);
- setTelegramNotice('Настройки Telegram/SOCKS5 сохранены.');
+ setTelegramNotice(data.message || 'Настройки Telegram/SOCKS5 сохранены.');
} catch (saveError) {
setTelegramNotice(`Ошибка сохранения: ${saveError.message}`);
} finally {
@@ -183,6 +196,7 @@ function App() {
async function testProxy() {
setTestingProxy(true);
setTelegramNotice('');
+ setTelegramError('');
try {
const response = await fetch(API_URL + '/api/admin/telegram/test-proxy', {
@@ -191,6 +205,7 @@ function App() {
const data = await response.json();
setProxyTestResult(data);
if (data.settings && !telegramDirty) setTelegramSettings(data.settings);
+ if (data.bridge) setTelegramBridge(data.bridge);
} catch (testError) {
setProxyTestResult({ ok: false, status: 'error', message: testError.message });
} finally {
@@ -198,9 +213,31 @@ function App() {
}
}
+ async function restartBridge() {
+ setTestingProxy(true);
+ setTelegramNotice('');
+ setTelegramError('');
+
+ try {
+ const response = await fetch(API_URL + '/api/admin/telegram/restart', {
+ method: 'POST'
+ });
+ const data = await response.json();
+ if (!data.ok) throw new Error(data.error || 'Bridge restart failed');
+ setTelegramBridge(data.bridge || null);
+ setTelegramNotice(data.bridge?.running ? 'Telegram bridge перезапущен.' : `Bridge не запущен: ${data.bridge?.error || 'unknown error'}`);
+ await loadDashboard({ silent: true, includeTelegram: true });
+ } catch (restartError) {
+ setTelegramError(restartError.message);
+ } finally {
+ setTestingProxy(false);
+ }
+ }
+
async function resetTelegramForm() {
setTelegramDirty(false);
setTelegramNotice('');
+ setTelegramError('');
setProxyTestResult(null);
await loadTelegramSettings({ force: true });
}
@@ -225,6 +262,9 @@ function App() {
Прокси уже сохраняется в SQLite. Следующий шаг — подключить Telegraf bridge и отправлять сообщения сайта операторам.
+Источник настроек: SQLite через API. Сверяйте блок диагностики выше: API URL, DB path и bridge status.