
    Bգ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                    d          defd	            ZdS )
u)   
大厅聊天室 —— WebSocket 广播
    N)datetimetimezone)	APIRouter	WebSocketWebSocketDisconnectc                   z    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dS )ChatManagerc                     i | _         d S N)connectionsselfs    5/root/workspace/TheGreatWar/server/app/routes/chat.py__init__zChatManager.__init__   s    13    user_idnicknamewsc                    K   |                                  d {V  || j        |<   |                     | d           d {V  d S )N    进入了大厅)acceptr   broadcast_system)r   r   r   r   s       r   connectzChatManager.connect   sh      iikk$&!##x$A$A$ABBBBBBBBBBBr   c                 |   K   | j                             |d            |                     | d           d {V  d S )N    离开了大厅)r   popr   )r   r   r   s      r   
disconnectzChatManager.disconnect   sT      Wd+++##x$A$A$ABBBBBBBBBBBr   messagec                 :  K   t          j        |d          }g }| j                                        D ]F\  }}	 |                    |           d {V  "# t
          $ r |                    |           Y Cw xY w|D ]}| j                            |d            d S )NF)ensure_ascii)jsondumpsr   items	send_text	Exceptionappendr   )r   r   datadeaduidr   s         r   	broadcastzChatManager.broadcast   s      z'666'--// 	! 	!GC!ll4(((((((((( ! ! !C     ! 	, 	,C  d++++	, 	,s   AA87A8textc                    K   |                      d|t          j        t          j                                                  d           d {V  d S )Nsystem)typecontenttimer*   r   nowr   utc	isoformat)r   r+   s     r   r   zChatManager.broadcast_system%   so      nnL..88::
 
   	 	 	 	 	 	 	 	 	r   r/   c           	         K   |                      d|||t          j        t          j                                                  d           d {V  d S )Nchat)r.   r   r   r/   r0   r1   )r   r   r   r/   s       r   broadcast_chatzChatManager.broadcast_chat,   su      nn L..88::
 
   	 	 	 	 	 	 	 	 	r   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 4 4CS CC CY C C C C
C Cs C C C C	,t 	, 	, 	, 	,3    C 3      % % X% % %r   r	   z/ws/chatr   c                   K   d}d}	 |                                   d{V  |                                  d{V }t          j        |          }|                    d          dk    rk|                     dd           d{V  	 |rGt          j                            |d           |r't          	                    | d           d{V  dS dS dS dd	l
m}  ||                    d
d                    }|sk|                     dd           d{V  	 |rGt          j                            |d           |r't          	                    | d           d{V  dS dS dS |d         }|                    dd          }| t          j        |<   t          	                    | d           d{V  |                     t          j        dt          j        d                     d{V  	 |                                  d{V }t          j        |          }|                    d          dk    rj|                    dd                                          rBt                              |||d                                         dd                    d{V  # t"          $ r Y n5t$          $ r)}	t&                              d|	 d           Y d}	~	nd}	~	ww xY w|rGt          j                            |d           |r't          	                    | d           d{V  dS dS dS # |rFt          j                            |d           |r%t          	                    | d           d{V  w w w xY 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iikk********Jx((	==  F**((-M(NNNNNNNNND  	S$(($777 S"33x4Q4Q4QRRRRRRRRRRR	S 	SS SE 	100000%%immGR&@&@AA 	((^(<<<<<<<<<8  	S$(($777 S"33x4Q4Q4QRRRRRRRRRRR	S 	SS S9 %.;;z955 -/ )++x,I,I,IJJJJJJJJJ ll4:!.'
 '
     	 	 	 	 	 	 		d))))))))C:c??Dxx6))dhhy".E.E.K.K.M.M)"11'8T)_EZEZE\E\]a^a]aEbccccccccc		d     ; ; ;*q**T::::::::;  	S$(($777 S"33x4Q4Q4QRRRRRRRRRRR	S 	SS S  	S$(($777 S"33x4Q4Q4QRRRRRRRRRR	SSsE   A>J# AJ# &D=J# #
K!-L1 /	K!8KL1 K!!L1 1AM<)__doc__r!   loggingr   r   fastapir   r   r   	getLoggerr;   rW   routerr	   rT   	websocketr^   rA   r   r   <module>re      s       ' ' ' ' ' ' ' ' = = = = = = = = = =		8	$	$	*% *% *% *% *% *% *% *%Z {}} *4Si 4S 4S 4S 4S 4S 4Sr   