Enhance bot functionality and refactor database interactions
- Added `ca-certificates` installation to Dockerfile for improved network security. - Updated health check command in Dockerfile to include better timeout handling. - Refactored `run_helper.py` to implement proper signal handling and logging during shutdown. - Transitioned database operations to an asynchronous model in `async_db.py`, improving performance and responsiveness. - Updated database schema to support new foreign key relationships and optimized indexing for better query performance. - Enhanced various bot handlers to utilize async database methods, improving overall efficiency and user experience. - Removed obsolete database and fix scripts to streamline the project structure.
This commit is contained in:
@@ -1,22 +1,15 @@
|
||||
import html
|
||||
import traceback
|
||||
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
from aiogram import Router, F
|
||||
from aiogram.types import CallbackQuery
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.filters import MagicData
|
||||
|
||||
from helper_bot.handlers.voice.constants import CALLBACK_SAVE, CALLBACK_DELETE
|
||||
from helper_bot.handlers.voice.services import AudioFileService
|
||||
from logs.custom_logger import logger
|
||||
|
||||
from aiogram import Router
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import CallbackQuery
|
||||
from aiogram import F
|
||||
from aiogram.filters import MagicData
|
||||
|
||||
from helper_bot.keyboards.keyboards import create_keyboard_with_pagination, get_reply_keyboard_admin, \
|
||||
create_keyboard_for_ban_reason
|
||||
from helper_bot.utils.helper_func import get_banned_users_list, get_banned_users_buttons
|
||||
@@ -96,7 +89,7 @@ async def decline_post_for_group(
|
||||
|
||||
|
||||
@callback_router.callback_query(F.data == CALLBACK_BAN)
|
||||
async def ban_user_from_post(call: CallbackQuery):
|
||||
async def ban_user_from_post(call: CallbackQuery, **kwargs):
|
||||
ban_service = get_ban_service()
|
||||
# TODO: переделать на MagicData
|
||||
try:
|
||||
@@ -116,21 +109,29 @@ async def ban_user_from_post(call: CallbackQuery):
|
||||
|
||||
|
||||
@callback_router.callback_query(F.data.contains(CALLBACK_BAN))
|
||||
async def process_ban_user(call: CallbackQuery, state: FSMContext):
|
||||
async def process_ban_user(call: CallbackQuery, state: FSMContext, **kwargs):
|
||||
ban_service = get_ban_service()
|
||||
# TODO: переделать на MagicData
|
||||
user_id = call.data[4:]
|
||||
logger.info(f"Вызов функции process_ban_user. Данные callback: {call.data} пользователь: {user_id}")
|
||||
|
||||
# Проверяем, что user_id является валидным числом
|
||||
try:
|
||||
user_name = await ban_service.ban_user(user_id, "")
|
||||
await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, date_to_unban=None)
|
||||
user_id_int = int(user_id)
|
||||
except ValueError:
|
||||
logger.error(f"Некорректный user_id в callback: {user_id}")
|
||||
await call.answer(text="Ошибка: некорректный ID пользователя", show_alert=True, cache_time=3)
|
||||
return
|
||||
|
||||
try:
|
||||
user_name = await ban_service.ban_user(str(user_id_int), "")
|
||||
await state.update_data(user_id=user_id_int, user_name=user_name, message_for_user=None, date_to_unban=None)
|
||||
markup = create_keyboard_for_ban_reason()
|
||||
|
||||
user_name_escaped = html.escape(str(user_name))
|
||||
full_name_escaped = html.escape(str(call.message.from_user.full_name))
|
||||
await call.message.answer(
|
||||
text=f"<b>Выбран пользователь:\nid:</b> {user_id}\n<b>username:</b> {user_name_escaped}\nИмя:{full_name_escaped}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
text=f"<b>Выбран пользователь:\nid:</b> {user_id_int}\n<b>username:</b> {user_name_escaped}\nИмя:{full_name_escaped}\nВыбери причину бана из списка или напиши ее в чат",
|
||||
reply_markup=markup
|
||||
)
|
||||
await state.set_state('BAN_2')
|
||||
@@ -141,13 +142,21 @@ async def process_ban_user(call: CallbackQuery, state: FSMContext):
|
||||
|
||||
|
||||
@callback_router.callback_query(F.data.contains(CALLBACK_UNLOCK))
|
||||
async def process_unlock_user(call: CallbackQuery):
|
||||
async def process_unlock_user(call: CallbackQuery, **kwargs):
|
||||
ban_service = get_ban_service()
|
||||
# TODO: переделать на MagicData
|
||||
user_id = call.data[7:]
|
||||
|
||||
# Проверяем, что user_id является валидным числом
|
||||
try:
|
||||
username = await ban_service.unlock_user(user_id)
|
||||
user_id_int = int(user_id)
|
||||
except ValueError:
|
||||
logger.error(f"Некорректный user_id в callback: {user_id}")
|
||||
await call.answer(text="Ошибка: некорректный ID пользователя", show_alert=True, cache_time=3)
|
||||
return
|
||||
|
||||
try:
|
||||
username = await ban_service.unlock_user(str(user_id_int))
|
||||
await call.answer(f'{MESSAGE_USER_UNLOCKED} {username}', show_alert=True)
|
||||
except UserNotFoundError:
|
||||
await call.answer(text='Пользователь не найден в базе', show_alert=True, cache_time=3)
|
||||
@@ -157,7 +166,7 @@ async def process_unlock_user(call: CallbackQuery):
|
||||
|
||||
|
||||
@callback_router.callback_query(F.data == CALLBACK_RETURN)
|
||||
async def return_to_main_menu(call: CallbackQuery):
|
||||
async def return_to_main_menu(call: CallbackQuery, **kwargs):
|
||||
await call.message.delete()
|
||||
logger.info(f"Запуск админ панели для пользователя: {call.message.from_user.id}")
|
||||
markup = get_reply_keyboard_admin()
|
||||
@@ -167,14 +176,21 @@ async def return_to_main_menu(call: CallbackQuery):
|
||||
@callback_router.callback_query(F.data.contains(CALLBACK_PAGE))
|
||||
async def change_page(
|
||||
call: CallbackQuery,
|
||||
bot_db: MagicData("bot_db")
|
||||
bot_db: MagicData("bot_db"),
|
||||
**kwargs
|
||||
):
|
||||
page_number = int(call.data[5:])
|
||||
try:
|
||||
page_number = int(call.data[5:])
|
||||
except ValueError:
|
||||
logger.error(f"Некорректный номер страницы в callback: {call.data}")
|
||||
await call.answer(text="Ошибка: некорректный номер страницы", show_alert=True, cache_time=3)
|
||||
return
|
||||
|
||||
logger.info(f"Переход на страницу {page_number}")
|
||||
|
||||
if call.message.text == 'Список пользователей которые последними обращались к боту':
|
||||
list_users = bot_db.get_last_users_from_db()
|
||||
keyboard = create_keyboard_with_pagination(int(page_number), len(list_users), list_users, 'ban')
|
||||
list_users = await bot_db.get_last_users(30)
|
||||
keyboard = create_keyboard_with_pagination(page_number, len(list_users), list_users, 'ban')
|
||||
await call.bot.edit_message_reply_markup(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.message_id,
|
||||
@@ -189,7 +205,7 @@ async def change_page(
|
||||
)
|
||||
|
||||
buttons = get_banned_users_buttons(bot_db)
|
||||
keyboard = create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unlock')
|
||||
keyboard = create_keyboard_with_pagination(page_number, len(buttons), buttons, 'unlock')
|
||||
await call.bot.edit_message_reply_markup(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.message_id,
|
||||
@@ -201,27 +217,31 @@ async def change_page(
|
||||
async def save_voice_message(
|
||||
call: CallbackQuery,
|
||||
bot_db: MagicData("bot_db"),
|
||||
settings: MagicData("settings")
|
||||
settings: MagicData("settings"),
|
||||
**kwargs
|
||||
):
|
||||
try:
|
||||
# Создаем сервис для работы с аудио файлами
|
||||
audio_service = AudioFileService(bot_db)
|
||||
|
||||
# Получаем ID пользователя из базы
|
||||
user_id = bot_db.get_user_id_by_message_id_for_voice_bot(call.message.message_id)
|
||||
user_id = await bot_db.get_user_id_by_message_id_for_voice_bot(call.message.message_id)
|
||||
|
||||
# Генерируем имя файла
|
||||
file_name = audio_service.generate_file_name(user_id)
|
||||
file_name = await audio_service.generate_file_name(user_id)
|
||||
|
||||
# Собираем инфо о сообщении
|
||||
time_UTC = int(time.time())
|
||||
date_added = datetime.fromtimestamp(time_UTC)
|
||||
|
||||
# Получаем file_id из voice сообщения
|
||||
file_id = call.message.voice.file_id if call.message.voice else ""
|
||||
|
||||
# Сохраняем в базу данных
|
||||
audio_service.save_audio_file(file_name, user_id, date_added)
|
||||
await audio_service.save_audio_file(file_name, user_id, date_added, file_id)
|
||||
|
||||
# Скачиваем и сохраняем файл
|
||||
await audio_service.download_and_save_audio(call.bot, call.message.message_id, file_name)
|
||||
await audio_service.download_and_save_audio(call.bot, call.message, file_name)
|
||||
|
||||
# Удаляем сообщение из предложки
|
||||
await call.bot.delete_message(
|
||||
@@ -240,7 +260,8 @@ async def save_voice_message(
|
||||
async def delete_voice_message(
|
||||
call: CallbackQuery,
|
||||
bot_db: MagicData("bot_db"),
|
||||
settings: MagicData("settings")
|
||||
settings: MagicData("settings"),
|
||||
**kwargs
|
||||
):
|
||||
try:
|
||||
# Удаляем сообщение из предложки
|
||||
|
||||
Reference in New Issue
Block a user