Advertisement
den4ik2003

Untitled

Feb 22nd, 2024
962
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.79 KB | None | 0 0
  1. import os
  2. import random
  3. import pandas as pd
  4. import asyncio
  5.  
  6. import lyricsgenius as lg
  7. import pickle as pkl
  8. import wordcloud
  9. from aiogram import Bot, Dispatcher, types
  10. from aiogram.filters import Command, StateFilter
  11. from aiogram.types import Message, FSInputFile
  12. from aiogram.enums import ParseMode
  13. from aiogram import F
  14. from aiogram.fsm.context import FSMContext
  15. from aiogram.fsm.state import State, StatesGroup
  16.  
  17.  
  18. class UserContext(StatesGroup):
  19.     is_guessed = State()
  20.     is_true = State()
  21.  
  22.  
  23. id = 'Ve-cqnQoF0XkGOoV5Bd7ffVXIi9S38GbEwpwKCB98A-GrGPI1_qkn3EgCq5aaDKX'
  24. secret = 'zIXKeKxY2DEQ7_Vyn7uOF1okwGX4JUYRor-KRmHGxuZpZrMY_hKwWf6GxB2j-ub4itvJB7oZCjcrTnwg3vPZTA'
  25. access_token = 'F--CA-E5kwN2nCHZzGgxZ6pwFufhXsnwd4YiFLdWXsyJJOd6JT6MeXD2_vSuzOX_'
  26.  
  27. bot = Bot(token='7130759964:AAF8l9aX9zeCvQLFAtN_yzVVo7Nu-Ws_Zzs')
  28. dp = Dispatcher()
  29.  
  30. data = pd.read_csv('data.csv')
  31. genius = lg.Genius(access_token, skip_non_songs=True, remove_section_headers=True)
  32.  
  33.  
  34. async def check_answer(guess, actual_name, artist):
  35.     async_search = asyncio.to_thread(genius.search_song, guess)
  36.     guess_search = await async_search
  37.  
  38.     if guess_search is not None:
  39.         if guess_search.title == actual_name:
  40.             return True
  41.         else:
  42.             async_search = asyncio.to_thread(genius.search_song, guess, artist)
  43.             guess_search = await async_search
  44.  
  45.             if guess_search is not None:
  46.                 return guess_search.title == actual_name
  47.             else:
  48.                 return False
  49.            
  50.     return False
  51.  
  52.  
  53. with open ('vectorizer.pkl', 'rb') as f:
  54.     vectorizer = pkl.load(f)
  55.  
  56.  
  57. def create_wordcloud(song):
  58.     vecs = vectorizer.transform([song['lyrics']])
  59.     dense = vecs.todense()
  60.     lst1 = dense.tolist()
  61.     df = pd.DataFrame(lst1, columns=vectorizer.get_feature_names_out())
  62.     cloud = wordcloud.WordCloud(max_font_size=80, max_words=100, background_color="white").fit_words({word: freq for word, freq in zip(df.columns, df.loc[0])})
  63.     return cloud
  64.  
  65.  
  66. def generate_trial(data):
  67.     idx = random.randint(0, len(data) - 1)
  68.     song = data.loc[idx]
  69.     cloud = create_wordcloud(song)
  70.     params = {'title': song['title'],
  71.               'artist': song['artist'],
  72.               'url': song['url'],
  73.               'index_in_data': idx
  74.              }
  75.     if song['album'] is not None:
  76.         params['album'] = song['album']
  77.     return cloud, params
  78.  
  79.  
  80.  
  81. @dp.message(StateFilter(None), Command('play'))
  82. async def send_play(message: Message, state: FSMContext):
  83.     cloud, params = generate_trial(data)
  84.     img_path = 'img/{0}.png'.format(params['index_in_data'])
  85.  
  86.     if not os.path.exists(img_path):
  87.         cloud.to_file(img_path)
  88.    
  89.     await message.answer_photo(
  90.         FSInputFile(img_path),
  91.         caption="Угадай название трека и напиши его"
  92.     )
  93.  
  94.     await state.update_data(guessed_song=params['title'])
  95.     await state.update_data(song_artist=params['artist'])
  96.     await state.update_data(song_url=params['url'])
  97.  
  98.     await state.set_state(UserContext.is_guessed)
  99.     ctx = await state.get_data()
  100.     print(ctx)
  101.  
  102. # TODO: маршрутизатор
  103. # async def hint(message: Message, state: FSMContext):
  104. #     ctx = await state.get_data()
  105. #     message.answer('Подсказка!\n Исполнитель: {0}'.format(ctx['song_artist']))
  106.  
  107.  
  108. @dp.message(UserContext.is_guessed)  # F.text
  109. async def guess_song(message: Message, state: FSMContext):
  110.     ctx = await state.get_data()
  111.  
  112.     if await check_answer(message.text, ctx['guessed_song'], ctx['song_artist']):
  113.         await message.answer('Ты угадал! Это {0} - {1}\nПослушай: {2}'.format(ctx['guessed_song'], ctx['song_artist'], ctx['song_url']))
  114.     else:
  115.         await message.answer('Тебя постигла неудача, правильный ответ: {0} - {1}\nПослушай: {2}'.format(ctx['guessed_song'], ctx['song_artist'], ctx['song_url']))
  116.  
  117.     await state.clear()
  118.  
  119.  
  120. @dp.message(Command('start'))
  121. async def send_welcome(message: Message):
  122.     welcome_text = (
  123.         "<b>Тебя приветсвует Угадай Трек бот!</b>\n"
  124.         "Тебе будут показаны наиболее часто встречающиеся в песне слова, а ты должен будешь отгадать название трека.\n\n"
  125.         "<b>Команды:</b>\n"
  126.         "/start - Начать взаимодействие с ботом.\n"
  127.         "/play - Играть.\n"
  128.         "/help - Показать список доступных команд.\n"
  129.         "/stats - Посмотреть процент угаданных треков.\n\n"
  130.         "Удачи тебе иии... Погнали!"
  131.     )
  132.  
  133.     kb = [[types.KeyboardButton(text='Играть!')]]
  134.  
  135.     keyboard = types.ReplyKeyboardMarkup(
  136.         keyboard=kb,
  137.         resize_keyboard=True,
  138.         one_time_keyboard=True
  139.     )
  140.  
  141.     await message.reply(welcome_text, parse_mode=ParseMode.HTML, reply_markup=keyboard)
  142.  
  143.  
  144. async def help(message: Message):
  145.     help_text = (
  146.         "Потерялся? Сейчас помогу!\n\n"
  147.         "<b>Команды:</b>\n"
  148.         "/start - Начать взаимодействие с ботом.\n"
  149.         "/play - Играть.\n"
  150.         "/stats - Посмотреть процент угаданных треков."
  151.     )
  152.  
  153.     await message.reply(help_text, parse_mode=ParseMode.HTML)
  154.  
  155.  
  156. dp.message.register(help, Command('help'))
  157.  
  158.  
  159. @dp.message(StateFilter(None), F.text)
  160. async def unknown_message(message: Message, state: FSMContext):
  161.     if message.text == 'Играть!':
  162.         await send_play(message, state)
  163.     else:
  164.         await help(message)
  165.  
  166.  
  167. async def main():
  168.     await dp.start_polling(bot)
  169.  
  170.  
  171. if __name__ == "__main__":
  172.     asyncio.run(main())
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement