Merge pull request #87 from izzzzzi/main

Update keyboards and restructuring for filters
This commit is contained in:
Vladislav Lisitsyn
2024-11-13 18:04:38 +03:00
committed by GitHub
15 changed files with 120 additions and 43 deletions
+8 -3
View File
@@ -2,7 +2,8 @@ from aiogram import Bot, Dispatcher, Router
from aiogram.fsm.storage.memory import MemoryStorage
from config import API_TOKEN, CRYPTO_BOT_ENABLE, FREEKASSA_ENABLE, STARS_ENABLE, YOOKASSA_ENABLE
from middlewares.logging import UserActivityMiddleware
from middlewares.database import DatabaseMiddleware
from middlewares.logging import LoggingMiddleware
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
@@ -33,5 +34,9 @@ if STARS_ENABLE:
dp.include_router(stars_pay.router)
dp.include_router(notifications.router)
dp.message.middleware(UserActivityMiddleware())
dp.callback_query.middleware(UserActivityMiddleware())
dp.message.middleware(LoggingMiddleware())
dp.callback_query.middleware(LoggingMiddleware())
dp.message.middleware(DatabaseMiddleware())
dp.callback_query.middleware(DatabaseMiddleware())
+1 -1
View File
@@ -25,7 +25,7 @@ async def add_client(
id=client_id,
email=email.lower(),
limit_ip=limit_ip,
total_gb = TOTAL_GB,
total_gb=TOTAL_GB,
expiry_time=expiry_time,
enable=enable,
tg_id=tg_id,
+1 -1
View File
@@ -8,7 +8,7 @@ from loguru import logger
from bot import bot
from config import DATABASE_URL
from database import add_balance_to_client, check_connection_exists
from handlers.filters.admin import IsAdminFilter
from filters.admin import IsAdminFilter
from handlers.texts import TRIAL
router = Router()
+1 -1
View File
@@ -12,8 +12,8 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder
from backup import backup_database
from bot import bot
from config import DATABASE_URL
from filters.admin import IsAdminFilter
from handlers.admin.admin_commands import send_message_to_all_clients
from handlers.filters.admin import IsAdminFilter
router = Router()
+5 -9
View File
@@ -12,8 +12,8 @@ from loguru import logger
from bot import bot
from config import DATABASE_URL, SERVERS
from database import get_client_id_by_email, restore_trial, update_key_expiry
from filters.admin import IsAdminFilter
from handlers.admin.admin_panel import back_to_admin_menu
from handlers.filters.admin import IsAdminFilter
from handlers.keys.key_utils import delete_key_from_server, renew_server_key
from handlers.utils import sanitize_key_name
@@ -300,22 +300,18 @@ async def handle_key_name_input(message: types.Message, state: FSMContext):
key_buttons.row(
InlineKeyboardButton(
text="⏳ Изменить время истечения",
callback_data=f"change_expiry|{email}"
callback_data=f"change_expiry|{email}",
)
)
key_buttons.row(
InlineKeyboardButton(
text="❌ Удалить ключ",
callback_data=f"delete_key_admin|{email}"
text="❌ Удалить ключ", callback_data=f"delete_key_admin|{email}"
)
)
key_buttons.row(
InlineKeyboardButton(
text="🔙 Назад",
callback_data="back_to_user_editor"
)
)
InlineKeyboardButton(text="🔙 Назад", callback_data="back_to_user_editor")
)
await message.reply(
"\n".join(response_messages),
+6
View File
@@ -77,6 +77,12 @@ async def process_callback_pay_cryptobot(
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
)
)
builder.row(
InlineKeyboardButton(
text="💰 Ввести свою сумму", callback_data="enter_custom_amount"
)
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_profile"))
key_count = await get_key_count(tg_id)
+6
View File
@@ -119,6 +119,12 @@ async def process_callback_pay_freekassa(
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
)
)
builder.row(
InlineKeyboardButton(
text="💰 Ввести свою сумму", callback_data="enter_custom_amount"
)
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_profile"))
await bot.delete_message(
chat_id=tg_id, message_id=callback_query.message.message_id
+6
View File
@@ -72,6 +72,12 @@ async def process_callback_pay_stars(
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
)
)
builder.row(
InlineKeyboardButton(
text="💰 Ввести свою сумму", callback_data="enter_custom_amount"
)
)
builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_profile"))
key_count = await get_key_count(tg_id)
+25 -17
View File
@@ -63,24 +63,32 @@ async def process_callback_pay_yookassa(
builder = InlineKeyboardBuilder()
for i in range(0, 4, 2):
builder.row(
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i]["text"],
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
),
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i + 1]["text"],
callback_data=PAYMENT_OPTIONS[i + 1]["callback_data"],
),
)
for i in range(4, len(PAYMENT_OPTIONS)):
builder.row(
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i]["text"],
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
for i in range(0, len(PAYMENT_OPTIONS), 2):
if i + 1 < len(PAYMENT_OPTIONS):
builder.row(
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i]["text"],
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
),
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i + 1]["text"],
callback_data=PAYMENT_OPTIONS[i + 1]["callback_data"],
),
)
else:
builder.row(
InlineKeyboardButton(
text=PAYMENT_OPTIONS[i]["text"],
callback_data=PAYMENT_OPTIONS[i]["callback_data"],
)
)
builder.row(
InlineKeyboardButton(
text="💰 Ввести свою сумму", callback_data="enter_custom_amount"
)
)
builder.row(
InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_profile")
)
key_count = await get_key_count(tg_id)
+3 -8
View File
@@ -1,6 +1,5 @@
import os
import asyncpg
from aiogram import F, Router
from aiogram.filters import Command
from aiogram.types import BufferedInputFile, CallbackQuery, InlineKeyboardButton, Message
@@ -8,7 +7,7 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder
from loguru import logger
from bot import bot
from config import APP_URL, CHANNEL_URL, DATABASE_URL, SUPPORT_CHAT_URL, DOWNLOAD_IOS, DOWNLOAD_ANDROID, CONNECT_ANDROID, CONNECT_IOS
from config import CHANNEL_URL, CONNECT_ANDROID, CONNECT_IOS, DOWNLOAD_ANDROID, DOWNLOAD_IOS, SUPPORT_CHAT_URL
from database import add_connection, add_referral, check_connection_exists, get_trial
from handlers.keys.trial_key import create_trial_key
from handlers.texts import INSTRUCTIONS_TRIAL, WELCOME_TEXT, get_about_vpn
@@ -69,7 +68,7 @@ async def start_command(message: Message):
@router.callback_query(F.data == "connect_vpn")
async def handle_connect_vpn(callback_query: CallbackQuery):
async def handle_connect_vpn(callback_query: CallbackQuery, session):
await callback_query.message.delete()
user_id = callback_query.from_user.id
@@ -78,9 +77,8 @@ async def handle_connect_vpn(callback_query: CallbackQuery):
if "error" in trial_key_info:
await callback_query.message.answer(trial_key_info["error"])
else:
conn = await asyncpg.connect(DATABASE_URL)
try:
result = await conn.execute(
result = await session.execute(
"""
UPDATE connections SET trial = 1 WHERE tg_id = $1
""",
@@ -91,9 +89,6 @@ async def handle_connect_vpn(callback_query: CallbackQuery):
except Exception as e:
logger.error(f"Ошибка при обновлении trial: {e}")
finally:
await conn.close()
key_message = (
f"🔑 <b>Ваш персональный ключ доступа:</b>\n"
f"<pre>{trial_key_info['key']}</pre>\n\n"
+1 -1
View File
@@ -7,7 +7,7 @@ from aiogram.types import TelegramObject
from config import DATABASE_URL
class AdminMiddleware(BaseMiddleware):
class DatabaseMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
+1 -1
View File
@@ -5,7 +5,7 @@ from aiogram.types import CallbackQuery, Message, TelegramObject
from loguru import logger
class UserActivityMiddleware(BaseMiddleware):
class LoggingMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
+54
View File
@@ -0,0 +1,54 @@
from sqlalchemy import Column, BigInteger, Float, Text, Boolean, ForeignKey
from sqlalchemy.orm import declarative_base, relationship
Base = declarative_base()
class Connection(Base):
"""
Модель для таблицы connections
"""
__tablename__ = 'connections'
tg_id = Column(BigInteger, primary_key=True, nullable=False)
balance = Column(Float, nullable=False, default=0.0)
trial = Column(BigInteger, nullable=False, default=0)
# Связь с ключами и рефералами
keys = relationship('Key', back_populates='connection')
referrals_received = relationship('Referral', foreign_keys='Referral.referred_tg_id', back_populates='referred')
referrals_sent = relationship('Referral', foreign_keys='Referral.referrer_tg_id', back_populates='referrer')
class Key(Base):
"""
Модель для таблицы keys
"""
__tablename__ = 'keys'
tg_id = Column(BigInteger, ForeignKey('connections.tg_id'), primary_key=True, nullable=False)
client_id = Column(Text, primary_key=True, nullable=False)
email = Column(Text, nullable=False)
created_at = Column(BigInteger, nullable=False)
expiry_time = Column(BigInteger, nullable=False)
key = Column(Text, nullable=False)
server_id = Column(Text, nullable=False, default='server1')
notified = Column(Boolean, nullable=False, default=False)
notified_24h = Column(Boolean, nullable=False, default=False)
# Связь с подключением
connection = relationship('Connection', back_populates='keys')
class Referral(Base):
"""
Модель для таблицы referrals
"""
__tablename__ = 'referrals'
referred_tg_id = Column(BigInteger, ForeignKey('connections.tg_id'), primary_key=True, nullable=False)
referrer_tg_id = Column(BigInteger, ForeignKey('connections.tg_id'), nullable=False)
reward_issued = Column(Boolean, default=False)
# Связи с подключениями
referred = relationship('Connection', foreign_keys=[referred_tg_id], back_populates='referrals_received')
referrer = relationship('Connection', foreign_keys=[referrer_tg_id], back_populates='referrals_sent')
+2 -1
View File
@@ -27,4 +27,5 @@ yarl==1.15.5
yookassa==3.3.0
loguru
aiocryptopay
py3xui
py3xui
sqlalchemy