Files
py12306/old_py12306/user/user.py
2019-05-14 13:21:25 +08:00

94 lines
2.8 KiB
Python

from py12306.app import *
from py12306.cluster.cluster import Cluster
from py12306.helpers.event import Event
from py12306.helpers.func import *
from py12306.log.user_log import UserLog
from py12306.user.job import UserJob
@singleton
class User:
users = []
user_accounts = []
retry_time = 3
cluster = None
def __init__(self):
self.cluster = Cluster()
self.update_interval()
self.update_user_accounts()
def update_user_accounts(self, auto=False, old=None):
self.user_accounts = Config().USER_ACCOUNTS
if auto:
UserLog.add_quick_log(UserLog.MESSAGE_USERS_DID_CHANGED).flush()
self.refresh_users(old)
def update_interval(self, auto=False):
self.interval = Config().USER_HEARTBEAT_INTERVAL
if auto: jobs_do(self.users, 'update_user')
@classmethod
def run(cls):
self = cls()
app_available_check()
self.start()
pass
def start(self):
self.init_users()
UserLog.print_init_users(users=self.users)
# 多线程维护用户
create_thread_and_run(jobs=self.users, callback_name='run', wait=Const.IS_TEST)
def init_users(self):
for account in self.user_accounts:
self.init_user(account)
def init_user(self, info):
user = UserJob(info=info)
self.users.append(user)
return user
def refresh_users(self, old):
for account in self.user_accounts:
key = account.get('key')
old_account = array_dict_find_by_key_value(old, 'key', key)
if old_account and account != old_account:
user = self.get_user(key)
user.init_data(account)
elif not old_account: # 新用户 添加到 多线程
new_user = self.init_user(account)
create_thread_and_run(jobs=new_user, callback_name='run', wait=Const.IS_TEST)
for account in old: # 退出已删除的用户
if not array_dict_find_by_key_value(self.user_accounts, 'key', account.get('key')):
Event().user_job_destroy({'key': account.get('key')})
@classmethod
def is_empty(cls):
self = cls()
return not bool(self.users)
@classmethod
def get_user(cls, key) -> UserJob:
self = cls()
for user in self.users:
if user.key == key: return user
return None
@classmethod
def get_passenger_for_members(cls, members, key):
"""
检测乘客信息
:param passengers
:return:
"""
self = cls()
for user in self.users:
assert isinstance(user, UserJob)
if user.key == key and user.wait_for_ready():
return user.get_passengers_by_members(members)