diff --git a/database/db.py b/database/db.py index 8378e75..ce6621d 100644 --- a/database/db.py +++ b/database/db.py @@ -1040,61 +1040,86 @@ class BotDB: def last_date_audio(self): """Получаем дату последнего войса""" + self.logger.info( + f"Запуск функции last_date_audio") try: self.connect() result = self.cursor.execute( "SELECT `date_added` FROM `audio_message_reference` ORDER BY date_added DESC LIMIT 1") - return result.fetchone()[0] + last_date = result.fetchone()[0] + self.logger.info(f"Последняя дата сообщения {last_date}") + return last_date except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() def get_last_user_audio_record(self, user_id): """Получает данные о количестве записей пользователя""" + self.logger.info( + f"Запуск функции get_last_user_audio_record. user_id={user_id}") try: self.connect() - result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", - (user_id,)) - return bool(len(result.fetchall())) + r = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", + (user_id,)) + result = bool(len(r.fetchall())) + self.logger.info( + f"Результат функции get_last_user_audio_record: {result}") + return result except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() def get_id_for_audio_record(self, user_id): """Получает ID аудио сообщения пользователя""" + self.logger.info( + f"Запуск функции get_id_for_audio_record. user_id={user_id}") try: self.connect() - result = self.cursor.execute( + r = self.cursor.execute( "SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? " "ORDER BY date_added DESC LIMIT 1", (user_id,)) - return result.fetchone()[0] + result = r.fetchone()[0] + self.logger.info( + f"Результат функции get_id_for_audio_record: {result}") + return result except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() def get_path_for_audio_record(self, user_id): """Получает данные о названии файла""" + self.logger.info( + f"Запуск функции get_path_for_audio_record. user_id={user_id}") try: self.connect() - result = self.cursor.execute( + r = 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] + result = r.fetchone()[0] + self.logger.info( + f"Результат функции get_path_for_audio_record: {result}") + return result except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() def check_listen_audio(self, user_id): """Проверяет прослушано ли аудио пользователем""" + self.logger.info( + f"Запуск функции check_listen_audio. user_id={user_id}") try: self.connect() query_listen_audio = self.cursor.execute( @@ -1111,14 +1136,19 @@ class BotDB: new_sign = [] for i in new_sign1: new_sign.append(i[0]) + self.logger.info( + f"Функция check_listen_audio успешно отработала.") return new_sign except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() def mark_listened_audio(self, file_name, user_id): """Отмечает аудио прослушанным для конкретного пользователя.""" + self.logger.info( + f"Запуск функции mark_listened_audio. file_name={file_name}, user_id={user_id}") try: self.connect() result = self.cursor.execute( @@ -1126,7 +1156,8 @@ class BotDB: (file_name, user_id, 1)) return self.conn.commit() except sqlite3.Error as error: - print(error) + self.logger.error(f"Ошибка получения последней даты войса: {error}") + raise finally: self.close() diff --git a/voice_bot.py b/voice_bot.py deleted file mode 100644 index 5e3f88c..0000000 --- a/voice_bot.py +++ /dev/null @@ -1,315 +0,0 @@ -import configparser -import os -import sys -from pathlib import Path -from time import sleep - -from database.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', 'listen_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('database/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) - bot.send_message(message.chat.id, - "Так же можешь ознакомиться с инструкцией к боту по команде /help", - 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 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) - 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) - elif message.text == '/restart': - msg = bot.send_message(message.chat.id, 'Я перезапущен, и готов к работе🥳', reply_markup=markup) - 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, standup) - elif message.text == '/help': - help_function(message) - else: - msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понял, воспользуйся меню', reply_markup=markup) - bot.register_next_step_handler(msg, standup) - except Exception as e: - msg = bot.send_message(chat_id=message.chat.id, text='Я не могу прислать тебе голосовое, потому что они скрыты у тебя в настройках. Открой для меня голосовые и возвращайся❤️', reply_markup=markup) - bot.register_next_step_handler(msg, standup) - - - 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) - - @bot.message_handler(commands=['restart']) - def restart_function(message): - return standup(message) - - @bot.message_handler(commands=['help']) - def help_function(message): - msg = bot.send_message(chat_id=message.chat.id, text='Скорее всего ответы на твои вопросы есть здесь, ознакомься: https://telegra.ph/Instrukciya-k-botu-Golosa-Bijsk-10-11-2' - '\nЕсли это не поможет, пиши в тг: @Kerrad1',disable_web_page_preview=not PREVIEW_LINK) - bot.register_next_step_handler(msg, standup) - - @bot.message_handler(commands=['send']) - def notify(message): - """Функция для рассылки сообщений пользователям бота""" - admins = [842766148] - command_sender = message.from_user.id - if command_sender in admins: - markup = types.InlineKeyboardMarkup(row_width=1) - button = types.InlineKeyboardButton(text='Я прочитал ', callback_data='from_user') - success_send_message = 0 - error_send_message = 0 - markup.add(button) - user_ids = BotDB.get_all_user_id() - # Парсим список id юзеров для рассылки и рассылаем сообщения - for i in user_ids: - username = BotDB.get_username(i) - try: - bot.send_message(chat_id=i, - text='Привет, на связи админ. Первая тестовая рассылка через этого бота, не суди строго, обещаю не злоупотреблять этим))\n' - 'Собственно хотел сказать следующее, сегодня ночью обновил бота, добавил ему две функции /restart и /help. ' - 'Рекомендую ознакомиться со статьей в /help, там я подробно описал как сейчас все работает. ' - 'Если у тебя будут предложения по доработке бота или новому функционал, пиши не стесняйся @Kerrad1. ' - 'Так же прошу нажать на кнопку под сообщением, чтобы я понял что ты прочитал сообщение❤️\n\nНа этом у меня все, пока, до следующего релиза', reply_markup=markup) - bot.send_message(chat_id=message.chat.id, - text=f'Успешно отправлено - @{username}') - success_send_message += 1 - except Exception as e: - bot.send_message(chat_id=message.chat.id, - text=f'Этому юзеру не отправилось - @{username}') - error_send_message += 1 - bot.send_message(chat_id=message.chat.id, - text=f'Количество успешных отправок - {success_send_message}', parse_mode='html') - bot.send_message(chat_id=message.chat.id, - text=f'Количество неуспешных отправок - {error_send_message}', parse_mode='html') - standup(message) - else: - bot.send_message(command_sender, f'у вас нет прав для запуска команды') - bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) - standup(message) - - @bot.callback_query_handler(func=lambda call: True) - def post_for_group(call): - if call.data == 'from_user' and call.message.content_type == 'text': - try: - command_sender = call.message.from_user.id - bot.answer_callback_query(call.id, text="Мне приятно, спасибо ❤") - #Попробовать варианты если не сработает call.from_user.username - bot.send_message(chat_id=842766148, text=f'Юзер с ником @{call.message.chat.username} по имени {call.message.chat.first_name} прочитал сообщение') - except: - print('что-то не так') - -if __name__ == '__main__': - telegram_bot() - while True: - 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, "Произошло что-то непредвиденное, хелп. Войс бот болеет") \ No newline at end of file diff --git a/voice_bot/__init__.py b/voice_bot/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_bot/keyboards/__init__.py b/voice_bot/keyboards/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_bot/keyboards/keyboards.py b/voice_bot/keyboards/keyboards.py new file mode 100644 index 0000000..0726fea --- /dev/null +++ b/voice_bot/keyboards/keyboards.py @@ -0,0 +1,10 @@ +from aiogram import types +from aiogram.utils.keyboard import ReplyKeyboardBuilder + + +def get_main_keyboard(): + builder = ReplyKeyboardBuilder() + builder.add(types.KeyboardButton(text="🎤Высказаться")) + builder.add(types.KeyboardButton(text="🎧Послушать")) + markup = builder.as_markup(resize_keyboard=True) + return markup diff --git a/voice_bot/main.py b/voice_bot/main.py new file mode 100644 index 0000000..199d2f7 --- /dev/null +++ b/voice_bot/main.py @@ -0,0 +1,18 @@ +from aiogram import Bot, Dispatcher +from aiogram.client.default import DefaultBotProperties +from aiogram.fsm.storage.memory import MemoryStorage +from aiogram.fsm.strategy import FSMStrategy + +from voice_bot.voice_handler.voice_handler import voice_router + + +async def start_bot(bdf): + token = bdf.settings['Telegram']['listen_bot_token'] + bot = Bot(token=token, default=DefaultBotProperties( + parse_mode='HTML', + link_preview_is_disabled=bdf.settings['Telegram']['preview_link'] + )) + dp = Dispatcher(storage=MemoryStorage(), fsm_strategy=FSMStrategy.GLOBAL_USER) + dp.include_routers(voice_router) + await bot.delete_webhook(drop_pending_updates=True) + await dp.start_polling(bot, skip_updates=True) diff --git a/voice_bot/utils/__init__.py b/voice_bot/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_bot/utils/helper_func.py b/voice_bot/utils/helper_func.py new file mode 100644 index 0000000..ca23b25 --- /dev/null +++ b/voice_bot/utils/helper_func.py @@ -0,0 +1,53 @@ +import time +from datetime import datetime + +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory + +bdf = BaseDependencyFactory() + +BotDB = bdf.get_db() + + +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 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] diff --git a/voice_bot/utils/messages.py b/voice_bot/utils/messages.py new file mode 100644 index 0000000..3cb6df3 --- /dev/null +++ b/voice_bot/utils/messages.py @@ -0,0 +1,6 @@ +def get_message(username: str, type_message: str): + constants = { + + } + message = constants[type_message] + return message.replace('username', username).replace('&', '\n') diff --git a/voice_bot/voice_handler/__init__.py b/voice_bot/voice_handler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_bot/voice_handler/voice_handler.py b/voice_bot/voice_handler/voice_handler.py new file mode 100644 index 0000000..4a648e5 --- /dev/null +++ b/voice_bot/voice_handler/voice_handler.py @@ -0,0 +1,200 @@ +import random +import time +from datetime import datetime +from pathlib import Path + +from aiogram import Router, types, F +from aiogram.filters import Command, StateFilter +from aiogram.fsm.context import FSMContext +from aiogram.types import FSInputFile + +from helper_bot.filters.main import ChatTypeFilter +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory +from logs.custom_logger import logger +from voice_bot.keyboards.keyboards import get_main_keyboard +from voice_bot.utils.helper_func import last_message + +voice_router = Router() + +bdf = BaseDependencyFactory() + +GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs'] +IMPORTANT_LOGS = bdf.settings['Telegram']['important_logs'] +PREVIEW_LINK = bdf.settings['Telegram']['preview_link'] +LOGS = bdf.settings['Settings']['logs'] +TEST = bdf.settings['Settings']['test'] + +BotDB = bdf.get_db() + + +@voice_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("start") +) +async def start(message: types.Message, state: FSMContext): + await state.set_state("START") + await message.forward(chat_id=GROUP_FOR_LOGS) + try: + name_stick_hello = list(Path('Stick').rglob('Hello_*')) + random_stick_hello = random.choice(name_stick_hello) + random_stick_hello = FSInputFile(path=random_stick_hello) + logger.info(f"Стикер успешно получен из БД. Наименование стикера: {name_stick_hello}") + await message.answer_sticker(random_stick_hello) + time.sleep(0.3) + except Exception as e: + if LOGS: + await message.bot.send_message(IMPORTANT_LOGS, f'Отправка приветственных стикеров лажает. Ошибка: {e}') + markup = get_main_keyboard() + await message.answer(text="Привет.", parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.3) + await message.answer(text="Здесь можно послушать голосовые сообщения от совершенно незнакомых людей из " + "Бийска", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1) + await message.answer(text="Это почти как написать письмо, положить его в бутылку и швырнуть в океан. Никогда не " + "узнаешь, послушал его кто-то или нет и ответить тоже не получится..", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) + await message.answer(text="Записывать можно всё что угодно — никаких правил нет. Главное — твой голос, хотя " + "бы на 5-10 секунд", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1.5) + await message.answer(text="Здесь всё анонимно: тот, кому я отправлю твое сообщение, не узнает ни твое имя, " + "ни твой аккаунт (так что можно не стесняться говорить то, что не стал(а) бы " + "выкладывать в собственные соцсети)", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(1.3) + await message.answer(text="Если не знаешь, что сказать, можешь просто прочитать любое текстовое сообщение из " + "недавно полученных или отправленных (или спеть, рассказать стихотворенье)", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) + await message.answer(text="Так же можешь ознакомиться с инструкцией к боту по команде /help", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + time.sleep(0.8) + await message.answer(text="ну всё, достаточно инструкций. записывайся! Микрофон твой - 🎤", + parse_mode='html', reply_markup=markup, + disable_web_page_preview=not PREVIEW_LINK) + + +@voice_router.message( + StateFilter("START"), + ChatTypeFilter(chat_type=["private"]), + F.text == '🎤Высказаться' +) +async def standup_write(message: types.Message, state: FSMContext): + await message.forward(chat_id=GROUP_FOR_LOGS) + markup = types.ReplyKeyboardRemove() + await message.answer(text='Хорошо, теперь пришли мне свое голосовое сообщение', reply_markup=markup) + message_with_date = last_message() + await message.answer(text=message_with_date, parse_mode="html") + await state.set_state('STANDUP_WRITE') + + +@voice_router.message( + StateFilter("STANDUP_WRITE"), + ChatTypeFilter(chat_type=["private"]) +) +async def save_voice_message(message: types.Message, state: FSMContext): + markup = get_main_keyboard() + if message.content_type == 'voice': + await message.forward(chat_id=GROUP_FOR_LOGS) + 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 = message.bot.get_file(file_id=message.voice.file_id) + # downloaded_file = message.bot.download_file(file_path=file_info.file_path) + # with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: + # new_file.write(downloaded_file) + + file_info = await message.bot.get_file(file_id=message.voice.file_id) + downloaded_file = await message.bot.download_file(file_path=file_info.file_path) + with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: + new_file.write(downloaded_file.read()) + await message.answer(text='Окей, сохранил!👌', reply_markup=markup) + await state.set_state('START') + else: + # TODO: Если пришлют фото, он не работает + await message.forward(chat_id=GROUP_FOR_LOGS) + await message.answer(text='Я тебя не понимаю🤷‍♀️ запиши голосовое', reply_markup=markup) + await state.set_state('STANDUP_WRITE') + + +@voice_router.message( + StateFilter("START"), + ChatTypeFilter(chat_type=["private"]), + F.text == '🎧Послушать' +) +async def standup_listen_audio(message: types.Message, state: FSMContext): + check_audio = BotDB.check_listen_audio(user_id=message.from_user.id) + list_audio = list(check_audio) + markup = get_main_keyboard() + await message.forward(chat_id=GROUP_FOR_LOGS) + if not list_audio: + await message.answer(text='Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится', + reply_markup=markup) + message_with_date = last_message() + message.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") + 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') + voice = FSInputFile(path) + # Маркируем сообщение как прослушанное + BotDB.mark_listened_audio(audio_for_user, user_id=message.from_user.id) + await message.bot.send_voice(message.chat.id, voice=voice, reply_markup=markup) + await message.forward(chat_id=GROUP_FOR_LOGS) + await state.set_state('START') + + +@voice_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("restart") +) +async def restart_function(message: types.Message, state: FSMContext): + await message.forward(chat_id=GROUP_FOR_LOGS) + markup = get_main_keyboard() + await message.answer(text='Я перезапущен!', + reply_markup=markup) + await state.set_state('START') + + +@voice_router.message( + ChatTypeFilter(chat_type=["private"]), + Command("help") +) +async def help_function(message: types.Message, state: FSMContext): + await message.forward(chat_id=GROUP_FOR_LOGS) + await message.answer( + text='Скорее всего ответы на твои вопросы есть здесь, ознакомься: https://telegra.ph/Instrukciya-k-botu-Golosa-Bijsk-10-11-2' + '\nЕсли это не поможет, пиши в тг: @Kerrad1', disable_web_page_preview=not PREVIEW_LINK) + await state.set_state('START') diff --git a/voice_bot_v2.py b/voice_bot_v2.py new file mode 100644 index 0000000..d788edd --- /dev/null +++ b/voice_bot_v2.py @@ -0,0 +1,9 @@ +import asyncio + +from helper_bot.utils.base_dependency_factory import BaseDependencyFactory +from voice_bot.main import start_bot + +bdf = BaseDependencyFactory() + +if __name__ == '__main__': + asyncio.run(start_bot(BaseDependencyFactory()))