o
    ahE'                     @   s  d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ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'm(Z(m)Z) d d
l*m+Z+ e
, Z-da.dd Z/e0ddd Z1e0ddd Z2e0ddd Z3e0ddd Z4dd Z5e0ddd Z6e0ddd Z7e0d d!d" Z8e0d#d$d# Z9d%d& Z:e0d'd(d' Z;e0d)d*d) Z<ed+e=d,d-Z>e>j?d.d/gd0d1d2 Z@dS )3    )request	Blueprintjsonify)emitN)AudioSegment)socketioclientaudio_buffers
sectionIdscharacterIdslast_ping_timemetadatabuttonsStatescharacter_actionsdistance_objectsaction_modesget_available_sttrelease_sttSTT_INSTANCESget_available_ttsrelease_ttsTTS_INSTANCES
CHUNK_SIZE)process_request_1)process_request)get_action_response)get_character_by_idupdate_token_usageget_mongo_client)TTSc                  C   s^   	 t   } tt D ]}| t|  dkr(td|  tjdi |d t| qtd q)NT   u#   ⏳ Disconnecting inactive client: Zforce_disconnectroom
   )	timelistr   keysprintr   r   onUserDisconnectsleep)Zcurrent_timesid r+   4/var/www/html/aiverses.in/BackEnd/app/chat/routes.pycheck_inactive_users   s   
r-   connectc                   C   sH   t  td u rttaW d    n1 sw   Y  tdddi d S )NmessagedatazConnected to server!)thread_lockbackground_threadr   start_background_taskr-   r   r+   r+   r+   r,   handle_connect%   s   
r4   
disconnectc                  C   s.   t j} td|   t|  td|   d S )Nu   ❌ Client disconnected: u   🗑 Cleaned up data for )r   r*   r'   r(   r*   r+   r+   r,   handle_disconnect.   s   r7   Ztoggle_action_modec                 C   s0   t j}| dd}|t|< tdd|i|d d S )NenabledFZaction_mode_toggledr!   )r   r*   getr   r   )r0   r*   r8   r+   r+   r,   handle_toggle_action_mode6   s   r:   Zping_from_clientc                  C   s4   t j} td|   t t| < tjdi | d d S )Nu   🔄 Received ping from Zpong_from_serverr!   )r   r*   r'   r$   r   r   r   r6   r+   r+   r,   handle_ping=   s   r;   c                 C   sp   t | d  t| d  t| d  t| d  t| d  t| d  t| d  t| d  t	| d  d S )N)
r	   popr   r
   r   r   r   r   r   r   r6   r+   r+   r,   r(   D   s   r(   Zupdate_Character_idc                 C   s   |  dd}|ttj< dttj< d i dttj< t|} |  ddttj< td }|d }|  d	}|r@|	d	|id
d|ii t
jddditjd d S )Ncharacter_id $)Z	rag_chainmemoryZtoggle_buttonFcharacter_testclients	client_idz$setselected_character_idZupdate_successr/   z!Character ID updated successfullyr!   )r9   r   r   r*   r
   r   r   r   r   
update_oner   r   )r0   Zcharacteriddbclients_collectionrC   r+   r+   r,   updateCharacteridP   s   



rH   start_audio_streamc                   C   s   t  ttj< dS )zCInitialize a new buffer for a client when they start sending audio.N)ioBytesIOr	   r   r*   r+   r+   r+   r,   rI   i   s   audio_chunkc                 C   s@   t jtvrt tt j< t| trt| } tt j 	|  dS )z.Receive audio byte chunks and write to buffer.N)
r   r*   r	   rJ   rK   
isinstancestrbase64	b64decodewrite)chunkr+   r+   r,   handle_audio_chunkn   s
   


rS   end_audio_streamc               
   C   s0  t jtvrtdddi dS tt j} | d dt j d}t }t| }z`z2t|d}|	| 
  W d   n1 s@w   Y  ||}|d	 }td
d	|i t| W n tyu } ztddt|i W Y d}~nd}~ww W tj|rt| t| dS tj|rt| t| w )z0Process the collected audio when streaming ends.transcriptionerrorzNo audio received.Nr   Ztemp_audio_z.wavwbtextZuser_audio_textr/   )r   r*   r	   r   r<   seekr   r   openrQ   getvalue
transcribe
handleChat	ExceptionrN   ospathexistsremover   )Z
audio_dataZtemp_wav_pathZ	stt_indexZ	stt_modelfresulttranscription_texter+   r+   r,   rT   z   s6   





c                 C   s  | t tj ttj d}tjtv r;ttj r;td ttjg }ttjg }t	| ||}td| t tj |d< nt
tj rLtd tt|tj}ntd tt|tj}td|  td|d   |d t tj< td	d
|d i ttttj |d d t|d dd d S )N)r/   
section_idr=   zIaction mode is enables and actions and objects are added to the chat datazaction response : rg   zNarriative design is enabledzKnowledge bank is enabledu   💬 Chat Response: u   🔵 New section ID: chat_responserX   responsetoken_usage)r=   rj   Zfemale)rX   gender)r
   r   r*   r   r   r'   r   r9   r   r   r   r   r   r   r   r   synthesize_audio)re   	chat_dataactions	distancesrh   r+   r+   r,   r]      s0   

r]   rl   c              
   C   sb  |  dd}|stdddi dS t }t| }zzit }|j||d |d tj	|d	d
}|
ddd}t }|j|d	dd | }t|t d t }t|D ]}	||	t |	d t  }
t|
d}td||	|d qZtdddi W n ty } ztddt|i W Y d}~nd}~ww W t| dS W t| dS t| w )z5Convert text to speech and stream audio in real-time.rX   r>   rV   r/   zMissing textN)rX   	file_pathr   wav)formati>        	pcm_s16le)rr   codeczutf-8rL   )rR   indextotal_chunksZaudio_completezAudio synthesis complete)r9   r   r   r   rJ   rK   tts_to_filerY   r   	from_fileZset_frame_rateZset_channelsZset_sample_widthexportr[   lenr   rangerO   	b64encodedecoder^   rN   r   )r0   rX   Z	tts_index	tts_modelZaudio_bufferaudioZaudio_bytes_ioZaudio_bytesrx   irR   Zencoded_chunkrf   r+   r+   r,   rl      s:   
	text_chatc                 C   s   t | d d S )NZ	userInput)r]   r9   )r0   r+   r+   r,   r      s   Z	chat_restz/api)
url_prefixz/chatPOST)methodsc                  C   s`   t  } | d}| d}|r|stddidfS ||dd}td |d }td|dd	iS )
Npromptr=   rV   zMissing prompt or character_idi  r?   )r/   r=   rg   ri   zNo response)r   get_jsonr9   r   r   )r0   r   r=   rm   ri   r+   r+   r,   chat_with_character   s   

r   )Aflaskr   r   r   flask_socketior   rO   r_   rJ   r$   	threadingZpydubr   app.corer   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZEAi_Agents.services.process_requests.process_request_narriative_designr   ZBAi_Agents.services.process_requests.process_request_knowledge_bankr   Z4Ai_Agents.services.llm_functions.get_action_responser   app.database.fetch_datar   r   r   TTS.apir   Lockr1   r2   r-   onr4   r7   r:   r;   r(   rH   rI   rS   rT   r]   rl   r   __name__chat_rest_bprouter   r+   r+   r+   r,   <module>   sT    P







*
#
