Ë
    ÷g÷jÜ  ã                  óº   — d 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mZ ed   hZed   hZeeegdf   Z G d„ d	«      Z e«       Zdd
„Zdd„Zddd„Zy)zDIn-process WebSocket hub + guided demo director for Clevertree Chat.é    )ÚannotationsN)ÚCallable)Úget_demo)ÚJORDANÚMAYAÚnamec                  óF   — e Zd Zd	d„Zd
d„Zd
d„Zdd„Zdd„Zddd„Zdd„Z	y)ÚChatHubc                óp   — t        j                  «       | _        i | _        i | _        t        «       | _        y ©N)Ú	threadingÚRLockÚ_lockÚ_subsÚ_timersÚsetÚ
_injecting)Úselfs    ú /app/clevertree_chat/chat_hub.pyÚ__init__zChatHub.__init__   s'   € Ü—_‘_Ó&ˆŒ
Ø%'ˆŒ
Ø35ˆŒÜ$'£Eˆ�ó    c                ó¬   — | j                   5  | j                  j                  |t        «       «      j	                  |«       d d d «       y # 1 sw Y   y xY wr   )r   r   Ú
setdefaultr   Úadd)r   ÚtopicÚsends      r   Ú	subscribezChatHub.subscribe   s4   € Ø�Z‹ZØ�J‰J×!Ñ! %¬«Ó/×3Ñ3°DÔ9÷ �Z‰Zús   �4A
Á
Ac                óò   — | j                   5  | j                  j                  |«      }|s
	 d d d «       y |j                  |«       |s| j                  j	                  |d «       d d d «       y # 1 sw Y   y xY wr   )r   r   ÚgetÚdiscardÚpop)r   r   r   Úbuckets       r   ÚunsubscribezChatHub.unsubscribe   sU   € Ø�Z‹ZØ—Z‘Z—^‘^ EÓ*ˆFÙØ÷ ˆZð �N‰N˜4Ô ÙØ—
‘
—‘˜u dÔ+÷ �Z‰Zús   �A-µ/A-Á-A6c                óZ  — t        j                  |d¬«      }| j                  5  t        | j                  j                  |«      xs d«      }d d d «       g }D ]  }	  ||«       Œ |D ]  }| j                  ||«       Œ y # 1 sw Y   Œ5xY w# t        $ r |j                  |«       Y ŒPw xY w)N)Ú,Ú:)Ú
separators© )	ÚjsonÚdumpsr   Úlistr   r   Ú	ExceptionÚappendr#   )r   r   ÚeventÚrawÚsendsÚdeadr   s          r   Ú	broadcastzChatHub.broadcast(   s•   € Ü�j‰j˜¨:Ô6ˆØ�Z‹ZÜ˜Ÿ™Ÿ™¨Ó.Ò4°"Ó5ˆE÷ àˆÛˆDð"Ù�S•	ð ó
 ˆDØ×Ñ˜U DÕ)ñ ÷ ˆZûô ò "Ø—‘˜DÖ!ð"ús   ¤)BÁBÂB
ÂB*Â)B*c                ó¤   — | j                   5  | j                  j                  |d «      }d d d «       r|j                  «        y y # 1 sw Y   ŒxY wr   )r   r   r!   Úcancel)r   r   Útimers      r   Úcancel_timerzChatHub.cancel_timer5   s=   € Ø�Z‹ZØ—L‘L×$Ñ$ U¨DÓ1ˆE÷ áØ�L‰L�Nð ÷ ˆZús   �AÁAc                óò   ‡ ‡— ‰ j                  ‰«       dˆ ˆfd„}t        j                  ||«      }d|_        ‰ j                  5  |‰ j
                  ‰<   ddd«       |j                  «        y# 1 sw Y   ŒxY w)zNIf the next scripted beat is a peer, inject it after delay (server-side only).c                 ó(  •— 	 ‰ j                  ‰«       ‰ j                  5  ‰ j                  j                  ‰d «       d d d «       y # 1 sw Y   y xY w# ‰ j                  5  ‰ j                  j                  ‰d «       d d d «       w # 1 sw Y   w xY wxY wr   )Ú_inject_next_peerr   r   r!   )r   r   s   €€r   Úfirez/ChatHub.schedule_peer_after_drain.<locals>.fire?   s_   ø€ ð2Ø×&Ñ& uÔ-à—Z“ZØ—L‘L×$Ñ$ U¨DÔ1÷  —Z‘Zû�T—Z“ZØ—L‘L×$Ñ$ U¨DÔ1÷  —Z‘Zýs.   ƒA  AÁAÁBÁBÁ<	BÂBÂ
BTN©ÚreturnÚNone)r6   r   ÚTimerÚdaemonr   r   Ústart)r   r   Údelay_sr:   r5   s   ``   r   Úschedule_peer_after_drainz!ChatHub.schedule_peer_after_drain;   sZ   ù€ à×Ñ˜%Ô ö	2ô —‘ ¨Ó.ˆØˆŒØ�Z‹ZØ"'ˆD�L‰L˜Ñ÷ à�‰�÷ ˆZús   ÁA-Á-A6c           	     ó  ‡‡
— ddl mŠ
 | j                  5  ‰| j                  v r
	 d d d «       y | j                  j	                  ‰«       d d d «       	 t        ‰«      }‰
j                  ‰«      }|j                  d«      r2	 | j                  5  | j                  j                  ‰«       d d d «       y |d   t        |j                  «      k\  r2	 | j                  5  | j                  j                  ‰«       d d d «       y |j                  |d      }|d   d   t        v r2	 | j                  5  | j                  j                  ‰«       d d d «       y |d   }‰
j                  ‰|d   |d   |j                  d	«      xs d |d   ¬
«      }t        ˆ
ˆfd„‰
j                  ‰«      d   D «       «      }|d   |d<   |d   |d<   |d   |d<   d|d<   | j                  ‰d‰t        |d¬«      |d   dœ«       t!        j"                  d«       ‰
j%                  ‰|d   «      }| j                  ‰d‰|j                  d«      xs |j                  d«      xs d|d   dœ«       | j                  ‰d‰|d   dœ«       t        ‰«      }‰
j                  ‰«      }|d   t        |j                  «      k  r3|j                  |d      }	|	d   d   t&        v r| j)                  ‰d¬ «       | j                  5  | j                  j                  ‰«       d d d «       y # 1 sw Y   �ŒÇxY w# 1 sw Y   y xY w# 1 sw Y   y xY w# 1 sw Y   y xY w# 1 sw Y   y xY w# | j                  5  | j                  j                  ‰«       d d d «       w # 1 sw Y   w xY wxY w)!Nr   )ÚdemoÚpendingÚstepÚauthorr   ÚuuidÚbodyÚchosen)rJ   r   c              3  óX   •K  — | ]!  }|d    ‰j                  ‰«      d   k(  sŒ|–— Œ# y­w)ÚidrE   N)Úboard)Ú.0ÚcrD   r   s     €€r   Ú	<genexpr>z,ChatHub._inject_next_peer.<locals>.<genexpr>e   s2   øè ø€ ÐoÑ&C ÀqÈÁwÐRV×R\ÑR\Ð]bÓRcÐdmÑRnÓGnœ1Ñ&Cùs   ƒ*£*ÚcommentsÚauthor_nameÚauthor_uuidrL   Ú	author_idTÚinjectedz	post.liveÚ )ÚvisitorÚview)Útyper   ÚcommentrX   g333333ó?zbatch.noticeÚbatch_noticeÚmessage)rY   r   ÚnoticerX   zboard.snapshot)rY   r   rX   g      @)rA   )ÚapirD   r   r   r   r   rM   r   r    ÚlenÚSCRIPTÚVISITOR_NAMESÚsubmitÚnextr2   Ú_activity_commentÚtimeÚsleepÚdrainÚ
PEER_NAMESrB   )r   r   Údemo_modÚstateÚitemrG   ÚresultrE   ÚdrainedÚnxtrD   s    `        @r   r9   zChatHub._inject_next_peerL   s#  ù€ Ýà�Z‹ZØ˜Ÿ™Ñ'Ø÷ ˆZð �O‰O×Ñ Ô&÷ ð9	/Ü “ˆHØ—J‘J˜uÓ%ˆEØ�y‰y˜Ô#Øðh —“Ø—‘×'Ñ'¨Ô.÷ �ðg �V‰}¤ H§O¡OÓ 4Ò4Øðd —“Ø—‘×'Ñ'¨Ô.÷ �ðc —?‘? 5¨¡=Ñ1ˆDØ�H‰~˜fÑ%¬Ñ6Øð^ —“Ø—‘×'Ñ'¨Ô.÷ �ð] ˜(‘^ˆFØ—[‘[ØØ�v‘Ø�V‘Ø—x‘x Ó)Ò1¨TØ˜F‘^ð !ó ˆFô Ôo d§j¡j°Ó&7¸
Ò&CÓoÓoˆGØ%+¨F¡^ˆG�MÑ"Ø%+¨F¡^ˆG�MÑ"Ø#)¨$¡<ˆG�KÑ Ø"&ˆG�JÑà�N‰NØà'Ø"Ü0°À"ÔEØ" 6™Nñ	ôô �J‰J�sŒOØ—j‘j ¨¨v©Ó7ˆGØ�N‰NØà*Ø"Ø%Ÿk™k¨.Ó9ÒY¸W¿[¹[ÈÓ=SÒYÐWYØ# F™Oñ	ôð �N‰NØØ)°EÀ7È6Á?ÑSôô
   “ˆHØ—J‘J˜uÓ%ˆEØ�V‰}œs 8§?¡?Ó3Ò3Ø—o‘o e¨F¡mÑ4�Ø�x‘= Ñ(¬JÑ6Ø×2Ñ2°5À#Ð2ÔFà—“Ø—‘×'Ñ'¨Ô.÷ �÷y ‰Zú÷x �ú—�ú—�ú—�û�—“Ø—‘×'Ñ'¨Ô.÷ —‘ýsw   •L®LÁ-M ÂLÂ1M ÃL'Ã> M Ä+L3ÅFM Ë)L?ÌLÌL$Ì'L0Ì3L<Ì?MÍN	ÍM=Í4	N	Í=NÎN	Nr;   )r   Ústrr   zCallable[[str], None]r<   r=   )r   ro   r.   Údictr<   r=   )r   ro   r<   r=   )g333333@)r   ro   rA   Úfloatr<   r=   )
Ú__name__Ú
__module__Ú__qualname__r   r   r#   r2   r6   rB   r9   r(   r   r   r
   r
      s&   „ ó*ó:ó,ó*óôô"@/r   r
   c                ó&   — | d   d   }|t         v ryy)NrG   r   ÚpeerrW   )rh   )rF   r   s     r   Úscript_rolerw   ’   s   € Ø�‰>˜&Ñ!€DØŒzÑØØr   c                ó”  — t        | j                  d«      xs g «      }| d   | j                  d«      xs d| j                  d«      xs d| j                  d«      xs d|| j                  d«      xs d	t        | j                  d
«      «      t        |«      xr | j                  d«      |k(  t        | j                  d«      «      ddœ
S )NÚkeysrL   rR   ÚVisitorrS   rV   rI   ÚstartingÚuncategorizedÚplacedrU   Úpost©
rL   rG   rS   rI   ry   r{   r}   ÚminerU   Úkind)r+   r   Úbool)rZ   rW   ry   s      r   rd   rd   ™   s±   € Ü�—‘˜FÓ#Ò) rÓ*€Dà�d‰mØ—+‘+˜mÓ,Ò9°	Ø—{‘{ =Ó1Ò7°RØ—‘˜FÓ#Ò) rØØ—K‘K 
Ó+Ò>¨Ü�w—{‘{ 8Ó,Ó-Ü�W“ÒG '§+¡+¨mÓ"<ÀÑ"GÜ˜Ÿ™ ZÓ0Ó1Øñð r   c                óö  — g }t        «       }| j                  d«      xs i }g }|j                  «       D ]T  }|j                  d«      xs g D ]:  }|j                  d«      }||v rŒ|j                  |«       |j	                  |«       Œ< ŒV dd„}	|j                  |	¬«       |D ]Ã  }t        |j                  d«      xs g «      }
|j	                  |j                  d«      |j                  d«      xs d|j                  d	«      xs d
|j                  d«      xs d
|
D �cg c]
  }|dk7  sŒ	|‘Œ c}|j                  d«      xs ddt        |j                  d«      «      dddœ
«       ŒÅ | j                  d«      xs( | j                  d«      xs i j                  d«      xs d
}|rN|j	                  dt        | j                  d«      xs i j                  d«      xs d«      z   dd
|g d
dddddœ
«       |S c c}w )z<Flatten comments into minimized activity rows (newest last).ÚsectionsrQ   rL   c                óê   — t        | j                  d«      xs d«      }|j                  «       rdt        |«      dfS |j	                  dd«      d   }|j                  «       rdt        |«      |fS dd|fS )NrL   Ú0r   rV   Ú-é   éÿÿÿÿ)ro   r   ÚisdigitÚintÚrsplit)rZ   r/   Útails      r   Ú_id_sortz$activity_from_view.<locals>._id_sort·   so   € Ü�'—+‘+˜dÓ#Ò* sÓ+ˆØ�;‰;Œ=Ø”s˜3“x Ð$Ð$à�z‰z˜#˜qÓ! "Ñ%ˆØ�<‰<Œ>Ø”s˜4“y #Ð&Ð&Ø�1�cˆ{Ðr   )Úkeyry   rG   rz   rS   rV   Útextr|   r{   Tr€   Fr~   r   r[   rD   r]   zbatch-rF   r   ÚBatchÚbatch)rZ   rp   )	r   r   Úvaluesr   r-   Úsortr+   r‚   ro   )rX   rW   ÚrowsÚseenr„   ÚbagÚsectionrZ   ÚcidrŽ   ry   Úkr]   s                r   Úactivity_from_viewr›   ©   sç  € à€DÜ‹5€DØ�x‰x˜
Ó#Ò) r€Hà
€CØ—?‘?Ö$ˆØ—{‘{ :Ó.Ò4°"Ò4ˆGØ—+‘+˜dÓ#ˆCØ�d‰{ØØ�H‰H�SŒMØ�J‰J�wÕñ 5ð %óð ‡H�H�€HÔÛˆÜ�G—K‘K Ó'Ò-¨2Ó.ˆØ�‰à—k‘k $Ó'Ø!Ÿ+™+ hÓ/Ò<°9Ø&Ÿ{™{¨=Ó9Ò?¸RØŸ™ FÓ+Ò1¨rÙ$(ÓA¡D˜q¨A°Ó,@š DÑAØ#ŸK™K¨
Ó3ÒF°ØÜ˜WŸ[™[¨Ó0Ó1Ø!Øñõ	
ð ð  �X‰X�nÓ%ÒU¨$¯(©(°6Ó*:Ò*@¸b×)EÑ)EÀhÓ)OÒUÐSU€FÙØ�‰à¤ d§h¡h¨vÓ&6Ò&<¸"×%AÑ%AÀ&Ó%IÒ%NÈQÓ!OÑOØ!Ø!ØØØØØØ!Øñô	
ð €Kùò1 Bs   Ä
G6Ä*G6)rF   rp   r<   ro   )rZ   rp   rW   ro   r<   rp   )rV   )rX   rp   rW   ro   r<   z
list[dict])Ú__doc__Ú
__future__r   r)   r   re   Útypingr   Úclevertree_chat.demosr   Úclevertree_chat.demos.personasr   r   ra   rh   ro   rp   ÚBroadcastFnr
   ÚHUBrw   rd   r›   r(   r   r   Ú<module>r£      sn   ðÙ Jå "ã Û Û Ý å *ß 7ð �f‘�€Ø�V‰nÐ€
à˜˜T�{ DÐ(Ñ)€÷x/ñ x/ñv ƒi€óóõ 9r   