a
    NpJhh                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ G dd deZG dd dZ dS )    N)DictAny)Bot
DispatchertypesF)CommandStateFilter)
FSMContext)StateStatesGroup)MessageCallbackQueryFSInputFile)Config)DatabaseManager)ShazamService)InlineKeyboardsc                   @   s   e Zd Ze Ze ZdS )	BotStatesN)__name__
__module____qualname__r   waiting_search_textwaiting_audio_file r   r   &/var/www/shaz/handlers/bot_handlers.pyr      s   r   c                   @   s  e Zd ZdZeedddZdd Zee	ddd	Z
ejee	ef d
ddZeedddZedddZedddZedddZeedddZeedddZeedddZeeddd Zedd!d"Zedd#d$Zedd%d&Zedd'd(Zedd)d*Zedd+d,Z edd-d.Z!edd/d0Z"edd1d2Z#edd3d4Z$edd5d6Z%edd7d8Z&edd9d:Z'd;S )<BotHandlersz-
    Bot handler'lari uchun asosiy klass
    )botdpc                 C   s(   || _ || _t | _t | _|   d S )N)r   r   r   dbr   shazamregister_handlers)selfr   r   r   r   r   __init__   s
    zBotHandlers.__init__c                 C   s  | j j| jtd | j j| jtd | j j| jtj	dk | j j| j
tj	dk | j j| jtj	dk | j j| jtj	dk | j j| jtj	dk | j j| jtj	dk | j j| jtj	d	k | j j| jtj	d
k | j j| jtj	dk | j j| jtj	dk | j j| jtj	d | j j| jtj	d | j j| jtj	d | j j| jtj	d | j j| jtj	d | j j| jtj	d | j j| jtj	d | j j| jttj | j j| jttj  dS )z4
        Handler'larni ro'yxatdan o'tkazish
        starthelp	main_menusearchZsearch_textZsearch_audioZ	top_songshistory	favoritesZsettingsZsettings_languageZsettings_qualityzset_language:zset_quality:zsong_details:z	download:zdl_quality:zadd_favorite:zremove_favorite:N)!r   messageregisterstart_commandr   help_commandcallback_querymain_menu_handlerr   datasearch_handlersearch_text_handlersearch_audio_handlertop_songs_handlerhistory_handlerfavorites_handlersettings_handlersettings_language_handlersettings_quality_handlerset_language_handler
startswithset_quality_handlersong_details_handlerdownload_handlerdownload_quality_handleradd_favorite_handlerremove_favorite_handlertext_search_handlerr	   r   r   audio_search_handlerr   )r"   r   r   r   r!   "   s*    zBotHandlers.register_handlers)user_idreturnc                    s   | j |}|r|d S dS )z,
        Foydalanuvchi tilini olish
        languageuz)r   get_user)r"   rD   userr   r   r   get_user_languageE   s    zBotHandlers.get_user_language)telegram_userrE   c                    s>   | j |j}|s:| j |j|j|j|j | j |j}|S )z5
        Foydalanuvchini olish yoki yaratish
        )r   rH   idZcreate_userusername
first_name	last_name)r"   rK   rI   r   r   r   get_or_create_userL   s    zBotHandlers.get_or_create_user)r*   statec                    s   |  I dH  | |jI dH }|d }d|jj dd|jj dd|jj dd	}|||d
 }t|}|j||dI dH  t	d|jj
  dS )z"
        /start komandasi
        NrF   zAssalomu alaykum, u   ! 🎵

Muzlar botiga xush kelibsiz!

Bu bot orqali siz:
🔍 Qo'shiqlarni qidirishingiz
⬇️ Yuklab olishingiz
❤️ Sevimlilaringizga qo'shishingiz mumkinu!   Добро пожаловать, u   ! 🎵

Добро пожаловать в Muzlar бот!

С помощью этого бота вы можете:
🔍 Искать песни
⬇️ Скачивать их
❤️ Добавлять в избранноеz	Welcome, uy   ! 🎵

Welcome to Muzlar bot!

With this bot you can:
🔍 Search for songs
⬇️ Download them
❤️ Add to favoritesrG   ruenrG   reply_markupzYangi foydalanuvchi: )clearrP   	from_userrN   getr   r&   answerlogginginforL   )r"   r*   rQ   rI   rF   Zwelcome_textstextkeyboardr   r   r   r,   [   s    
zBotHandlers.start_command)r*   c                    sR   |  |jjI dH }dddd}|||d }t|}|j||dI dH  dS )z!
        /help komandasi
        Nu   🤖 Muzlar Bot yordam

🔍 Qidiruv - qo'shiqlarni matn yoki audio orqali qidiring
🔥 TOP - eng mashhur qo'shiqlar
📝 Tarix - qidiruv tarixingiz
❤️ Sevimlilar - sevimli qo'shiqlaringiz
⚙️ Sozlamalar - til va sifat sozlamalariun  🤖 Muzlar Bot помощь

🔍 Поиск - ищите песни по тексту или аудио
🔥 ТОП - самые популярные песни
📝 История - ваша история поиска
❤️ Избранное - ваши избранные песни
⚙️ Настройки - настройки языка и качестваu   🤖 Muzlar Bot help

🔍 Search - search for songs by text or audio
🔥 TOP - most popular songs
📝 History - your search history
❤️ Favorites - your favorite songs
⚙️ Settings - language and quality settingsrR   rG   rU   )rJ   rX   rL   rY   r   r&   rZ   )r"   r*   rF   Z
help_textsr]   r^   r   r   r   r-   o   s    
zBotHandlers.help_command)callbackc                    sb   |  |jjI dH }dddd}|||d }t|}|jj||dI dH  | I dH  dS )z(
        Asosiy menyuga qaytish
        Nu   🎵 Asosiy menyuu   🎵 Главное менюu   🎵 Main menurR   rG   rU   )	rJ   rX   rL   rY   r   r&   r*   	edit_textrZ   )r"   r_   rF   Zmain_menu_textsr]   r^   r   r   r   r/      s    
zBotHandlers.main_menu_handlerc                    sb   |  |jjI dH }dddd}|||d }t|}|jj||dI dH  | I dH  dS )z!
        Qidiruv menyusi
        Nu   🔍 Qidiruv turini tanlang:u*   🔍 Выберите тип поиска:u   🔍 Choose search type:rR   rG   rU   )	rJ   rX   rL   rY   r   Zsearch_menur*   r`   rZ   )r"   r_   rF   Zsearch_textsr]   r^   r   r   r   r1      s    
zBotHandlers.search_handler)r_   rQ   c                    sf   |  |jjI dH }dddd}|||d }|j|I dH  |tjI dH  |	 I dH  dS )z%
        Matn orqali qidiruv
        Nu*   ✍️ Qo'shiq yoki ijrochi nomini yozing:uR   ✍️ Напишите название песни или исполнителя:u!   ✍️ Write song or artist name:rR   rG   )
rJ   rX   rL   rY   r*   r`   	set_stater   r   rZ   )r"   r_   rQ   rF   Zsearch_prompt_textsr]   r   r   r   r2      s    zBotHandlers.search_text_handlerc                    sf   |  |jjI dH }dddd}|||d }|j|I dH  |tjI dH  |	 I dH  dS )z&
        Audio orqali qidiruv
        Nu0   🎵 Audio faylni yuboring (maksimal 20 soniya):uO   🎵 Отправьте аудио файл (максимум 20 секунд):u*   🎵 Send audio file (maximum 20 seconds):rR   rG   )
rJ   rX   rL   rY   r*   r`   ra   r   r   rZ   )r"   r_   rQ   rF   Zaudio_prompt_textsr]   r   r   r   r3      s    z BotHandlers.search_audio_handlerc                    s2  |  I dH  |j}| |jjI dH }dddd}||||d I dH }zj| j|dI dH }|rh| 	|jI dH }| j
|d |t|d	 d
| dt| ddt| d| ddt| d| dd}	|	||	d }
t|d|}|j|
|dI dH  |D ]R}| j
|d |d |d |d|d|d|d|d|d	 qnRd| dd| dd| dd}|||d }
t|}|j|
|dI dH  W np ty, } zVtd |  d!d"d#d}|||d }
t|}|j|
|dI dH  W Y d}~n
d}~0 0 dS )$z&
        Matn qidiruvi javobi
        Nu!   🔍 Qidiruv... Iltimos kuting...u=   🔍 Поиск... Пожалуйста подождите...u    🔍 Searching... Please wait...rR   rG   
   rL   r]   u   🔍 'z' uchun z ta natija:u   🔍 u     результатов для 'z':z results for 'r   rU   titleartistalbumduration	cover_urlpreview_urldownload_url	file_sizeu   ❌ 'z' uchun hech narsa topilmadi.u-   ❌ Ничего не найдено для 'z'.u   ❌ Nothing found for 'zQidiruv xatosi: u?   ❌ Qidiruv vaqtida xatolik yuz berdi. Qaytadan urinib ko'ring.u\   ❌ Произошла ошибка при поиске. Попробуйте еще раз.u/   ❌ An error occurred during search. Try again.)rW   r]   rJ   rX   rL   rZ   rY   r    Zsearch_songsrP   r   add_search_historylenr   
songs_listr`   add_songr&   	Exceptionr[   error)r"   r*   rQ   queryrF   loading_textsloading_msgsongsrI   Zresults_textsr]   r^   songZno_results_textseerror_textsr   r   r   rB      sV    





zBotHandlers.text_search_handlerc                    s  |  I dH  |js^|js^| |jjI dH }dddd}|||d }||I dH  dS | |jjI dH }ddd	d}||||d I dH }z|jp|j}| j	|j
I dH }	tjtjd
d tj d|jj d}
| j|	j|
I dH  | j|
I dH }zt|
 W n   Y n0 |r| |jI dH }| j|d d|d  dd d|d  d|d  d}|dr|d|d  7 }t|d d|}|j||ddI dH  | j|d |d |d |d|d|d|d|d|d 	 n:d!d"d#d}|||d }t|}|j||d$I dH  W np ty } zVtd%|  d&d'd(d}|||d }t|}|j||d$I dH  W Y d}~n
d}~0 0 dS ))z'
        Audio qidiruvi javobi
        Nu!   ❌ Iltimos, audio fayl yuboring!uA   ❌ Пожалуйста, отправьте аудио файл!u   ❌ Please send an audio file!rR   rG   u/   🎵 Audio tanib olinmoqda... Iltimos kuting...uR   🎵 Распознаем аудио... Пожалуйста подождите...u(   🎵 Recognizing audio... Please wait...T)exist_okZaudio_z.oggrL   zAudio: rc      audio   🎵 *u   *
👤 *rd   *re   u   
💿 FMarkdownrV   
parse_moderf   rg   rh   ri   rj   u<   ❌ Audio tanib olinmadi. Boshqa audio bilan urinib ko'ring.uW   ❌ Аудио не распознано. Попробуйте другое аудио.u,   ❌ Audio not recognized. Try another audio.rU   zAudio tanib olish xatosi: u;   ❌ Audio qayta ishlashda xatolik. Qaytadan urinib ko'ring.uS   ❌ Ошибка обработки аудио. Попробуйте еще раз.u&   ❌ Audio processing error. Try again.)rW   rz   voicerJ   rX   rL   rY   rZ   r   get_filefile_idosmakedirsr   TEMP_DIRdownload_file	file_pathr    Zrecognize_audioremoverP   r   rk   r   song_detailsr`   rn   r&   ro   r[   rp   )r"   r*   rQ   rF   Zinvalid_textsr]   rr   rs   
audio_file	file_infoZ
audio_path	song_inforI   Zresult_textr^   Zno_recognition_textsrv   rw   r   r   r   rC     sr     

z BotHandlers.audio_search_handlerc                    s  |  |jjI dH }dddd}|j|||d I dH  z| jjddI dH }|rd	t| d
dt| dd	t| dd}|||d }t	
|d|}|jj||dI dH  |D ]P}| j|d |d |d |d|d|d|d|d|d	 qn<dddd}	|	||	d }t	|}|jj||dI dH  W n^ ty }
 zDtd|
  dddd}||||d I dH  W Y d}
~
n
d}
~
0 0 | I dH  dS ) z 
        TOP qo'shiqlar
        Nu"   🔥 TOP qo'shiqlar yuklanmoqda...u,   🔥 Загружаем ТОП песни...u   🔥 Loading TOP songs...rR   rG   rb   )limitu	   🔥 TOP z ta qo'shiq:u   🔥 ТОП u    песен:z songs:r   rU   rL   rc   rd   re   rf   rg   rh   ri   rj   u7   ❌ TOP qo'shiqlar yuklanmadi. Qaytadan urinib ko'ring.uV   ❌ ТОП песни не загрузились. Попробуйте еще раз.u$   ❌ TOP songs not loaded. Try again.zTOP qo'shiqlar xatosi:    ❌ Xatolik yuz berdi!$   ❌ Произошла ошибка!   ❌ An error occurred!)rJ   rX   rL   r*   r`   rY   r    Zget_top_tracksrl   r   rm   r   rn   r&   ro   r[   rp   rZ   )r"   r_   rF   rr   rt   Z	top_textsr]   r^   ru   rw   rv   Zerror_callback_textsr   r   r   r4   r  sL    
2zBotHandlers.top_songs_handlerc                    sb   |  |jjI dH }dddd}|||d }t|}|jj||dI dH  | I dH  dS )z$
        Sozlamalar menyusi
        Nu   ⚙️ Sozlamalar:u   ⚙️ Настройки:u   ⚙️ Settings:rR   rG   rU   )	rJ   rX   rL   rY   r   Zsettings_menur*   r`   rZ   )r"   r_   rF   Zsettings_textsr]   r^   r   r   r   r7     s    
zBotHandlers.settings_handlerc                    sb   |  |jjI dH }dddd}|||d }t|}|jj||dI dH  | I dH  dS )z!
        Til sozlamalari
        Nu   🌐 Tilni tanlang:u   🌐 Выберите язык:u   🌐 Choose language:rR   rG   rU   )	rJ   rX   rL   rY   r   Zlanguage_settingsr*   r`   rZ   )r"   r_   Zcurrent_langZ
lang_textsr]   r^   r   r   r   r8     s    
z%BotHandlers.settings_language_handlerc                    sr   |j dd }| jj|jj|d dddd}|||d }t|}|j	j
||d	I d
H  | I d
H  d
S )z!
        Tilni o'rnatish
        :ry   )rF   u%   ✅ Til muvaffaqiyatli o'zgartirildi!u+   ✅ Язык успешно изменен!u"   ✅ Language successfully changed!rR   rG   rU   N)r0   splitr   update_user_settingsrX   rL   rY   r   r&   r*   r`   rZ   )r"   r_   Z	lang_codesuccess_textsr]   r^   r   r   r   r:     s    
z BotHandlers.set_language_handlerc                    sb   |  |jjI dH }dddd}|||d }t|}|jj||dI dH  | I dH  dS )z+
        Sifat sozlamalari menyusi
        Nu   🎵 Audio sifatini tanlang:u2   🎵 Выберите качество аудио:u   🎵 Choose audio quality:rR   rG   rU   )	rJ   rX   rL   rY   r   Zquality_settingsr*   r`   rZ   )r"   r_   rF   quality_textsr]   r^   r   r   r   r9     s    
z$BotHandlers.settings_quality_handlerc                    s   |j dd }| |jjI dH }| jj|jj|d d| dd| dd	| dd
}|||d }t	|}|j
j||dI dH  | I dH  dS )z#
        Sifatni o'rnatish
        r   ry   N)Zaudio_qualityu   ✅ Audio sifat z kbps ga o'zgartirildi!u6   ✅ Качество аудио изменено на z kbps!u   ✅ Audio quality changed to rR   rG   rU   )r0   r   rJ   rX   rL   r   r   rY   r   r&   r*   r`   rZ   )r"   r_   qualityrF   r   r]   r^   r   r   r   r<     s    



zBotHandlers.set_quality_handlerc           	         s   |j dd }| |jjI dH }| |jI dH }| j|d sdtj	 ddtj	 dd	tj	 d
d}|
||d }|j|ddI dH  dS dddd}|
||d }t||}|jj||dI dH  | I dH  dS )z#
        Qo'shiqni yuklash
        r   ry   NrL   u&   ❌ Kunlik yuklash limitingiz tugadi (u5    ta).
💎 Premium sotib oling cheksiz yuklash uchun!uH   ❌ Ваш дневной лимит загрузок исчерпан (uQ    шт).
💎 Купите Premium для безлимитной загрузки!u(   ❌ Your daily download limit exceeded (u/    pcs).
💎 Buy Premium for unlimited download!rR   rG   T)
show_alertu   🎵 Yuklash sifatini tanlang:u8   🎵 Выберите качество загрузки:u   🎵 Choose download quality:rU   )r0   r   rJ   rX   rL   rP   r   Zcheck_daily_limitr   FREE_DOWNLOAD_LIMITrY   rZ   r   Zdownload_qualityr*   r`   )	r"   r_   song_idrF   rI   Zlimit_textsr]   r   r^   r   r   r   r>     s&    zBotHandlers.download_handlerc              
      s  |j d}|d }|d }| |jjI dH }| |jI dH }d| dd| dd| dd	}|j|||d
 I dH  z| j	
|}|sdddd	}	||	||	d
 I dH  W dS |d |d |d d}
| j|
|I dH }|r,tj|r,t|}d|d  d|d  d| dd|d  d|d  d| dd|d  d|d  d| dd	}| jj|jj||d |d |||d
 ddI dH }| j	|d |d ||jj | j	|d  zt| W n   Y n0 dddd	}|||d
 }t|}|jj||dI dH  n<dd d!d	}|||d
 }t|}|jj||dI dH  W n^ ty } zDtd"|  d#d$d%d	}||||d
 I dH  W Y d}~n
d}~0 0 | I dH  dS )&z2
        Sifat tanlangandan keyin yuklash
        r   ry      Nu   ⬇️ Yuklanyapti (z	 kbps)...u   ⬇️ Загружается (u   ⬇️ Downloading (rR   rG      ❌ Qo'shiq topilmadi!#   ❌ Песня не найдена!   ❌ Song not found!	shazam_idrc   rd   )rL   rc   rd   r{   z* - *u   *
💿 Sifat: z kbpsu   *
💿 Качество: u   *
💿 Quality: r}   )rc   	performercaptionr   rL   u   ✅ Muvaffaqiyatli yuklandi!u&   ✅ Успешно загружено!u   ✅ Successfully downloaded!rU   u    ❌ Yuklashda xatolik yuz berdi.u)   ❌ Ошибка при загрузке.u   ❌ Download error occurred.zYuklash xatosi: u   ❌ Yuklashda xatolik!u"   ❌ Ошибка загрузки!u   ❌ Download error!)r0   r   rJ   rX   rL   rP   r*   r`   rY   r   get_songrZ   r    Zdownload_songr   pathexistsr   r   
send_audioZadd_downloadrz   r   Zincrement_daily_downloadsr   r   r&   ro   r[   rp   )r"   r_   partsr   r   rF   rI   Zdownloading_textsru   not_found_textsr   r   r   Zcaption_textsZsent_messager   r]   r^   rw   rv   Zdownload_error_textsr   r   r   r?   2  s    





2z$BotHandlers.download_quality_handlerc                    sJ  |j dd  | |jjI dH }| |jI dH }| j }|srdddd}||	||d I dH  dS | j
|d	 }t fd
d|D }d|d  d}|d|d  d7 }|d r|d|d  d7 }|d r|d d }	|d d }
|d|	 d|
dd7 }t ||}|jj||ddI dH  | I dH  dS )z&
        Qo'shiq tafsilotlari
        r   ry   Nr   r   r   rR   rG   rL   c                 3   s   | ]}|d   kV  qdS )r   Nr   ).0favr   r   r   	<genexpr>      z3BotHandlers.song_details_handler.<locals>.<genexpr>r{   rc   z*
u   👤 *rd   re   u   💿 
rf   <   u   ⏱ Z02dr}   r~   )r0   r   rJ   rX   rL   rP   r   r   rZ   rY   get_favoritesanyr   r   r*   r`   )r"   r_   rF   rI   ru   r   r)   Zis_favoriteZdetails_textZduration_minZduration_secr^   r   r   r   r=     s0    
z BotHandlers.song_details_handlerc                    s   |j dd }| |jjI dH }| |jI dH }| j|}|r| j|d |d  dddd}|	|
||d	 I dH  n(d
ddd}|	|
||d	 I dH  dS )z0
        Sevimlilar ro'yxatiga qo'shish
        r   ry   NrL   u'   ❤️ Sevimlilar ro'yxatiga qo'shildi!u0   ❤️ Добавлено в избранное!u   ❤️ Added to favorites!rR   rG   r   r   r   )r0   r   rJ   rX   rL   rP   r   r   Zadd_favoriterZ   rY   r"   r_   r   rF   rI   ru   r   rw   r   r   r   r@     s     z BotHandlers.add_favorite_handlerc                    s   |j dd }| |jjI dH }| |jI dH }| j|}|r| j|d |d  dddd}|	|
||d	 I dH  n(d
ddd}|	|
||d	 I dH  dS )z-
        Sevimlilardan olib tashlash
        r   ry   NrL   u"   💔 Sevimlilardan olib tashlandi!u.   💔 Удалено из избранного!u   💔 Removed from favorites!rR   rG   r   r   r   )r0   r   rJ   rX   rL   rP   r   r   Zremove_favoriterZ   rY   r   r   r   r   rA     s     z#BotHandlers.remove_favorite_handlerc                    sB  |  |jjI dH }| |jI dH }| j|d }|rg }|D ]J}||d |d |d |d pfd|d ppd	|d
 pzd|d pdd qBdt| ddt| ddt| dd}|||d }t	
|d	|}	|jj||	dI dH  n<dddd}
|
||
d }t	|}	|jj||	dI dH  | I dH  dS )z%
        Sevimlilar ro'yxati
        NrL   r   rc   rd   re    rf   r   rg   rh   )rL   rc   rd   re   rf   rg   rh   u   ❤️ Sevimlilar (z ta):u   ❤️ Избранное (u    шт):u   ❤️ Favorites (z pcs):rR   rG   rU   u    ❤️ Sevimlilar ro'yxati bo'shu1   ❤️ Список избранного пустu   ❤️ Favorites list is empty)rJ   rX   rL   rP   r   r   appendrl   rY   r   rm   r*   r`   r&   rZ   )r"   r_   rF   rI   r)   rt   r   Zfavorites_textsr]   r^   empty_textsr   r   r   r6     s<    





zBotHandlers.favorites_handlerc              
      s  |  |jjI dH }| |jI dH }| j|d d}|rd}dddd}|||d	 }t|d
D ]D\}}|d dkr~dnd}	|| d|	 d|d  d|d  d7 }qft	|}
|j
j||
dI dH  n<dddd}|||d	 }t	|}
|j
j||
dI dH  | I dH  dS )z 
        Qidiruv tarixi
        NrL   rb   r   u   📝 Qidiruv tarixi:

u#   📝 История поиска:

u   📝 Search history:

rR   rG   ry   search_typerz   u   🎵u   📝z.  rq   z (Zresults_countz ta)
rU   u   📝 Qidiruv tarixi bo'shu+   📝 История поиска пустаu   📝 Search history is empty)rJ   rX   rL   rP   r   Zget_search_historyrY   	enumerater   r&   r*   r`   rZ   )r"   r_   rF   rI   r(   Zhistory_textZhistory_headersiitemr   r^   r   r]   r   r   r   r5   (  s.    *

zBotHandlers.history_handlerN)(r   r   r   __doc__r   r   r#   r!   intstrrJ   r   Userr   r   rP   r   r
   r,   r-   r   r/   r1   r2   r3   rB   rC   r4   r7   r8   r:   r9   r<   r>   r?   r=   r@   rA   r6   r5   r   r   r   r   r      s4   #Hb>!j%/r   )!r[   r   asynciotypingr   r   aiogramr   r   r   r   Zaiogram.filtersr   r	   aiogram.fsm.contextr
   aiogram.fsm.stater   r   aiogram.typesr   r   r   configr   Zdatabase.db_managerr   Zservices.shazam_servicer   Zkeyboards.inline_keyboardsr   r   r   r   r   r   r   <module>   s   