Source code for sni.user.user

"""
User (aka character), corporation, and alliance management
"""

from sni.esi.esi import esi_get

from .models import (
    Alliance,
    Corporation,
    Group,
    User,
)


[docs]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
[docs]def ensure_autogroup(name: str) -> Group: """ Ensured that an automatically created group exists. Automatic groups are owned by root. """ grp = Group.objects(group_name=name).first() if grp is None: grp = Group(is_autogroup=True, group_name=name).save() return grp
[docs]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
[docs]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