
     h;                     8   d dl Z d dlmZ d dlZd dlZd dl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mZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d d
lmZ d d
lmZ  d d
l!mZ" d dlm#Z#  ej$                    Z%de	dej&        fdZ'de	dej&        fdZ(dZ)de	dej&        fdZ*de	dej&        fdZ+de	dej&        fdZ,dde#e-         defdZ.de-de-fdZ/de0e1         de-fdZ2e3dk    r2 e.            Z4 ej5        d           e46                    d           dS dS )     N)escape)Dict)Update)	ParseMode)ApplicationApplicationBuilderCommandHandlerContextTypesMessageHandlerfilters)logger)toggle_subscriptionis_subscribedsearch_people)run_once)Optionalupdatecontextc                 N   K   d}| j                             |           d {V  d S )Nu  안녕하세요! 대정부·전력그룹사 봇입니다.

명령어 안내:
/start - 도움말
/subscribe - 인사 알림 구독/해지
/search - 직원 검색(산업부·기재부 통합)
/sync - (누구나 실행 가능) 조직/인사 데이터 동기화
)message
reply_text)r   r   texts      %/var/www/html/bot/app/telegram/bot.pystartr   '   sA      	P 	 .
#
#D
)
))))))))))    c                    K   | j         j        }t          |           d {V }|r"| j                            d           d {V  d S | j                            d           d {V  d S )Nu   구독이 설정되었습니다.
- 산업부/기재부 인사발령
- 전력그룹사 인사동정
새 글이 올라오면 알림을 보내드릴게요.uG   구독이 해지되었습니다. 다시 /subscribe 하면 구독돼요.)effective_chatidr   r   r   )r   r   chat_idnow_ons       r   	subscriber"   2   s      #&G&w////////F sn''D
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
 n''(qrrrrrrrrrrrr   waiting_keywordc                 h   K   d|j         t          <   | j                            d           d {V  d S )NTuH   검색할 키워드를 입력해주세요. (이름/부서/직위/업무))	user_dataSEARCH_WAITINGr   r   )r   r   s     r   
search_cmdr'   B   sB      (,Gn%
.
#
#$n
o
oooooooooor   c                   K   | j         j                                        |j                            t
                    rd|j        t
          <   t          j                                        d fd           d {V }|s"| j         	                    d           d {V  d S t          |d d                   }| j         	                    |t          j        d           d {V  d S d S )NFc                  "    t                     S Nr   )msgs   r   <lambda>ztext_router.<locals>.<lambda>L   s    -,, r   u   검색 결과가 없습니다.
   T)
parse_modedisable_web_page_preview)r   r   stripr%   getr&   asyncioget_event_looprun_in_executorr   format_staff_resultsr   HTML)r   r   rowsmsg_textr+   s       @r   text_routerr9   F   s4     
.

#
#
%
%C^,, ,1.)+--==,,,,
 
 
 
 
 
 
 
  	.++,LMMMMMMMMMF'SbS	22n'' ~%) ( 
 
 	
 	
 	
 	
 	
 	
 	

 	! r   c                 <  K   t                                           r"| j                            d           d {V  d S | j                            d           d {V  t           4 d {V  t	          j                    }|                    d t                     d {V }|                    d t                     d {V }|                    d t                     d {V }|                    d t                     d {V }t          |t                    r|                    dd          n|}t          |t                    r|                    dd          nd}t          |t                    r|                    dd          n|}	t          |t                    r|                    dd          nd}
d| d| d| d	| d
|	 d	|
 d}| j                            |t          j                   d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S )NuF   이미 동기화가 진행 중입니다. 잠시만 기다려주세요.uW   동기화를 시작합니다.
- MOTIE/MOEF 조직도(org)
- MOTIE/MOEF 인사발령(id)insertedr   sentu)   동기화 완료 ✅

- MOTIE 조직도: u   건 갱신
- MOEF  조직도: u   건 갱신
- MOTIE 인사: u   건 신규, u"   건 알림 발송
- MOEF  인사: u   건 알림 발송
)r.   )	SYNC_LOCKlockedr   r   r2   r3   r4   motie_org_syncmoef_org_syncmotie_id_syncmoef_id_sync
isinstancedictr1   r   r6   )r   r   loop	motie_orgmoef_orgmotie_idmoef_idmotie_id_insmotie_id_sentmoef_id_insmoef_id_sentsummarys               r   sync_allrO   [   sk      n''(pqqqqqqqqq
.
#
#$  A  A  A  A  A  A  A  A  A L L L L L L L L%'' ..t^DDDDDDDD	--dMBBBBBBBB--dMBBBBBBBB,,T<@@@@@@@@ 7A46P6P^x||J222V^3=h3M3MTVQ///ST4>w4M4MZgkk*a000SZ1;GT1J1JQw{{61---PQZ"+Z Z"*Z Z  ,Z Z :GZ Z  +	Z Z 9E	Z Z Z 	 n''IN'KKKKKKKKK/L L L L L L L L L L L L L L L L L L L L L L L L L L L L L Ls   +FH
HHtokenreturnc                    |  t           j                            dd          } | st          d          t	                                          |                                           }|                    t          dt                               |                    t          dt                               |                    t          dt                               |                    t          dt                               |                    t          t          j        t          j         z  t"                               |S )N	BOT_TOKEN u/   BOT_TOKEN 이 설정되어 있지 않습니다.r   r"   searchsync)osenvironr1   RuntimeErrorr   rP   buildadd_handlerr	   r   r"   r'   rO   r   r   TEXTCOMMANDr9   )rP   apps     r   	build_appr_      s    }
{B// NLMMM)++11%88>>@@COON7E22333OON;	::;;;OON8Z88999OON6844555OON7<7?2B#BKPPQQQJr   rawc                 D    t          j        dd| pd          }|rd| ndS )Nz[^0-9+]rT   ztel:)resub)r`   digitss     r   	_tel_hrefre      s.    VJCI2..F$,?&???",r   r7   c           	         g }t          | d          D ])\  }}t          |                    d          pd          }t          |                    d          pd          }t          |                    d          pd          }t          |                    d          pd          }|                    d          pd}t          |          }	t          |          }
| d	| d
|                     d          |||	r	d|	 d|
 dn|
g}|                    d                    d |D                                  +d                    |          S )u   
    rows: [{name, position, department, task, phone}, ...]
    출력 형식:
    1) 이름 / position
    department
    task
    <a href="tel:...">원문전화번호</a>
       )r   namerT   position
departmenttaskphonez) z / z /z	<a href="z">z</a>
c                     g | ]}||S  ro   ).0bs     r   
<listcomp>z(format_staff_results.<locals>.<listcomp>   s    666aA6666r   z

)	enumerater   r1   re   r0   appendjoin)r7   linesirrh   ri   rj   rk   phone_display
phone_hrefphone_display_escapedblocks               r   r5   r5      si    E$a((( 9 91aeeFmm)r**!%%
++1r22AEE,//5266
aeeFmm)r**g,"}--
 &} 5 5 ''D''X''--d33EOjA
AA&;AAAAUj	
 	TYY665666778888;;ur   __main__z"Telegram bot starting (polling)...F)
close_loopr*   )7rb   htmlr   rW   r2   loggingtypingr   telegramr   telegram.constantsr   telegram.extr   r   r	   r
   r   r   app.services.supabase_servicer   !app.services.subscription_servicer   r   app.services.search_servicer   app.crawler.motie_org_sync_n8nr   r?   app.crawler.moef_org_sync_n8nr@   app.crawler.motie_n8nrA   app.crawler.moef_n8nrB   r   Lockr=   DEFAULT_TYPEr   r"   r&   r'   r9   rO   strr_   re   listrD   r5   __name__r^   inforun_pollingro   r   r   <module>r      s   				       				               ( ( ( ( ( (                1 0 0 0 0 0 P P P P P P P P 5 5 5 5 5 5 E E E E E E C C C C C C ; ; ; ; ; ; 9 9 9 9 9 9       GLNN		* 	*)B 	* 	* 	* 	*sF s\-F s s s s #pV pl.G p p p pf |/H    *L6 LL,E L L L LH Xc] k    -3 -3 - - - -
tDz c    < z
)++CFK4555OOuO%%%%% r   