refactor bot

This commit is contained in:
KatykhinAA
2024-07-03 23:06:10 +03:00
parent 908682d05a
commit 20d92856b4
2 changed files with 298 additions and 236 deletions

61
db.py
View File

@@ -41,6 +41,7 @@ console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter) console_handler.setFormatter(formatter)
logger.addHandler(console_handler) logger.addHandler(console_handler)
class BotDB: class BotDB:
def __init__(self, db_file): def __init__(self, db_file):
@@ -81,18 +82,18 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def add_new_user_in_db(self, user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed): def add_new_user_in_db(self, user_id, first_name, full_name, username, is_bot, language_code, date_added,
date_changed):
"""Добавляем юзера в базу""" """Добавляем юзера в базу"""
try: try:
self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', " self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', "
"'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)", "'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
(user_id, first_name, full_name, (user_id, first_name, full_name,
username,is_bot,language_code,date_added,date_changed)) username, is_bot, language_code, date_added, date_changed))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def user_exists(self, user_id): def user_exists(self, user_id):
"""Проверяем, есть ли юзер в базе""" """Проверяем, есть ли юзер в базе"""
try: try:
@@ -101,7 +102,6 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_user_id(self, user_id): def get_user_id(self, user_id):
"""Достаем id юзера в базе по его user_id""" """Достаем id юзера в базе по его user_id"""
try: try:
@@ -110,7 +110,6 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_username(self, user_id): def get_username(self, user_id):
"""Достаем id юзера в базе по его user_id""" """Достаем id юзера в базе по его user_id"""
try: try:
@@ -122,7 +121,7 @@ class BotDB:
def get_all_user_id(self): def get_all_user_id(self):
"""Достаем все айдишники юзеров из БД и преобразуем их в список""" """Достаем все айдишники юзеров из БД и преобразуем их в список"""
try: try:
result = self.cursor.execute("SELECT `user_id` FROM `our_users`",) result = self.cursor.execute("SELECT `user_id` FROM `our_users`", )
fetch_all = result.fetchall() fetch_all = result.fetchall()
list_of_users = [] list_of_users = []
for i in fetch_all: for i in fetch_all:
@@ -138,7 +137,6 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def change_name(self, user_id): def change_name(self, user_id):
#TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. ОБновляем поля first_name, date_changed #TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. ОБновляем поля first_name, date_changed
#result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), ) #result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), )
@@ -147,7 +145,9 @@ class BotDB:
def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id): def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id):
"""Добавляет информацию о войсе юзера в БД""" """Добавляет информацию о войсе юзера в БД"""
try: try:
result = self.cursor.execute("INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)", (file_name, author_id, date_added, listen_count, file_id)) result = self.cursor.execute(
"INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)",
(file_name, author_id, date_added, listen_count, file_id))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -161,11 +161,11 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_last_user_audio_record(self, user_id): def get_last_user_audio_record(self, user_id):
"""Получает данные о количестве записей пользователя""" """Получает данные о количестве записей пользователя"""
try: try:
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?",
(user_id,))
return bool(len(result.fetchall())) return bool(len(result.fetchall()))
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -173,8 +173,9 @@ class BotDB:
def get_id_for_audio_record(self, user_id): def get_id_for_audio_record(self, user_id):
"""Получает ID аудио сообщения пользователя""" """Получает ID аудио сообщения пользователя"""
try: try:
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", result = self.cursor.execute(
(user_id,)) "SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1",
(user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -182,7 +183,9 @@ class BotDB:
def get_path_for_audio_record(self, user_id): def get_path_for_audio_record(self, user_id):
"""Получает данные о названии файла""" """Получает данные о названии файла"""
try: try:
result = self.cursor.execute("SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", (user_id,)) result = self.cursor.execute(
"SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1",
(user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -195,9 +198,10 @@ class BotDB:
FROM audio_message_reference a FROM audio_message_reference a
LEFT JOIN listen_audio_users l ON l.file_name = a.file_name LEFT JOIN listen_audio_users l ON l.file_name = a.file_name
WHERE l.user_id = ? WHERE l.user_id = ?
AND l.file_name IS NOT NULL""" , (user_id,)) AND l.file_name IS NOT NULL""", (user_id,))
check_sign = query_listen_audio.fetchall() check_sign = query_listen_audio.fetchall()
query_all_audio = self.cursor.execute('SELECT file_name FROM audio_message_reference WHERE author_id <> ?', (user_id,)) query_all_audio = self.cursor.execute('SELECT file_name FROM audio_message_reference WHERE author_id <> ?',
(user_id,))
sign_all_audio = query_all_audio.fetchall() sign_all_audio = query_all_audio.fetchall()
new_sign1 = list(set(sign_all_audio) - set(check_sign)) new_sign1 = list(set(sign_all_audio) - set(check_sign))
new_sign = [] new_sign = []
@@ -210,7 +214,9 @@ class BotDB:
def mark_listened_audio(self, file_name, user_id): def mark_listened_audio(self, file_name, user_id):
"""Отмечает аудио прослушанным для конкретного пользователя.""" """Отмечает аудио прослушанным для конкретного пользователя."""
try: try:
result = self.cursor.execute("INSERT INTO `listen_audio_users` (file_name, user_id, is_listen) VALUES (?, ?, ?)", (file_name, user_id, 1)) result = self.cursor.execute(
"INSERT INTO `listen_audio_users` (file_name, user_id, is_listen) VALUES (?, ?, ?)",
(file_name, user_id, 1))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -219,7 +225,8 @@ class BotDB:
"""Получает данные о получении стикеров пользователем""" """Получает данные о получении стикеров пользователем"""
try: try:
result = self.cursor.execute("SELECT `has_stickers` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `has_stickers` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return result.fetchone()[0] return result.fetchone()[0] == 1
#return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
@@ -243,7 +250,6 @@ class BotDB:
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_blacklist_users_by_filters(self): def get_blacklist_users_by_filters(self):
"""Возвращает список пользователей в черном списке по фильтру""" """Возвращает список пользователей в черном списке по фильтру"""
return None return None
@@ -270,6 +276,25 @@ class BotDB:
logger.error(f"Error delete user with ID {user_id} from blacklist table: {error}") logger.error(f"Error delete user with ID {user_id} from blacklist table: {error}")
return False return False
def add_new_message_in_db(self, message_text, user_id, message_id, date, has_answer):
"""Добавляем сообщение юзера в базу"""
try:
self.cursor.execute(
"INSERT INTO `user_messages` (message_text, user_id, message_id, date, has_answer) VALUES (?, ?, ?, ?, ?)",
(message_text, message_id, user_id, date, has_answer))
return self.conn.commit()
except sqlite3.Error as error:
print(error)
def get_user_by_message_id(self, message_id):
"""Возвращает идентификатор пользователя по идентификатору сообщения"""
try:
result = self.cursor.execute("SELECT user_id FROM `user_messages` WHERE message_id = ?", (message_id,))
return result.fetchone()[0]
except sqlite3.Error as error:
print(error)
def close(self): def close(self):
"""Закрываем соединение с БД""" """Закрываем соединение с БД"""
self.conn.close() self.conn.close()

473
main.py
View File

@@ -3,7 +3,7 @@ import os
import sys import sys
from pathlib import Path from pathlib import Path
from time import sleep from time import sleep
from enum import Enum
import db import db
from db import BotDB from db import BotDB
import telebot import telebot
@@ -32,59 +32,122 @@ LOGS = config.getboolean('Settings', 'logs')
TEST = config.getboolean('Settings', 'test') TEST = config.getboolean('Settings', 'test')
# Инициализируем бота и базку # Инициализируем бота и базку
bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None)
BotDB = BotDB('tg-bot-database') BotDB = BotDB('tg-bot-database')
def telegram_bot(): #TODO: state хранить в базе
# Черный список #TODO: Перенести обработчик коллбэков
@bot.message_handler(commands=['admin'], user_id=842766148) class State(Enum):
def admin_panel(message): START = "START"
try: SUGGEST = "SUGGEST"
ADMIN = "ADMIN"
CHAT = "CHAT"
PRE_CHAT = "PRE_CHAT"
class TelegramHelperBot:
def __init__(self, token):
self.bot = telebot.TeleBot(token)
self.state = State.START
# Router for user
@self.bot.message_handler(func=lambda message: True, chat_types=['private'])
def handle_message(message):
if self.state == State.START:
if message.text == '/start':
print(f'Внутри функции handle_message // Команда /start // state - {self.state.value}')
self.start_message(message)
elif message.text == '📢Предложить свой пост':
print(f'Внутри функции handle_message // Команда /suggest // state - {self.state.value}')
self.suggest_post(message)
self.state = State.SUGGEST
elif message.text == '🤪Хочу стикеры':
print(f'Внутри функции handle_message // Команда /stickers // state - {self.state.value}')
self.stickers(message)
self.state = State.START
elif message.text == '📩Связаться с админами':
print(f'Внутри функции handle_message // Команда /connect // state - {self.state.value}')
self.connect_with_admin(message)
self.state = State.PRE_CHAT
print(f'В state.START - {self.state.value}')
elif message.text == '👋🏼Сказать пока!':
print(f'Внутри функции handle_message // Команда /end // state - {self.state.value}')
self.end_message(message)
self.state = State.START
elif message.text == 'Выйти из чата':
print(f'Внутри функции handle_message // Команда /end // state - {self.state.value}')
self.end_message(message)
elif message.text == '/admin':
self.state = State.ADMIN
#TODO: Админку сделать!
self.bot.send_message(message.chat.id,
"Ты в админке, Ура! Делай что хочешь")
elif message.text == '/state':
print(f'Внутри функции handle_message // Команда /state // state - {self.state.value}')
self.bot.send_message(message.chat.id,
f'Твой state == {self.state.value}')
else:
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.state = State.START
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 self.state == State.CHAT:
print(f'В state.CHAT - {self.state.value}')
if message.text == 'Выйти из чата':
self.state = State.START
self.end_message(message)
print(f'Обработчик в CHAT - {self.state.value}')
else:
print(f'Обработчик чата в чате CHAT - {self.state.value}')
self.resend_message_in_group_for_message(message)
@self.bot.message_handler(func=lambda message: True, chat_types=['group'])
def handle_message(message):
"""Функция ответа админа пользователю через закрытый чат"""
self.state = State.CHAT
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("Забанить пользователя по ID") markup.add(item1)
markup.add(item1, item2) message_id = message.reply_to_message.id
bot.send_message(message.chat.id,"Добро пожаловать в админку. Выбери что хочешь:", reply_markup=markup) message_from_admin = message.text
bot.register_next_step_handler(message, ban_user) chat_id = BotDB.get_user_by_message_id(message_id)
except Exception as e: self.bot.send_message(chat_id, message_from_admin, reply_markup=markup)
bot.register_next_step_handler(message, admin_panel)
def register_chat_handler(self, message):
self.bot.register_next_step_handler(message, self.resend_message_in_group_for_message)
def ban_user(message): def start(self):
# проверяем, что ID передан правильно while True:
#TODO: остановился где-то тут, функция не дописана. Хотел сделать админку + бан пользователей try:
try: self.bot.polling(none_stop=True)
if message.text == "Забанить пользователя из списка": except (ConnectionError, Exception):
pass print(f"Произошла ошибка: {str(Exception)}\n\nTraceback:\n{traceback.format_exc()}")
elif message.text == "Забанить пользователя по ID":
bot.send_message(message.chat.id, "Пришли ID юзера")
BotDB.set_user_blacklist(ban_user_id)
bot.reply_to(message, f"Пользователь {ban_user_id} заблокирован.")
except Exception as e:
bot.reply_to(message, f"Укажи ID пользователя. Ошибка\n\n {e}")
bot.register_next_step_handler(message, ban_user)
def start_message(self, message):
@bot.message_handler(commands=['start'])
def send_welcome(message):
# TODO: Тексты приветствий вынести в отдельный файл
try: try:
name_stick_hello = list(Path('Stick').rglob('Hello_*')) name_stick_hello = list(Path('Stick').rglob('Hello_*'))
number_stick_hello = random.randint(1, len(name_stick_hello)) random_stick_hello = open(random.choice(name_stick_hello), 'rb')
random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb')
# logging # logging
if LOGS: if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS, self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
bot.send_sticker(message.chat.id, random_stick_hello) self.bot.send_sticker(message.chat.id, random_stick_hello)
sleep(0.3) sleep(0.3)
except Exception as e: except Exception as e:
print(f'{str(e)}')
if LOGS: if LOGS:
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()}")
try: try:
user_id = message.from_user.id user_id = message.from_user.id
first_name = message.from_user.first_name first_name = message.from_user.first_name
@@ -92,161 +155,103 @@ def telegram_bot():
is_bot = message.from_user.is_bot is_bot = message.from_user.is_bot
username = message.from_user.username username = message.from_user.username
language_code = message.from_user.language_code language_code = message.from_user.language_code
time_utc = int(time.time()) date_added = datetime.now()
date_added = datetime.fromtimestamp(time_utc) date_changed = date_added
date_changed = datetime.fromtimestamp(time_utc)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) if not BotDB.user_exists(user_id):
item1 = types.KeyboardButton("📢Предложить свой пост")
item2 = types.KeyboardButton("📩Связаться с админами")
# TODO: Выпилил, удалить
# item3 = types.KeyboardButton("❌Удалить пост")
if BotDB.user_exists(user_id):
is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id)
if is_need_sticker == 0:
item5 = types.KeyboardButton("🤪Хочу стикеры")
BotDB.update_info_about_stickers(user_id=message.from_user.id)
markup.add(item1, item2, item5)
else:
markup.add(item1, item2)
else:
BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date_added, BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date_added,
date_changed) date_changed)
is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id) markup = self.get_reply_keyboard(message)
if is_need_sticker == 0: hello_message = messages.get_message(self.__get_first_name(message), 'HELLO_MESSAGE')
item5 = types.KeyboardButton("🤪Хочу стикеры") self.bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup,
BotDB.update_info_about_stickers(user_id=message.from_user.id) disable_web_page_preview=not PREVIEW_LINK)
markup.add(item1, item2, item5) except Exception as e:
else: print(f'{str(e)}')
markup.add(item1, item2) if LOGS:
hello_message = messages.get_message(__get_first_name(message), 'HELLO_MESSAGE') self.bot.send_message(IMPORTANT_LOGS,
bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup, f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
disable_web_page_preview=not PREVIEW_LINK)
#TODO: При отправке более одного сообщения, не пересылает сообщение в чат, БАГ!!!!
def resend_message_in_group_for_message(self, message):
self.bot.forward_message(chat_id=GROUP_FOR_MESSAGE,
from_chat_id=message.chat.id,
message_id=message.message_id
)
print(f'Кладу в базу: {message.message_id}')
BotDB.add_new_message_in_db(message.text, message.message_id + 1, message.from_user.id, datetime.now(), 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)
self.bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK,
reply_markup=markup)
def suggest_post(self, message):
try:
markup = types.ReplyKeyboardRemove()
suggest_news = messages.get_message(self.__get_first_name(message), 'SUGGEST_NEWS')
self.bot.send_message(message.chat.id, suggest_news, parse_mode='html')
sleep(0.3)
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: except Exception as e:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") self.bot.send_message(IMPORTANT_LOGS,
bot.register_next_step_handler(message, go_send_messages) f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
@bot.message_handler(commands=['end_command'])
def after_post(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("📢Предложить свой пост")
item2 = types.KeyboardButton("📩Связаться с админами")
# TODO: Скрыл, удалить обработчик
# item3 = types.KeyboardButton("❌Удалить пост")
item5 = types.KeyboardButton("👋🏼Сказать пока!")
markup.add(item1, item2, item5)
bot.send_message(message.chat.id,
"Выбери нужную кнопку внизу экрана".format(
message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
bot.register_next_step_handler(message, go_send_messages)
def go_send_messages(message):
global msg
if message.text == '📢Предложить свой пост':
try:
markup = types.ReplyKeyboardRemove()
suggest_news = messages.get_message(__get_first_name(message), 'SUGGEST_NEWS')
bot.send_message(message.chat.id, suggest_news, parse_mode='html')
sleep(0.3)
suggest_news_2 = messages.get_message(__get_first_name(message), 'SUGGEST_NEWS_2')
msg = bot.send_message(message.chat.id, suggest_news_2, parse_mode='html', reply_markup=markup)
except Exception as e:
if LOGS:
bot.send_message(IMPORTANT_LOGS,
f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
# logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_post)
elif message.text == "📩Связаться с админами":
connect_with_admin = messages.get_message(__get_first_name(message), 'CONNECT_WITH_ADMIN')
msg = bot.send_message(message.chat.id, connect_with_admin, parse_mode="html")
# logging # logging
if LOGS: if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS, self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_message)
elif message.text == "❌Удалить пост": def stickers(self, message):
# TODO: требует автоматизации. На входе говорим пришли мне пост, на выходе получаем идентификатор поста, удаляем из ТГ. Насчет удаления из ВК надо подумать BotDB.update_info_about_stickers(user_id=message.from_user.id)
del_message = messages.get_message(__get_first_name(message), 'DEL_MESSAGE') markup = self.get_reply_keyboard(message)
msg = bot.send_message(message.chat.id, del_message, parse_mode="html") try:
self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
self.bot.send_message(message.chat.id,
text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk',
reply_markup=markup)
except ApiTelegramException as e:
self.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
def connect_with_admin(self, message):
connect_with_admin = messages.get_message(self.__get_first_name(message), 'CONNECT_WITH_ADMIN')
self.bot.send_message(message.chat.id, connect_with_admin, parse_mode="html")
# logging
if LOGS:
self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
def end_message(self, message):
try:
name_stick_bye = list(Path('Stick').rglob('Universal_*'))
random_stick_bye = open(random.choice(name_stick_bye), 'rb')
self.bot.send_sticker(message.chat.id, random_stick_bye)
except ApiTelegramException as e:
if LOGS:
self.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
markup = types.ReplyKeyboardRemove()
try:
bye_message = messages.get_message(self.__get_first_name(message), 'BYE_MESSAGE')
self.bot.send_message(message.chat.id, bye_message,
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
except Exception as e:
if LOGS:
self.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
if LOGS:
# logging # logging
if LOGS: self.bot.forward_message(chat_id=GROUP_FOR_LOGS,
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id,
from_chat_id=message.chat.id, message_id=message.message_id)
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_message)
elif message.text == "👋🏼Сказать пока!": def resend_message_in_group_for_post(self, message):
try:
name_stick_bye = list(Path('Stick').rglob('Universal_*'))
number_stick_bye = random.randint(1, len(name_stick_bye))
random_stick_bye = open(name_stick_bye[number_stick_bye], 'rb')
bot.send_sticker(message.chat.id, random_stick_bye)
except ApiTelegramException as e:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
markup = types.ReplyKeyboardRemove()
try:
bye_message = messages.get_message(__get_first_name(message), 'BYE_MESSAGE')
bot.send_message(message.chat.id, bye_message,
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
except Exception as e:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
if LOGS:
# logging
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
elif message.text == "🤪Хочу стикеры":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("📢Предложить свой пост")
item2 = types.KeyboardButton("📩Связаться с админами")
# TODO: Скрыл кнопку, убрать обработчик позднее
# item3 = types.KeyboardButton("❌Удалить пост")
item5 = types.KeyboardButton("👋🏼Сказать пока!")
markup.add(item1, item2, item5)
try:
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.send_message(message.chat.id,
text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk',
reply_markup=markup)
bot.register_next_step_handler(message, callback=go_send_messages)
except ApiTelegramException as e:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
else:
try:
user_error = messages.get_message(__get_first_name(message), 'USER_ERROR')
bot.send_message(message.chat.id, user_error, parse_mode='html',
disable_web_page_preview=not PREVIEW_LINK)
except Exception as e:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
# logging
if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(message, callback=go_send_messages)
def resend_message_in_group_for_post(message):
markup = types.InlineKeyboardMarkup(row_width=1) markup = types.InlineKeyboardMarkup(row_width=1)
item1 = types.InlineKeyboardButton("Опубликовать", callback_data='post_post_post') item1 = types.InlineKeyboardButton("Опубликовать", callback_data='post_post_post')
item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline')
@@ -255,21 +260,21 @@ def telegram_bot():
if message.content_type == 'text': if message.content_type == 'text':
post_text = message.text.lower() post_text = message.text.lower()
if post_text.find('неанон') != -1 or post_text.find('не анон') != -1: if post_text.find('неанон') != -1 or post_text.find('не анон') != -1:
bot.send_message( self.bot.send_message(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
reply_markup=markup reply_markup=markup
) )
elif post_text.find('анон') != -1: elif post_text.find('анон') != -1:
bot.send_message( self.bot.send_message(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{message.text}\n\nПост опубликован анонимно', text=f'Пост из ТГ:\n{message.text}\n\nПост опубликован анонимно',
reply_markup=markup reply_markup=markup
) )
else: else:
bot.send_message( self.bot.send_message(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
@@ -278,7 +283,7 @@ def telegram_bot():
elif message.content_type == 'photo' and message.media_group_id is None: elif message.content_type == 'photo' and message.media_group_id is None:
post_text_for_photo = message.caption.lower() post_text_for_photo = message.caption.lower()
if post_text_for_photo.find('неанон') != -1 or post_text_for_photo.find('не анон') != -1: if post_text_for_photo.find('неанон') != -1 or post_text_for_photo.find('не анон') != -1:
bot.send_photo( self.bot.send_photo(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
@@ -286,7 +291,7 @@ def telegram_bot():
reply_markup=markup reply_markup=markup
) )
elif post_text_for_photo.find('анон') != -1 or post_text_for_photo.find('анон') != -1: elif post_text_for_photo.find('анон') != -1 or post_text_for_photo.find('анон') != -1:
bot.send_photo( self.bot.send_photo(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nПост опубликован анонимно', caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nПост опубликован анонимно',
@@ -294,7 +299,7 @@ def telegram_bot():
reply_markup=markup reply_markup=markup
) )
else: else:
bot.send_photo( self.bot.send_photo(
# TODO: GROUP_FOR_POST # TODO: GROUP_FOR_POST
chat_id=GROUP_FOR_POST, chat_id=GROUP_FOR_POST,
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
@@ -308,29 +313,67 @@ def telegram_bot():
pass pass
except Exception as e: except Exception as e:
if LOGS: if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, self.bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}")
markup_for_user = self.get_reply_keyboard(message)
success_send_message = messages.get_message(self.__get_first_name(message), 'SUCCESS_SEND_MESSAGE')
self.bot.send_message(message.chat.id, success_send_message, parse_mode='html',
disable_web_page_preview=not PREVIEW_LINK, reply_markup=markup_for_user)
success_send_message = messages.get_message(__get_first_name(message), 'SUCCESS_SEND_MESSAGE') @staticmethod
def get_reply_keyboard(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("📢Предложить свой пост")
item2 = types.KeyboardButton("📩Связаться с админами")
item3 = types.KeyboardButton("👋🏼Сказать пока!")
#TODO: Есть ощущение что не совсем так работает как надо
item4 = types.KeyboardButton("🤪Хочу стикеры") if not BotDB.get_info_about_stickers(
user_id=message.from_user.id) else None
bot.send_message(message.chat.id, success_send_message, parse_mode='html', if item4:
disable_web_page_preview=not PREVIEW_LINK) markup.add(item1, item2, item3, item4)
after_post(message=message) else:
markup.add(item1, item2, item3)
def resend_message_in_group_for_message(message): return markup
bot.forward_message(chat_id=GROUP_FOR_MESSAGE,
from_chat_id=message.chat.id, @staticmethod
message_id=message.message_id def __get_first_name(message):
) return message.from_user.first_name
question = messages.get_message(__get_first_name(message), 'QUESTION')
bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK)
bot = TelegramHelperBot(BOT_TOKEN)
def telegram_bot():
# Черный список
@bot.message_handler(commands=['admin'], user_id=842766148)
def admin_panel(message):
try: try:
pass markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("Забанить пользователя из списка")
item2 = types.KeyboardButton("Забанить пользователя по ID")
markup.add(item1, item2)
bot.send_message(message.chat.id, "Добро пожаловать в админку. Выбери что хочешь:", reply_markup=markup)
bot.register_next_step_handler(message, ban_user)
except Exception as e: except Exception as e:
if LOGS: bot.register_next_step_handler(message, admin_panel)
bot.send_message(chat_id=IMPORTANT_LOGS,
text=f"Произошла ошибка: {str(e)}\n\nTraceback:\n{traceback.format_exc()}") def ban_user(message):
after_post(message=message) # проверяем, что ID передан правильно
#TODO: остановился где-то тут, функция не дописана. Хотел сделать админку + бан пользователей
try:
if message.text == "Забанить пользователя из списка":
pass
elif message.text == "Забанить пользователя по ID":
bot.send_message(message.chat.id, "Пришли ID юзера")
#BotDB.set_user_blacklist(ban_user_id)
#bot.reply_to(message, f"Пользователь {ban_user_id} заблокирован.")
except Exception as e:
bot.reply_to(message, f"Укажи ID пользователя. Ошибка\n\n {e}")
bot.register_next_step_handler(message, ban_user)
# Админка # Админка
@bot.callback_query_handler(func=lambda call: True) @bot.callback_query_handler(func=lambda call: True)
@@ -367,12 +410,6 @@ def telegram_bot():
return message.from_user.first_name return message.from_user.first_name
if __name__ == '__main__': if __name__ == "__main__":
telegram_bot() # Запускаем бота
while True: bot.start()
try:
bot.polling(none_stop=True)
bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()
except (ConnectionError, Exception):
print(f"Произошла ошибка: {str(Exception)}\n\nTraceback:\n{traceback.format_exc()}")