fix renew after sync
This commit is contained in:
+14
-15
@@ -385,21 +385,19 @@ async def store_key(
|
||||
remnawave_link: str = None,
|
||||
):
|
||||
"""
|
||||
Сохраняет информацию о ключе в базу данных.
|
||||
|
||||
Args:
|
||||
tg_id (int): Telegram ID пользователя
|
||||
client_id (str): Уникальный идентификатор клиента
|
||||
email (str): Электронная почта или имя устройства
|
||||
expiry_time (int): Время истечения ключа в миллисекундах
|
||||
key (str): Ключ доступа (публичная ссылка)
|
||||
server_id (str): Идентификатор сервера или кластера
|
||||
remnawave_link (str, optional): Подписка Remnawave (если есть)
|
||||
|
||||
Raises:
|
||||
Exception: Если возникает ошибка при сохранении ключа в базу данных
|
||||
Сохраняет информацию о ключе в базу данных, если ключ ещё не существует.
|
||||
"""
|
||||
try:
|
||||
existing_key = await session.fetchrow(
|
||||
"SELECT 1 FROM keys WHERE tg_id = $1 AND client_id = $2",
|
||||
tg_id,
|
||||
client_id,
|
||||
)
|
||||
|
||||
if existing_key:
|
||||
logger.info(f"[Store Key] Ключ уже существует — пропускаем: tg_id={tg_id}, client_id={client_id}")
|
||||
return
|
||||
|
||||
await session.execute(
|
||||
"""
|
||||
INSERT INTO keys (tg_id, client_id, email, created_at, expiry_time, key, server_id, remnawave_link)
|
||||
@@ -414,9 +412,10 @@ async def store_key(
|
||||
server_id,
|
||||
remnawave_link,
|
||||
)
|
||||
logger.info(f"Ключ успешно сохранен для пользователя {tg_id} на сервере {server_id}")
|
||||
logger.info(f"✅ Ключ сохранён: tg_id={tg_id}, client_id={client_id}, server_id={server_id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при сохранении ключа для пользователя {tg_id}: {e}")
|
||||
logger.error(f"❌ Ошибка при сохранении ключа для tg_id={tg_id}, client_id={client_id}: {e}")
|
||||
raise
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ from backup import create_backup_and_send_to_admins
|
||||
from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL, TOTAL_GB, USE_COUNTRY_SELECTION, REMNAWAVE_PASSWORD, REMNAWAVE_LOGIN
|
||||
from database import check_unique_server_name, get_servers, update_key_expiry
|
||||
from filters.admin import IsAdminFilter
|
||||
from handlers.keys.key_utils import create_client_on_server, create_key_on_cluster, renew_key_in_cluster
|
||||
from handlers.keys.key_utils import create_client_on_server, create_key_on_cluster, renew_key_in_cluster, delete_key_from_cluster
|
||||
from logger import logger
|
||||
|
||||
from ..panel.keyboard import AdminPanelCallback, build_admin_back_kb
|
||||
@@ -437,10 +437,10 @@ async def handle_sync_cluster(callback_query: types.CallbackQuery, callback_data
|
||||
|
||||
try:
|
||||
query_keys = """
|
||||
SELECT tg_id, client_id, email, expiry_time
|
||||
FROM keys
|
||||
WHERE server_id = $1
|
||||
"""
|
||||
SELECT tg_id, client_id, email, expiry_time
|
||||
FROM keys
|
||||
WHERE server_id = $1
|
||||
"""
|
||||
keys_to_sync = await session.fetch(query_keys, cluster_name)
|
||||
|
||||
if not keys_to_sync:
|
||||
@@ -450,33 +450,44 @@ async def handle_sync_cluster(callback_query: types.CallbackQuery, callback_data
|
||||
)
|
||||
return
|
||||
|
||||
text = f"<b>🔄 Синхронизация кластера {cluster_name}</b>\n\n🔑 Количество ключей: <b>{len(keys_to_sync)}</b>"
|
||||
|
||||
await callback_query.message.edit_text(
|
||||
text=text,
|
||||
text=f"<b>🔄 Синхронизация кластера {cluster_name}</b>\n\n🔑 Количество ключей: <b>{len(keys_to_sync)}</b>"
|
||||
)
|
||||
|
||||
for key in keys_to_sync:
|
||||
try:
|
||||
await create_key_on_cluster(
|
||||
await delete_key_from_cluster(cluster_name, key["email"], key["client_id"])
|
||||
|
||||
await session.execute(
|
||||
"DELETE FROM keys WHERE tg_id = $1 AND client_id = $2",
|
||||
key["tg_id"],
|
||||
key["client_id"]
|
||||
)
|
||||
|
||||
result = await create_key_on_cluster(
|
||||
cluster_name,
|
||||
key["tg_id"],
|
||||
key["client_id"],
|
||||
key["email"],
|
||||
key["expiry_time"],
|
||||
session=session,
|
||||
)
|
||||
await asyncio.sleep(0.6)
|
||||
|
||||
await asyncio.sleep(0.5)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при добавлении ключа {key['client_id']} в кластер {cluster_name}: {e}")
|
||||
logger.error(f"Ошибка при синхронизации ключа {key['client_id']} в {cluster_name}: {e}")
|
||||
|
||||
|
||||
await callback_query.message.edit_text(
|
||||
text=f"✅ Ключи успешно синхронизированы для кластера {cluster_name}",
|
||||
reply_markup=build_admin_back_kb("clusters"),
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка синхронизации ключей в кластере {cluster_name}: {e}")
|
||||
await callback_query.message.edit_text(
|
||||
text=f"❌ Произошла ошибка при синхронизации: {e}", reply_markup=build_admin_back_kb("clusters")
|
||||
text=f"❌ Произошла ошибка при синхронизации: {e}",
|
||||
reply_markup=build_admin_back_kb("clusters"),
|
||||
)
|
||||
|
||||
|
||||
|
||||
+22
-14
@@ -242,21 +242,29 @@ async def renew_key_in_cluster(cluster_id, email, client_id, new_expiry_time, to
|
||||
logger.warning(f"Не указан inbound_id для продления Remnawave на сервере {server_name}")
|
||||
|
||||
if remnawave_inbound_ids:
|
||||
remna = RemnawaveAPI(cluster[0]["api_url"])
|
||||
logged_in = await remna.login(REMNAWAVE_LOGIN, REMNAWAVE_PASSWORD)
|
||||
if logged_in:
|
||||
expire_iso = datetime.utcfromtimestamp(new_expiry_time // 1000).isoformat() + "Z"
|
||||
updated = await remna.update_user(
|
||||
uuid=client_id,
|
||||
expire_at=expire_iso,
|
||||
active_user_inbounds=remnawave_inbound_ids,
|
||||
)
|
||||
if updated:
|
||||
logger.info(f"Подписка Remnawave {client_id} успешно продлена")
|
||||
else:
|
||||
logger.warning(f"Не удалось продлить подписку Remnawave {client_id}")
|
||||
remnawave_server = next(
|
||||
(srv for srv in cluster if srv.get("panel_type", "").lower() == "remnawave" and srv.get("inbound_id") in remnawave_inbound_ids),
|
||||
None
|
||||
)
|
||||
|
||||
if not remnawave_server:
|
||||
logger.error("❌ Не найден Remnawave сервер для продления")
|
||||
else:
|
||||
logger.error("Не удалось войти в Remnawave API")
|
||||
remna = RemnawaveAPI(remnawave_server["api_url"])
|
||||
logged_in = await remna.login(REMNAWAVE_LOGIN, REMNAWAVE_PASSWORD)
|
||||
if logged_in:
|
||||
expire_iso = datetime.utcfromtimestamp(new_expiry_time // 1000).isoformat() + "Z"
|
||||
updated = await remna.update_user(
|
||||
uuid=client_id,
|
||||
expire_at=expire_iso,
|
||||
active_user_inbounds=remnawave_inbound_ids,
|
||||
)
|
||||
if updated:
|
||||
logger.info(f"Подписка Remnawave {client_id} успешно продлена")
|
||||
else:
|
||||
logger.warning(f"Не удалось продлить подписку Remnawave {client_id}")
|
||||
else:
|
||||
logger.error("Не удалось войти в Remnawave API")
|
||||
|
||||
for server_info in cluster:
|
||||
panel_type = server_info.get("panel_type", "3x-ui").lower()
|
||||
|
||||
Reference in New Issue
Block a user