async def online2all(): lst = [{x:y for x,y in v.items() if x != 'ws' } for v in ws_pool.get_data().values()] d = DictObject(type='onlineList', onlineList=lst) info(f'{d=}, {lst=}') for i in lst: d1 = [ x for x in lst if x['id'] != i['id'] ] await ws_pool.sendto({ 'type':'onlineList', 'onlineList':d1 } , id=i['id']) def set_from_data(mydata): buff = ws_pool.get_data() d = buff.get(ws_pool.id) d = {k:v for k,v in d.items() if k!='ws'} info(f'ws_pool.get_data = {d}') d = d.copy() mydata['from'] = d def save_external_ip(ip): data = ws_pool.get_data() mydata = data[ws_pool.id] mydata.external_ip = ip ws_pool.set_data(data) def is_extenal_ip(ip): # 通常不是以 10.、172.16 - 172.31.、192.168 开头 info(ip) if ip == '127.0.0.1': info(f'{ip} is not a external ip') return False if ip.startswith('10.'): info(f'{ip} is not a external ip') return False if ip.startswith('192.168.'): info(f'{ip} is not a external ip') return False if ip.startswith('172.'): v = int(ip.split('.')[1]) if v<=31 and v>=16: info(f'{ip} is not a external ip') return False info(f'{ip} is a external ip') return True info(f'{ws_data=}') v = json.loads(ws_data) client_data = DictObject(**v) if client_data.type == 'login': info(f'0 ========client_data={client_data}, {client_data.info=}') ws_pool.add_me(client_data.info); info(f'1 ========client_data={client_data}') await online2all() info(f'2 ========client_data={client_data}') return if client_data.type == 'logout': ws_pool.remove_me() online2all() return if client_data.type == 'iceCandidate': s = client_data.candidate.candidate ip = s.split(' ')[4] if len(ip.split(':')) < 2: if is_extenal_ip(ip): save_external_ip(ip) else: info(f'{ip=} is a ipv6==========') # # for the following type # [ 'callRequest', 'offer', 'iceCandidate', 'callAccepted', 'callRejected', # 'disconnect', 'answer']: # set_from_data(client_data) await ws_pool.sendto(client_data, id=client_data.to.id) return