215 lines
11 KiB
Python
215 lines
11 KiB
Python
import random
|
||
import time
|
||
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.middlewares.blacklist_middleware import BlacklistMiddleware
|
||
from helper_bot.utils.base_dependency_factory import BaseDependencyFactory
|
||
from helper_bot.utils.helper_func import update_user_info, check_user_emoji, send_voice_message
|
||
from logs.custom_logger import logger
|
||
from voice_bot.keyboards.keyboards import get_main_keyboard, get_reply_keyboard_for_voice
|
||
from voice_bot.utils.helper_func import last_message
|
||
|
||
voice_router = Router()
|
||
|
||
bdf = BaseDependencyFactory()
|
||
|
||
GROUP_FOR_LOGS = bdf.settings['Telegram']['group_for_logs']
|
||
GROUP_FOR_POST = bdf.settings['Telegram']['group_for_posts']
|
||
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.middleware(BlacklistMiddleware())
|
||
|
||
|
||
@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)
|
||
await update_user_info('voice', message)
|
||
check_user_emoji(message.from_user.id)
|
||
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 update_user_info('voice', message)
|
||
check_user_emoji(message.from_user.id)
|
||
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)
|
||
await update_user_info('voice', message)
|
||
check_user_emoji(message.from_user.id)
|
||
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="<b>Привет.</b>", parse_mode='html', reply_markup=markup,
|
||
disable_web_page_preview=not PREVIEW_LINK)
|
||
time.sleep(0.3)
|
||
await message.answer(text="<i>Здесь можно послушать голосовые сообщения от совершенно незнакомых людей из "
|
||
"Бийска</i>",
|
||
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="Записывать можно всё что угодно — никаких правил нет. Главное — твой голос, <i>хотя "
|
||
"бы на 5-10 секунд</i>",
|
||
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="<b>ну всё, достаточно инструкций. записывайся! Микрофон твой - </b> 🎤",
|
||
parse_mode='html', reply_markup=markup,
|
||
disable_web_page_preview=not PREVIEW_LINK)
|
||
|
||
|
||
@voice_router.message(
|
||
ChatTypeFilter(chat_type=["private"]),
|
||
Command("refresh")
|
||
)
|
||
async def refresh_listen_function(message: types.Message, state: FSMContext):
|
||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||
await update_user_info('voice', message)
|
||
markup = get_main_keyboard()
|
||
check_user_emoji(message.from_user.id)
|
||
BotDB.delete_listen_count_for_user(message.from_user.id)
|
||
await message.answer(
|
||
text='Прослушивания очищены. Можешь начать слушать заново🤗', disable_web_page_preview=not PREVIEW_LINK,
|
||
markup=markup)
|
||
await state.set_state('START')
|
||
|
||
|
||
@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)
|
||
try:
|
||
message_with_date = last_message()
|
||
await message.answer(text=message_with_date, parse_mode="html")
|
||
except Exception as e:
|
||
logger.error(f'Не удалось получить дату последнего сообщения - {e}')
|
||
await state.set_state('STANDUP_WRITE')
|
||
|
||
|
||
@voice_router.message(
|
||
StateFilter("STANDUP_WRITE"),
|
||
ChatTypeFilter(chat_type=["private"]),
|
||
)
|
||
async def suggest_voice(message: types.Message, state: FSMContext):
|
||
logger.info(
|
||
f"Вызов функции suggest_voice. Пользователь: {message.from_user.id} Имя автора сообщения: {message.from_user.full_name}")
|
||
await message.forward(chat_id=GROUP_FOR_LOGS)
|
||
markup = get_main_keyboard()
|
||
if message.content_type == 'voice':
|
||
markup_for_voice = get_reply_keyboard_for_voice()
|
||
# Отправляем аудио в приватный канал
|
||
sent_message = await send_voice_message(GROUP_FOR_POST, message,
|
||
message.voice.file_id, markup_for_voice)
|
||
|
||
# Сохраняем в базу инфо о посте
|
||
BotDB.set_user_id_and_message_id_for_voice_bot(sent_message.message_id, message.from_user.id)
|
||
|
||
# Отправляем юзеру ответ и возвращаем его в меню
|
||
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):
|
||
check_audio = BotDB.check_listen_audio(user_id=message.from_user.id)
|
||
list_audio = list(check_audio)
|
||
markup = get_main_keyboard()
|
||
if not list_audio:
|
||
await message.answer(text='Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится',
|
||
reply_markup=markup)
|
||
try:
|
||
message_with_date = last_message()
|
||
await message.answer(text=message_with_date, parse_mode="html")
|
||
except Exception as e:
|
||
logger.error(f'Не удалось получить последнюю дату {e}')
|
||
else:
|
||
# Получаем эмоджи пользователя
|
||
number_element = random.randint(0, len(list_audio) - 1)
|
||
audio_for_user = check_audio[number_element]
|
||
# Получаем автора записи + эмодзи по нему
|
||
user_id = BotDB.get_user_id_by_file_name(audio_for_user)
|
||
user_emoji = BotDB.check_emoji_for_user(user_id)
|
||
|
||
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)
|
||
if user_emoji:
|
||
await message.bot.send_voice(chat_id=message.chat.id, voice=voice, caption=user_emoji, reply_markup=markup)
|
||
else:
|
||
await message.bot.send_voice(chat_id=message.chat.id, voice=voice, reply_markup=markup)
|
||
await message.answer(text=f'Осталось непрослушанных: <b>{len(check_audio) - 1}</b>', reply_markup=markup)
|