Добавил новые функции #1

Merged
KerradKerridi merged 10 commits from dev into master 2024-07-06 10:07:34 +00:00
4 changed files with 103 additions and 51 deletions
Showing only changes of commit 2944bf2ae8 - Show all commits

12
db.py
View File

@@ -221,6 +221,18 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(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): def get_blacklist_users_by_filters(self):
"""Возвращает список пользователей в черном списке по фильтру""" """Возвращает список пользователей в черном списке по фильтру"""
return None return None

130
main.py
View File

@@ -5,7 +5,7 @@ from pathlib import Path
from time import sleep from time import sleep
from enum import Enum from enum import Enum
from typing import Any from typing import Any
from apscheduler.schedulers.background import BackgroundScheduler
import db import db
from db import BotDB from db import BotDB
import telebot import telebot
@@ -88,28 +88,39 @@ class TelegramHelperBot:
self.bot.send_message(message.chat.id, self.bot.send_message(message.chat.id,
"Не понимаю где ты находишься. Нажми /state, и я расскажу что ты можешь " "Не понимаю где ты находишься. Нажми /state, и я расскажу что ты можешь "
"сделать") "сделать")
if self.state == State.SUGGEST: 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 self.state = State.START
if message.text == '/start':
self.state = State.START
self.start_message(message)
elif self.state == State.PRE_CHAT: elif self.state == State.PRE_CHAT:
self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message) self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message)
self.state = State.START self.state = State.START
if message.text == '/start':
self.state = State.START
self.start_message(message)
if self.state == State.CHAT: if self.state == State.CHAT:
if message.text == 'Выйти из чата': if message.text == 'Выйти из чата':
self.state = State.START self.state = State.START
self.end_message(message) self.end_message(message)
elif message.text == '/start':
self.state = State.START
self.start_message(message)
else: else:
self.resend_message_in_group_for_message(message) self.resend_message_in_group_for_message(message)
if self.state == State.ADMIN: 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) access = self.check_access(message.from_user.id)
if access: if access:
self.admin_panel(message) self.admin_panel(message)
else: else:
self.bot.send_message(message.chat.id, 'Доступ запрещен, досвидания!') 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']) @self.bot.message_handler(func=lambda message: True, chat_types=['group'])
def handle_message(message): def handle_message(message):
@@ -159,26 +170,32 @@ class TelegramHelperBot:
if call.data[:3] == 'ban': if call.data[:3] == 'ban':
user_id = call.data[4:] user_id = call.data[4:]
self.ban_user(call.message, user_id) 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': if call.data[:5] == 'unban':
#TODO: Тут обрабатываем события, ДОПИСАТЬ!!!! self.delete_user_blacklist(call.data[6:])
print(f'UNBAN NAXUY , {call.data[6:]}') msg = f'Успешно удалено.'
self.bot.send_message(chat_id=call.message.chat.id, text=msg)
elif call.data[:4] == 'page': elif call.data[:4] == 'page':
if call.message.text == 'Список пользователей которые последними обращались к боту': if call.message.text == 'Список пользователей которые последними обращались к боту':
list_users = BotDB.get_last_users_from_db() list_users = BotDB.get_last_users_from_db()
keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(list_users), list_users, 'ban') keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(list_users), list_users,
self.bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=keyboard) '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(): if "Список заблокированных пользователей".lower() in call.message.text.lower():
#Готовим сообщения #Готовим сообщения
message_user = self.get_banned_users_list(int(call.data[5:])*7-7) 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) 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() buttons = self.get_banned_users_buttons()
keyboard = self.create_keyboard_with_pagination(int(call.data[5:]), len(buttons), buttons, 'unban') 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) 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)
def start(self): def start(self):
while True: while True:
@@ -187,15 +204,29 @@ class TelegramHelperBot:
except (ConnectionError, Exception): except (ConnectionError, Exception):
print(f"Произошла ошибка: {str(Exception)}\n\nTraceback:\n{traceback.format_exc()}") 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): def admin_panel(self, message):
try: try:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("Бан (Список)") item1 = types.KeyboardButton("Бан (Список)")
item2 = types.KeyboardButton("Добавить админа") #item2 = types.KeyboardButton("Добавить админа") #TODO: Когда-нибудь потом доделаю
item3 = types.KeyboardButton("Удалить админа") #item3 = types.KeyboardButton("Удалить админа")
item4 = types.KeyboardButton("Разбан (список)") item4 = types.KeyboardButton("Разбан (список)")
markup.add(item1, item2, item3, item4) markup.add(item1, item4)
self.bot.send_message(message.chat.id, "Добро пожаловать в админку. Выбери что хочешь:", self.bot.send_message(message.chat.id, "Добро пожаловать в админку. Выбери что хочешь:",
reply_markup=markup) reply_markup=markup)
self.bot.register_next_step_handler(message, self.handle_admin_message) self.bot.register_next_step_handler(message, self.handle_admin_message)
@@ -261,17 +292,12 @@ class TelegramHelperBot:
self.bot.reply_to(message, f"Пользователь уже был заблокирован ранее.") self.bot.reply_to(message, f"Пользователь уже был заблокирован ранее.")
self.admin_panel(message) self.admin_panel(message)
else: else:
result = BotDB.set_user_blacklist(ban_object['user_id'], BotDB.set_user_blacklist(ban_object['user_id'],
ban_object['user_name'], ban_object['user_name'],
ban_object['message_for_user'], ban_object['message_for_user'],
ban_object['date_to_unban']) ban_object['date_to_unban'])
if result: self.bot.reply_to(message, f"Пользователь {ban_object['user_name']} успешно заблокирован.")
self.bot.reply_to(message, f"Пользователь {ban_object['user_name']} успешно заблокирован.") self.admin_panel(message)
self.admin_panel(message)
else:
#TODO: тут какой-то баг. Отвечает что ошибка, но ошибок None
self.bot.reply_to(message, f"Произошла ошибка при блокировке пользователя. ERROR: {result}")
self.admin_panel(message)
def get_last_users(self, message): def get_last_users(self, message):
list_users = BotDB.get_last_users_from_db() list_users = BotDB.get_last_users_from_db()
@@ -282,8 +308,12 @@ class TelegramHelperBot:
def get_banned_users(self, message): def get_banned_users(self, message):
message_text = self.get_banned_users_list(0) message_text = self.get_banned_users_list(0)
buttons_list = self.get_banned_users_buttons() buttons_list = self.get_banned_users_buttons()
k = self.create_keyboard_with_pagination(1, len(buttons_list), buttons_list, 'unban') if buttons_list:
self.bot.send_message(message.chat.id, message_text, reply_markup=k) 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): def start_message(self, message):
try: try:
@@ -334,9 +364,7 @@ class TelegramHelperBot:
date = current_date.strftime("%Y-%m-%d %H:%M:%S") 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) 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') question = messages.get_message(self.__get_first_name(message), 'QUESTION')
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = self.get_reply_keyboard(message)
item1 = types.KeyboardButton("Выйти из чата")
markup.add(item1)
self.bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK, self.bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK,
reply_markup=markup) reply_markup=markup)
@@ -349,9 +377,8 @@ class TelegramHelperBot:
suggest_news_2 = messages.get_message(self.__get_first_name(message), 'SUGGEST_NEWS_2') 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) self.bot.send_message(message.chat.id, suggest_news_2, parse_mode='html', reply_markup=markup)
except Exception as e: except Exception as e:
if LOGS: self.bot.send_message(IMPORTANT_LOGS,
self.bot.send_message(IMPORTANT_LOGS, f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
# logging # logging
if LOGS: if LOGS:
self.bot.forward_message(chat_id=GROUP_FOR_LOGS, self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
@@ -405,7 +432,7 @@ class TelegramHelperBot:
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_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) markup = types.InlineKeyboardMarkup(row_width=1)
item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish') item1 = types.InlineKeyboardButton("Опубликовать", callback_data='publish')
item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline')
@@ -530,23 +557,24 @@ class TelegramHelperBot:
# Создаем список кнопок # Создаем список кнопок
buttons = [] 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, убрал, потому что на текстовом массиве выходит за пределы for i in range(start_index, min(start_index + 7,
buttons.append(types.InlineKeyboardButton(f"{array_items[i][0]}", callback_data=f"{callback}_{array_items[i][1]}")) 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: 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: 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 кнопками в ряд # Формируем клавиатуру с 3 кнопками в ряд
keyboard = [] keyboard = []
for i in range(0, len(buttons), 3): for i in range(0, len(buttons), 3):
keyboard.append(buttons[i:i+3]) keyboard.append(buttons[i:i + 3])
return types.InlineKeyboardMarkup(keyboard) return types.InlineKeyboardMarkup(keyboard)
@staticmethod @staticmethod
@@ -589,8 +617,18 @@ class TelegramHelperBot:
user_ids.append((user[0], user[1])) user_ids.append((user[0], user[1]))
return user_ids return user_ids
@staticmethod
def delete_user_blacklist(user_id):
return BotDB.delete_user_blacklist(user_id=user_id)
bot = TelegramHelperBot(BOT_TOKEN) bot = TelegramHelperBot(BOT_TOKEN)
if __name__ == "__main__": if __name__ == "__main__":
# Запускаем бота # Запускаем бота
bot.start() bot.start()
scheduler = BackgroundScheduler()
scheduler.add_job(bot.unban_notifier(), 'cron', hour=0, minute=0)
scheduler.start()

View File

@@ -5,10 +5,11 @@ def get_message(username: str, type_message: str):
'HELLO_MESSAGE': "Привет, username!👋🏼&Меня зовут Виби, я бот канала 'Влюбленный Бийск'❤🤖" 'HELLO_MESSAGE': "Привет, username!👋🏼&Меня зовут Виби, я бот канала 'Влюбленный Бийск'❤🤖"
"&Я был создан для того, чтобы помочь тебе выложить пост в наш канал и если это необходимо, связаться с админами ✍✉" "&Я был создан для того, чтобы помочь тебе выложить пост в наш канал и если это необходимо, связаться с админами ✍✉"
"&Так же я могу выдать тебе набор стикеров, где я буду главным героем🦸‍♂" "&Так же я могу выдать тебе набор стикеров, где я буду главным героем🦸‍♂"
"&Дать возможность высказаться в нашем стендап режиме🎤&Послушать о чем говорит наш город🎧" "&Наш бот голосового общения переехал сюда: https://t.me/podslushano_biysk_bot 🎤&Там можно послушать о чем говорит наш город🎧"
"&Предлагай свой пост мне и я обязательно его опубликую😉" "&Предлагай свой пост мне и я обязательно его опубликую😉"
"&Для продолжения взаимодействия воспользуйся меню внизу твоего дисплея⬇" "&Для продолжения взаимодействия воспользуйся меню внизу твоего дисплея⬇"
"&&P.S. Иногда я зависаю по неизвестным причинам, если от меня нет ответа, введи в чат команду /start, это перезапустит сценарий." "&&Если что-то пошло не так: введи в чат команду /start, это перезапустит сценарий сначала."
"&Не жми кнопку несколько раз если я не ответил с первого раза. Возможно ведутся тех.работы и я отвечу позже"
"&&Основная группа в ВК: https://vk.com/love_bsk" "&&Основная группа в ВК: https://vk.com/love_bsk"
"&Основной канал в ТГ: https://t.me/love_bsk", "&Основной канал в ТГ: https://t.me/love_bsk",
'SUGGEST_NEWS': "username, окей, жду от тебя текст поста🙌🏼" 'SUGGEST_NEWS': "username, окей, жду от тебя текст поста🙌🏼"
@@ -17,8 +18,8 @@ def get_message(username: str, type_message: str):
'SUGGEST_NEWS_2': "Обрати внимание, что я умный и смогу из твоего текста понять команды указанные ниже😉" 'SUGGEST_NEWS_2': "Обрати внимание, что я умный и смогу из твоего текста понять команды указанные ниже😉"
"&Если хочешь чтобы пост был опубликован анонимно, напиши в любом месте своего поста слово 'анон'." "&Если хочешь чтобы пост был опубликован анонимно, напиши в любом месте своего поста слово 'анон'."
"&Если хочешь опубликовать пост не анонимно, то напиши 'не анон', 'неанон' или не пиши ничего." "&Если хочешь опубликовать пост не анонимно, то напиши 'не анон', 'неанон' или не пиши ничего."
"&&Я обучен только на команды, указанные мной выше👆" "&&❗️❗️❗️Я обучен только на команды, указанные мной выше❗️❗️❗️👆"
"&‼Проверь, чтобы указание авторства было выполнено так как я попросил." "&‼Проверь, чтобы указание авторства было выполнено так как я попросил, иначе пост будет выложен не корректно"
"&Пост будет опубликован только в группе ТГ📩", "&Пост будет опубликован только в группе ТГ📩",
"CONNECT_WITH_ADMIN": "username, напиши свое обращение или предложение✍️" "CONNECT_WITH_ADMIN": "username, напиши свое обращение или предложение✍️"
"&Мы рассмотрим и ответим тебе в ближайшее время☺️❤️", "&Мы рассмотрим и ответим тебе в ближайшее время☺️❤️",

View File

@@ -1 +1,2 @@
pyTelegramBotAPI pyTelegramBotAPI
APScheduler~=3.10.4