diff --git a/database/db.py b/database/db.py index 5924137..8378e75 100644 --- a/database/db.py +++ b/database/db.py @@ -239,6 +239,68 @@ class BotDB: finally: self.close() + def get_user_id_by_username(self, username: str): + """ + Возвращает user_id пользователя из базы данных по его user_name в Telegram. + + Args: + username (str): Username пользователя. + + Returns: + user_id (int): Идентификатор пользователя в Telegram. + None: Если пользователь не найден. + + Raises: + sqlite3.Error: Если произошла ошибка при выполнении запроса. + """ + try: + self.connect() + self.cursor.execute("SELECT user_id FROM our_users WHERE username = ?", (username,)) + result = self.cursor.fetchone() + if result: + user_id = result[0] + self.logger.info(f"User_id пользователя найден: username={username}, user_id={user_id}") + return user_id + else: + self.logger.info(f"Пользователь с username={username} не найден в базе данных.") + return None + except sqlite3.Error as error: + self.logger.error(f"Ошибка при получении username из базы данных: {error}") + raise + finally: + self.close() + + def get_full_name_by_id(self, user_id: str): + """ + Возвращает full_name пользователя из базы данных по его username в Telegram. + + Args: + user_id (int): Идентификатор пользователя в Telegram. + + Returns: + full_name (str): Username пользователя. + None: Если пользователь не найден. + + Raises: + sqlite3.Error: Если произошла ошибка при выполнении запроса. + """ + try: + self.connect() + self.cursor.execute("SELECT full_name FROM our_users WHERE user_id = ?", (user_id,)) + result = self.cursor.fetchone() + if result: + full_name = result[0] + self.logger.info(f"Username пользователя найден: user_id={user_id}, full_name={full_name}") + return full_name + else: + self.logger.info(f"Пользователь с user_id={user_id} не найден в базе данных.") + return None + except sqlite3.Error as error: + self.logger.error(f"Ошибка при получении username из базы данных: {error}") + raise + finally: + self.close() + def get_all_user_id(self): """ Возвращает список всех user_id из базы данных. diff --git a/helper_bot/handlers/admin/admin_handlers.py b/helper_bot/handlers/admin/admin_handlers.py index e83e545..3f64ed7 100644 --- a/helper_bot/handlers/admin/admin_handlers.py +++ b/helper_bot/handlers/admin/admin_handlers.py @@ -6,7 +6,7 @@ from aiogram.fsm.context import FSMContext from helper_bot.filters.main import ChatTypeFilter from helper_bot.keyboards.keyboards import get_reply_keyboard_admin, create_keyboard_with_pagination, \ - create_keyboard_for_ban_days, create_keyboard_for_approve_ban + create_keyboard_for_ban_days, create_keyboard_for_approve_ban, create_keyboard_for_ban_reason from helper_bot.utils.base_dependency_factory import BaseDependencyFactory from helper_bot.utils.helper_func import check_access, add_days_to_date, get_banned_users_buttons, get_banned_users_list from logs.custom_logger import logger @@ -60,6 +60,48 @@ async def get_last_users(message: types.Message): reply_markup=keyboard) +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + StateFilter("ADMIN"), + F.text == 'Бан по нику' +) +async def ban_by_nickname(message: types.Message, state: FSMContext): + await message.answer('Пришли мне username блокируемого пользователя') + await state.set_state('PRE_BAN') + + +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + F.text == 'Отменить' +) +async def decline_ban(message: types.Message, state: FSMContext): + await state.set_data({}) + await state.set_state("ADMIN") + logger.info(f"Отмена процедуры блокировки") + markup = get_reply_keyboard_admin() + await message.answer('Вернулись в меню', reply_markup=markup) + + +@admin_router.message( + ChatTypeFilter(chat_type=["private"]), + StateFilter("PRE_BAN") +) +async def ban_by_nickname_step_2(message: types.Message, state: FSMContext): + logger.info( + f"Функция ban_by_nickname_2. Получен никнейм пользователя: {message.text}") + user_name = message.text + user_id = BotDB.get_user_id_by_username(user_name) + await state.update_data(user_id=user_id, user_name=user_name, message_for_user=None, + date_to_unban=None) + full_name = BotDB.get_full_name_by_id(user_id) + markup = create_keyboard_for_ban_reason() + await message.answer( + text=f"Выбран пользователь:\nid: {user_id}\nusername: {user_name}\n" + f"Имя:{full_name}\nВыбери причину бана из списка или напиши ее в чат", + reply_markup=markup) + await state.set_state('BAN_2') + + @admin_router.message( ChatTypeFilter(chat_type=["private"]), StateFilter("ADMIN"), @@ -114,24 +156,24 @@ async def ban_user_step_3(message: types.Message, state: FSMContext): @admin_router.message( ChatTypeFilter(chat_type=["private"]), - StateFilter("BAN_FINAL") + StateFilter("BAN_FINAL"), + F.text == 'Подтвердить' ) async def approve_ban(message: types.Message, state: FSMContext): user_data = await state.get_data() logger.info(f"Переход на финальный шаг бана пользователя. Словарь с данными для бана: {user_data})") - if message.text == 'Подтвердить': - exists = BotDB.check_user_in_blacklist(user_data['user_id']) - if exists: - await message.reply(f"Пользователь уже был заблокирован ранее.") - logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)") - await state.set_state('ADMIN') - else: - BotDB.set_user_blacklist(user_data['user_id'], - user_data['user_name'], - user_data['message_for_user'], - user_data['date_to_unban']) - await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.") - logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)") - await state.set_state('ADMIN') + exists = BotDB.check_user_in_blacklist(user_data['user_id']) + if exists: + await message.reply(f"Пользователь уже был заблокирован ранее.") + logger.info(f"Пользователь: {user_data['user_id']} был заблокирован ранее)") + await state.set_state('ADMIN') + else: + BotDB.set_user_blacklist(user_data['user_id'], + user_data['user_name'], + user_data['message_for_user'], + user_data['date_to_unban']) + await message.reply(f"Пользователь {user_data['user_name']} успешно заблокирован.") + logger.info(f"Пользователь: {user_data['user_id']} успешно заблокирован)") + await state.set_state('ADMIN') markup = get_reply_keyboard_admin() await message.answer('Вернулись в меню', reply_markup=markup) diff --git a/helper_bot/handlers/private/private_handlers.py b/helper_bot/handlers/private/private_handlers.py index fd70cad..43bc111 100644 --- a/helper_bot/handlers/private/private_handlers.py +++ b/helper_bot/handlers/private/private_handlers.py @@ -104,6 +104,10 @@ async def handle_start_message(message: types.Message, state: FSMContext): ) async def suggest_post(message: types.Message, state: FSMContext): try: + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) await message.forward(chat_id=GROUP_FOR_LOGS) await state.set_state("SUGGEST") current_state = await state.get_state() @@ -130,6 +134,10 @@ async def suggest_post(message: types.Message, state: FSMContext): ) async def end_message(message: types.Message, state: FSMContext): try: + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) await message.forward(chat_id=GROUP_FOR_LOGS) logger.info( f"Вызов функции end_message. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") @@ -355,6 +363,10 @@ async def stickers(message: types.Message, state: FSMContext): async def connect_with_admin(message: types.Message, state: FSMContext): logger.info( f"Вызов функции connect_with_admin. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}") + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) admin_message = messages.get_message(get_first_name(message), 'CONNECT_WITH_ADMIN') await message.answer(admin_message, parse_mode="html") await message.forward(chat_id=GROUP_FOR_LOGS) @@ -370,6 +382,10 @@ async def connect_with_admin(message: types.Message, state: FSMContext): ChatTypeFilter(chat_type=["private"]), ) async def resend_message_in_group_for_message(message: types.Message, state: FSMContext): + user_id = message.from_user.id + current_date = datetime.now() + date = current_date.strftime("%Y-%m-%d %H:%M:%S") + BotDB.update_date_for_user(date, user_id) logger.info( f"Попытка пересылки сообщения в связь с админами. Сообщение: {message.text} Имя автора сообщения: {message.from_user.full_name} Идентификатор сообщения: {message.message_id})") await message.forward(chat_id=GROUP_FOR_MESSAGE) diff --git a/helper_bot/keyboards/keyboards.py b/helper_bot/keyboards/keyboards.py index d2318eb..42a19a2 100644 --- a/helper_bot/keyboards/keyboards.py +++ b/helper_bot/keyboards/keyboards.py @@ -35,6 +35,7 @@ def get_reply_keyboard_leave_chat(): def get_reply_keyboard_admin(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Бан (Список)")) + builder.add(types.KeyboardButton(text="Бан по нику")) builder.add(types.KeyboardButton(text="Разбан (список)")) builder.add(types.KeyboardButton(text="Вернуться в бота")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) @@ -88,6 +89,9 @@ def create_keyboard_for_ban_reason(): builder = ReplyKeyboardBuilder() builder.add(types.KeyboardButton(text="Спам")) builder.add(types.KeyboardButton(text="Заебал стикерами")) + builder.row(types.KeyboardButton(text="Реклама здесь: @kerrad1 ")) + builder.row(types.KeyboardButton(text="Тема с лагерями: https://vk.com/topic-75343895_50049913")) + builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup @@ -97,7 +101,8 @@ def create_keyboard_for_ban_days(): builder.add(types.KeyboardButton(text="1")) builder.add(types.KeyboardButton(text="7")) builder.add(types.KeyboardButton(text="30")) - builder.add(types.KeyboardButton(text="Навсегда")) + builder.row(types.KeyboardButton(text="Навсегда")) + builder.row(types.KeyboardButton(text="Отменить")) markup = builder.as_markup(resize_keyboard=True, one_time_keyboard=True) return markup diff --git a/helper_bot/utils/state.py b/helper_bot/utils/state.py index 6d4e320..92f1fda 100644 --- a/helper_bot/utils/state.py +++ b/helper_bot/utils/state.py @@ -7,6 +7,7 @@ class StateUser(StatesGroup): ADMIN = State() CHAT = State() PRE_CHAT = State() + PRE_BAN = State() BAN_2 = State() BAN_3 = State() BAN_4 = State()