From 6afef7c60afae861841bf2c309741a1fb9ee1ada Mon Sep 17 00:00:00 2001 From: KerradKerridi Date: Thu, 1 Sep 2022 23:32:06 +0300 Subject: [PATCH] new function, fix bugs --- db.py | 27 +++++++++- main.py | 160 ++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 147 insertions(+), 40 deletions(-) diff --git a/db.py b/db.py index ac4194e..e2ea45b 100644 --- a/db.py +++ b/db.py @@ -2,7 +2,6 @@ import sqlite3 import configparser import os import sys -import random config_path = os.path.join(sys.path[0], 'settings.ini') config = configparser.ConfigParser() @@ -100,6 +99,16 @@ class BotDB: except sqlite3.Error as error: print(error) + def last_date_audio(self): + """Получаем дату последнего войса""" + try: + result = self.cursor.execute( + "SELECT `date_added` FROM `audio_message_reference` ORDER BY date_added DESC LIMIT 1") + return result.fetchone()[0] + except sqlite3.Error as error: + print(error) + + def get_last_user_audio_record(self, user_id): """Получает данные о количестве записей пользователя""" try: @@ -153,6 +162,22 @@ class BotDB: except sqlite3.Error as error: print(error) + def get_info_about_stickers(self, user_id): + """Получает данные о получении стикеров пользователем""" + try: + result = self.cursor.execute("SELECT `has_stickers` FROM `our_users` WHERE `user_id` = ?", (user_id,)) + return result.fetchone()[0] + except sqlite3.Error as error: + print(error) + + def update_info_about_stickers(self, user_id): + """Обновляет данные о получении стикеров пользователем""" + try: + result = self.cursor.execute("UPDATE `our_users` SET `has_stickers` = 1 WHERE `user_id` = ?", (user_id,)) + return self.conn.commit() + except sqlite3.Error as error: + print(error) + def close(self): """Закрываем соединение с БД""" self.conn.close() diff --git a/main.py b/main.py index aa2721e..05b71b0 100644 --- a/main.py +++ b/main.py @@ -25,6 +25,8 @@ IMPORTANT_LOGS = config.get('Telegram', 'important_logs') PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK') #SETTINGS LOGS = config.getboolean('Settings', 'logs') +TEST = config.getboolean('Settings', 'test') + #Инициализируем бота и базку bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None) @@ -51,12 +53,17 @@ def telegram_bot(): bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(7)) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Предложить свой пост") - item2 = types.KeyboardButton("Связаться с админами") - item3 = types.KeyboardButton("Удалить пост") - item4 = types.KeyboardButton("Войти в режим стендапа") - - markup.add(item1, item2, item3, item4) + item1 = types.KeyboardButton("📢Предложить свой пост") + item2 = types.KeyboardButton("📩Связаться с админами") + item3 = types.KeyboardButton("❌Удалить пост") + item4 = types.KeyboardButton("🎧Войти в режим стендапа") + 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, item3, item4, item5) + else: + markup.add(item1, item2, item3, item4) try: user_id = message.from_user.id first_name = message.from_user.first_name @@ -81,11 +88,11 @@ def telegram_bot(): @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("Связаться с админами") - item3 = types.KeyboardButton("Удалить пост") - item4 = types.KeyboardButton("Войти в режим стендапа") - item5 = types.KeyboardButton("Сказать пока!") + item1 = types.KeyboardButton("📢Предложить свой пост") + item2 = types.KeyboardButton("📩Связаться с админами") + item3 = types.KeyboardButton("❌Удалить пост") + item4 = types.KeyboardButton("🎧Войти в режим стендапа") + item5 = types.KeyboardButton("👋🏼Сказать пока!") markup.add(item1, item2, item3, item4, item5) bot.send_message(message.chat.id, "Выбери нужную кнопку внизу экрана".format( @@ -95,7 +102,7 @@ def telegram_bot(): def go_send_messages(message): global msg - if message.text == 'Предложить свой пост': + if message.text == '📢Предложить свой пост': try: markup = types.ReplyKeyboardRemove() first_name = message.from_user.first_name @@ -115,7 +122,7 @@ def telegram_bot(): message_id=message.message_id) bot.register_next_step_handler(msg, resend_message_in_group_for_post) - elif message.text == "Связаться с админами": + elif message.text == "📩Связаться с админами": first_name = message.from_user.first_name connect_with_admin = BotDB.get_message_from_db('connect_with_admin', first_name) msg = bot.send_message(message.chat.id, connect_with_admin, parse_mode="html") @@ -126,24 +133,47 @@ def telegram_bot(): message_id=message.message_id) bot.register_next_step_handler(msg, resend_message_in_group_for_message) - elif message.text == "Войти в режим стендапа": + elif message.text == "🎧Войти в режим стендапа": markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Высказаться") - item2 = types.KeyboardButton("Послушать") - item3 = types.KeyboardButton("Вернуться в меню") + item1 = types.KeyboardButton("🎤Высказаться") + item2 = types.KeyboardButton("🎧Послушать") + item3 = types.KeyboardButton("🔙Вернуться в меню") markup.add(item1, item2, item3) first_name = message.from_user.first_name message_for_standup = BotDB.get_message_from_db('message_for_standup', first_name) - msg = bot.send_message(message.chat.id, message_for_standup, parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) #logging 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, message_for_standup, parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + #функция с отображением сообщения "Последнее сообщение было записано" + date_from_db = BotDB.last_date_audio() + parse_date = datetime.strptime(date_from_db, "%Y-%m-%d %H:%M:%S") + last_voice_time_timestamp = time.mktime(parse_date.timetuple()) + time_now_timestamp = time.time() + date_difference = time_now_timestamp - last_voice_time_timestamp + # считаем минуты, часы, дни + much_minutes_ago = round(date_difference / 60, 0) + much_hour_ago = round(date_difference / 3600, 0) + much_days_ago = int(round(much_hour_ago / 24, 0)) + message_with_date = '' + if much_minutes_ago <= 60: + word_minute = plural_time(1, much_minutes_ago) + message_with_date = f'Последнее сообщение было записано {word_minute} назад' + elif much_minutes_ago > 60 and much_hour_ago <= 24: + word_hour = plural_time(2, much_hour_ago) + message_with_date = f'Последнее сообщение было записано {word_hour} назад' + elif much_hour_ago > 24: + word_day = plural_time(3, much_days_ago) + message_with_date = f'Последнее сообщение было записано {word_day} назад' + msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") + bot.register_next_step_handler(msg, standup) - elif message.text == "Удалить пост": + elif message.text == "❌Удалить пост": #TODO: требует автоматизации. На входе говорим пришли мне пост, на выходе получаем идентификатор поста, удаляем из ТГ. Насчет удаления из ВК надо подумать first_name = message.from_user.first_name del_message = BotDB.get_message_from_db('del_message', first_name) @@ -155,7 +185,7 @@ def telegram_bot(): message_id=message.message_id) bot.register_next_step_handler(msg, resend_message_in_group_for_message) - elif message.text == "Сказать пока!": + elif message.text == "👋🏼Сказать пока!": try: name_stick_bye = list(Path('Stick').rglob('Universal_*')) number_stick_bye = random.randint(1, len(name_stick_bye)) @@ -180,6 +210,24 @@ def telegram_bot(): 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("📩Связаться с админами") + item3 = types.KeyboardButton("❌Удалить пост") + item4 = types.KeyboardButton("🎧Войти в режим стендапа") + item5 = types.KeyboardButton("👋🏼Сказать пока!") + markup.add(item1, item2, item3, item4, 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: + if LOGS: + bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(12)) else: try: first_name = message.from_user.first_name @@ -198,20 +246,24 @@ def telegram_bot(): def standup(message): # Клавиатуру добавляем markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Высказаться") - item2 = types.KeyboardButton("Послушать") - item3 = types.KeyboardButton("Вернуться в меню") + item1 = types.KeyboardButton("🎤Высказаться") + item2 = types.KeyboardButton("🎧Послушать") + item3 = types.KeyboardButton("🔙Вернуться в меню") markup.add(item1, item2, item3) try: - if message.text == 'Высказаться' or message.text == 'Высказаться еще': + if message.text == '🎤Высказаться' or message.text == '🎤Высказаться еще': markup = types.ReplyKeyboardRemove() - msg = bot.send_message(chat_id=message.chat.id, text='Пришли мне свое голосовое сообщение', reply_markup=markup) + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) + msg = bot.send_message(chat_id=message.chat.id, text='Хорошо, теперь пришли мне свое голосовое сообщение', reply_markup=markup) bot.register_next_step_handler(msg, save_voice_message) - elif message.text == 'Послушать': + elif message.text == '🎧Послушать': check_audio = BotDB.check_listen_audio(user_id=message.from_user.id) list_audio = list(check_audio) + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) if list_audio == []: - msg = bot.send_message(message.chat.id, 'Прости, ты прослушал все аудио. Возвращайся позже', reply_markup=markup) + msg = bot.send_message(message.chat.id, 'Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится', reply_markup=markup) bot.register_next_step_handler(msg, standup) else: number_element = random.randint(0, len(list_audio) - 1) @@ -223,14 +275,41 @@ def telegram_bot(): msg = bot.send_voice(message.chat.id, voice=voice, reply_markup=markup) bot.register_next_step_handler(msg, standup) - elif message.text == 'Вернуться в меню': + elif message.text == '🔙Вернуться в меню': + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) after_post(message=message) + else: + msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понял, воспользуйся меню', reply_markup=markup) + bot.register_next_step_handler(msg, standup) except: if LOGS: bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4)) + + def plural_time(type, n): + word = [] + if type == 1: + word = ['минуту', 'минуты', 'минут'] + elif type == 2: + word = ['час', 'часа', 'часов'] + elif type == 3: + word = ['день', 'дня', 'дней'] + else: + pass + + if n % 10 == 1 and n % 100 != 11: + p = 0 + elif 2 <= n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20): + p = 1 + else: + p = 2 + return str(n) + ' ' + word[p] + def save_voice_message(message): if message.content_type == 'voice': + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) file_name = '' file_id = 1 #Проверяем что запись о файле есть в базе данных @@ -260,17 +339,19 @@ def telegram_bot(): new_file.write(downloaded_file) #инициализируем кнопки markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Вернуться в меню") + item1 = types.KeyboardButton("🔙Вернуться в меню") markup.add(item1) - bot.send_message(chat_id=message.chat.id, text='Окей, сохранил!', reply_markup=markup) + bot.send_message(chat_id=message.chat.id, text='Окей, сохранил!👌', reply_markup=markup) #menu_standup(message=message) bot.register_next_step_handler(message, standup) else: #TODO: Если пришлют фото, он не работает + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) - item1 = types.KeyboardButton("Вернуться в меню") + item1 = types.KeyboardButton("🔙Вернуться в меню") markup.add(item1) - msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понимаю, запиши голосовое', reply_markup=markup) + msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понимаю🤷‍♀️ запиши голосовое', reply_markup=markup) bot.register_next_step_handler(msg, standup) def resend_message_in_group_for_post(message): @@ -329,14 +410,15 @@ def telegram_bot(): after_post(message=message) def resend_message_in_group_for_message(message): + bot.forward_message(chat_id=GROUP_FOR_MESSAGE, + from_chat_id=message.chat.id, + message_id=message.message_id + ) + username = message.from_user.first_name + question = BotDB.get_message_from_db('question', username) + bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) try: - bot.forward_message(chat_id=GROUP_FOR_MESSAGE, - from_chat_id=message.chat.id, - message_id=message.message_id - ) - username = message.from_user.first_name - question = BotDB.get_message_from_db('question', username) - bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) + pass except: if LOGS: bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4))