78 lines
2.0 KiB
Plaintext
78 lines
2.0 KiB
Plaintext
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
|