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("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') @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')