U
    !jH                     @  s(  d Z ddlmZ ddlZddlmZ ddlZddlmZm	Z	 ddl
Z
G dd deZdd	d
ddZddddddZddd
ddZddd
ddZd/ddddddddddZddd
ddZddd
d d!Zddd"dd#d$d%Zddddd&d'd(Zddd
d)d*Zd0dddd+dd,d-d.ZdS )1u   Клиент Битрикс24 REST: OAuth-обмен/refresh токенов и вызовы методов
под учёткой оператора (вариант Б).    )annotationsN)Any)settingsPortalConfigc                   @  s   e Zd ZdS )BitrixErrorN)__name__
__module____qualname__ r
   r
   -/var/www/spa-bitrix.ru/bitrix_asist/bitrix.pyr      s   r   strr   )domainreturnc                 C  s$   t j| }|s td|  d|S )N   Портал u3    отсутствует в конфигурации)r   portalsgetr   )r   cfgr
   r
   r   _portal_cfg   s    r   dict)r   coder   c              
     s   t | }d|j|j|d}tjdd4 I dH }|jtj|dI dH }W 5 Q I dH R X | }d|krtt	d| t
j| |d |d	 |d
d|d|dd |S )uZ   Обмен authorization_code на токены (срок жизни кода ~30 сек).Zauthorization_code)
grant_type	client_idclient_secretr      timeoutNparamsaccess_tokenu$   OAuth обмен не удался: refresh_token
expires_in  	member_idapplication_tokenr   accessZrefreshr    r"   	app_token)r   r   r   httpxAsyncClientr   r   oauth_token_urljsonr   storeupsert_portal_tokens)r   r   r   r   clientrdatar
   r
   r   exchange_code   s(    &
r0   c              
     s   t | }t| }|r |ds0td|  dd|j|j|d d}tjdd4 I d H }|jt	j
|dI d H }W 5 Q I d H R X | }d|krtd	|  d
| tj| |d |d |dd|dd d |d S )Nr   u#   Нет refresh-токена для uG   ; нужна повторная установка приложения)r   r   r   r   r   r   r   r   u!   Refresh не удался для : r    r!   r"   r$   )r   r+   
get_portalr   r   r   r   r'   r(   r   r)   r*   r,   )r   r   pr   r-   r.   r/   r
   r
   r   _refresh2   s.    
&
r4   c                   sR   t | }|std|  dt|dp,dtt krJt| I d H S |d S )Nr   u    не авторизованZ
expires_atr   r   )r+   r2   r   intr   timer4   )r   r3   r
   r
   r   _access_tokenM   s    
r7   F)as_botzdict[str, Any] | Noneboolr   )r   methodpayloadr8   r   c          
   
     sN  t | I dH }t|pi }||d< t| j d| }tjdd4 I dH }|j||dI dH }W 5 Q I dH R X | }	t|	tr4|		dr4|		ddkrt
| I dH }||d< tjdd4 I dH }|j||dI dH }W 5 Q I dH R X | }	t|	tr4|		dr4t| d	|		d d
|		dd t|	trJ|		dS |	S )u  Вызов REST-метода. По умолчанию — под токеном оператора (вариант Б).

    Токен передаётся в теле запроса (никогда в URL — это требование приватности).
    Nauth/   r   )r*   error>   invalid_tokenexpired_tokenr1    Zerror_description result)r7   r   r   Z	rest_baser'   r(   postr*   
isinstancer   r4   r   )
r   r:   r;   r8   tokenbodyurlr-   r.   r/   r
   r
   r   callV   s"    $$&rJ   c                   s   t | dI d H S )NZprofilerJ   )r   r
   r
   r   whoamir   s    rL   z
list[dict]c                   s4   t | dddiI d H }t|tr,|dg S |p2g S )Nzim.recent.getZSKIP_OPENLINESYitemsrJ   rF   r   r   )r   resr
   r
   r   recent_dialogsv   s    
rQ   r5   )r   	dialog_idlimitr   c                   s6   t | d||dI d H }t|tr.|dg S |p4g S )Nzim.dialog.messages.get)	DIALOG_IDZLIMITmessagesrO   )r   rR   rS   rP   r
   r
   r   dialog_messages~   s    

rV   )r   rR   textr   c                   s   t | d||dI dH S )u   Отправка сообщения в чат ОТ ИМЕНИ ОПЕРАТОРА. Вызывается только после
    явного подтверждения.zim.message.addrT   MESSAGENrK   )r   rR   rW   r
   r
   r   send_as_user   s    rZ   c                   s   t | }t| dddtjdddd|jdI d H }t|}t| d	| d
D ]P}z6t| d||ddd|jd|ddgtjdI d H  W qL tk
r   Y qLX qL|S )Nzimbot.registerZdraft_approverBNu   Черновикиu'   Согласование ответов)NAMEZWORK_POSITION)ZCODEZTYPEZEVENT_HANDLERZOPENLINEZ
PROPERTIES	CLIENT_IDbot_id)Zapproveeditskipzimbot.command.registerrM   rurC   )ZLANGUAGE_IDZTITLEPARAMS)BOT_IDCOMMANDZCOMMONZHIDDENZEXTRANET_SUPPORTr^   LANGZEVENT_COMMAND_ADD)	r   rJ   r   Zevent_handler_urlr   r   r+   set_portal_fieldr   )r   r   rP   r_   cmdr
   r
   r   register_bot   s4    
ri   zlist[dict] | None)r   rR   rW   keyboardr   c                   sL   t | }||d}|r.|dr.|d |d< |r:||d< t| d|I d H S )NrX   r_   rd   ZKEYBOARDzimbot.message.add)r+   r2   r   rJ   )r   rR   rW   rj   r3   r;   r
   r
   r   bot_message   s    

rk   )N)N)__doc__
__future__r   r6   typingr   r'   configr   r   r+   RuntimeErrorr   r   r0   r4   r7   rJ   rL   rQ   rV   rZ   ri   rk   r
   r
   r
   r   <module>   s*   	 