
    i                     t   d dl Z d dl mZ d dlmZmZ d dlmZ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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e	defdZ!de de
fdZ"d dl#m$Z$ dede%fdZ& G d de          Z' G d de          Z( G d de          Z) G d d           Z*dS )!    N)Logger)current_threadThread)OptionalCallable)HttpRequestHttpResponse)App)	BoltError)ThreadLazyListenerRunner)build_runnable_function)ListenerStartHandlerDefaultListenerStartHandler)ListenerCompletionHandler DefaultListenerCompletionHandler)ThreadListenerRunner)	OAuthFlow)BoltRequest)BoltResponsereqreturnc                     | j         }|r|                    d          nd}t          || j        d         | j                  S )Nutf-8 QUERY_STRING)bodyqueryheaders)r   decoder   METAr   )r   raw_bodyr   s      \/root/projects/butler/venv/lib/python3.11/site-packages/slack_bolt/adapter/django/handler.pyto_bolt_requestr#      sM    hH,4<((("Dh~&       	bolt_respc                 ,   t          | j        | j                            d                    }|                                                                 D ]
\  }}|||<   |                                 D ]}|                                D ]\  }}|                    d          }|rt          |          nd }|	                    ||j
        |                    d          ||                    d          |                    d          dd           |S )	Nr   statuscontentzmax-ageexpiresdomainpathT)keyvaluer*   max_ager+   r,   securehttponly)r	   r(   r   encode first_headers_without_set_cookieitemscookiesgetint
set_cookier.   )	r%   respkvcookienamecstr_max_ager/   s	            r"   to_django_responser@   $   s+   %%%g..  D ::<<BBDD  1Q##%%  ||~~ 	 	GD!)*y)9)9K9D%NS%5%5%5$GOOgi((uuXUU6]]  	 	 	 		 Kr$   )close_old_connectionsloggerexecution_timingc                     t                       | j        t          j        k    r1t	                      }|                     d|j         d| d           d S d S )Nz7Released thread-bound old DB connections (thread name: z, execution timing: ))rA   levelloggingDEBUGr   debugr=   )rB   rC   currents      r"    release_thread_local_connectionsrK   @   s|    |w}$$(**S$\S S?OS S S	
 	
 	
 	
 	
 %$r$   c                   2    e Zd ZdZdedee         ddfdZdS )DjangoListenerStartHandler  Django sets DB connections as a thread-local variable per thread.
    If the thread is not managed on the Django app side, the connections won't be released by Django.
    This handler releases the connections every time a ThreadListenerRunner execution completes.
    requestresponser   Nc                 :    t          |j        j        d           d S )Nzlistener-startrK   contextrB   selfrO   rP   s      r"   handlez!DjangoListenerStartHandler.handleP   s    ()?AQRRRRRr$   __name__
__module____qualname____doc__r   r   r   rV    r$   r"   rM   rM   J   sV         
Sk SXl5K SPT S S S S S Sr$   rM   c                   2    e Zd ZdZdedee         ddfdZdS )DjangoListenerCompletionHandlerrN   rO   rP   r   Nc                 :    t          |j        j        d           d S )Nzlistener-completionrR   rT   s      r"   rV   z&DjangoListenerCompletionHandler.handleZ   s    ()?AVWWWWWr$   rW   r\   r$   r"   r^   r^   T   sV         
Xk XXl5K XPT X X X X X Xr$   r^   c                   .    e Zd Zded         deddfdZdS )DjangoThreadLazyListenerRunnerfunction).NrO   r   Nc                 x    t          || j                  fd}| j                            |           d S )N)funcrB   rO   c                      t          j        j        d           	                t          j        j        d           d S # t          j        j        d           w xY w)Nzbefore-lazy-listenerzlazy-listener-completionrR   )rd   rO   s   r"   wrapped_funcz:DjangoThreadLazyListenerRunner.start.<locals>.wrapped_funcf   sc    ,W_-CE[\\\e01GIcddddd01GIcdddds   
A A)r   rB   executorsubmit)rU   rb   rO   rf   rd   s     ` @r"   startz$DjangoThreadLazyListenerRunner.start_   se    #:;$
 $
 $
	e 	e 	e 	e 	e 	e 	\*****r$   )rX   rY   rZ   r   r   ri   r\   r$   r"   ra   ra   ^   sB        +hy1 +K +D + + + + + +r$   ra   c                   *    e Zd ZdefdZdedefdZdS )SlackRequestHandlerappc                    || _         | j         j        }t          |j        |j                  | j         j        _        t          |t                    st          d          |j	        du r!| j         j        
                    d           d S |j        }|7t          |t                    s"d}| j         j                            |           n<t                      | j         j        _        | j         j        
                    d           |j        }|8t          |t                     s#d}| j         j                            |           d S t#                      | j         j        _        | j         j        
                    d           d S )	N)rB   rg   zDCustom listener_runners are not compatible with this Django adapter.Tz*App.process_before_response is set to Truea  As you've already set app.listener_runner.listener_start_handler to your own one,
            Bolt skipped to set it to slack_sdk.adapter.django.DjangoListenerStartHandler.

            If you go with your own handler here, we highly recommend having the following lines of code
            in your handle() method to clean up unmanaged stale/old database connections:

            from django.db import close_old_connections
            close_old_connections()
            z+DjangoListenerStartHandler has been enabledzAs you've already set app.listener_runner.listener_completion_handler to your own one,
            Bolt skipped to set it to slack_sdk.adapter.django.DjangoListenerCompletionHandler.
            z0DjangoListenerCompletionHandler has been enabled)rl   listener_runnerra   rB   listener_executorlazy_listener_runner
isinstancer   r   process_before_responserI   listener_start_handlerr   inforM   listener_completion_handlerr   r^   )rU   rl   rn   current_start_handlermessagecurrent_completion_handlers         r"   __init__zSlackRequestHandler.__init__q   s}   (28V")$69
 9
 9
 5
 /+?@@ 	dbccc&$.. HO!!"NOOOF / F ,Z@UWr5s5s,G HO  )))) ?Y>Z>ZDH$;HO!!"OPPP%4%P"%1*&(H;
 ;
1
G HO  )))F?^?`?` <PQQQQQr$   r   r   c                    |j         dk    r| j        j        | j        j        }|j        |j        k    r1|                    t          |                    }t          |          S |j        |j        k    r1|	                    t          |                    }t          |          S nA|j         dk    r6| j        
                    t          |                    }t          |          S t          dd          S )NGETPOSTi  s	   Not Foundr'   )methodrl   
oauth_flowr,   install_pathhandle_installationr#   r@   redirect_uri_pathhandle_callbackdispatchr	   )rU   r   r~   r%   s       r"   rV   zSlackRequestHandler.handle   s    :x".(,(;
8z666 * > >s?S?S T TI-i888X!=== * : :?3;O;O P PI-i888Z6!!))/#*>*>??I%i0003====r$   N)rX   rY   rZ   r
   ry   r   r	   rV   r\   r$   r"   rk   rk   p   sW        2RC 2R 2R 2R 2Rh>+ >, > > > > > >r$   rk   )+rG   r   	threadingr   r   typingr   r   django.httpr   r	   slack_bolt.appr
   slack_bolt.errorr   slack_bolt.lazy_listenerr   "slack_bolt.lazy_listener.internalsr   *slack_bolt.listener.listener_start_handlerr   r   /slack_bolt.listener.listener_completion_handlerr   r   !slack_bolt.listener.thread_runnerr   slack_bolt.oauthr   slack_bolt.requestr   slack_bolt.responser   r#   r@   	django.dbrA   strrK   rM   r^   ra   rk   r\   r$   r"   <module>r      s          , , , , , , , , % % % % % % % % 1 1 1 1 1 1 1 1       & & & & & & = = = = = = F F F F F F               C B B B B B & & & & & & * * * * * * , , , , , ,     , <    2 , + + + + +
V 
s 
 
 
 
S S S S S!5 S S SX X X X X&? X X X+ + + + +%= + + +$C> C> C> C> C> C> C> C> C> C>r$   