Этот коммит содержится в:
stevefoxru
2025-04-28 14:43:32 +03:00
коммит произвёл GitHub
родитель 87431cc6ab
Коммит 5b957dd7bc
+49 -43
Просмотреть файл
@@ -11,11 +11,10 @@ import uuid
import pytz import pytz
import zipfile import zipfile
import shutil import shutil
from aiogram import Bot, types from aiogram import Bot, Dispatcher, types
from aiogram.dispatcher import Dispatcher from aiogram.filters import Command
from aiogram.dispatcher.middlewares import BaseMiddleware
from aiogram.utils import executor
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram import BaseMiddleware
from datetime import datetime, timedelta from datetime import datetime, timedelta
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger from apscheduler.triggers.interval import IntervalTrigger
@@ -63,7 +62,8 @@ except ValueError as e:
logger.error(f"Ошибка преобразования admin_ids или moderator_ids: {str(e)}") logger.error(f"Ошибка преобразования admin_ids или moderator_ids: {str(e)}")
sys.exit(1) sys.exit(1)
bot = Bot(bot_token) bot = Bot(token=bot_token)
dp = Dispatcher()
WG_CONFIG_FILE = wg_config_file WG_CONFIG_FILE = wg_config_file
DOCKER_CONTAINER = docker_container DOCKER_CONTAINER = docker_container
ENDPOINT = endpoint ENDPOINT = endpoint
@@ -71,14 +71,14 @@ yoomoney_client = Client(yoomoney_token) if yoomoney_token else None
PRICING = pricing PRICING = pricing
class AdminMessageDeletionMiddleware(BaseMiddleware): class AdminMessageDeletionMiddleware(BaseMiddleware):
async def on_process_message(self, message: types.Message, data: dict): async def __call__(self, handler, event, data):
if message.from_user.id in admins and message.text.startswith('/'): if isinstance(event, types.Message) and event.from_user.id in admins and event.text.startswith('/'):
asyncio.create_task(delete_message_after_delay(message.chat.id, message.message_id)) asyncio.create_task(delete_message_after_delay(event.chat.id, event.message_id))
return await handler(event, data)
dp = Dispatcher(bot)
scheduler = AsyncIOScheduler(timezone=pytz.utc) scheduler = AsyncIOScheduler(timezone=pytz.utc)
scheduler.start() scheduler.start()
dp.middleware.setup(AdminMessageDeletionMiddleware()) dp.message.middleware(AdminMessageDeletionMiddleware())
# Вспомогательная функция для обновления сообщений # Вспомогательная функция для обновления сообщений
async def update_user_message(user_id, chat_id, text, reply_markup, old_message_id=None, state=None): async def update_user_message(user_id, chat_id, text, reply_markup, old_message_id=None, state=None):
@@ -246,7 +246,7 @@ async def issue_vpn_key(user_id: int, period: str) -> bool:
logger.error(f"Ошибка в issue_vpn_key для user_id {user_id}: {str(e)}") logger.error(f"Ошибка в issue_vpn_key для user_id {user_id}: {str(e)}")
return False return False
@dp.message_handler(commands=['start', 'help']) @dp.message(Command(commands=['start', 'help']))
async def start_command_handler(message: types.Message): async def start_command_handler(message: types.Message):
user_id = message.from_user.id user_id = message.from_user.id
await update_user_message( await update_user_message(
@@ -257,7 +257,7 @@ async def start_command_handler(message: types.Message):
old_message_id=user_main_messages.get(user_id, {}).get('message_id') old_message_id=user_main_messages.get(user_id, {}).get('message_id')
) )
@dp.message_handler(commands=['add_admin']) @dp.message(Command(commands=['add_admin']))
async def add_admin_command(message: types.Message): async def add_admin_command(message: types.Message):
if message.from_user.id not in admins: if message.from_user.id not in admins:
await message.answer("У вас нет прав.") await message.answer("У вас нет прав.")
@@ -281,7 +281,7 @@ async def add_admin_command(message: types.Message):
old_message_id=message.message_id old_message_id=message.message_id
) )
@dp.message_handler() @dp.message()
async def handle_messages(message: types.Message): async def handle_messages(message: types.Message):
global PRICING global PRICING
user_id = message.from_user.id user_id = message.from_user.id
@@ -455,7 +455,7 @@ async def handle_messages(message: types.Message):
state=None state=None
) )
@dp.callback_query_handler(lambda c: c.data == "settings") @dp.callback_query(lambda c: c.data == "settings")
async def settings_menu_callback(callback_query: types.CallbackQuery): async def settings_menu_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -470,7 +470,7 @@ async def settings_menu_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "yoomoney_settings") @dp.callback_query(lambda c: c.data == "yoomoney_settings")
async def yoomoney_settings_callback(callback_query: types.CallbackQuery): async def yoomoney_settings_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -485,7 +485,7 @@ async def yoomoney_settings_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "set_yoomoney_token") @dp.callback_query(lambda c: c.data == "set_yoomoney_token")
async def set_yoomoney_token_callback(callback_query: types.CallbackQuery): async def set_yoomoney_token_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -501,7 +501,7 @@ async def set_yoomoney_token_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "set_yoomoney_wallet") @dp.callback_query(lambda c: c.data == "set_yoomoney_wallet")
async def set_yoomoney_wallet_callback(callback_query: types.CallbackQuery): async def set_yoomoney_wallet_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -517,7 +517,7 @@ async def set_yoomoney_wallet_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "pricing_settings") @dp.callback_query(lambda c: c.data == "pricing_settings")
async def pricing_settings_callback(callback_query: types.CallbackQuery): async def pricing_settings_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -532,7 +532,7 @@ async def pricing_settings_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('set_price_')) @dp.callback_query(lambda c: c.data.startswith('set_price_'))
async def set_price_callback(callback_query: types.CallbackQuery): async def set_price_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -549,7 +549,7 @@ async def set_price_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "add_user") @dp.callback_query(lambda c: c.data == "add_user")
async def prompt_for_user_name(callback_query: types.CallbackQuery): async def prompt_for_user_name(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -565,7 +565,7 @@ async def prompt_for_user_name(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "add_admin") @dp.callback_query(lambda c: c.data == "add_admin")
async def prompt_for_admin_id(callback_query: types.CallbackQuery): async def prompt_for_admin_id(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -581,7 +581,7 @@ async def prompt_for_admin_id(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('client_')) @dp.callback_query(lambda c: c.data.startswith('client_'))
async def client_selected_callback(callback_query: types.CallbackQuery): async def client_selected_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -645,7 +645,7 @@ async def client_selected_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer("Ошибка на сервере.", show_alert=True) await callback_query.answer("Ошибка на сервере.", show_alert=True)
@dp.callback_query_handler(lambda c: c.data == "list_users") @dp.callback_query(lambda c: c.data == "list_users")
async def list_users_callback(callback_query: types.CallbackQuery): async def list_users_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -700,7 +700,7 @@ async def list_users_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer("Ошибка на сервере.", show_alert=True) await callback_query.answer("Ошибка на сервере.", show_alert=True)
@dp.callback_query_handler(lambda c: c.data == "list_admins") @dp.callback_query(lambda c: c.data == "list_admins")
async def list_admins_callback(callback_query: types.CallbackQuery): async def list_admins_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -719,7 +719,7 @@ async def list_admins_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('remove_admin_')) @dp.callback_query(lambda c: c.data.startswith('remove_admin_'))
async def remove_admin_callback(callback_query: types.CallbackQuery): async def remove_admin_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -734,7 +734,7 @@ async def remove_admin_callback(callback_query: types.CallbackQuery):
await bot.send_message(admin_id, "Вы удалены из администраторов.") await bot.send_message(admin_id, "Вы удалены из администраторов.")
await list_admins_callback(callback_query) await list_admins_callback(callback_query)
@dp.callback_query_handler(lambda c: c.data.startswith('delete_user_')) @dp.callback_query(lambda c: c.data.startswith('delete_user_'))
async def client_delete_callback(callback_query: types.CallbackQuery): async def client_delete_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -763,7 +763,7 @@ async def client_delete_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('renew_user_')) @dp.callback_query(lambda c: c.data.startswith('renew_user_'))
async def renew_user_callback(callback_query: types.CallbackQuery): async def renew_user_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -779,7 +779,7 @@ async def renew_user_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('renew_period_')) @dp.callback_query(lambda c: c.data.startswith('renew_period_'))
async def renew_period_callback(callback_query: types.CallbackQuery): async def renew_period_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -824,7 +824,7 @@ async def renew_period_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "home") @dp.callback_query(lambda c: c.data == "home")
async def return_home(callback_query: types.CallbackQuery): async def return_home(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
await update_user_message( await update_user_message(
@@ -836,7 +836,7 @@ async def return_home(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "get_config") @dp.callback_query(lambda c: c.data == "get_config")
async def list_users_for_config(callback_query: types.CallbackQuery): async def list_users_for_config(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -860,7 +860,7 @@ async def list_users_for_config(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('send_config_')) @dp.callback_query(lambda c: c.data.startswith('send_config_'))
async def send_user_config(callback_query: types.CallbackQuery): async def send_user_config(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins and user_id not in moderators: if user_id not in admins and user_id not in moderators:
@@ -885,7 +885,7 @@ async def send_user_config(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "create_backup") @dp.callback_query(lambda c: c.data == "create_backup")
async def create_backup_callback(callback_query: types.CallbackQuery): async def create_backup_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -921,7 +921,7 @@ async def create_backup_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "buy_key") @dp.callback_query(lambda c: c.data == "buy_key")
async def buy_key_callback(callback_query: types.CallbackQuery): async def buy_key_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
await update_user_message( await update_user_message(
@@ -933,7 +933,7 @@ async def buy_key_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "select_subscription_period") @dp.callback_query(lambda c: c.data == "select_subscription_period")
async def select_period_callback(callback_query: types.CallbackQuery): async def select_period_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
keyboard = InlineKeyboardMarkup(row_width=2) keyboard = InlineKeyboardMarkup(row_width=2)
@@ -955,7 +955,7 @@ async def select_period_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('confirm_period_')) @dp.callback_query(lambda c: c.data.startswith('confirm_period_'))
async def confirm_period_callback(callback_query: types.CallbackQuery): async def confirm_period_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
period = callback_query.data.split('confirm_period_')[1] period = callback_query.data.split('confirm_period_')[1]
@@ -1004,7 +1004,7 @@ async def confirm_period_callback(callback_query: types.CallbackQuery):
logger.error(f"Ошибка при создании платежа для user_id {user_id}: {str(e)}") logger.error(f"Ошибка при создании платежа для user_id {user_id}: {str(e)}")
await callback_query.answer("Ошибка при создании платежа.", show_alert=True) await callback_query.answer("Ошибка при создании платежа.", show_alert=True)
@dp.callback_query_handler(lambda c: c.data == "enter_promocode_for_buy") @dp.callback_query(lambda c: c.data == "enter_promocode_for_buy")
async def enter_promocode_for_buy_callback(callback_query: types.CallbackQuery): async def enter_promocode_for_buy_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
await update_user_message( await update_user_message(
@@ -1017,7 +1017,7 @@ async def enter_promocode_for_buy_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "reset_promocode") @dp.callback_query(lambda c: c.data == "reset_promocode")
async def reset_promocode_callback(callback_query: types.CallbackQuery): async def reset_promocode_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if 'promocode_discount' in user_main_messages.get(user_id, {}): if 'promocode_discount' in user_main_messages.get(user_id, {}):
@@ -1031,7 +1031,7 @@ async def reset_promocode_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "use_promocode") @dp.callback_query(lambda c: c.data == "use_promocode")
async def use_promocode_callback(callback_query: types.CallbackQuery): async def use_promocode_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
await update_user_message( await update_user_message(
@@ -1044,7 +1044,7 @@ async def use_promocode_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "manage_promocodes") @dp.callback_query(lambda c: c.data == "manage_promocodes")
async def manage_promocodes_callback(callback_query: types.CallbackQuery): async def manage_promocodes_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -1069,7 +1069,7 @@ async def manage_promocodes_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "add_promocode") @dp.callback_query(lambda c: c.data == "add_promocode")
async def add_promocode_callback(callback_query: types.CallbackQuery): async def add_promocode_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -1085,7 +1085,7 @@ async def add_promocode_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data == "delete_promocode") @dp.callback_query(lambda c: c.data == "delete_promocode")
async def delete_promocode_callback(callback_query: types.CallbackQuery): async def delete_promocode_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -1105,7 +1105,7 @@ async def delete_promocode_callback(callback_query: types.CallbackQuery):
) )
await callback_query.answer() await callback_query.answer()
@dp.callback_query_handler(lambda c: c.data.startswith('remove_promocode_')) @dp.callback_query(lambda c: c.data.startswith('remove_promocode_'))
async def remove_promocode_callback(callback_query: types.CallbackQuery): async def remove_promocode_callback(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id user_id = callback_query.from_user.id
if user_id not in admins: if user_id not in admins:
@@ -1141,5 +1141,11 @@ async def check_pending_payments():
scheduler.add_job(check_pending_payments, IntervalTrigger(minutes=5)) scheduler.add_job(check_pending_payments, IntervalTrigger(minutes=5))
async def main():
try:
await dp.start_polling(bot)
finally:
await bot.session.close()
if __name__ == '__main__': if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True) asyncio.run(main())