отображение ключей и создание на сутки

This commit is contained in:
Vlad
2024-09-26 02:38:32 +03:00
parent 34f0205f6d
commit 0e43b36901
9 changed files with 58 additions and 7 deletions
+2 -1
View File
@@ -9,7 +9,7 @@ storage = MemoryStorage()
dp = Dispatcher(bot=bot, storage=storage)
router = Router()
from handlers import balance, keys, pay, profile, start
from handlers import balance, keys, pay, profile, start, notifications
from key_management import router as key_management_router
# Регистрация обработчиков
@@ -19,6 +19,7 @@ dp.include_router(keys.router)
dp.include_router(balance.router)
dp.include_router(key_management_router)
dp.include_router(pay.router)
dp.include_router(notifications.router)
+1
View File
@@ -40,6 +40,7 @@ def add_client(session, client_id: str, email: str, tg_id: str, limit_ip: int, t
if response.status_code == 200:
print(f"Клиент добавлен: email={email}")
return response.json()
else:
print(f"Ошибка при добавлении клиента: {response.status_code}, {response.text}")
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9 -2
View File
@@ -79,9 +79,16 @@ async def process_callback_view_key(callback_query: types.CallbackQuery):
expiry_time = record['expiry_time']
expiry_date = datetime.utcfromtimestamp(expiry_time / 1000)
current_date = datetime.utcnow()
days_left = (expiry_date - current_date).days
time_left = expiry_date - current_date
if time_left.total_seconds() <= 0:
days_left_message = "Ключ истек."
elif time_left.days > 0:
days_left_message = f"Осталось дней: {time_left.days}"
else:
hours_left = time_left.seconds // 3600
days_left_message = f"Осталось часов: {hours_left}"
days_left_message = f"Осталось дней: {days_left}" if days_left > 0 else "Ключ истек."
response_message = (f"Ваш ключ:\n<pre>{key}</pre>\n"
f"Дата окончания: <b>{expiry_date.strftime('%Y-%m-%d %H:%M:%S')}</b>\n"
f"{days_left_message}")
+26
View File
@@ -1,6 +1,11 @@
import asyncpg
from datetime import datetime, timedelta
from aiogram import Bot
from aiogram import Router, types
from bot import bot
from aiogram.filters import Command
router = Router()
from config import DATABASE_URL
@@ -39,3 +44,24 @@ async def notify_expiring_keys(bot: Bot):
await conn.close()
except Exception as e:
print(f"Ошибка при отправке уведомлений: {e}")
@router.message(Command(commands=['notify']))
async def notify_command(message: types.Message):
# Запрашиваем у администратора ID пользователя и текст уведомления
await message.answer("Введите ID пользователя и текст уведомления в формате:\n<code>/notify user_id текст</code>", parse_mode="HTML")
# Обработка команды уведомления
@router.message()
async def process_notification(message: types.Message):
if message.text.startswith("/notify"):
try:
# Парсим команду
command, user_id, *text = message.text.split()
text = ' '.join(text)
# Отправляем сообщение пользователю
await bot.send_message(chat_id=user_id, text=text)
await message.answer(f"Уведомление успешно отправлено пользователю {user_id}.")
except Exception as e:
await message.answer(f"Ошибка при отправке уведомления: {e}")
+1 -1
View File
@@ -232,4 +232,4 @@ async def process_admin_confirmation(callback_query: types.CallbackQuery, state:
finally:
await state.clear()
await callback_query.answer()
await callback_query.answer()
+19 -3
View File
@@ -9,6 +9,7 @@ from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import (CallbackQuery, InlineKeyboardButton,
InlineKeyboardMarkup, Message)
from pytz import timezone
from auth import link, login_with_credentials
from bot import bot, dp
@@ -139,7 +140,7 @@ async def handle_key_name_input(message: Message, state: FSMContext):
if trial_status == 0:
# Создаем пробный ключ на 1 день
expiry_time = int((current_time + timedelta(days=1)).timestamp() * 1000)
expiry_time = int((current_time + timedelta(days=1, hours=3)).timestamp() * 1000)
else:
# Проверяем баланс перед созданием нового ключа
balance = await get_balance(tg_id)
@@ -151,10 +152,23 @@ async def handle_key_name_input(message: Message, state: FSMContext):
return
await update_balance(tg_id, -100)
expiry_time = int((current_time + timedelta(days=30)).timestamp() * 1000)
expiry_time = int((current_time + timedelta(days=30, hours=3)).timestamp() * 1000)
try:
add_client(session, client_id, email, tg_id, limit_ip=1, total_gb=0, expiry_time=expiry_time, enable=True, flow="xtls-rprx-vision")
# Попробуем добавить клиента
response = add_client(session, client_id, email, tg_id, limit_ip=1, total_gb=0, expiry_time=expiry_time, enable=True, flow="xtls-rprx-vision")
# Проверяем статус ответа от сервера
if not response.get("success", True):
error_msg = response.get("msg", "Неизвестная ошибка.")
if "Duplicate email" in error_msg:
await message.bot.send_message(tg_id, "❌ Этот email уже используется. Пожалуйста, выберите другое имя для ключа.")
await state.set_state(Form.waiting_for_key_name) # Возвращаем пользователя к вводу имени ключа
return
else:
raise Exception(error_msg)
# Если добавление клиента прошло успешно, получаем ссылку
connection_link = link(session, client_id, email)
# Проверка существующей записи
@@ -182,6 +196,7 @@ async def handle_key_name_input(message: Message, state: FSMContext):
f"<pre>{connection_link}</pre>"
)
await message.bot.send_message(tg_id, key_message, parse_mode="HTML", reply_markup=keyboard)
except Exception as e:
await message.bot.send_message(tg_id, f"❌ Ошибка при создании ключа: {e}")
@@ -189,6 +204,7 @@ async def handle_key_name_input(message: Message, state: FSMContext):
@dp.callback_query(F.data == 'instructions')
async def handle_instructions(callback_query: CallbackQuery):
instructions_message = (