From 7dc23a63c272851baf9be1ac9eb9ac0f00d32788 Mon Sep 17 00:00:00 2001 From: KerradKerridi Date: Thu, 15 Sep 2022 21:59:40 +0300 Subject: [PATCH] new voice bot --- main.py | 6 +- voice_bot.py | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+), 3 deletions(-) create mode 100644 voice_bot.py diff --git a/main.py b/main.py index b574638..d853ac2 100644 --- a/main.py +++ b/main.py @@ -71,7 +71,7 @@ def telegram_bot(): 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("🤪Хочу ваши стикеры") + item5 = types.KeyboardButton("🤪Хочу стикеры") BotDB.update_info_about_stickers(user_id=message.from_user.id) markup.add(item1, item2, item3, item4, item5) else: @@ -80,7 +80,7 @@ def telegram_bot(): BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed) is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id) if is_need_sticker == 0: - item5 = types.KeyboardButton("🤪Хочу ваши стикеры") + item5 = types.KeyboardButton("🤪Хочу стикеры") BotDB.update_info_about_stickers(user_id=message.from_user.id) markup.add(item1, item2, item3, item4, item5) else: @@ -217,7 +217,7 @@ 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 == "🤪Хочу ваши стикеры": + elif message.text == "🤪Хочу стикеры": markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) item1 = types.KeyboardButton("📢Предложить свой пост") item2 = types.KeyboardButton("📩Связаться с админами") diff --git a/voice_bot.py b/voice_bot.py new file mode 100644 index 0000000..cfecf33 --- /dev/null +++ b/voice_bot.py @@ -0,0 +1,240 @@ +import configparser +import os +import sys +from pathlib import Path +from time import sleep +from db import BotDB +import telebot +import random +from datetime import datetime +import time +from telebot import types + +#Настройки +config_path = os.path.join(sys.path[0], 'settings.ini') +config = configparser.ConfigParser() +config.read(config_path) +#TELEGRAM +BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN') +GROUP_FOR_POST = config.get('Telegram', 'group_for_posts') +GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message') +MAIN_PUBLIC = config.get('Telegram', 'main_public') +GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs') +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) +BotDB = BotDB('tg-bot-database') + + + +def telegram_bot(): + @bot.message_handler(commands=['start']) + def send_welcome(message): + try: + name_stick_hello = list(Path('Stick').rglob('Hello_*')) + number_stick_hello = random.randint(1, len(name_stick_hello)) + random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb') + #logging + if LOGS: + bot.forward_message(chat_id=GROUP_FOR_LOGS, + from_chat_id=message.chat.id, + message_id=message.message_id) + bot.send_sticker(message.chat.id, random_stick_hello) + sleep(0.3) + except: + if LOGS: + 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("🎧Послушать") + markup.add(item1, item2) + bot.send_message(message.chat.id, "Привет.", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.3) + bot.send_message(message.chat.id, "Здесь можно послушать голосовые сообщения от совершенно незнакомых людей из Алтайского края", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1) + bot.send_message(message.chat.id, "Это почти как написать письмо, положить его в бутылку и швырнуть в океан. Никогда не узнаешь, послушал его кто-то или нет и ответить тоже не получится..", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) + bot.send_message(message.chat.id, "Записывать можно всё что угодно — никаких правил нет. Главное — твой голос, хотя бы на 5-10 секунд", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1.5) + bot.send_message(message.chat.id, "Здесь всё анонимно: тот, кому я отправлю твое сообщение, не узнает ни твое имя, ни твой аккаунт (так что можно не стесняться говорить то, что не стал(а) бы выкладывать в собственные соцсети)", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1.3) + bot.send_message(message.chat.id, "Если не знаешь, что сказать, можешь просто прочитать любое текстовое сообщение из недавно полученных или отправленных (или спеть, рассказать стихотворенье)", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) + msg = bot.send_message(message.chat.id, "ну всё, достаточно инструкций. записывайся! Микрофон твой - 🎤", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + bot.register_next_step_handler(msg, standup) + + + def last_message(): + # функция с отображением сообщения "Последнее сообщение было записано" + 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} назад' + return message_with_date + + def standup(message): + # Клавиатуру добавляем + markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) + item1 = types.KeyboardButton("🎤Высказаться") + item2 = types.KeyboardButton("🎧Послушать") + markup.add(item1, item2) + try: + if message.text == '🎤Высказаться': + markup = types.ReplyKeyboardRemove() + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) + bot.send_message(chat_id=message.chat.id, text='Хорошо, теперь пришли мне свое голосовое сообщение', reply_markup=markup) + message_with_date = last_message() + msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") + bot.register_next_step_handler(msg, save_voice_message) + 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 == []: + bot.send_message(message.chat.id, 'Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится', reply_markup=markup) + message_with_date = last_message() + msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") + bot.register_next_step_handler(msg, standup) + else: + number_element = random.randint(0, len(list_audio) - 1) + audio_for_user = check_audio[number_element] + path = Path(f'voice_users/{audio_for_user}.ogg') + voice = open(path, 'rb') + #Маркируем сообщение как прослушанное + BotDB.mark_listened_audio(audio_for_user, user_id=message.from_user.id) + + msg = bot.send_voice(message.chat.id, voice=voice, reply_markup=markup) + bot.register_next_step_handler(msg, standup) + + if LOGS: + # logging + bot.forward_message(chat_id=GROUP_FOR_LOGS, + from_chat_id=message.chat.id, + message_id=message.message_id) + if TEST: + bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) + 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 + new_number = int(n) + return str(new_number) + ' ' + 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 + #Проверяем что запись о файле есть в базе данных + is_having_audio_from_user = BotDB.get_last_user_audio_record(user_id=message.from_user.id) + if is_having_audio_from_user is False: + #Если нет, то генерируем имя файла + file_name = f'message_from_{message.from_user.id}_number_{file_id}' + else: + #Иначе берем последнюю запись из БД, добавляем к ней 1, и создаем новую запись + file_name = BotDB.get_path_for_audio_record(user_id=message.from_user.id) + file_id = BotDB.get_id_for_audio_record(message.from_user.id) + 1 + path = Path(f'voice_users/{file_name}.ogg') + if path.exists(): + file_name = f'message_from_{message.from_user.id}_number_{file_id}' + else: + pass + #Собираем инфо о сообщении + author_id = message.from_user.id + time_UTC = int(time.time()) + date_added = datetime.fromtimestamp(time_UTC) + #Сохраняем в базку + BotDB.add_audio_record(file_name, author_id, date_added, 0, file_id) + #Сохраняем файл на сервер + file_info = bot.get_file(message.voice.file_id) + downloaded_file = bot.download_file(file_info.file_path) + with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: + new_file.write(downloaded_file) + #инициализируем кнопки + markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) + item1 = types.KeyboardButton("🎤Высказаться") + item2 = types.KeyboardButton("🎧Послушать") + markup.add(item1, item2) + 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("🎤Высказаться") + item2 = types.KeyboardButton("🎧Послушать") + markup.add(item1, item2) + msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понимаю🤷‍♀️ запиши голосовое', reply_markup=markup) + bot.register_next_step_handler(msg, standup) + + + +if __name__ == '__main__': + telegram_bot() + try: + bot.polling(none_stop=True) + bot.enable_save_next_step_handlers(delay=2) + bot.load_next_step_handlers() + except ConnectionError as e: + if LOGS: + bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял войс бот связь") + except Exception as r: + if LOGS: + bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп. Войс бот болеет") + finally: + if LOGS: + bot.send_message(IMPORTANT_LOGS, 'Я войс бот упал, помогите') \ No newline at end of file