fix renew after sync

This commit is contained in:
Vladless
2025-04-11 17:34:47 +03:00
parent f71e6eb226
commit ab35ce9178
4 changed files with 61 additions and 43 deletions
+14 -15
View File
@@ -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
+24 -13
View File
@@ -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
View File
@@ -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()
+1 -1
View File
File diff suppressed because one or more lines are too long