Esempio n. 1
0
def ensure_alliance_members(alliance: Alliance):
    """
    Makes sure all members of a given alliance exist in the database.
    """
    logging.debug("Updating members of alliance %s", alliance.alliance_name)
    response = esi_get(
        f"latest/alliances/{alliance.alliance_id}/corporations/")
    for corporation_id in response.data:
        ensure_corporation(int(corporation_id))
Esempio n. 2
0
def ensure_corporation_members(corporation: Corporation):
    """
    Ensure that all members of a corporation exist in the database.
    """
    logging.debug("Ensuring members of corporation %s",
                  corporation.corporation_name)
    scope = EsiScope.ESI_CORPORATIONS_READ_CORPORATION_MEMBERSHIP_V1
    result = EsiRefreshToken.objects.aggregate([
        {
            "$lookup": {
                "as": "owner_data",
                "foreignField": "_id",
                "from": "user",
                "localField": "owner",
            },
        },
        {
            "$match": {
                "owner_data.corporation": corporation.pk,
                "scopes": scope.value,
                "valid": True,
            }
        },
        {
            "$project": {
                "owner_data.character_id": 1
            }
        },
    ])

    response = None
    for document in result:
        try:
            character_id = document["owner_data"][0]["character_id"]
            esi_access_token = get_access_token(character_id, scope)
            response = esi_get(
                f"latest/corporations/{corporation.corporation_id}/members/",
                token=esi_access_token.access_token,
            )
        except Exception:
            response = None
        else:
            break

    if response is None:
        logging.debug(
            ("Could not list members of corporation %s (%d): "
             'no refresh token with scope "%s"'),
            corporation.corporation_name,
            corporation.corporation_id,
            scope.value,
        )
        return

    for character_id in response.data:
        scheduler.add_job(ensure_user, args=(int(character_id), ))
Esempio n. 3
0
def update_alliance_from_esi(alliance: Alliance):
    """
    Updates an alliance's properties from the ESI.
    """
    logging.debug("Updating properties of alliance %s", alliance.alliance_name)
    data = esi_get(f"latest/alliances/{alliance.alliance_id}").data
    old_executor = alliance.executor
    alliance.executor_corporation_id = int(data["executor_corporation_id"])
    if old_executor.corporation_id != alliance.executor_corporation_id:
        reset_clearance(old_executor.ceo, save=True)
    alliance.save()
Esempio n. 4
0
def update_user_from_esi(usr: User):
    """
    Updates a user's information from the ESI
    """
    data = esi_get(f"latest/characters/{usr.character_id}").data
    old_corporation = usr.corporation
    usr.corporation = ensure_corporation(int(data["corporation_id"]))
    usr.updated_on = utils.now()
    if usr.corporation != old_corporation:
        logging.debug("Corporation of user %s changed", usr.character_name)
        reset_clearance(usr)
    usr.save()
Esempio n. 5
0
def update_corporation_from_esi(corporation: Corporation):
    """
    Updates a corporation properties from the ESI.
    """
    logging.debug("Updating properties of corproation %s",
                  corporation.corporation_name)
    data = esi_get(f"latest/corporations/{corporation.corporation_id}").data
    corporation.alliance = (ensure_alliance(int(data["alliance_id"]))
                            if "alliance_id" in data else None)
    old_ceo = corporation.ceo
    corporation.ceo_character_id = int(data["ceo_id"])
    if old_ceo.character_id != corporation.ceo_character_id:
        reset_clearance(old_ceo, save=True)
    corporation.save()
Esempio n. 6
0
def ensure_user(character_id: int) -> User:
    """
    Ensures that a user (with a valid ESI character ID) exists, and returns it.
    It it does not, creates it by fetching relevant data from the ESI. Also
    creates the character's corporation and alliance (if applicable).
    """
    usr = User.objects(character_id=character_id).first()
    if usr is None:
        data = esi_get(f"latest/characters/{character_id}").data
        usr = User(
            character_id=character_id,
            character_name=str(data["name"]),
            corporation=ensure_corporation(int(data["corporation_id"])),
        ).save()
    return usr
Esempio n. 7
0
def ensure_alliance(alliance_id: int) -> Alliance:
    """
    Ensures that an alliance exists, and returns it. It it does not, creates
    it by fetching relevant data from the ESI.
    """
    alliance: Alliance = Alliance.objects(alliance_id=alliance_id).first()
    if alliance is None:
        data = esi_get(f"latest/alliances/{alliance_id}").data
        alliance = Alliance(
            alliance_id=alliance_id,
            alliance_name=str(data["name"]),
            executor_corporation_id=int(data["executor_corporation_id"]),
            ticker=str(data["ticker"]),
        ).save()
        ensure_corporation(alliance.executor_corporation_id)
    return alliance
Esempio n. 8
0
def ensure_corporation(corporation_id: int) -> Corporation:
    """
    Ensures that a corporation exists, and returns it. It it does not, creates
    it by fetching relevant data from the ESI.
    """
    corporation: Corporation = Corporation.objects(
        corporation_id=corporation_id).first()
    if corporation is None:
        data = esi_get(f"latest/corporations/{corporation_id}").data
        alliance = (ensure_alliance(int(data["alliance_id"]))
                    if "alliance_id" in data else None)
        corporation = Corporation(
            alliance=alliance,
            ceo_character_id=int(data["ceo_id"]),
            corporation_id=corporation_id,
            corporation_name=str(data["name"]),
            ticker=str(data["ticker"]),
        ).save()
        ensure_user(corporation.ceo_character_id)
    return corporation