diff --git a/db.py b/db.py index b61319f..6c6d4d5 100644 --- a/db.py +++ b/db.py @@ -221,6 +221,18 @@ class BotDB: except sqlite3.Error as error: print(error) + def get_users_for_unblock_today(self, date_to_unban): + """Возвращает пользователей у которых истекает срок блокировки сегодня""" + try: + result = self.cursor.execute("SELECT user_id, user_name FROM `blacklist` WHERE date_to_unban = ?", (date_to_unban,)) + fetch_all = result.fetchall() + list_of_users = {} + for i in fetch_all: + list_of_users[i[0]] = i[1] + return list_of_users + except sqlite3.Error as error: + print(error) + def get_blacklist_users_by_filters(self): """Возвращает список пользователей в черном списке по фильтру""" return None diff --git a/main.py b/main.py index 35e6999..a023ec7 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ from pathlib import Path from time import sleep from enum import Enum from typing import Any - +from apscheduler.schedulers.background import BackgroundScheduler import db from db import BotDB import telebot @@ -88,28 +88,39 @@ class TelegramHelperBot: self.bot.send_message(message.chat.id, "Не понимаю где ты находишься. Нажми /state, и я расскажу что ты можешь " "сделать") - if self.state == State.SUGGEST: - self.bot.register_next_step_handler(message, self.resend_message_in_group_for_post) + self.bot.register_next_step_handler(message, self.send_to_suggest) self.state = State.START + if message.text == '/start': + self.state = State.START + self.start_message(message) elif self.state == State.PRE_CHAT: self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message) self.state = State.START + if message.text == '/start': + self.state = State.START + self.start_message(message) if self.state == State.CHAT: if message.text == 'Выйти из чата': self.state = State.START self.end_message(message) + elif message.text == '/start': + self.state = State.START + self.start_message(message) else: self.resend_message_in_group_for_message(message) if self.state == State.ADMIN: - if message == '/admin' or message == '/restart': + if message == '/admin' or message == '/restart' or message == 'Вернуться в админку': access = self.check_access(message.from_user.id) if access: self.admin_panel(message) else: self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!') + if message.text == '/start': + self.state = State.START + self.start_message(message) @self.bot.message_handler(func=lambda message: True, chat_types=['group']) def handle_message(message): @@ -159,26 +170,32 @@ class TelegramHelperBot: if call.data[:3] == 'ban': user_id = call.data[4:] self.ban_user(call.message, user_id) + if call.data == 'return': + self.bot.delete_message(call.message.chat.id, call.message.message_id) + self.admin_panel(call.message) + if call.data[:5] == 'unban': - #TODO: Тут обрабатываем события, ДОПИСАТЬ!!!! - print(f'UNBAN NAXUY , {call.data[6:]}') + self.delete_user_blacklist(call.data[6:]) + msg = f'Успешно удалено.' + self.bot.send_message(chat_id=call.message.chat.id, text=msg) elif call.data[:4] == 'page': if call.message.text == 'Список пользователей которые последними обращались к боту': list_users = BotDB.get_last_users_from_db() - keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(list_users), list_users, 'ban') - self.bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=keyboard) + keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(list_users), list_users, + 'ban') + self.bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, + reply_markup=keyboard) if "Список заблокированных пользователей".lower() in call.message.text.lower(): #Готовим сообщения - message_user = self.get_banned_users_list(int(call.data[5:])*7-7) - self.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=message_user) + message_user = self.get_banned_users_list(int(call.data[5:]) * 7 - 7) + self.bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, + text=message_user) #Готовим клавиатуру buttons = self.get_banned_users_buttons() keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unban') - self.bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=keyboard) - - def register_chat_handler(self, message): - self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message) + self.bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, + reply_markup=keyboard) def start(self): while True: @@ -187,15 +204,29 @@ class TelegramHelperBot: except (ConnectionError, Exception): print(f"Произошла ошибка: {str(Exception)}\n\nTraceback:\n{traceback.format_exc()}") + def unban_notifier(self): + # Получение сегодняшней даты в формате DD-MM-YYYY + current_date = datetime.now() + today = current_date.strftime("%d-%m-%Y") + print(today) + # Получение списка разблокированных пользователей + unblocked_users = BotDB.get_users_for_unblock_today(today) + message = "Разблокированные пользователи:\n" + for user_id, user_name in unblocked_users.items(): + message += f"ID: {user_id}, Имя: {user_name}\n" + + # Отправка сообщения в канал + self.bot.send_message(GROUP_FOR_MESSAGE, message) + # Черный список def admin_panel(self, message): try: markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) item1 = types.KeyboardButton("Бан (Список)") - item2 = types.KeyboardButton("Добавить админа") - item3 = types.KeyboardButton("Удалить админа") + #item2 = types.KeyboardButton("Добавить админа") #TODO: Когда-нибудь потом доделаю + #item3 = types.KeyboardButton("Удалить админа") item4 = types.KeyboardButton("Разбан (список)") - markup.add(item1, item2, item3, item4) + markup.add(item1, item4) self.bot.send_message(message.chat.id, "Добро пожаловать в админку. Выбери что хочешь:", reply_markup=markup) self.bot.register_next_step_handler(message, self.handle_admin_message) @@ -261,17 +292,12 @@ class TelegramHelperBot: self.bot.reply_to(message, f"Пользователь уже был заблокирован ранее.") self.admin_panel(message) else: - result = BotDB.set_user_blacklist(ban_object['user_id'], - ban_object['user_name'], - ban_object['message_for_user'], - ban_object['date_to_unban']) - if result: - self.bot.reply_to(message, f"Пользователь {ban_object['user_name']} успешно заблокирован.") - self.admin_panel(message) - else: - #TODO: тут какой-то баг. Отвечает что ошибка, но ошибок None - self.bot.reply_to(message, f"Произошла ошибка при блокировке пользователя. ERROR: {result}") - self.admin_panel(message) + BotDB.set_user_blacklist(ban_object['user_id'], + ban_object['user_name'], + ban_object['message_for_user'], + ban_object['date_to_unban']) + self.bot.reply_to(message, f"Пользователь {ban_object['user_name']} успешно заблокирован.") + self.admin_panel(message) def get_last_users(self, message): list_users = BotDB.get_last_users_from_db() @@ -282,8 +308,12 @@ class TelegramHelperBot: def get_banned_users(self, message): message_text = self.get_banned_users_list(0) buttons_list = self.get_banned_users_buttons() - k = self.create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unban') - self.bot.send_message(message.chat.id, message_text, reply_markup=k) + if buttons_list: + k = self.create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unban') + self.bot.send_message(message.chat.id, message_text, reply_markup=k) + else: + self.bot.send_message(message.chat.id, "В списке забанненых пользователей никого нет") + self.admin_panel(message) def start_message(self, message): try: @@ -334,9 +364,7 @@ class TelegramHelperBot: date = current_date.strftime("%Y-%m-%d %H:%M:%S") BotDB.add_new_message_in_db(message.text, message.message_id + 1, message.from_user.id, date, 0) question = messages.get_message(self.__get_first_name(message), 'QUESTION') - markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Выйти из чата") - markup.add(item1) + markup = self.get_reply_keyboard(message) self.bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK, reply_markup=markup) @@ -349,9 +377,8 @@ class TelegramHelperBot: suggest_news_2 = messages.get_message(self.__get_first_name(message), 'SUGGEST_NEWS_2') self.bot.send_message(message.chat.id, suggest_news_2, parse_mode='html', reply_markup=markup) except Exception as e: - if LOGS: - self.bot.send_message(IMPORTANT_LOGS, - f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") + self.bot.send_message(IMPORTANT_LOGS, + f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") # logging if LOGS: self.bot.forward_message(chat_id=GROUP_FOR_LOGS, @@ -405,7 +432,7 @@ class TelegramHelperBot: from_chat_id=message.chat.id, message_id=message.message_id) - def resend_message_in_group_for_post(self, message): + def send_to_suggest(self, message): markup = types.InlineKeyboardMarkup(row_width=1) item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish') item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') @@ -530,23 +557,24 @@ class TelegramHelperBot: # Создаем список кнопок buttons = [] # Вычисляем стартовый номер для текущей страницы - start_index = (page - 1) * 7 #тут было +1, убрал, потому что на текстовом массиве выходит за пределы + start_index = (page - 1) * 7 #тут было +1, убрал, потому что на текстовом массиве выходит за пределы # Кнопки с номерами страниц - for i in range(start_index, min(start_index + 7, len(array_items))): #тут было len(array_items) +1, убрал, потому что на текстовом массиве выходит за пределы - buttons.append(types.InlineKeyboardButton(f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}")) - + for i in range(start_index, min(start_index + 7, + len(array_items))): #тут было len(array_items) +1, убрал, потому что на текстовом массиве выходит за пределы + buttons.append( + types.InlineKeyboardButton(f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}")) # Добавляем кнопки "Предыдущая" и "Следующая" if int(page) > 1: - buttons.insert(6, types.InlineKeyboardButton("⬅️ Предыдущая", callback_data=f"page_{page-1}")) + buttons.insert(6, types.InlineKeyboardButton("⬅️ Предыдущая", callback_data=f"page_{page - 1}")) if page < total_pages: - buttons.append(types.InlineKeyboardButton("➡️ Следующая", callback_data=f"page_{page+1}")) - + buttons.append(types.InlineKeyboardButton("➡️ Следующая", callback_data=f"page_{page + 1}")) + #Добавляем кнопку назад + buttons.append(types.InlineKeyboardButton("🏠 Назад", callback_data="return")) # Формируем клавиатуру с 3 кнопками в ряд keyboard = [] for i in range(0, len(buttons), 3): - keyboard.append(buttons[i:i+3]) - + keyboard.append(buttons[i:i + 3]) return types.InlineKeyboardMarkup(keyboard) @staticmethod @@ -589,8 +617,18 @@ class TelegramHelperBot: user_ids.append((user[0], user[1])) return user_ids + @staticmethod + def delete_user_blacklist(user_id): + return BotDB.delete_user_blacklist(user_id=user_id) + + bot = TelegramHelperBot(BOT_TOKEN) if __name__ == "__main__": # Запускаем бота bot.start() + + scheduler = BackgroundScheduler() + scheduler.add_job(bot.unban_notifier(), 'cron', hour=0, minute=0) + scheduler.start() + diff --git a/messages.py b/messages.py index 26c4824..883ae1d 100644 --- a/messages.py +++ b/messages.py @@ -5,10 +5,11 @@ def get_message(username: str, type_message: str): 'HELLO_MESSAGE': "Привет, username!👋🏼&Меня зовут Виби, я бот канала 'Влюбленный Бийск'❤🤖" "&Я был создан для того, чтобы помочь тебе выложить пост в наш канал и если это необходимо, связаться с админами ✍✉" "&Так же я могу выдать тебе набор стикеров, где я буду главным героем🦸‍♂" - "&Дать возможность высказаться в нашем стендап режиме🎤&Послушать о чем говорит наш город🎧" + "&Наш бот голосового общения переехал сюда: https://t.me/podslushano_biysk_bot 🎤&Там можно послушать о чем говорит наш город🎧" "&Предлагай свой пост мне и я обязательно его опубликую😉" "&Для продолжения взаимодействия воспользуйся меню внизу твоего дисплея⬇" - "&&P.S. Иногда я зависаю по неизвестным причинам, если от меня нет ответа, введи в чат команду /start, это перезапустит сценарий." + "&&Если что-то пошло не так: введи в чат команду /start, это перезапустит сценарий сначала." + "&Не жми кнопку несколько раз если я не ответил с первого раза. Возможно ведутся тех.работы и я отвечу позже" "&&Основная группа в ВК: https://vk.com/love_bsk" "&Основной канал в ТГ: https://t.me/love_bsk", 'SUGGEST_NEWS': "username, окей, жду от тебя текст поста🙌🏼" @@ -17,8 +18,8 @@ def get_message(username: str, type_message: str): 'SUGGEST_NEWS_2': "Обрати внимание, что я умный и смогу из твоего текста понять команды указанные ниже😉" "&Если хочешь чтобы пост был опубликован анонимно, напиши в любом месте своего поста слово 'анон'." "&Если хочешь опубликовать пост не анонимно, то напиши 'не анон', 'неанон' или не пиши ничего." - "&&Я обучен только на команды, указанные мной выше👆" - "&‼Проверь, чтобы указание авторства было выполнено так как я попросил." + "&&❗️❗️❗️Я обучен только на команды, указанные мной выше❗️❗️❗️👆" + "&‼Проверь, чтобы указание авторства было выполнено так как я попросил, иначе пост будет выложен не корректно" "&Пост будет опубликован только в группе ТГ📩", "CONNECT_WITH_ADMIN": "username, напиши свое обращение или предложение✍️" "&Мы рассмотрим и ответим тебе в ближайшее время☺️❤️", diff --git a/requirements.txt b/requirements.txt index 0ec9818..682a9e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -pyTelegramBotAPI \ No newline at end of file +pyTelegramBotAPI +APScheduler~=3.10.4 \ No newline at end of file