§
    ÔŸ’j³  ã                   óˆ   — d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dlm	Z	  e j
        d¦  «        Z G d„ d¦  «        ZdS )	é    N)Údatetime)ÚAny)ÚPostgresClient)Úget_settingszdscons.telegram_bridgec            	       óŠ   — e Zd Zd„ Z	 ddedededefd„Zded	ed
edz  fd„Zdededefd„Zde	ee
f         fd„Zdedefd„ZdS )ÚTelegramBridgec                 óÆ   — t          ¦   «         | _        | j        j        | _        d| j        › �| _        t          ¦   «         | _        | j        j        pd| _        d| _	        d S )Nzhttps://api.telegram.org/botz-1000000000000z&http://127.0.0.1:3081/api/send-message)
r   ÚsettingsÚtelegram_bot_tokenÚ	bot_tokenÚapi_urlr   Ú	db_clientÚtelegram_chat_idÚmain_group_idÚzalo_bridge_url)Úselfs    ú2C:\Projects\DSCons\app\services\telegram_bridge.pyÚ__init__zTelegramBridge.__init__   sX   € Ý$™œˆŒØœÔ9ˆŒØF°d´nÐFÐFˆŒÝ'Ñ)Ô)ˆŒØ!œ]Ô;ÐOÐ?OˆÔØGˆÔÐÐó    FÚsender_nameÚ	sender_idÚtextÚis_internalc              ƒ   óÖ  K  — | j         st                               d¦  «         dS |rdnd}|› d|› d|› d|› dt          j        ¦   «                              d	¦  «        › �	}d
|› �}d}	 | j                             |¦  «        }	|	r|	                     d¦  «        }n# t          $ r Y nw xY w| j
        |ddœ}
|r3t          |¦  «                             ¦   «         rt          |¦  «        |
d<   	 t          j        ¦   «         4 ƒd{V —†}|                     | j        › d�|
d¬¦  «        ƒ d{V —†}|                     ¦   «         }|                     d¦  «        s<|
                     dd¦  «         |                     | j        › d�|
d¬¦  «        ƒ d{V —† ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)z>Forward an inbound Zalo message to Telegram group immediately.z%Telegram Bot Token is not configured.Nu#   ðŸš¨ <b>[VIP GIÃ�M Ä�á»�C ZALO]</b>u   ðŸ’¬ <b>[KHÃ�CH HÃ€NG ZALO]</b>u   
ðŸ‘¤ <b>NgÆ°á»�i gá»­i:</b> z (ID: <code>u!   </code>)
ðŸ“� <b>Ná»™i dung:</b> u   
â�± <b>Thá»�i gian:</b> z%H:%M:%S %d/%m/%YÚconv_company_Útelegram_topic_idÚHTML)Úchat_idr   Ú
parse_modeÚmessage_thread_idú/sendMessageç      $@©ÚjsonÚtimeoutÚokz.Error forwarding inbound message to Telegram: )r   ÚloggerÚwarningr   ÚnowÚstrftimer   Ú"get_telegram_topic_by_conversationÚgetÚ	Exceptionr   ÚstrÚisdigitÚintÚhttpxÚAsyncClientÚpostr   r$   ÚpopÚerror)r   r   r   r   r   ÚiconÚmsg_textÚconv_idÚtopic_idÚ	topic_mapÚpayloadÚclientÚrespÚdataÚes                  r   Úforward_inbound_messagez&TelegramBridge.forward_inbound_message   sM  è è € ð Œ~ð 	Ý�NŠNÐBÑCÔCÐCØˆFð ð3Ð1Ð1à2ð 	ð ð Vð VØ+6ðVð VØDMðVð Và'+ðVð Võ (0¤|¡~¤~×'>Ò'>Ð?RÑ'SÔ'SðVð Vð 	ð . )Ð-Ð-ˆØˆð	Øœ×IÒIÈ'ÑRÔRˆIØð >Ø$Ÿ=š=Ð)<Ñ=Ô=�øøÝð 	ð 	ð 	ØˆDð	øøøð Ô)ØØ ð#
ð #
ˆð
 ð 	9�˜H™œ×-Ò-Ñ/Ô/ð 	9Ý+.¨x©=¬=ˆGÐ'Ñ(ð	OÝÔ(Ñ*Ô*ð 
ð 
ð 
ð 
ð 
ð 
ð 
¨fØ#Ÿ[š[Ø”|Ð1Ð1Ð1¸Èð )ñ ô ð ð ð ð ð ð �ð —y’y‘{”{�Ø—x’x ‘~”~ð à—K’KÐ 3°TÑ:Ô:Ð:Ø Ÿ+š+Øœ<Ð5Ð5Ð5¸GÈTð &ñ ô ð ð ð ð ð ð ð ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
øõ ð 	Oð 	Oð 	OÝ�LŠLÐMÈ!ÐMÐMÑNÔNÐNÐNÐNÐNÐNÐNÐNøøøøð	OøøøsO   Á(1B Â
B'Â&B'Ã+F6 ÄBF#ÆF6 Æ#
F-Æ-F6 Æ0F-Æ1F6 Æ6
G(Ç G#Ç#G(Úconversation_idÚ
topic_nameÚreturnNc              ƒ   ó¦  K  — | j         sdS t          j        ¦   «         4 ƒd{V —†}|                     | j        › d�| j        |dœd¬¦  «        ƒ d{V —†}|                     ¦   «         }|                     d¦  «        r’t          |d         d         ¦  «        }t          t          j
        ¦   «         ¦  «        ||t          | j        ¦  «        t          j        ¦   «         d	œ}| j                             |¦  «         |cddd¦  «        ƒd{V —† S t                               d
|› �¦  «         	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zBCreate a forum topic on Telegram group for the given conversation.Nz/createForumTopic)r   Únamer"   r#   r&   Úresultr    )ÚidrA   r   Útelegram_group_idÚ
created_atzFailed to create topic: )r   r1   r2   r3   r   r   r$   r,   r.   ÚuuidÚuuid4r   r)   r   Úupsert_telegram_topic_mapr'   r5   )r   rA   rB   r<   r=   r>   r9   Úmapping_datas           r   Úcreate_topiczTelegramBridge.create_topicK   s'  è è € àŒ~ð 	Ø�4ÝÔ$Ñ&Ô&ð 	ð 	ð 	ð 	ð 	ð 	ð 	¨&ØŸšØ”<Ð2Ð2Ð2Ø!%Ô!3¸ZÐHÐHØð %ñ ô ð ð ð ð ð ð ˆDð
 —9’9‘;”;ˆDØ�xŠx˜‰~Œ~ð 
 Ý˜t Hœ~Ð.AÔBÑCÔC�å�dœj™lœlÑ+Ô+Ø'6Ø)1Ý),¨TÔ-?Ñ)@Ô)@Ý"*¤,¡.¤.ð ð  �ð ”×8Ò8¸ÑFÔFÐFØð#	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ$ �LŠLÐ:°DÐ:Ð:Ñ;Ô;Ð;Øð'	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¥CE ÄE Å 
E
ÅE
Ú
contact_idr9   Ú
draft_textc           
   ƒ   óž  K  — | j         sdS ddd|› �dœggi}t          j        ¦   «         4 ƒd{V —†}|                     | j        › d�| j        t          |¦  «                             ¦   «         rt          |¦  «        ndd|› �d|d	œd
¬¦  «        ƒ d{V —†}| 	                    ¦   «         cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS )z@Phase 4: AI sends Draft Message to Telegram with Approve button.NÚinline_keyboardu   Duyá»‡t & Gá»­i Zalo (Approve)Úapprove_)r   Úcallback_datar!   u*   ðŸ¤– <b>[AI SOáº N NHÃ�P TRáº¢ Lá»œI]</b>
r   )r   r    r   r   Úreply_markupr"   r#   )
r   r1   r2   r3   r   r   r.   r/   r0   r$   )r   rO   r9   rP   Úkeyboardr<   r=   s          r   Úsend_draft_for_approvalz&TelegramBridge.send_draft_for_approvald   s°  è è € ð Œ~ð 	Ø�4àð !AØ)@°JÐ)@Ð)@ðð ðð ð	
ˆõ Ô$Ñ&Ô&ð 	ð 	ð 	ð 	ð 	ð 	ð 	¨&ØŸšØ”<Ð-Ð-Ð-à#Ô1å˜8‘}”}×,Ò,Ñ.Ô.ð*­¨X©¬¨àØVÈ*ÐVÐVØ"(Ø$,ðð ð ð %ñ ô ð ð ð ð ð ð ˆDð —9’9‘;”;ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ±A8B<Â<
CÃ	CÚupdatec              ƒ   ód  K  — d|v �r-|d         }|                      dd¦  «        }|                     d¦  «        rø|                     d¦  «        d         }|                      di ¦  «                              dd¦  «                             dd¦  «                             d	d¦  «        }|                      ||¦  «        ƒ d
{V —† t          j        ¦   «         4 ƒd
{V —†}|                     | j        › d�|d         ddœd¬¦  «        ƒ d
{V —† d
d
d
¦  «        ƒd
{V —† d
S # 1 ƒd
{V —†swxY w Y   d
S d
S d|v �rn|d         }t          |                      di ¦  «                              dd¦  «        ¦  «        }|t          | j
        ¦  «        k    �r|                      di ¦  «                              d¦  «        sñt          |                      dd¦  «        ¦  «        }	|                      d¦  «        }
|
r¹|	r¹	 | j                             |	¦  «        }|r]|                      d¦  «        p)|                      dd¦  «                             dd¦  «        }|                      ||
¦  «        ƒ d
{V —† d
S d
S # t          $ r(}t                               d|› �¦  «         Y d
}~d
S d
}~ww xY wd
S d
S d
S d
S d
S )z'Process incoming webhook from Telegram.Úcallback_queryr>   Ú rS   é   Úmessager   u#   ðŸ¤– [AI SOáº N NHÃ�P TRáº¢ Lá»œI]
z
AI DRAFT:
Nz/answerCallbackQueryrG   u"   Ä�Ã£ duyá»‡t vÃ  gá»­i tá»›i Zalo!)Úcallback_query_idr   r"   r#   ÚchatÚfromÚis_botr    rO   rA   r   z(Error mapping telegram message to Zalo: )r,   Ú
startswithÚsplitÚreplaceÚsend_to_zalor1   r2   r3   r   r.   r   r   Úget_telegram_topic_by_idr-   r'   r5   )r   rX   Úcbr>   rO   r7   r<   Úmsgr   Ú	thread_idr   Úmappingr?   s                r   Úprocess_webhookzTelegramBridge.process_webhook„   s×  è è € à˜vÐ%Ñ%ØÐ(Ô)ˆBØ—6’6˜& "Ñ%Ô%ˆDØ�Š˜zÑ*Ô*ð Ø!ŸZšZ¨
Ñ3Ô3°AÔ6�
à—F’F˜9 bÑ)Ô)ß’S˜ ‘_”_ß’WÐCÀRÑHÔHß’W˜]¨BÑ/Ô/ð	 ð ×'Ò'¨
°HÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=õ !Ô,Ñ.Ô.ð ð ð ð ð ð ð °&Ø Ÿ+š+Øœ<Ð=Ð=Ð=à13°D´Ø$Hðð ð !%ð &ñ ô ð ð ð ð ð ð ð ðð ð ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øøøð ð ð ð ð ð ðð ð. ˜&Ð Ñ Ø˜Ô#ˆCÝ˜#Ÿ'š' &¨"Ñ-Ô-×1Ò1°$¸Ñ;Ô;Ñ<Ô<ˆGà�#˜dÔ0Ñ1Ô1Ò1Ñ1¸#¿'º'À&È"Ñ:MÔ:M×:QÒ:QØñ;ô ;Ð1õ   §¢Ð(;¸RÑ @Ô @ÑAÔA�	Ø—w’w˜v‘”�Øð 
U˜Ið 
UðUØ"&¤.×"IÒ"IÈ)Ñ"TÔ"T˜Ø"ð FØ)0¯ª°\Ñ)BÔ)Bð *;ÀgÇkÂkØ 1°2ñGô Gç%šg o°rÑ:Ô:ð 'ð #'×"3Ò"3°JÀÑ"EÔ"EÐEÐEÐEÐEÐEÐEÐEÐEÐEð	Fð Føõ
 %ð Uð Uð UÝŸšÐ%SÐPQÐ%SÐ%SÑTÔTÐTÐTÐTÐTÐTÐTÐTøøøøðUøøøð% !Ð ð 2Ð1Ð1Ð1ð

Uð 
Uð 
Uð 
Us+   Ã0D Ä 
D*Ä-D*Ç8A7I3 É3
J%É=J Ê J%c              ƒ   ó„  K  — 	 t          j        ¦   «         4 ƒd{V —†}|                     | j        ||dœd¬¦  «        ƒ d{V —†}t                               d|j        › �¦  «         |cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)z8Send a message to Zalo via Zalo Bridge Microservice API.N)ÚuserIdr]   r"   r#   zSent to Zalo: zError sending to Zalo: )	r1   r2   r3   r   r'   ÚinfoÚstatus_coder-   r5   )r   rO   r   r<   r=   r?   s         r   re   zTelegramBridge.send_to_zaloµ   s‹  è è € ð	ÝÔ(Ñ*Ô*ð ð ð ð ð ð ð ¨fØ#Ÿ[š[ØÔ(Ø$.¸4Ð@Ð@Ø ð )ñ ô ð ð ð ð ð ð �õ
 —’Ð?¨TÔ-=Ð?Ð?Ñ@Ô@Ð@Øðð ð ð ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øøøð ð ð ð ð ð øõ ð 	ð 	ð 	Ý�LŠLÐ6°1Ð6Ð6Ñ7Ô7Ð7Ø�4�4�4�4�4øøøøð	øøøs;   „B �A
A:Á'B Á:
BÂB ÂBÂB Â
B?ÂB:Â:B?)F)Ú__name__Ú
__module__Ú__qualname__r   r.   Úboolr@   rN   rW   Údictr   rk   re   © r   r   r   r      s  € € € € € ðHð Hð Hð PUð2Oð 2OØð2OØ+.ð2OØ69ð2OØHLð2Oð 2Oð 2Oð 2Oðh°#ð À3ð È3ÐQUÉ:ð ð ð ð ð2ØðØ),ðØ:=ðð ð ð ð@/U¨D°°c°¬Nð /Uð /Uð /Uð /Uðb¨Sð ¸ð ð ð ð ð ð r   r   )ÚloggingrJ   r   Útypingr   r1   Úapp.core.postgresr   Úapp.core.settingsr   Ú	getLoggerr'   r   ru   r   r   ú<module>r{      s·   ðØ €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	Ð3Ñ	4Ô	4€ðtð tð tð tð tñ tô tð tð tð tr   