示例#1
0
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)
示例#2
0
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))
示例#3
0
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
示例#4
0
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)
示例#5
0
def save_connection(connection_id, user, room_ids):
    connection = {'user': user, 'rooms': room_ids}
    redis_client.set(connection_id, json.dumps(connection))
示例#6
0
def upsert_room(room):
    redis_client.set(room['id'], json.dumps(room))
示例#7
0
def refresh_user_data(token, user):
    redis_client.set(token, json.dumps(user.to_dict()))
示例#8
0
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
示例#9
0
def upsert_room(room):
    room_id = room['id']
    redis_client.set(f'room-{room_id}', json.dumps(room))