Возможность тикеты создавать
This commit is contained in:
11
Lark_VPN_Bot.code-workspace
Normal file
11
Lark_VPN_Bot.code-workspace
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "../Bot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ from datetime import datetime
|
|||||||
from instences.config import BASE_URL_FASTAPI
|
from instences.config import BASE_URL_FASTAPI
|
||||||
import locale
|
import locale
|
||||||
locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8")
|
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__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Инициализируем менеджер базы данных
|
# Инициализируем менеджер базы данных
|
||||||
@@ -40,16 +40,105 @@ async def call_api(method, endpoint, data=None):
|
|||||||
return "ERROR"
|
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):
|
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())
|
await message.answer("subhist", reply_markup=subhist_keyboard())
|
||||||
|
|
||||||
async def start_command(message: types.Message):
|
async def start_command(message: types.Message):
|
||||||
@@ -96,7 +185,7 @@ async def profile_callback_handler(callback: types.CallbackQuery):
|
|||||||
|
|
||||||
# Если подписки нет
|
# Если подписки нет
|
||||||
if not sub_data:
|
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:
|
else:
|
||||||
# Получение даты окончания подписки
|
# Получение даты окончания подписки
|
||||||
expiry_date = sub_data.get("expiry_date")
|
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.message.edit_text(result, reply_markup=tranhist_keyboard())
|
||||||
await callback.answer()
|
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):
|
async def buy_subscription_callback_handler(callback: types.CallbackQuery):
|
||||||
"""
|
"""
|
||||||
Обработчик callback_query с data="buy_subscription".
|
Обработчик 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(tranhist_callback_handler, lambda c: c.data == "tranhist")
|
||||||
dp.callback_query.register(buy_subscription_callback_handler, lambda c: c.data == "buy_subscription")
|
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("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(balance_callback_handler, lambda c: c.data == "balance")
|
||||||
dp.callback_query.register(guide_callback_handler, lambda c: c.data == "guide")
|
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")
|
# dp.callback_query.register(about_tarifs_callback_handler, lambda c: c.data == "about_tarifs")
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
|
||||||
from aiogram.types import InlineKeyboardButton
|
from aiogram.types import InlineKeyboardButton, KeyboardButton
|
||||||
|
|
||||||
|
|
||||||
def main_keyboard():
|
def main_keyboard():
|
||||||
@@ -8,7 +8,7 @@ def main_keyboard():
|
|||||||
"""
|
"""
|
||||||
builder = InlineKeyboardBuilder()
|
builder = InlineKeyboardBuilder()
|
||||||
builder.row(InlineKeyboardButton(text="Профиль", callback_data="profile"))
|
builder.row(InlineKeyboardButton(text="Профиль", callback_data="profile"))
|
||||||
builder.row(InlineKeyboardButton(text="FAQ", callback_data="faq"))
|
builder.row(InlineKeyboardButton(text="❔FAQ❔", callback_data="faq"))
|
||||||
builder.row(InlineKeyboardButton(text="О нас", url="https://www.youtube.com/watch?v=Zirn-CKck-c"))
|
builder.row(InlineKeyboardButton(text="О нас", url="https://www.youtube.com/watch?v=Zirn-CKck-c"))
|
||||||
return builder.as_markup()
|
return builder.as_markup()
|
||||||
|
|
||||||
@@ -20,11 +20,17 @@ def account_keyboard():
|
|||||||
builder.row(InlineKeyboardButton(text="Пополнение баланса", callback_data="popup"))
|
builder.row(InlineKeyboardButton(text="Пополнение баланса", callback_data="popup"))
|
||||||
builder.row(InlineKeyboardButton(text="Приобрести подписку", callback_data="buy_subscription"))
|
builder.row(InlineKeyboardButton(text="Приобрести подписку", callback_data="buy_subscription"))
|
||||||
builder.row(InlineKeyboardButton(text="Руководство по подключению", callback_data="guide"))
|
builder.row(InlineKeyboardButton(text="Руководство по подключению", callback_data="guide"))
|
||||||
builder.row(InlineKeyboardButton(text="История транзакций", callback_data="tranhist"))
|
builder.row(InlineKeyboardButton(text="📑История транзакций", callback_data="tranhist"))
|
||||||
builder.row(InlineKeyboardButton(text="Назад", callback_data="base"))
|
builder.row(InlineKeyboardButton(text="Назад", callback_data="base"))
|
||||||
return builder.as_markup()
|
return builder.as_markup()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def ticket_keyboard():
|
||||||
|
builder = ReplyKeyboardBuilder()
|
||||||
|
builder.row(KeyboardButton(text="Отмена"))
|
||||||
|
return builder.as_markup()
|
||||||
|
|
||||||
def buy_keyboard():
|
def buy_keyboard():
|
||||||
"""
|
"""
|
||||||
Приобрести подписку
|
Приобрести подписку
|
||||||
|
|||||||
4
main.py
4
main.py
@@ -22,7 +22,9 @@ dp.message.middleware(AntiSpamMiddleware(rate_limit=1))
|
|||||||
async def set_commands():
|
async def set_commands():
|
||||||
"""Устанавливает команды для бота."""
|
"""Устанавливает команды для бота."""
|
||||||
commands = [
|
commands = [
|
||||||
BotCommand(command="/start", description="Запустить бота"),
|
BotCommand(command="/start", description="🥚Запустить бота"),
|
||||||
|
BotCommand(command="/subscriptions", description="🦴Мои подписки"),
|
||||||
|
BotCommand(command="/support", description="❕Поддержка❕"),
|
||||||
]
|
]
|
||||||
await bot.set_my_commands(commands)
|
await bot.set_my_commands(commands)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user