B
    fdF'                 @   s   d dl Z d dlZd dlZd dlm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 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# e$e%Z&G dd dZ'dS )    N)OrderedDict)utils)CallbackQueryHandlerMessageHandlerEditedMessageHandlerDeletedMessagesHandlerUserStatusHandlerRawUpdateHandlerInlineQueryHandlerPollHandlerChosenInlineResultHandlerChatMemberUpdatedHandlerChatJoinRequestHandler)UpdateNewMessageUpdateNewChannelMessageUpdateNewScheduledMessageUpdateEditMessageUpdateEditChannelMessageUpdateDeleteMessagesUpdateDeleteChannelMessagesUpdateBotCallbackQueryUpdateInlineBotCallbackQueryUpdateUserStatusUpdateBotInlineQueryUpdateMessagePollUpdateBotInlineSendUpdateChatParticipantUpdateChannelParticipantUpdateBotChatInviteRequesterc               @   s   e Zd ZeeefZeefZ	e
efZeefZeefZefZefZefZefZefZddddZdd Zdd Ze d	d
dZ!e d	ddZ"dd Z#dS )
Dispatcherzpyrogram.Client)clientc                s  |_ t _g _g _t _t _	fdd  fdd}fdd}fdd}fd	d
}fdd}fdd}fdd}fdd}	fdd}
t
j t
j|t
j|t
j|t
j|t
j|t
j|t
j|t
j|	t
j|
i
_dd j D _d S )Nc          	      s*   t jj j| j||t| tI d H tfS )N)	pyrogramtypesMessage_parser    message
isinstancer   r   )updateuserschats)self 7/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/dispatcher.pymessage_parserB   s    z+Dispatcher.__init__.<locals>.message_parserc                s    | ||I d H \}}|t fS )N)r   )r'   r(   r)   parsed_)r-   r+   r,   edited_message_parserI   s    z2Dispatcher.__init__.<locals>.edited_message_parserc                s   t  j| tfS )N)r   Zparse_deleted_messagesr    r   )r'   r(   r)   )r*   r+   r,   deleted_messages_parserR   s    z4Dispatcher.__init__.<locals>.deleted_messages_parserc                s   t jj j| |I d H tfS )N)r!   r"   ZCallbackQueryr$   r    r   )r'   r(   r)   )r*   r+   r,   callback_query_parserX   s    z2Dispatcher.__init__.<locals>.callback_query_parserc                s   t jj j| tfS )N)r!   r"   ZUserZ_parse_user_statusr    r   )r'   r(   r)   )r*   r+   r,   user_status_parser^   s    z/Dispatcher.__init__.<locals>.user_status_parserc                s   t jj j| |tfS )N)r!   r"   ZInlineQueryr$   r    r
   )r'   r(   r)   )r*   r+   r,   inline_query_parserd   s    z0Dispatcher.__init__.<locals>.inline_query_parserc                s   t jj j| tfS )N)r!   r"   ZPollZ_parse_updater    r   )r'   r(   r)   )r*   r+   r,   poll_parserj   s    z(Dispatcher.__init__.<locals>.poll_parserc                s   t jj j| |tfS )N)r!   r"   ZChosenInlineResultr$   r    r   )r'   r(   r)   )r*   r+   r,   chosen_inline_result_parserp   s    z8Dispatcher.__init__.<locals>.chosen_inline_result_parserc                s   t jj j| ||tfS )N)r!   r"   ZChatMemberUpdatedr$   r    r   )r'   r(   r)   )r*   r+   r,   chat_member_updated_parserv   s    z7Dispatcher.__init__.<locals>.chat_member_updated_parserc                s   t jj j| ||tfS )N)r!   r"   ZChatJoinRequestr$   r    r   )r'   r(   r)   )r*   r+   r,   chat_join_request_parser|   s    z5Dispatcher.__init__.<locals>.chat_join_request_parserc             S   s    i | ]\}}|D ]
}||qqS r+   r+   ).0Z	key_tuplevaluekeyr+   r+   r,   
<dictcomp>   s    z'Dispatcher.__init__.<locals>.<dictcomp>)r    asyncioZget_event_looploophandler_worker_tasks
locks_listQueueupdates_queuer   groupsr   NEW_MESSAGE_UPDATESEDIT_MESSAGE_UPDATESDELETE_MESSAGES_UPDATESCALLBACK_QUERY_UPDATESUSER_STATUS_UPDATESBOT_INLINE_QUERY_UPDATESPOLL_UPDATESCHOSEN_INLINE_RESULT_UPDATESCHAT_MEMBER_UPDATESCHAT_JOIN_REQUEST_UPDATESupdate_parsersitems)r*   r    r0   r1   r2   r3   r4   r5   r6   r7   r8   r+   )r-   r*   r,   __init__8   s6    

	zDispatcher.__init__c          	      sb   | j js^xDt| j jD ]4}| jt  | j| j	
| | jd  qW td| j j d S )NzStarted %s HandlerTasks)r    
no_updatesrangeworkersr@   appendr=   Lockr?   r>   create_taskhandler_workerloginfo)r*   ir+   r+   r,   start   s    zDispatcher.startc                sl   | j jshx t| j jD ]}| jd  qW x| jD ]}|I d H  q2W | j  | j  t	
d| j j d S )NzStopped %s HandlerTasks)r    rR   rS   rT   rB   
put_nowaitr?   clearrC   rY   rZ   )r*   r[   r+   r+   r,   stop   s    

zDispatcher.stop)groupc                s"    fdd}j |  d S )Nc           	      sz   xj D ]} |  I d H  qW z< jkrHg j < ttj _j   W d xj D ]} |   qdW X d S )N)r@   acquirerC   r   sortedrO   rU   release)lock)r`   handlerr*   r+   r,   fn   s    

z"Dispatcher.add_handler.<locals>.fn)r>   rW   )r*   re   r`   rf   r+   )r`   re   r*   r,   add_handler   s    zDispatcher.add_handlerc                s"    fdd}j |  d S )Nc           	      sl   xj D ]} |  I d H  qW z. jkr:td  dj   W d xj D ]} |   qVW X d S )NzGroup z) does not exist. Handler was not removed.)r@   ra   rC   
ValueErrorremoverc   )rd   )r`   re   r*   r+   r,   rf      s    
z%Dispatcher.remove_handler.<locals>.fn)r>   rW   )r*   re   r`   rf   r+   )r`   re   r*   r,   remove_handler   s    zDispatcher.remove_handlerc                s4  x,| j  I d H }|d krP y|\}}}| jt|d }|d k	rX||||I d H n
d td f\}}|4 I d H b xX| j D ]H}	x@|	D ]6}
d }t|
|ry|
| j|I d H r|f}W n. t	k
r } zt
| wW d d }~X Y nX nt|
tr|||f}|d krqyPt|
jrD|
j| jf| I d H  n$| jj| jj|
j| jf| I d H  W n^ tjk
r    Y nF tjk
r   wY n. t	k
r } zt
| W d d }~X Y nX P qW qW W d Q I d H R X W q tjk
r   Y q t	k
r* } zt
| W d d }~X Y qX qW d S )N)rB   getrN   typerC   valuesr&   checkr    	ExceptionrY   	exceptionr	   inspectiscoroutinefunctioncallbackr>   Zrun_in_executorexecutorr!   ZStopPropagationZContinuePropagation)r*   rd   packetr'   r(   r)   parserZparsed_updateZhandler_typer`   re   argser+   r+   r,   rX      sV    





zDispatcher.handler_workerN)$__name__
__module____qualname__r   r   r   rD   r   r   rE   r   r   rF   r   r   rG   r   r   rL   r   rH   r   rI   r   rJ   r   rK   r   rM   rP   r\   r_   intrg   rj   rX   r+   r+   r+   r,   r   ,   s    
Yr   )(r=   rq   loggingcollectionsr   r!   r   Zpyrogram.handlersr   r   r   r   r   r	   r
   r   r   r   r   Zpyrogram.raw.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	getLoggerry   rY   r   r+   r+   r+   r,   <module>   s   4H

