@@ -44,11 +44,13 @@ class TelegramHelperBot:
# Router for user
@self.bot.message_handler ( func = lambda message : True , chat_types = [ ' private ' ] )
def handle_message ( message ) :
self . logger . info ( f ' Получено сообщение: { message . text } от пользователя: { message . from_user . full_name } id юзера: { message . chat . id } ' )
self . logger . info (
f ' Получено сообщение: { message . text } от пользователя: { message . from_user . full_name } id юзера: { message . chat . id } ' )
if self . BotDB . check_user_in_blacklist ( message . from_user . id ) :
attribute = self . BotDB . get_blacklist_users_by_id ( message . from_user . id )
self . bot . send_message ( message . chat . id ,
f ' <b>Ты заблокирован \n Причина блокировки:</b> { attribute [ 2 ] } \n <b>Дата разблокировки:</b> { attribute [ 3 ] } ' , parse_mode = ' HTML ' )
f ' <b>Ты заблокирован \n Причина блокировки:</b> { attribute [ 2 ] } \n <b>Дата разблокировки:</b> { attribute [ 3 ] } ' ,
parse_mode = ' HTML ' )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) заблокирован ' )
return
if self . state == State . START :
@@ -73,10 +75,12 @@ class TelegramHelperBot:
if access :
self . admin_panel ( message )
self . state = State . ADMIN
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вошел в админ-панель ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вошел в админ-панель ' )
else :
self . bot . send_message ( message . chat . id , ' Доступ запрещен, досвидания! ' )
self . logger . info ( f ' Пользователю { message . from_user . full_name } (ID: { message . chat . id } ) отказано в доступе к админ-панели ' )
self . logger . info (
f ' Пользователю { message . from_user . full_name } (ID: { message . chat . id } ) отказано в доступе к админ-панели ' )
elif message . text == ' /state ' :
self . bot . send_message ( message . chat . id ,
f ' Твой state == { self . state . value } ' )
@@ -84,7 +88,8 @@ class TelegramHelperBot:
self . bot . send_message ( message . chat . id ,
#TODO: Здесь раньше был /state
" Н е понимаю где ты находишься. Нажми /start, и я перезапущусь" )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) отправил непонятное сообщение: { message . text } ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) отправил непонятное сообщение: { message . text } ' )
if self . state == State . SUGGEST :
self . bot . register_next_step_handler ( message , self . suggest_router )
@@ -92,24 +97,28 @@ class TelegramHelperBot:
if message . text == ' /start ' :
self . state = State . START
self . start_message ( message )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
if 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 )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
if self . state == State . CHAT :
if message . text == ' Выйти из чата ' :
self . state = State . START
self . end_message ( message )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вышел из чата ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вышел из чата ' )
elif message . text == ' /start ' :
self . state = State . START
self . start_message ( message )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
else :
self . resend_message_in_group_for_message ( message )
@@ -118,19 +127,23 @@ class TelegramHelperBot:
access = self . check_access ( message . from_user . id )
if access :
self . admin_panel ( message )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вошел в админ-панель ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вошел в админ-панель ' )
else :
self . bot . send_message ( message . chat . id , ' Доступ запрещен, досвидания! ' )
self . logger . info ( f ' Пользователю { message . from_user . full_name } (ID: { message . chat . id } ) отказано в доступе к админ-панели ' )
self . logger . info (
f ' Пользователю { message . from_user . full_name } (ID: { message . chat . id } ) отказано в доступе к админ-панели ' )
if message . text == ' /start ' :
self . state = State . START
self . start_message ( message )
self . logger . info ( f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
self . logger . info (
f ' Пользователь { message . from_user . full_name } (ID: { message . chat . id } ) вернулся в главное меню ' )
@self.bot.message_handler ( func = lambda message : True , chat_types = [ ' group ' ] )
def handle_message ( message ) :
""" Функция ответа админа пользователю через закрытый чат """
self . logger . info ( f ' Получено сообщение в группе { message . chat . title } (ID: { message . chat . id } ) от пользователя { message . from_user . full_name } (ID: { message . from_user . id } ): " { message . text } " ' )
self . logger . info (
f ' Получено сообщение в группе { message . chat . title } (ID: { message . chat . id } ) от пользователя { message . from_user . full_name } (ID: { message . from_user . id } ): " { message . text } " ' )
self . state = State . CHAT
markup = types . ReplyKeyboardMarkup ( resize_keyboard = True , one_time_keyboard = True )
item1 = types . KeyboardButton ( " Выйти из чата " )
@@ -140,7 +153,8 @@ class TelegramHelperBot:
message_id = message . reply_to_message . id
except AttributeError :
self . bot . send_message ( message . chat . id , f ' Блять, выдели сообщение! ' )
self . logger . warning ( f ' В группе { message . chat . title } (ID: { message . chat . id } ) админ не выделил сообщение для ответа. ' )
self . logger . warning (
f ' В группе { message . chat . title } (ID: { message . chat . id } ) админ не выделил сообщение для ответа. ' )
message_from_admin = message . text
try :
chat_id = self . BotDB . get_user_by_message_id ( message_id )
@@ -148,12 +162,14 @@ class TelegramHelperBot:
self . logger . info ( f ' Ответ админа " { message . text } " отправлен пользователю с ID: { chat_id } . ' )
except TypeError :
self . bot . send_message ( message . chat . id , f ' Н е могу найти кому ответить в базе, проебали сообщение.' )
self . logger . error ( f ' Ошибка при поиске пользователя в базе для ответа: { message . text } в группе { message . chat . title } (ID: { message . chat . id } ) ' )
self . logger . error (
f ' Ошибка при поиске пользователя в базе для ответа: { message . text } в группе { message . chat . title } (ID: { message . chat . id } ) ' )
# Админка
@self.bot.callback_query_handler ( func = lambda call : call . data in [ ' publish ' , ' decline ' ] )
def post_for_group ( call ) :
self . logger . info ( f ' Получен callback-запрос с данными: { call . data } от пользователя { call . from_user . full_name } (ID: { call . from_user . id } ) ' )
self . logger . info (
f ' Получен callback-запрос с данными: { call . data } от пользователя { call . from_user . full_name } (ID: { call . from_user . id } ) ' )
if call . data == ' publish ' and call . message . content_type == ' text ' :
try :
self . bot . send_message ( chat_id = self . MAIN_PUBLIC , text = call . message . text )
@@ -181,7 +197,8 @@ class TelegramHelperBot:
elif call . data == ' decline ' :
try :
self . bot . delete_message ( chat_id = self . GROUP_FOR_POST , message_id = call . message . message_id )
self . logger . info ( f ' Сообщение отклонено админом { call . from_user . full_name } (ID: { call . from_user . id } ). ' )
self . logger . info (
f ' Сообщение отклонено админом { call . from_user . full_name } (ID: { call . from_user . id } ). ' )
except Exception as e :
if self . LOGS :
self . bot . send_message ( self . IMPORTANT_LOGS ,
@@ -230,9 +247,11 @@ class TelegramHelperBot:
def start ( self ) :
while True :
try :
print ( self . bot . last_update_id )
self . bot . polling ( none_stop = True )
except ConnectionError as e :
self . logger . error ( f " Произошла ошибка (потеря коннекта): { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
self . logger . error (
f " Произошла ошибка (потеря коннекта): { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
except Exception as e :
self . logger . error ( f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
@@ -286,7 +305,8 @@ class TelegramHelperBot:
self . admin_panel ( message )
def ban_user ( self , message , user_id : int ) :
self . logger . info ( f " Получена команда от админа на бан пользователя: { message . text } (пользователь: { message . from_user . id } ) " )
self . logger . info (
f " Получена команда от админа на бан пользователя: { message . text } (пользователь: { message . from_user . id } ) " )
user_name = self . BotDB . get_username ( user_id = user_id )
ban_object = { ' user_id ' : user_id , ' user_name ' : user_name , ' message_for_user ' : None , ' date_to_unban ' : None }
markup = types . ReplyKeyboardMarkup ( resize_keyboard = True , one_time_keyboard = True )
@@ -348,14 +368,16 @@ class TelegramHelperBot:
self . admin_panel ( message )
def get_last_users ( self , message ) :
self . logger . info ( f " Попытка получения списка последних пользователей. Текст сообщения: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
self . logger . info (
f " Попытка получения списка последних пользователей. Текст сообщения: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
list_users = self . BotDB . get_last_users_from_db ( )
keyboard = self . create_keyboard_with_pagination ( 1 , len ( list_users ) , list_users , ' ban ' )
self . bot . send_message ( chat_id = message . chat . id , text = " Список пользователей которые последними обращались к боту " ,
reply_markup = keyboard )
def get_banned_users ( self , message ) :
self . logger . info ( f " Попытка получения списка заблокированных пользователей. Текст сообщения: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
self . logger . info (
f " Попытка получения списка заблокированных пользователей. Текст сообщения: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
message_text = self . get_banned_users_list ( 0 )
buttons_list = self . get_banned_users_buttons ( )
if buttons_list :
@@ -367,7 +389,8 @@ class TelegramHelperBot:
def start_message ( self , message ) :
try :
self . logger . info ( f " Формирование приветственного сообщения для пользователя. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
self . logger . info (
f " Формирование приветственного сообщения для пользователя. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
name_stick_hello = list ( Path ( ' Stick ' ) . rglob ( ' Hello_* ' ) )
random_stick_hello = open ( random . choice ( name_stick_hello ) , ' rb ' )
self . logger . info ( f " Стикер успешно получен из БД " )
@@ -385,7 +408,8 @@ class TelegramHelperBot:
f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
try :
self . logger . info ( f " Получение данных для приветственного сообщения пользователю. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
self . logger . info (
f " Получение данных для приветственного сообщения пользователю. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } ) " )
user_id = message . from_user . id
first_name = message . from_user . first_name
full_name = message . from_user . full_name
@@ -403,13 +427,15 @@ class TelegramHelperBot:
self . bot . send_message ( message . chat . id , hello_message , parse_mode = ' html ' , reply_markup = markup ,
disable_web_page_preview = not self . PREVIEW_LINK )
except Exception as e :
self . logger . error ( f " Произошла ошибка при отправке приветственного сообщения для пользователя { message . from_user . id } Имя: { message . from_user . full_name } . Ошибка: { str ( e ) } " )
self . logger . error (
f " Произошла ошибка при отправке приветственного сообщения для пользователя { message . from_user . id } Имя: { message . from_user . full_name } . Ошибка: { str ( e ) } " )
if self . LOGS :
self . bot . send_message ( self . IMPORTANT_LOGS ,
f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
def resend_message_in_group_for_message ( self , message ) :
self . logger . info ( f " Попытка пересылки сообщения в связь с админами. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } Идентификатор сообщения: { message . id } ) " )
self . logger . info (
f " Попытка пересылки сообщения в связь с админами. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } Идентификатор сообщения: { message . id } ) " )
self . bot . forward_message ( chat_id = self . GROUP_FOR_MESSAGE ,
from_chat_id = message . chat . id ,
message_id = message . message_id
@@ -419,12 +445,14 @@ class TelegramHelperBot:
self . BotDB . add_new_message_in_db ( message . text , message . from_user . id , message . message_id + 1 , date )
question = messages . get_message ( self . __get_first_name ( message ) , ' QUESTION ' )
markup = self . get_reply_keyboard ( message )
self . bot . send_message ( message . chat . id , question , parse_mode = ' html ' , disable_web_page_preview = not self . PREVIEW_LINK ,
self . bot . send_message ( message . chat . id , question , parse_mode = ' html ' ,
disable_web_page_preview = not self . PREVIEW_LINK ,
reply_markup = markup )
def suggest_post ( self , message ) :
try :
self . logger . info ( f " Вызов функции suggest_post. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } Идентификатор сообщения: { message . id } ) " )
self . logger . info (
f " Вызов функции suggest_post. Сообщение: { message . text } Имя автора сообщения: { message . from_user . full_name } Идентификатор сообщения: { message . id } ) " )
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 ' )
@@ -436,7 +464,8 @@ class TelegramHelperBot:
f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
def stickers ( self , message ) :
self . logger . info ( f " Вызов функции stickers. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . info (
f " Вызов функции stickers. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . BotDB . update_info_about_stickers ( user_id = message . from_user . id )
markup = self . get_reply_keyboard ( message )
try :
@@ -449,10 +478,12 @@ class TelegramHelperBot:
except ApiTelegramException as e :
self . bot . send_message ( chat_id = self . IMPORTANT_LOGS ,
text = f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
self . logger . error ( f " Ошибка функции stickers. Ошибка: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . error (
f " Ошибка функции stickers. Ошибка: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
def connect_with_admin ( self , message ) :
self . logger . info ( f " Вызов функции connect_with_admin. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . info (
f " Вызов функции connect_with_admin. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
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
@@ -463,12 +494,14 @@ class TelegramHelperBot:
def end_message ( self , message ) :
try :
self . logger . info ( f " Вызов функции end_message. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . info (
f " Вызов функции end_message. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
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 :
self . logger . error ( f " Ошибка в функции stickers при получении стикера: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . error (
f " Ошибка в функции stickers при получении стикера: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
if self . LOGS :
self . bot . send_message ( chat_id = self . IMPORTANT_LOGS ,
text = f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
@@ -476,10 +509,12 @@ class TelegramHelperBot:
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 self . PREVIEW_LINK )
parse_mode = ' html ' , reply_markup = markup ,
disable_web_page_preview = not self . PREVIEW_LINK )
except Exception as e :
if self . LOGS :
self . logger . error ( f " Ошибка в функции stickers при получении сообщения: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . logger . error (
f " Ошибка в функции stickers при получении сообщения: { str ( e ) } Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
self . bot . send_message ( chat_id = self . IMPORTANT_LOGS ,
text = f " Произошла ошибка: { str ( e ) } \n \n Traceback: \n { traceback . format_exc ( ) } " )
@@ -551,41 +586,45 @@ class TelegramHelperBot:
disable_web_page_preview = not self . PREVIEW_LINK , reply_markup = markup_for_user )
def suggest_router ( self , message ) :
self . logger . info (
f " Вызов функции suggest_router. Пользователь: { message . from_user . id } Имя автора сообщения: { message . from_user . full_name } " )
try :
if message . content_type == ' text ' :
lower_text = message . text . lower ( )
post_text , is_anonymous = self . _get_text_message ( lower_text , message . from_user . full_name , message . from_user . id )
post_text , is_anonymous = self . _get_text_message ( lower_text , message . from_user . full_name ,
message . from_user . id )
if is_anonymous :
self . _send_text_message ( post_text )
else :
self . _send_text_message ( post_text )
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 self . PREVIEW_LINK , reply_markup = markup_for_user )
elif message . content_type == ' photo ' and message . media_group_id is None :
lower_caption = message . caption . lower ( )
post_caption , is_anonymous = self . _get_text_message ( lower_caption , message . from_user . full_name , message . from_user . id )
post_caption , is_anonymous = self . _get_text_message ( lower_caption , message . from_user . full_name ,
message . from_user . id )
if is_anonymous :
self . _send_photo_message ( message . photo [ - 1 ] . file_id , post_caption )
else :
self . _send_photo_message ( message . photo [ - 1 ] . file_id , post_caption )
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 self . PREVIEW_LINK , reply_markup = markup_for_user )
elif message . media_group_id is not None :
#TODO: Остановился здесь, так нихрена не рабоатет
self . _get_media_group_from_u ser ( message )
media_group = self . _prepare_media_group ( message . media , message . caption )
self . _send_media_group_message ( media_group )
self . bot . send_message ( message . chat . id ,
' Я пока не умею работать с несколькими файлами. Пришли текст и не более одного фото ' )
self . bot . register_next_step_handler ( message , self . suggest_router )
el se:
self . bot . send_message ( message . chat . id ,
' Я пока не умею работать с таким сообщением. Пришли текст и не более одного фото ' )
self . bot . register_next_step_handler ( message , self . suggest_router )
except Exception as e :
if self . LOGS :
self . bot . send_message ( chat_id = self . IMPORTANT_LOGS ,
text = f " Произошла ошибка: { str ( e ) } \n \n Traceback: \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 self . PREVIEW_LINK , reply_markup = markup_for_user )
def _get_media_group_from_user ( self , message ) :
if message . media_group_id is not None :
print ( message )
@staticmethod
def _get_reply_keyboard_for_post ( ) :
@@ -595,22 +634,6 @@ class TelegramHelperBot:
markup . add ( item1 , item2 )
return markup
def _prepare_media_group ( self , message , post_caption ) :
post_content = message . photo
media_group = [ ]
if len ( post_caption ) > 1021 :
#TODO: Выключил обработку таких сообщений. Позднее нужно будет подумать что делать с длинными сообщениями
pass
else :
for idx , photo in enumerate ( post_content ) :
if idx == 0 :
media_group . append ( InputMediaPhoto ( photo . file_id ,
caption = post_caption ) )
else :
media_group . append ( InputMediaPhoto ( photo . file_id ,
caption = ' ' ) )
return media_group
@staticmethod
def _get_text_message ( post_text : str , first_name : str , username : str ) :
"""
@@ -655,9 +678,6 @@ class TelegramHelperBot:
reply_markup = markup
)
def _send_media_group_message ( self , media_group : list [ InputMediaPhoto ] ) :
self . bot . send_media_group ( chat_id = self . GROUP_FOR_POST , media = media_group )
def get_reply_keyboard ( self , message ) :
markup = types . ReplyKeyboardMarkup ( resize_keyboard = True , one_time_keyboard = True )
item1 = types . KeyboardButton ( " 📢Предложить свой пост " )
@@ -731,7 +751,6 @@ class TelegramHelperBot:
keyboard . append ( buttons [ i : i + 3 ] )
return types . InlineKeyboardMarkup ( keyboard )
def get_banned_users_list ( self , offset : int ) :
"""
Возвращает сообщение с о списком пользователей и словарь с ником + идентификатором