tgadmin/bot/handlers/user.py

172 lines
7.1 KiB
Python
Raw Normal View History

2024-07-25 12:19:15 +00:00
import base64
from io import BytesIO
from pathlib import Path
from config import Bot, F, Router, FSInputFile, types, FSMContext, State, bot, CallbackData, FSInputFile, settings
from markups.markup import *
from filters import filtersbot
from sql_function import databasework
from states.states import RequestState
from datetime import timedelta
import datetime
from aiogram.types import Chat
from db.models import UserTg
from config import current_directory
# Создайте объект Path из текущего пути
current_path = Path(current_directory)
# Перейдите на одну папку назад
parent_directory = current_path.parent
# Добавьте 'uploads' к родительскому пути
UPLOAD_DIRECTORY = parent_directory / "webadmin/uploads"
router = Router()
router.message.filter(filtersbot.AdminCheck()) # привязываем фильтр к роутеру
router.callback_query.filter(filtersbot.AdminCheck()) # привязываем фильтр к роутеру
# ========= Старт ======== #
@router.message(F.text == '/start', F.chat.type == 'private')
async def start(message: types.Message, state: FSMContext, bot_user: UserTg):
await state.clear()
markup = start_markup()
await message.answer(f'⭐️ Добро пожаловать в бота, используйте кнопки ниже', reply_markup=markup)
# ======= Возвраты назад ===== #
@router.callback_query(filtersbot.BackToQuestions.filter(F.action == 'back'))
async def questions_page_handler(callback: types.CallbackQuery, callback_data: filtersbot.BackToQuestions) -> None:
await bot.delete_message(chat_id=callback.message.chat.id, message_id=callback.message.message_id)
texts, markup = await questions_markup(callback_data.id_otdel)
text_ = '\n'.join(texts)
await bot.send_message(text=f'⭐️ Выберите нужный вам вопрос\n\n{text_}', chat_id=callback.message.chat.id, reply_markup=markup)
@router.callback_query(F.data == 'back_to_otdels')
async def back_to_otdels(callback: types.CallbackQuery, state: FSMContext):
await state.clear()
markup = await otdels_markup()
await bot.edit_message_text(message_id=callback.message.message_id, chat_id=callback.message.chat.id, text='⭐️ Добро пожаловать в бота, используйте кнопки ниже', reply_markup=markup)
# ========= Пагинация ======== #
@router.callback_query(filtersbot.PageCallback.filter(F.action == 'otdel'))
async def otdels_page_handler(callback: types.CallbackQuery, callback_data: filtersbot.PageCallback) -> None:
await callback.message.edit_reply_markup(
reply_markup=await otdels_markup(callback_data.page),
)
await callback.answer()
@router.callback_query(filtersbot.PageCallbackQuestions.filter(F.action == 'question'))
async def questions_page_handler(callback: types.CallbackQuery, callback_data: filtersbot.PageCallbackQuestions) -> None:
texts, markup = await questions_markup(callback_data.otdel_id, callback_data.page)
text_ = '\n'.join(texts)
await callback.message.edit_text(
text=f'⭐️ Выберите нужный вам вопрос\n\n{text_}',
reply_markup=markup,
)
await callback.answer()
# ========= Меню ======== #
@router.callback_query(F.data == 'main_menu')
async def go_main(callback: types.CallbackQuery, state: FSMContext):
await state.clear()
markup = start_markup()
await bot.edit_message_text(message_id=callback.message.message_id, chat_id=callback.message.chat.id, text='⭐️ Добро пожаловать в бота, используйте кнопки ниже', reply_markup=markup)
# ============ Отделы ========== #
@router.callback_query(F.data.in_(['pizza', 'ebi']))
async def otdels(callback: types.CallbackQuery, state: FSMContext):
markup = await otdels_markup()
await bot.edit_message_text(text=f'⭐️ Выберите нужный вам отдел', chat_id=callback.message.chat.id, message_id=callback.message.message_id, reply_markup=markup)
# ============ Вопросы ========== #
@router.callback_query(filtersbot.OtdelsMarkup.filter(F.action == 'open'))
async def questions(callback: types.CallbackQuery, callback_data: filtersbot.OtdelsMarkup) -> None:
texts, markup = await questions_markup(callback_data.id_otdel)
text_ = '\n'.join(texts)
await bot.edit_message_text(text=f'⭐️ Выберите нужный вам вопрос\n\n{text_}', chat_id=callback.message.chat.id, message_id=callback.message.message_id, reply_markup=markup)
# ============ Ответ на вопрос ========== #
2024-08-05 10:05:04 +00:00
MAX_MESSAGE_LENGTH = 4095
def split_text(text, max_length):
# Split the text into parts not exceeding max_length
parts = []
while len(text) > max_length:
# Find the last space character within the max_length limit to avoid splitting words
split_pos = text.rfind(' ', 0, max_length)
if split_pos == -1:
split_pos = max_length # In case there's no space, split at max_length
parts.append(text[:split_pos])
text = text[split_pos:].strip()
parts.append(text)
return parts
2024-07-25 12:19:15 +00:00
@router.callback_query(filtersbot.QuestionsMarkup.filter(F.action == 'open_ques'))
async def question(callback: types.CallbackQuery, callback_data: filtersbot.QuestionsMarkup) -> None:
id_question = callback_data.id_question
question = await databasework.get_question(id_question)
answer = question[2]
filename = question[4]
markup = back_to_questions(callback_data.id_otdel)
if filename:
await bot.delete_message(chat_id=callback.message.chat.id, message_id=callback.message.message_id)
file = FSInputFile(path=f"{UPLOAD_DIRECTORY}/{filename}")
2024-08-05 10:05:04 +00:00
if filename.split('.')[-1] in ['jpg', 'png']:
await bot.send_photo(caption=answer[:MAX_MESSAGE_LENGTH], chat_id=callback.message.chat.id, photo=file, reply_markup=markup)
remaining_text = answer[MAX_MESSAGE_LENGTH:]
elif filename.split('.')[-1] == 'mp4':
await bot.send_video(caption=answer[:MAX_MESSAGE_LENGTH], chat_id=callback.message.chat.id, video=file, reply_markup=markup)
remaining_text = answer[MAX_MESSAGE_LENGTH:]
else:
await bot.send_document(caption=answer[:MAX_MESSAGE_LENGTH], chat_id=callback.message.chat.id, document=file, reply_markup=markup)
remaining_text = answer[MAX_MESSAGE_LENGTH:]
2024-07-25 12:19:15 +00:00
2024-08-05 10:05:04 +00:00
# Send remaining text if any
if remaining_text:
parts = split_text(remaining_text, MAX_MESSAGE_LENGTH)
for part in parts:
await bot.send_message(chat_id=callback.message.chat.id, text=part, reply_markup=markup)
2024-07-25 12:19:15 +00:00
else:
2024-08-05 10:05:04 +00:00
parts = split_text(answer, MAX_MESSAGE_LENGTH)
await bot.edit_message_text(text=parts[0], chat_id=callback.message.chat.id, message_id=callback.message.message_id, reply_markup=markup)
for part in parts[1:]:
await bot.send_message(chat_id=callback.message.chat.id, text=part, reply_markup=markup)
2024-07-25 12:19:15 +00:00
user = router