
    Ţi                         d Z ddlZddlZddlmZmZ ddlmZmZmZ  ej                  e
      Z e       Z G d d      Z e       Zej                  d      defd	       Zy)
u)   
大厅聊天室 —— WebSocket 广播
    N)datetimetimezone)	APIRouter	WebSocketWebSocketDisconnectc                   r    e Zd Zd ZdededefdZdedefdZdefdZ	d	efd
Z
dededefdZed        Zy)ChatManagerc                     i | _         y N)connectionsselfs    M/mnt/c/Users/DipsyHou/Desktop/workspace/TheGreatWar/server/app/routes/chat.py__init__zChatManager.__init__   s
    13    user_idnicknamewsc                    K   |j                          d {    || j                  |<   | j                  | d       d {    y 7 07 w)N    进入了大厅)acceptr   broadcast_system)r   r   r   r   s       r   connectzChatManager.connect   sJ     iik$&!##xj0@$ABBB 	Bs!   AA*AA	A	Ac                    K   | j                   j                  |d        | j                  | d       d {    y 7 w)N    离开了大厅)r   popr   )r   r   r   s      r   
disconnectzChatManager.disconnect   s8     Wd+##xj0@$ABBBs   4><>messagec                 @  K   t        j                  |d      }g }| j                  j                         D ]  \  }}	 |j	                  |       d {    ! |D ]  }| j                  j                  |d          y 7 *# t
        $ r |j                  |       Y dw xY ww)NF)ensure_ascii)jsondumpsr   items	send_text	Exceptionappendr   )r   r   datadeaduidr   s         r   	broadcastzChatManager.broadcast   s     zz'6''--/GC!ll4((( 0
 C  d+  ) !C !s:   :BA>A<A>&B<A>>BBBBtextc                    K   | j                  d|t        j                  t        j                        j                         d       d {    y 7 w)Nsystem)typecontenttimer*   r   nowr   utc	isoformat)r   r+   s     r   r   zChatManager.broadcast_system%   s@     nnLL.88:
  	 	s   AA
AAr/   c           	         K   | j                  d|||t        j                  t        j                        j                         d       d {    y 7 w)Nchat)r.   r   r   r/   r0   r1   )r   r   r   r/   s       r   broadcast_chatzChatManager.broadcast_chat,   sF     nn LL.88:
  	 	s   A
AAAc                 ,    t        | j                        S r   )lenr   r   s    r   online_countzChatManager.online_count5   s    4##$$r   N)__name__
__module____qualname__r   strr   r   r   dictr*   r   r7   propertyr:    r   r   r	   r	      s    4CS CC CY C
C Cs C	,t 	,3 C 3   % %r   r	   z/ws/chatr   c                   K   d}d}	 | j                          d{    | j                          d{   }t        j                  |      }|j	                  d      dk7  rc| j                  dd       d{    	 |rDt        j                  j                  |d       |r!t        j                  | d       d{    yyydd	l
m}  ||j	                  d
d            }|sc| j                  dd       d{    	 |rDt        j                  j                  |d       |r!t        j                  | d       d{    yyy|d   }|j	                  dd      }| t        j                  |<   t        j                  | d       d{    | j                  t        j                  dt        j                  d             d{    	 | j                          d{   }t        j                  |      }|j	                  d      dk(  rS|j	                  dd      j                         r3t        j!                  |||d   j                         dd        d{    7 I7 47 7 7 v7 47 7 7 7 # t"        $ r Y n/t$        $ r$}	t&        j)                  d|	 d       Y d}	~	nd}	~	ww xY w|rEt        j                  j                  |d       |r"t        j                  | d       d{  7   yyy# |rEt        j                  j                  |d       |r"t        j                  | d       d{  7   w w w xY ww)u   
    大厅聊天 WebSocket
    客户端连接后第一条消息需发送: {"type":"auth","token":"xxx"}
    之后发送: {"type":"chat","content":"xxx"}
    Nr.   authi  u   首条消息需为认证信息)codereasonr   r   )decode_access_tokentoken i  u   Token 无效subusernameUnknownr   online)r.   countTr6   r/      zChat WS error: )exc_info)r   receive_textr!   loadsgetclosechat_managerr   r   r   app.authrF   r$   r"   r:   stripr7   r   r%   loggererror)
r   r   r   auth_msg	auth_datarF   payloadrawr'   es
             r   chat_wsr^   =   s#     GH,Siik**JJx(	== F*((-M(NNND $$(($7"33xj@P4QRRR  A 	1%immGR&@A((^(<<<8 $$(($7"33xj@P4QRRR  5 %.;;z95 -/  )++xj8H,IJJJ ll4::!..'
   	 	 ))C::c?Dxx6)dhhy".E.K.K.M"11'8T)_EZEZE\]a^aEbccc	 ; 	* OL SA =@ S/ 	K	 * d  ;qc*T::; $$(($7"33xj@P4QRRR  7$$(($7"33xj@P4QRRR  s$  MI> I$I> I'AI> 7I*8I> =?M<I-=M6I> :I0;I>  ?M?I3 MAI> I6<I> 	I8
I> "I:#A;I> I<I> 'I> *I> -M0I> 3M6I> 8I> :I> <I> >	J5L  	J5J0+L  0J55L  8?M7K:8M A M	 MM		M)__doc__r!   loggingr   r   fastapir   r   r   	getLoggerr;   rW   routerr	   rT   	websocketr^   rA   r   r   <module>re      sq      ' = =			8	$	*% *%Z } *4Si 4S 4Sr   