feat: implement referral payment system and enhance ticket management

This commit is contained in:
2026-04-18 22:34:15 +07:00
parent 3d19d9189b
commit 78a0ef9750
14 changed files with 165 additions and 31 deletions

View File

@@ -8,6 +8,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from config import settings
from db.models.tickets import TicketStatus
from db.models.users import User
from keyboards.admins import ticket_actions
from misc import utils
from repositories import UserRepository
from repositories.tickets import TicketRepository
@@ -51,9 +52,14 @@ class UserService:
@staticmethod
async def format_admin_support_message(
ticket_number: int, user: TelegramUser, rw_user: RWUserInfo | None, balance: int
ticket_number: int,
user: TelegramUser,
rw_user: RWUserInfo | None,
balance: int,
referal_id: int | None = None,
):
username_display = utils.format_username(user.username)
referal_display = utils.format_referal_id(referal_id)
if rw_user is None:
# Пользователь не найден в Remnawave
@@ -62,6 +68,8 @@ class UserService:
full_name=user.full_name,
username_display=username_display,
telegram_id=user.id,
referal_id=referal_display,
balance=balance,
)
status_icon, status_text = utils.format_status(rw_user.status)
@@ -85,6 +93,7 @@ class UserService:
hwid_limit=hwid_limit,
squads=squads,
remnawave_uuid=rw_user.uuid,
referal_id=referal_display,
)
async def add_user(
@@ -126,7 +135,9 @@ class UserService:
user_id=user.id,
username=user.username,
balance=db_user.balance,
referal_id=db_user.referal_id,
),
reply_markup=ticket_actions,
)
return
except Exception:
@@ -159,7 +170,9 @@ class UserService:
user_id=user.id,
username=user.username,
balance=db_user.balance,
referal_id=db_user.referal_id,
),
reply_markup=ticket_actions,
)
async def support_forward_message(self, session: AsyncSession, msg: Message, rw: RemnawaveSDK):
@@ -205,7 +218,9 @@ class UserService:
user=msg.from_user,
rw_user=rw_user,
balance=user.balance,
referal_id=user.referal_id,
),
reply_markup=ticket_actions,
)
await msg.copy_to(settings.admin_group_id, message_thread_id=thread.message_thread_id)
@@ -230,6 +245,8 @@ class UserService:
async def close_ticket(self, session: AsyncSession, msg: Message):
thread_id = msg.message_thread_id
if not thread_id:
return
ticket = await self.ticket_repository.get_ticket_by_thread_id(session, thread_id=thread_id)
await msg.bot.edit_forum_topic(
@@ -247,9 +264,14 @@ class UserService:
async def update_user_link(
self, session: AsyncSession, user_id: int, rw_sdk: RemnawaveSDK
) -> User | None:
) -> User:
rw_user = await get_user_by_telegram_id(rw_sdk, user_id)
user = await self.user_repository.get_user_by_id(session, user_id)
if not rw_user:
return user
link = utils.get_subscription_link(rw_user.short_uuid)
user = await self.user_repository.update_user_link(session, user_id, link)