§
    šŠtjw#  ã                  óÆ   — 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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       úk/var/www/html/CA-Chatbot/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.ÚpathúUnion[str, Path]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   r5   s         r   r8   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#   r8   r   r   r   r   r      sH   € € € € € Ø)Ð)ðð ð ð ð@ð @ð @ð @ð @ð @r   r   r   úUnion[str, List[str]]r$   c                óÜ  — ddl m}  |dg d¢d¬¦  «        }t          | t          ¦  «        r| g} d„ | D ¦   «         }t	          |¦  «        D ]\  }}|dz   |j        d	<   Œg }|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   )ÚRecursiveCharacterTextSplitteri   )r   ú
ú.ú!ú?ú,ú r*   é   )Ú
chunk_sizeÚ
separatorsÚchunk_overlapc                ó.   — g | ]}t          |¬ ¦  «        ‘ŒS ))r4   r
   )r/   Úpages     r   ú
<listcomp>z text_to_docs.<locals>.<listcomp>>   s#   € Ð>Ð>Ð>°• tÐ,Ñ,Ô,Ð>Ð>Ð>r   é   rP   )rP   Úchunkr3   ú-rS   r2   )
Úlangchain_text_splittersrD   r.   r   Ú	enumerater5   Ú
split_textr4   r   Úappend)	r   rD   Útext_splitterÚ	page_docsÚiÚdocÚ
doc_chunksÚchunksrS   s	            r   Útext_to_docsr_   1   sV  € àGÐGÐGÐGÐGÐGà2Ð2ØØ>Ð>Ð>Øðñ ô €Mõ �$�ÑÔð àˆvˆØ>Ð>¸Ð>Ñ>Ô>€Iõ ˜IÑ&Ô&ð %ð %‰ˆˆ3Ø  1™uˆŒ�VÑÐð €Jàð #ð #ˆØ×)Ò)¨#Ô*:Ñ;Ô;ˆÝ! &Ñ)Ô)ð 	#ð 	#‰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)rc   re   rg   ri   r!   )r"   rc   re   rg   ri   r!   s         r   r#   zTelegramChatApiLoader.__init__V   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.syncrm   ri   re   rg   Úiter_messagesrc   Úreply_toÚreply_to_msg_idrX   rn   r   r   Ú	isoformatÚidr6   r!   r7   Údump)r"   rm   ÚdataÚclientr-   rp   rq   r;   s           r   Úfetch_data_from_telegramz.TelegramChatApiLoader.fetch_data_from_telegramn   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.
            rq   ro   )Ú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   rp   rq   )Ú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   ro   )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*   ro   r   )Úbyr   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )r   )r/   Úelems     r   rQ   z@TelegramChatApiLoader._combine_message_texts.<locals>.<listcomp>ß   s   € ÐAÐAÐA¨4�S ™YœYÐAÐAÐAr   rJ   z.
)ÚitemsÚisinÚsort_valuesr‡   r9   Ú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`
                )rc   Únest_asyncioÚapplyÚasyncioÚrunr   ÚImportErrorr   r!   r6   r7   r8   ÚpandasÚjson_normalizeÚ	DataFramer”   r¡   r_   )
r"   r£   r:   r;   r<   ÚpdÚnormalized_messagesÚdfr“   Úcombined_textss
             r   r8   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)NNNNrb   )
rc   rd   re   rf   rg   rh   ri   rh   r!   r   )r   rk   )r}   r€   r   r   )r“   r•   r}   r€   r   r   r=   )	r>   r?   r@   rA   r#   r   r”   r¡   r8   r   r   r   ra   ra   S   s–   € € € € € Ø3Ð3ð -1Ø $Ø"&Ø"&Ø-ð#ð #ð #ð #ð #ð0=ð =ð =ð =ð.9ð 9ð 9ð 9ðv$%ð $%ð $%ð $%ðL",ð ",ð ",ð ",ð ",ð ",r   ra   )r   r   r   r   )r   rB   r   r$   )Ú
__future__r   r¥   r7   Úpathlibr   Útypingr   r   r   r   r	   Úlangchain_core.documentsr   Ú)langchain_community.document_loaders.baser   r¨   r«   Útelethon.hintsr   r   r   r_   ra   ÚTelegramChatLoaderr   r   r   ú<module>r¶      sK  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à -Ð -Ð -Ð -Ð -Ð -à @Ð @Ð @Ð @Ð @Ð @àð *ØÐÐÐØ)Ð)Ð)Ð)Ð)Ð)ð-ð -ð -ð -ð@ð @ð @ð @ð @˜Zñ @ô @ð @ð0ð ð ð ðDu,ð u,ð u,ð u,ð u,˜Jñ u,ô u,ð u,ðr ,Ð Ð Ð r   