§
    æ˜ºh0#  ã                  óÂ   — d dl m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 d dlmZ d dlmZ er
d dlZd dlmZ dd„Z G d„ de¦  «        Zdd„Z G d„ de¦  «        ZdS )é    )ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚDictÚListÚOptionalÚUnion©ÚDocument)Ú
BaseLoader)Ú
EntityLikeÚrowÚdictÚreturnÚstrc                óH   — | d         }| d         }| d         }|› d|› d|› d�S )zBCombine message information in a readable format ready to be used.ÚdateÚfromÚtextz on z: ú

© )r   r   Úsenderr   s       úu/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/document_loaders/telegram.pyÚconcatenate_rowsr      s<   € àˆvŒ;€DØ�Œ[€FØˆvŒ;€DØÐ,Ð,˜$Ð,Ð, $Ð,Ð,Ð,Ð,ó    c                  ó"   — e Zd ZdZd	d„Zd
d„ZdS )ÚTelegramChatFileLoaderzLoad from `Telegram chat` dump.Úpathr   c                ó   — || _         dS )zInitialize with a path.N)Ú	file_path)Úselfr   s     r   Ú__init__zTelegramChatFileLoader.__init__   s   € àˆŒˆˆr   r   úList[Document]c                ó4  — t          | j        ¦  «        }t          |d¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   d                     d„ |d         D ¦   «         ¦  «        }dt          |¦  «        i}t          ||¬¦  «        gS )	úLoad documents.Úutf8©ÚencodingNÚ c              3  ó‚   K  — | ]:}|d          dk    ¯t          |d         t          ¦  «        ¯)t          |¦  «        V — Œ;dS )ÚtypeÚmessager   N)Ú
isinstancer   r   )Ú.0r,   s     r   ú	<genexpr>z.TelegramChatFileLoader.load.<locals>.<genexpr>'   sX   è è € ð 
ð 
àØ�vŒ )Ò+Ð+µ
¸7À6¼?ÍCÑ0PÔ0PÐ+õ ˜WÑ%Ô%à+Ð+Ð+Ð+ð
ð 
r   ÚmessagesÚsource©Úpage_contentÚmetadata)r   r    ÚopenÚjsonÚloadÚjoinr   r   )r!   ÚpÚfÚdr   r4   s         r   r7   zTelegramChatFileLoader.load    sà   € å�”Ñ Ô ˆå�!˜fÐ%Ñ%Ô%ð 	¨Ý”	˜!‘”ˆAð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð �wŠwð 
ð 
à˜Zœ=ð
ñ 
ô 
ñ 
ô 
ˆð
 �c !™fœfÐ%ˆå d°XÐ>Ñ>Ô>Ð?Ð?s   ¦AÁAÁAN)r   r   ©r   r#   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r7   r   r   r   r   r      sH   € € € € € Ø)Ð)ðð ð ð ð@ð @ð @ð @ð @ð @r   r   r   úUnion[str, List[str]]r#   c                óÜ  — ddl m} t          | t          ¦  «        r| g} d„ | D ¦   «         }t	          |¦  «        D ]\  }}|dz   |j        d<   Œg }|D ]š} |dg d¢d¬	¦  «        }|                     |j        ¦  «        }t	          |¦  «        D ]^\  }}t          ||j        d         |d
œ¬¦  «        }|j        d         › d|j        d         › �|j        d<   | 	                    |¦  «         Œ_Œ›|S )zIConvert a string or list of strings to a list of Documents with metadata.r   )ÚRecursiveCharacterTextSplitterc                ó.   — g | ]}t          |¬ ¦  «        ‘ŒS ))r3   r
   )r.   Úpages     r   ú
<listcomp>z text_to_docs.<locals>.<listcomp>8   s#   € Ð>Ð>Ð>°• tÐ,Ñ,Ô,Ð>Ð>Ð>r   é   rE   i   )r   ú
ú.ú!ú?ú,ú r)   é   )Ú
chunk_sizeÚ
separatorsÚchunk_overlap)rE   Úchunkr2   ú-rR   r1   )
Úlangchain.text_splitterrC   r-   r   Ú	enumerater4   Ú
split_textr3   r   Úappend)	r   rC   Ú	page_docsÚiÚdocÚ
doc_chunksÚtext_splitterÚchunksrR   s	            r   Útext_to_docsr^   1   sV  € àFÐFÐFÐFÐFÐFå�$�ÑÔð àˆvˆØ>Ð>¸Ð>Ñ>Ô>€Iõ ˜IÑ&Ô&ð %ð %‰ˆˆ3Ø  1™uˆŒ�VÑÐð €Jàð #ð #ˆØ6Ð6ØØBÐBÐBØð
ñ 
ô 
ˆð
 ×)Ò)¨#Ô*:Ñ;Ô;ˆÝ! &Ñ)Ô)ð 	#ð 	#‰HˆAˆuÝØ"°c´lÀ6Ô6JÐUVÐ-WÐ-Wðñ ô ˆCð ),¬°VÔ(<Ð%VÐ%V¸s¼|ÈGÔ?TÐ%VÐ%VˆCŒL˜Ñ"Ø×Ò˜cÑ"Ô"Ð"Ð"ð	#ð Ðr   c                  óF   — e Zd ZdZ	 	 	 	 	 ddd„Zdd„Zdd„Zdd„Zdd„ZdS ) ÚTelegramChatApiLoaderz)Load `Telegram` chat json directory dump.Nútelegram_data.jsonÚchat_entityúOptional[EntityLike]Úapi_idúOptional[int]Úapi_hashúOptional[str]Úusernamer    r   c                óL   — || _         || _        || _        || _        || _        dS )aI  Initialize with API parameters.

        Args:
            chat_entity: The chat entity to fetch data from.
            api_id: The API ID.
            api_hash: The API hash.
            username: The username.
            file_path: The file path to save the data to. Defaults to
                 "telegram_data.json".
        N)rb   rd   rf   rh   r    )r!   rb   rd   rf   rh   r    s         r   r"   zTelegramChatApiLoader.__init__U   s,   € ð$ 'ˆÔØˆŒØ ˆŒØ ˆŒØ"ˆŒˆˆr   r   ÚNonec              ƒ  ó4  K  — ddl m} g } || j        | j        | j        ¦  «        4 ƒd{V —†}|                     | j        ¦  «        2 3 d{V —†}|j        du}|r|j        j        nd}| 	                    |j
        |j        |j                             ¦   «         |j        ||dœ¦  «         Œc6 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t          | j        dd¬¦  «        5 }t#          j        ||dd	¬
¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z8Fetch data from Telegram API and save it as a JSON file.r   )ÚTelegramClientN)Ú	sender_idr   r   ú
message.idÚis_replyÚreply_to_idÚwzutf-8r'   Fé   )Úensure_asciiÚindent)Útelethon.syncrl   rh   rd   rf   Úiter_messagesrb   Úreply_toÚreply_to_msg_idrW   rm   r   r   Ú	isoformatÚidr5   r    r6   Údump)r!   rl   ÚdataÚclientr,   ro   rp   r:   s           r   Úfetch_data_from_telegramz.TelegramChatApiLoader.fetch_data_from_telegramm   s(  è è € à0Ð0Ð0Ð0Ð0Ð0àˆØ!�> $¤-°´¸d¼mÑLÔLð 	ð 	ð 	ð 	ð 	ð 	ð 	ÐPVØ!'×!5Ò!5°dÔ6FÑ!GÔ!Gð ð ð ð ð ð ð �gØ"Ô+°4Ð7�ØBJÐT˜gÔ.Ô>Ð>ÐPT�Ø—’à%,Ô%6Ø '¤Ø '¤× 6Ò 6Ñ 8Ô 8Ø&-¤jØ$,Ø'2ðð ñ	ô 	ð 	ð 	ð "HÐ!Gð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ �$”. #°Ð8Ñ8Ô8ð 	=¸AÝŒI�d˜A¨E¸!Ð<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=s0   ­B?ÁB+ÁAB?Â?
C	ÃC	Ã'DÄDÄDr|   úpd.DataFramer   c                óê   ‡‡— dˆfd„Š||d                   }||d                                        d	g¬
¦  «        Š‰d	                              t          ¦  «        ‰d	<   ˆˆfd„|d         D ¦   «         }|S )a
  Create a dictionary of message threads from the given data.

        Args:
            data (pd.DataFrame): A DataFrame containing the conversation                 data with columns:
                - message.sender_id
                - text
                - date
                - message.id
                - is_reply
                - reply_to_id

        Returns:
            dict: A dictionary where the key is the parent message ID and                 the value is a list of message IDs in ascending order.
        Ú	parent_idÚintÚ
reply_datar   r   ú	List[int]c                ó�   •— ||d         | k             d                               ¦   «         }g }|D ]}||g ‰||¦  «        z   z  }Œ|S )a^  
            Recursively find all replies to a given parent message ID.

            Args:
                parent_id (int): The parent message ID.
                reply_data (pd.DataFrame): A DataFrame containing reply messages.

            Returns:
                list: A list of message IDs that are replies to the parent message ID.
            rp   rn   )Útolist)r�   rƒ   Údirect_repliesÚall_repliesÚreply_idÚfind_repliess        €r   rŠ   z@TelegramChatApiLoader._get_message_threads.<locals>.find_replies–   sj   ø€ ð (¨
°=Ô(AÀYÒ(NÔOØôçŠf‰hŒhð ð
 ˆKØ*ð Oð O�Ø ˜z¨L¨L¸À:Ñ,NÔ,NÑNÑN��àÐr   ro   rp   )Úsubsetc                ó2   •— i | ]}||g ‰|‰¦  «        z   “ŒS r   r   )r.   r�   rŠ   Úreply_messagess     €€r   ú
<dictcomp>z>TelegramChatApiLoader._get_message_threads.<locals>.<dictcomp>¸   s>   ø€ ð 
ð 
ð 
àð ˜	�{ \ \°)¸^Ñ%LÔ%LÑLð
ð 
ð 
r   rn   )r�   r‚   rƒ   r   r   r„   )ÚdropnaÚastyper‚   )r!   r|   Úparent_messagesÚmessage_threadsrŠ   r�   s       @@r   Ú_get_message_threadsz*TelegramChatApiLoader._get_message_threads„   s³   øø€ ð$	ð 	ð 	ð 	ð 	ð 	ð0   ZÔ 0Ð0Ô1ˆð ˜d :Ô.Ô/×6Ò6¸}¸oÐ6ÑNÔNˆð )7°}Ô(E×(LÒ(LÍSÑ(QÔ(Qˆ�}Ñ%ð
ð 
ð 
ð 
ð 
à,¨\Ô:ð
ñ 
ô 
ˆð
 Ðr   r’   úDict[int, List[int]]c                óJ  — d}|                      ¦   «         D ]y\  }}||d                              |¦  «                                      d¬¦  «        d                              ¦   «         }d„ |D ¦   «         }|d                     |¦  «        dz   z  }Œz|                     ¦   «         S )	aw  
        Combine the message texts for each parent message ID based             on the list of message threads.

        Args:
            message_threads (dict): A dictionary where the key is the parent message                 ID and the value is a list of message IDs in ascending order.
            data (pd.DataFrame): A DataFrame containing the conversation data:
                - message.sender_id
                - text
                - date
                - message.id
                - is_reply
                - reply_to_id

        Returns:
            str: A combined string of message texts sorted by date.
        r)   rn   r   )Úbyr   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )r   )r.   Úelems     r   rF   z@TelegramChatApiLoader._combine_message_texts.<locals>.<listcomp>Þ   s   € ÐAÐAÐA¨4�S ™YœYÐAÐAÐAr   rM   z.
)ÚitemsÚisinÚsort_valuesr†   r8   Ústrip)r!   r’   r|   Úcombined_textr�   Úmessage_idsÚmessage_textss          r   Ú_combine_message_textsz,TelegramChatApiLoader._combine_message_texts¿   s³   € ð* ˆð '6×&;Ò&;Ñ&=Ô&=ð 
	=ð 
	=Ñ"ˆI�{ð �T˜,Ô'×,Ò,¨[Ñ9Ô9Ô:ß’ �Ñ'Ô'¨ô0ç’‘”ð ð
 BÐA°=ÐAÑAÔAˆMð ˜SŸXšX mÑ4Ô4°uÑ<Ñ<ˆMˆMà×"Ò"Ñ$Ô$Ð$r   r#   c                óf  — | j         �]	 ddl}|                     ¦   «          t          j        |                      ¦   «         ¦  «         n# t          $ r t          d¦  «        ‚w xY wt          | j        ¦  «        }t          |d¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   	 ddl}n# t          $ r t          d¦  «        ‚w xY w |j        |¦  «        } |j        |¦  «        }|                      |¦  «        }|                      ||¦  «        }	t#          |	¦  «        S )r%   Nr   zy`nest_asyncio` package not found.
                    please install with `pip install nest_asyncio`
                    r&   r'   zf`pandas` package not found. 
                please install with `pip install pandas`
                )rb   Únest_asyncioÚapplyÚasyncioÚrunr~   ÚImportErrorr   r    r5   r6   r7   ÚpandasÚjson_normalizeÚ	DataFramer“   r    r^   )
r!   r¢   r9   r:   r;   ÚpdÚnormalized_messagesÚdfr’   Úcombined_textss
             r   r7   zTelegramChatApiLoader.loadå   s§  € ð ÔÐ'ð
Ø#Ð#Ð#Ð#à×"Ò"Ñ$Ô$Ð$Ý”˜D×9Ò9Ñ;Ô;Ñ<Ô<Ð<Ð<øÝð ð ð Ý!ðñô ð ðøøøõ �”Ñ Ô ˆå�!˜fÐ%Ñ%Ô%ð 	¨Ý”	˜!‘”ˆAð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð	ØÐÐÐÐøÝð 	ð 	ð 	Ýðñô ð ð	øøøð 0˜bÔ/°Ñ2Ô2ÐØˆRŒ\Ð-Ñ.Ô.ˆà×3Ò3°BÑ7Ô7ˆØ×4Ò4°_ÀbÑIÔIˆå˜NÑ+Ô+Ð+s)   ‰>A ÁA"Â
B+Â+B/Â2B/Â7B< Â<C)NNNNra   )
rb   rc   rd   re   rf   rg   rh   rg   r    r   )r   rj   )r|   r   r   r   )r’   r”   r|   r   r   r   r<   )	r=   r>   r?   r@   r"   r~   r“   r    r7   r   r   r   r`   r`   R   s–   € € € € € Ø3Ð3ð -1Ø $Ø"&Ø"&Ø-ð#ð #ð #ð #ð #ð0=ð =ð =ð =ð.9ð 9ð 9ð 9ðv$%ð $%ð $%ð $%ðL",ð ",ð ",ð ",ð ",ð ",r   r`   )r   r   r   r   )r   rA   r   r#   )Ú
__future__r   r¤   r6   Úpathlibr   Útypingr   r   r   r   r	   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   r§   rª   Útelethon.hintsr   r   r   r^   r`   r   r   r   ú<module>r´      sH  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @àð *ØÐÐÐØ)Ð)Ð)Ð)Ð)Ð)ð-ð -ð -ð -ð@ð @ð @ð @ð @˜Zñ @ô @ð @ð0ð ð ð ðBu,ð u,ð u,ð u,ð u,˜Jñ u,ô u,ð u,ð u,ð u,r   