a
    iÎ  ã                   @   sÖ  d dl Z d dlZd dlZd dlZd dlZd dl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Zd dlZd dlT d dlT d dlmZmZ d dlT d dlZd dlmZmZm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m Z  d d
l!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 e 9e:¡Z;e$ƒ  e%ƒ  e<dƒ e"ej=d�Z>dZ?e,ƒ Zd dl@mAZAmBZB d dlCmDZD dd„ ZEe:dk�rÒe  FeEƒ ¡ dS )é    N)Údate)Úserver)Ú*)ÚsaveGameAsyncÚloadGameAsync)Úregister_event_handlerÚcall_event_handlerÚInvalidEventError)ÚRateLimiter©Úconfig)Úregister_eventÚget_applicable_eventsÚevent_count)ÚPlayerCache)Úregister_all_event_handlersÚregister_all_events)ÚUserRegistryÚUSERSÚget_websocket_for_player)ÚBatchedUpdateÚserverClassÚComplexHandlerÚ
sendToUserÚsendEventMessageÚsendUserInfoÚsendDict)ÚstartÚshutdownÚerrorÚevery_minuteÚhandlerÚinitialize_dummy_userÚstartup)Úmax_sizeF)Úproducer_handlerÚconsumer_handler)ÚiterateGamesc            
      Ã   s¸  t  ¡ } |  ¡ }|  tj|jd ¡ ddlm} ddl	m	} ||j
d�I d H  td|j
› �ƒ tdƒ ddlm} ddlm} |ƒ I d H  |ƒ I d H  td	ƒ ttj d
d¡ƒ}tdƒ t td|¡I d H }td|› �ƒ t  tƒ ¡}t  d¡I d H  tƒ I d H  |I d H  tdƒ | ¡  z$t j| ¡ dd�I d H  tdƒ W n t j�y\   tdƒ Y n0 | ¡  z|I d H  W n t j �yŠ   Y n0 ddlm!}	 |	ƒ I d H  tdƒ tdƒ d S )Nr   )Úinitialize_poolr   )Ú	pool_sizez+Database connection pool initialized: size=z!Initializing retention systems...)Úinitialize_quest_templates)Úinitialize_daily_rewardszRetention systems initializedÚPORTÚ8001z
running...Ú z#WebSocket server listening on port é   zShutting down gracefully...g      @)ÚtimeoutzWebSocket server closedz2WebSocket server close timed out, forcing shutdown)Ú
close_poolzDatabase pool closedzShutdown complete)"ÚasyncioÚget_running_loopÚcreate_futureÚadd_signal_handlerÚsignalÚSIGTERMÚ
set_resultÚdatabase_asyncr(   r   ÚMAX_CONNECTIONSÚprintÚretention.daily_questsr*   Úretention.daily_rewardsr+   ÚintÚosÚenvironÚgetÚ
websocketsÚserver!   Úcreate_taskr    Úsleepr"   ÚcloseÚwait_forÚwait_closedÚTimeoutErrorÚcancelÚCancelledErrorr1   )
ÚloopÚstopr(   r   r*   r+   ÚportÚ	ws_serverZminute_taskr1   © rP   ú$/var/www/lichun.app/lichun/ws/app.pyÚmain8   sJ    
rR   Ú__main__)Gr2   ÚdatetimeÚtimeÚjsonÚcProfiler?   Úrandomr6   Ú	tracebackr   Úhttpr   ÚloggingrB   ÚeventsÚ	functionsr   r   ÚintradayActivityÚtutorial_eventsÚevent_handlersr   r   r	   Ú	dayEventsÚconversationEventsÚrate_limiterr
   r   Úevent_registryr   r   r   Úplayer_cacher   Úserver.event_registrationr   r   Úserver.websocket_registryr   r   r   Úserver.websocket_messagingr   r   r   r   r   r   r   Úserver.websocket_handlersr   r   r   r    r!   r"   Ú	getLoggerÚ__name__Úloggerr;   r:   ÚplayerRecordsÚlastIterationÚgame_loop.producer_consumerr%   r&   Úgame_loop.loop_managerr'   rR   ÚrunrP   rP   rP   rQ   Ú<module>   sP   $ 
A
