def delete_connection_from_rooms(connection_id, user, rooms): user_has_left = False for room_id in rooms: room = get_room(room_id) if room: user_in_room = [u for u in room['users'] if u['id'] == user['id']] if len(user_in_room) > 0: user_in_room = user_in_room[0] if connection_id in user_in_room['connections']: # remove connection from user user_in_room['connections'].remove(connection_id) if len(user_in_room['connections']) == 0: # remove user from room room['users'] = [ u for u in room['users'] if u['id'] != user['id'] ] if len(room['users']) == 0: # delete room # fix rooms are also deleted, should be fine # since chat history stays redis_client.delete(room_id) return else: user_has_left = True redis_client.set(room_id, json.dumps(room)) if user_has_left: # broadcast user left broadcast_user_left(room_id, user)
def add_token_to_user(user_id, token): # one user can have multiple tokens, so value is list key = f'user-id-{user_id}' tokens = redis_client.get(key) if tokens: tokens = json.loads(tokens) else: tokens = [] tokens.append(token) redis_client.set(key, json.dumps(tokens))
def remove_token_from_user(user_id, token): key = f'user-id-{user_id}' tokens = redis_client.get(key) if tokens: tokens = json.loads(tokens) tokens = [t for t in tokens if t != token] redis_client.set(key, json.dumps(tokens)) else: # TODO: log error pass
def clean_dead_connections(room_id, user_id, dead_connections): # Remove connection/user from room data # Remove connection from connections map # TODO: enforce how many connections a user can have, similar to MAX_USER_CONNECTION # but not per room, it's for total if len(dead_connections) > 0: print(f'[{room_id}] found dead connections: {len(dead_connections)}') room = get_room(room_id) users = room['users'] user_in_room = [u for u in users if u['id'] == user_id] if len(user_in_room) > 0: user = user_in_room[0] user['connections'] = [connection_id for connection_id in user['connections'] if connection_id not in dead_connections] if len(user['connections']) == 0: room['users'] = [u for u in users if u['id'] != user_id] # TODO: broadcast user left redis_client.set(room_id, json.dumps(room)) for connection_id in dead_connections: # TODO: bulk delete redis_client.delete(connection_id)
def save_connection(connection_id, user, room_ids): connection = {'user': user, 'rooms': room_ids} redis_client.set(connection_id, json.dumps(connection))
def upsert_room(room): redis_client.set(room['id'], json.dumps(room))
def refresh_user_data(token, user): redis_client.set(token, json.dumps(user.to_dict()))
def create_token(user_dict): token = token_hex(16) redis_client.set(token, json.dumps(user_dict)) add_token_to_user(user_dict['id'], token) return token
def upsert_room(room): room_id = room['id'] redis_client.set(f'room-{room_id}', json.dumps(room))