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))
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), ))
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()
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()
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()
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
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
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