U
    !j>                     @  s  d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
 ddlZddlZddlZddlmZ ejejd edZed	d
ZedddddZedddddZeddddddZdddddZedddddd Zddd!d"d#ZdS )$ua  Точка входа: FastAPI-приложение.

Эндпоинты:
- GET  /oauth/callback  — приём кода авторизации, обмен на токены, регистрация бота
- POST /bot/events      — события бота (сообщения и нажатия кнопок)
- GET  /healthz         — health-check
    )annotationsN)FastAPIRequestResponse)HTMLResponse)	poll_loop)levelappzBitrix24 Draft Assistant)titlestartupNone)returnc                     s   t   tt  d S )N)storeZinit_dbasynciocreate_taskr    r   r   */var/www/spa-bitrix.ru/bitrix_asist/app.py_startup   s    r   z/healthzdictc                     s   dt  dS )NT)okZportals)r   Zall_portal_domainsr   r   r   r   healthz!   s    r   z/oauth/callbackr   r   )requestr   c                   s   | j d}| j d}|r |s,tdddS t||I dH  t|I dH }t|dpb|d}t|d	| t	|I dH  td
| dS )u`   Битрикс возвращает code + domain (member_id) после авторизации.codedomainu4   Ожидались параметры code и domaini  )status_codeNZIDidoperator_idu(   <h3>Готово</h3><p>Портал <b>u   </b> подключён. Бот «Черновики» зарегистрирован. Можешь закрыть страницу.</p>)
Zquery_paramsgetr   bitrixZexchange_codeZwhoamistrr   Zset_portal_fieldZregister_bot)r   r   r   mer   r   r   r   oauth_callback&   s    
r!   z
str | None)payloadr   c                 C  sf   |  di }| d}| d}|r.t|nd}|s:dS t|}|rb| drb||d krbdS |S )u   Проверяет, что событие пришло от Битрикс (по application_token),
    и возвращает domain или None.auth	member_idZapplication_tokenN	app_token)r   r   Zfind_domain_by_member
get_portal)r"   r#   r$   r%   r   portalr   r   r   _verify_event<   s    


r(   z/bot/eventsc                   s^  |   I d H }tt|}|dp&d }t|}|sLtd| ddiS |di }|dkr|di }|dpxd }|d	pd}t	
|d
}	t||||	I d H  ddiS |dkrV|di }
t|
dp|
dpd}|
dpd }t	
|}|d
}|t|krN|rNt	||}|rNt||||I d H  ddiS ddiS )Nevent uL   event %s: неизвестный/непроверенный источникr   FdataZONIMCOMMANDADDZCOMMANDZCOMMAND_PARAMSr   TZONIMBOTMESSAGEADDZPARAMSZFROM_USER_IDZ	AUTHOR_IDZMESSAGE)form
_unflattenr   r   upperr(   logwarninglowerr   r&   approvalZhandle_commandr   stripZpop_edit_stateZhandle_edit_text)r   r,   r"   r)   r   r+   cmdcommandparamsZoperator_dialogpZauthortextr'   r   Z
pending_idr   r   r   
bot_eventsK   s6    


r9   )flatr   c                 C  sZ   i }|   D ]H\}}|ddd}|}|dd D ]}||i }q6|||d < q|S )ud   Превращает ключи вида data[PARAMS][MESSAGE] в вложенный словарь.]r*   [N)itemsreplacesplit
setdefault)r:   rootkeyvaluepartsnodepartr   r   r   r-   r   s    r-   )__doc__
__future__r   r   loggingZfastapir   r   r   Zfastapi.responsesr   r   r   r2   Zpollerr   basicConfigINFO	getLoggerr/   r	   Zon_eventr   r   r   r!   r(   postr9   r-   r   r   r   r   <module>   s,   

&