Возможность тикеты создавать

This commit is contained in:
Disledg
2025-01-04 21:19:39 +03:00
parent 9c00529216
commit 5997d67640
4 changed files with 121 additions and 29 deletions

View File

@@ -6,7 +6,7 @@ from datetime import datetime
from instences.config import BASE_URL_FASTAPI
import locale
locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8")
from keyboard.keyboards import subhist_keyboard,confirm_popup_keyboard,tarif_confirm_keyboard, popup_keyboard, main_keyboard,faq_keyboard, account_keyboard, buy_keyboard,balance_keyboard,guide_keyboard,tarif_Lark_keyboard,tarif_Lark_pro_keyboard,tranhist_keyboard
from keyboard.keyboards import subhist_keyboard,confirm_popup_keyboard,tarif_confirm_keyboard,ticket_keyboard, popup_keyboard, main_keyboard,faq_keyboard, account_keyboard, buy_keyboard,balance_keyboard,guide_keyboard,tarif_Lark_keyboard,tarif_Lark_pro_keyboard,tranhist_keyboard
logger = logging.getLogger(__name__)
# Инициализируем менеджер базы данных
@@ -40,16 +40,105 @@ async def call_api(method, endpoint, data=None):
return "ERROR"
async def popup_command(message: types.Message):
user_state = {}
async def start_ticket_creation(message: types.Message):
"""
Обработчик команды для отправки popup-сообщения.
Начинает процесс создания тикета.
"""
await message.answer("HAHAHHAHAHAHAHHAHA", reply_markup=popup_keyboard())
await message.answer(
"Введите тему тикета (или нажмите 'Отмена', чтобы выйти):",
reply_markup=ticket_keyboard()
)
user_state[message.from_user.id] = {"step": "subject"}
async def handle_ticket_input(message: types.Message):
"""
Обрабатывает ввод данных для тикета.
"""
user_id = message.from_user.id
text = message.text.lower()
if text == "отмена":
await message.answer("Создание тикета отменено.", reply_markup=types.ReplyKeyboardRemove())
user_state.pop(user_id, None)
return
state = user_state.get(user_id)
if not state:
await message.answer("Нет активного процесса создания тикета. Введите /support для начала.")
return
if state["step"] == "subject":
state["subject"] = message.text
state["step"] = "message"
await message.answer("Введите описание проблемы:")
elif state["step"] == "message":
state["message"] = message.text
await create_ticket(message, state)
user_state.pop(user_id, None)
async def create_ticket(message: types.Message, state):
"""
Отправляет запрос на создание тикета через FastAPI.
"""
user_id = message.from_user.id
subject = state["subject"]
ticket_message = state["message"]
try:
logger.info(f"Создание тикета для пользователя {user_id}: Тема - {subject}, Сообщение - {ticket_message}")
user_data = await call_api("GET", f"/user/{message.from_user.id}")
if not user_data:
await message.edit_text("Вы еще не зарегистрированы.")
await message.answer()
return
# Отправляем запрос через call_api
ticket_data = await call_api(
"POST",
f"/support/tickets?user_id={user_data['id']}", # Передаём user_id как query-параметр
data={"subject": subject, "message": ticket_message}
)
if ticket_data != "ERROR":
await message.answer(
f"✅ Тикет успешно создан!\n"
f"📌 Тема: {ticket_data['subject']}\n"
f"📊 Статус: {ticket_data['status']}\n"
f"📅 Дата создания: {ticket_data['created_at']}"
)
else:
await message.answer("❌ Ошибка создания тикета. Попробуйте позже.")
except Exception as e:
logger.exception(f"Ошибка при создании тикета для пользователя {user_id}: {e}")
await message.answer("❌ Произошла ошибка при создании тикета.")
async def subhist_command(message: types.Message):
"""
Обработчик команды для отправки истории подписок.
"""
user_data = await call_api("GET", f"/user/{message.from_user.id}")
if not user_data:
await message.edit_text("Вы еще не зарегистрированы.")
await message.answer()
return
subscriptions = await call_api("GET", f"/subscriptions/{user_data['id']}")
if not subscriptions:
await message.edit_text("У вас нет активных подписок.", reply_markup=account_keyboard())
await message.answer()
return
result = "Ваши подписки:\n"
for count, sub in enumerate(subscriptions, start=1):
result += f"{count}. Тариф: {sub['plan']}, Истекает: {sub['expiry_date']}\n"
await message.edit_text(result, reply_markup=account_keyboard())
await message.answer()
await message.answer("subhist", reply_markup=subhist_keyboard())
async def start_command(message: types.Message):
@@ -96,7 +185,7 @@ async def profile_callback_handler(callback: types.CallbackQuery):
# Если подписки нет
if not sub_data:
text = f"Профиль {callback.from_user.username}:\n{balance_text}\nПополните баланс и приобретите подписку чтобы получить активный статус (🐣,🦅)"
text = f"Профиль {callback.from_user.username}\n{balance_text}\nПополните баланс и приобретите подписку чтобы получить активный статус (🐣,🦅)"
else:
# Получение даты окончания подписки
expiry_date = sub_data.get("expiry_date")
@@ -191,25 +280,6 @@ async def tranhist_callback_handler(callback: types.CallbackQuery):
await callback.message.edit_text(result, reply_markup=tranhist_keyboard())
await callback.answer()
async def subhist_callback_handler(callback: types.CallbackQuery):
user_data = await call_api("GET", f"/user/{callback.from_user.id}")
if not user_data:
await callback.message.edit_text("Вы еще не зарегистрированы.")
await callback.answer()
return
subscriptions = await call_api("GET", f"/subscription/{user_data['id']}/last")
if not subscriptions:
await callback.message.edit_text("У вас нет активных подписок.", reply_markup=account_keyboard())
await callback.answer()
return
result = "Ваши подписки:\n"
for count, sub in enumerate(subscriptions, start=1):
result += f"{count}. Тариф: {sub['plan']}, Истекает: {sub['expiry_date']}\n"
await callback.message.edit_text(result, reply_markup=account_keyboard())
await callback.answer()
async def buy_subscription_callback_handler(callback: types.CallbackQuery):
"""
Обработчик callback_query с data="buy_subscription".
@@ -336,6 +406,9 @@ def register_handlers(dp: Dispatcher):
dp.callback_query.register(tranhist_callback_handler, lambda c: c.data == "tranhist")
dp.callback_query.register(buy_subscription_callback_handler, lambda c: c.data == "buy_subscription")
dp.message.register(start_command, Command("start"))
dp.message.register(start_command, Command("subscriptions"))
dp.message.register(start_ticket_creation, Command("support"))
dp.message.register(handle_ticket_input) # Для любых сообщений
dp.callback_query.register(balance_callback_handler, lambda c: c.data == "balance")
dp.callback_query.register(guide_callback_handler, lambda c: c.data == "guide")
# dp.callback_query.register(about_tarifs_callback_handler, lambda c: c.data == "about_tarifs")