Beispiel #1
0
def get_eve_character_journal(character_id, ignore_ids=[]):
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    journal_response = []
    response = EveClient.call_raw('get_characters_character_id_wallet_journal',
                                  token,
                                  character_id=character_id)
    journal_response += response.data

    # pull extra journal pages
    total_pages = int(response.header['X-Pages'][0])
    if total_pages > 1:
        for page in range(2, total_pages):
            response = EveClient.call_raw(
                'get_characters_character_id_wallet_journal',
                token,
                character_id=character_id,
                page=page)
            journal_response += response.data

    # clean journal of ignored ids, resolve unknown IDs
    journal = []
    ids_to_resolve = set()
    for entry in journal_response:
        if entry['id'] in ignore_ids:
            logger.debug("Skipping entry %s from journal query" % entry['id'])
            continue
        if 'first_party_id' in entry:
            ids_to_resolve.add(entry['first_party_id'])
        if 'second_party_id' in entry:
            ids_to_resolve.add(entry['second_party_id'])
        journal.append(entry)

    # return empty journal
    if len(journal) == 0:
        return journal

    resolved_ids = resolve_ids_with_types(ids_to_resolve)

    # resolve ids
    for entry in journal:
        if 'first_party_id' in entry:
            entry['first_party_name'] = resolved_ids[
                entry['first_party_id']]['name']
            entry['first_party_type'] = resolved_ids[
                entry['first_party_id']]['type'].upper()
        if 'second_party_id' in entry:
            entry['second_party_name'] = resolved_ids[
                entry['second_party_id']]['name']
            entry['second_party_type'] = resolved_ids[
                entry['second_party_id']]['type'].upper()

    return journal
Beispiel #2
0
def sso_callback(request):
    code = request.GET.get('code', None)
    eve_client = EveClient.get_instance()

    # verify token
    esi_security = EveClient.get_esi_security()
    esi_token = esi_security.auth(code)
    esi_character = esi_security.verify()

    # create new token
    new_token = EveToken.objects.get_or_create(
        access_token=esi_token['access_token'],
        refresh_token=esi_token['refresh_token'],
        expires_in=esi_token['expires_in'],
        user=request.user)[0]

    # set scopes M2M
    scopes = EveScope.objects.filter(name__in=esi_character['scp'])
    if scopes.count() != len(esi_character['scp']):
        logger.error(
            f"Whoa there. Somehow we added a scope we don't know about. Pass this to Krypted Developers: \n ${esi_character['scp']}"
        )
    new_token.scopes.set(scopes)

    # find or create character
    if EveCharacter.objects.filter(
            external_id=esi_character['sub'].split(":")[-1]).exists():
        character = EveCharacter.objects.get(
            external_id=esi_character['sub'].split(":")[-1])
        if character.token:
            old_token = character.token
            old_token.delete()
        character.token = new_token
        character.save()
    else:
        character = EveCharacter.objects.create(
            external_id=esi_character['sub'].split(":")[-1],
            name=esi_character['name'],
            token=new_token,
        )

    # if no primary user, set
    if not PrimaryEveCharacterAssociation.objects.filter(
            user=request.user).exists():
        PrimaryEveCharacterAssociation.objects.create(user=request.user,
                                                      character=character)

    return redirect('/')
Beispiel #3
0
def get_eve_character_transactions(character_id, ignore_ids=[]):
    logger.info("Getting transactions for %s" % character_id)
    logger.debug("Transactions to ignore: %s" % ignore_ids)
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    logger.debug("Resolved ID %s to character %s" %
                 (character_id, token.evecharacter.name))
    # resolve and clean transaction list
    transactions_response = EveClient.call(
        'get_characters_character_id_wallet_transactions',
        token,
        character_id=character_id)

    # resolve ids
    ids_to_resolve = set()
    for transaction in transactions_response:
        ids_to_resolve.add(transaction['client_id'])
    resolved_ids = resolve_ids_with_types(ids_to_resolve)

    transactions = []
    for transaction in transactions_response:
        if transaction['transaction_id'] in ignore_ids:
            logger.debug("Skipping ignored transaction: %s" %
                         transaction['transaction_id'])
            continue
        transaction['client'] = resolved_ids[transaction['client_id']]['name']
        transaction['client_id'] = transaction['client_id']
        transaction['client_type'] = resolved_ids[
            transaction['client_id']]['type']
        transaction['type_name'] = resolve_type_id_to_type_name(
            transaction['type_id'])
        transactions.append(transaction)
    logger.debug("Total transactions: %s \n Returned Transactions: %s" %
                 (len(transactions_response), len(transactions)))
    return transactions
Beispiel #4
0
def get_eve_character_skillpoints(character_id):
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    skillpoints_response = EveClient.call('get_characters_character_id_skills',
                                          token,
                                          character_id=character_id)

    return skillpoints_response['total_sp']
Beispiel #5
0
def get_structure_id(structure_id, token_entity_id, safe=True):
    from django_eveonline_connector.models import EveStructure
    if str(structure_id) in cache:
        return cache.get(str(structure_id))

    if safe:  # not running safe can lead to ESI lockouts, structure resolution is busted
        structure = EveStructure.objects.filter(
            structure_id=structure_id).first()
        if structure:
            return structure.name
        else:
            return "Unknown Structure"
    else:
        try:
            token = EveToken.objects.get(
                evecharacter__external_id=token_entity_id)
        except EveToken.DoesNotExist:
            raise EveDataResolutionError(
                'Attempted to resolve a structure without a token')

        response = EveClient.call('get_universe_structures_structure_id',
                                  token=token,
                                  structure_id=structure_id)
        if response.status != 200:
            raise EveDataResolutionError(
                f"Failed to resolve structure {structure_id} using external ID {token_entity_id}. Reason: {response.data}"
            )

        if cache:
            cache.set(str(structure_id), response.data['name'])
            return response.data['name']
        else:
            return response.data['name']
Beispiel #6
0
def sso_callback(request):
    code = request.GET.get('code', None)
    eve_client = EveClient.get_instance()

    # verify token
    esi_security = EveClient.get_esi_security()
    esi_token = esi_security.auth(code)
    esi_character = esi_security.verify()

    # create new token
    new_token = EveToken.objects.get_or_create(
        access_token=esi_token['access_token'],
        refresh_token=esi_token['refresh_token'],
        expires_in=esi_token['expires_in'],
        user=request.user)[0]

    # set scopes M2M
    new_token.scopes.set(EveScope.objects.all())

    # find or create character
    if EveCharacter.objects.filter(
            external_id=esi_character['sub'].split(":")[-1]).exists():
        character = EveCharacter.objects.get(
            external_id=esi_character['sub'].split(":")[-1])
        if character.token:
            old_token = character.token
            old_token.delete()
        character.token = new_token
        character.save()
    else:
        character = EveCharacter.objects.create(
            external_id=esi_character['sub'].split(":")[-1],
            name=esi_character['name'],
            token=new_token,
        )

    # if no primary token, set as primary token
    if not EveToken.objects.filter(user=request.user, primary=True).exists():
        logger.info("Setting primary token as %s for %s" %
                    (esi_character['name'], request.user))
        new_token.primary = True
        new_token.save()

    update_character_corporation.apply_async(args=[character.external_id])

    return redirect('app-dashboard')  # TODO: Redirect to EVE Character view
Beispiel #7
0
def get_type_id(type_id):
    response = EveClient.call('get_universe_types_type_id',
                              type_id=type_id,
                              raise_exception=True)
    if response.status != 200:
        raise EveDataResolutionError(
            f"Failed to resolve type_id({type_id}) using ESI. Notify CCP.")
    return response.data
Beispiel #8
0
def resolve_ids(ids):
    resolved_ids = EveClient.call('post_universe_names', token=None, ids=ids)
    response = {}
    for resolved_id in resolved_ids:
        external_id = resolved_id['id']
        external_name = resolved_id['name']
        if external_id not in response:
            response[external_id] = external_name
    return response
def get_entity_info(request):
    external_id = None
    if 'external_id' not in request.GET:
        return HttpResponse(status=400)
    else:
        external_id = request.GET['external_id']
    print(external_id)

    entity = resolve_id(external_id)

    if not entity:
        return HttpResponse(status=404)

    if entity['type'] == "character":
        response = EveClient.call(
            'get_characters_character_id', character_id=external_id).data
        return JsonResponse({
            "type": "character",
            "name": response['name'],
            "external_id": external_id,
        })
    elif entity['type'] == "corporation":
        response = EveClient.call(
            'get_corporations_corporation_id', corporation_id=external_id).data
        return JsonResponse({
            "type": "corporation",
            "name": response['name'],
            "ticker": response['ticker'],
            "external_id": external_id,
            "alliance_id": response['alliance_id'],
        })
    elif entity['type'] == "alliance":
        response = EveClient.call(
            'get_alliances_alliance_id', alliance_id=external_id).data
        return JsonResponse({
            "type": "alliance",
            "name": response['name'],
            "ticker": response['ticker'],
            "external_id": external_id,
        })
    else:
        return HttpResponse(status=500)
Beispiel #10
0
def add_sso_token(request):
    try:
        sso_url = EveClient.get_instance().get_sso_url()
        return redirect(sso_url)
    except Exception:
        logger.exception("Failed to get SSO url from EveClient")
        messages.warning(
            request,
            "Eve Settings are not configured correctly. Contact your administrator."
        )
        return redirect('/')
Beispiel #11
0
def get_eve_character_skills(character_id):
    logger.info("Gathering token for %s" % character_id)
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    logger.info("Pulling skills of %s" % token.evecharacter.name)
    # resolve and clean skill list
    skills = EveClient.call(
        'get_characters_character_id_skills', token, character_id=character_id)['skills']
    for skill in skills:
        skill['skill_name'] = resolve_type_id_to_type_name(skill['skill_id'])
        skill['skill_type'] = resolve_type_id_to_group_name(skill['skill_id'])
    return skills
Beispiel #12
0
def get_structure(structure_id, corporation_id):
    from django_eveonline_connector.models import EveCorporation
    corporation = EveCorporation.objects.get(external_id=corporation_id)
    response = EveClient.call('get_universe_structures_structure_id',
                              token=corporation.ceo.token,
                              structure_id=structure_id)
    if response.status != 200:
        raise EveDataResolutionError(
            f"Failed to resolve structure {structure_id} using external ID {corporation_id}. Reason: {response.data}"
        )

    return response
Beispiel #13
0
def resolve_ids_with_types(ids):
    resolved_ids = EveClient.call('post_universe_names', token=None, ids=ids)
    response = {}
    for resolved_id in resolved_ids:
        external_id = resolved_id['id']
        external_name = resolved_id['name']
        external_type = resolved_id['category']
        if external_id not in response:
            response[external_id] = {
                "name": external_name,
                "type": external_type
            }
    return response
Beispiel #14
0
def get_eve_character_clones(character_id):
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    # resolve and clean asset list
    clones_response = EveClient.call('get_characters_character_id_clones',
                                     token,
                                     character_id=character_id)
    structure_ids = []
    clones = []
    implant_list = {}
    # get structure ids and build implant list
    for clone in clones_response['jump_clones']:
        if clone['location_type'] == 'structure':
            structure_ids.append(clone['location_id'])
        for implant in clone['implants']:
            implant_list[implant] = {
                "item_id": implant,
                "item_name": resolve_type_id_to_type_name(implant)
            }

    logger.debug("Structure names to resolve: %s" % structure_ids)
    structure_names = resolve_structure_ids(token=token,
                                            structure_ids=structure_ids)
    logger.debug("Structure resolutions: %s" % structure_names)

    # build read-able clone list
    for clone in clones_response['jump_clones']:
        readable_clone = {
            'location': None,
            'implants': [],
        }

        # resolve locaton
        if clone['location_type'] == 'station':
            readable_clone['location'] = resolve_location_id_to_station(
                clone['location_id'])
        elif clone['location_type'] == 'structure':
            readable_clone['location'] = structure_names[clone['location_id']]
        else:
            readable_clone['location'] = "Unknown Location"

        # resolve implants
        for implant in clone['implants']:
            readable_clone['implants'].append(
                implant_list[implant]['item_name'])  # TODO: refactor

        clones.append(readable_clone)

    return clones
Beispiel #15
0
def resolve_ids(ids):
    response = EveClient.call('post_universe_names', ids=ids)

    if response.status != 200:
        raise EveDataResolutionError(
            f"[{response.status} Failed to resolve universe names. {response.data}"
        )

    resolved_ids = response.data
    response = {}
    for resolved_id in resolved_ids:
        external_id = resolved_id['id']
        external_name = resolved_id['name']
        if external_id not in response:
            response[external_id] = external_name
    return response
Beispiel #16
0
def get_contract_items(character_id, contract_id):
    logger.info("Getting contract items for %s" % contract_id)
    token = EveToken.objects.get(evecharacter__external_id=character_id)

    contracts_response = EveClient.call(
        'get_characters_character_id_contracts_contract_id_items',
        token,
        character_id=character_id,
        contract_id=contract_id)

    items = []
    for item in contracts_response:
        items.append(
            "%s %s" %
            (item['quantity'], resolve_type_id_to_type_name(item['type_id'])))

    return items
Beispiel #17
0
def resolve_ids_with_types(ids):
    response = {}
    for ids_segment in batch(list(ids), 999):
        request = EveClient.call('post_universe_names', ids=ids_segment)
        if request.status != 200:
            raise EveDataResolutionError(
                f"[{request.status}] Failed to resolve IDs: {ids_segment}\nResponse: {request.data}"
            )
        resolved_ids = request.data

        for resolved_id in resolved_ids:
            external_id = resolved_id['id']
            external_name = resolved_id['name']
            external_type = resolved_id['category']
            if external_id not in response:
                response[external_id] = {
                    "name": external_name,
                    "type": external_type
                }
    return response
Beispiel #18
0
def get_eve_character_contacts(character_id):
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    # resolve and clean asset list
    contacts_response = EveClient.call('get_characters_character_id_contacts',
                                       token,
                                       character_id=character_id)
    unresolved_ids = []
    contacts = []
    # get list of ids
    for contact in contacts_response:
        unresolved_ids.append(contact['contact_id'])

    resolved_ids = resolve_ids(unresolved_ids)

    # match ids to contacts
    for contact in contacts_response:
        contacts.append({
            'name': resolved_ids[contact['contact_id']],
            'external_id': contact['contact_id'],
            'type': contact['contact_type'].upper(),
            'standing': contact['standing'],
        })
    return contacts
Beispiel #19
0
def get_eve_character_net_worth(character_id):
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    wallet_response = EveClient.call('get_characters_character_id_wallet',
                                     token,
                                     character_id=character_id)
    return wallet_response
Beispiel #20
0
def get_category_id(category_id):
    return EveClient.call('get_universe_categories_category_id',
                          category_id=category_id).data
Beispiel #21
0
def get_group_id(group_id):
    return EveClient.call('get_universe_groups_group_id',
                          group_id=group_id).data
Beispiel #22
0
def get_station_id(station_id):
    return EveClient.call('get_universe_stations_station_id',
                          station_id=station_id).data
Beispiel #23
0
def resolve_names(names):
    resolved_ids = EveClient.call('post_universe_ids', token=None, names=names)
    return resolved_ids
Beispiel #24
0
def resolve_names(names):
    resolved_ids = EveClient.call('post_universe_ids', names=names).data
    return resolved_ids
Beispiel #25
0
def get_group_id(group_id):
    return EveClient.call('get_universe_groups_group_id',
                          token=None,
                          group_id=group_id)
Beispiel #26
0
def get_station_id(station_id):
    return EveClient.call('get_universe_stations_station_id',
                          token=None,
                          station_id=station_id)
Beispiel #27
0
def get_eve_character_contracts(character_id, contract_ids_to_ignore=[]):
    logger.info("Getting contracts for %s" % character_id)
    token = EveToken.objects.get(evecharacter__external_id=character_id)
    logger.debug("Resolved ID %s to character %s" %
                 (character_id, token.evecharacter.name))
    # resolve and clean asset list
    contracts_response = EveClient.call(
        'get_characters_character_id_contracts',
        token,
        character_id=character_id)
    logger.debug("Response: %s" % contracts_response[0])
    logger.debug("Obtaining IDs found in contracts of %s" %
                 token.evecharacter.name)
    ids_to_resolve = set()
    for contract in contracts_response:
        if 'assignee_id' in contract:
            ids_to_resolve.add(contract['assignee_id'])
        if 'acceptor_id' in contract:
            ids_to_resolve.add(contract['acceptor_id'])
        if 'issuer_id' in contract:
            ids_to_resolve.add(contract['issuer_id'])

    logger.debug("Resolving IDs to names: %s" % ids_to_resolve)
    resolved_ids = resolve_ids_with_types(list(ids_to_resolve))
    logger.debug("Resolved IDs: %s" % resolved_ids)

    contracts = []
    logger.info("Building contract list of %s from ESI response" %
                token.evecharacter.name)
    for contract in contracts_response:
        if contract['contract_id'] in contract_ids_to_ignore:
            continue
        resolved_contract = {
            "contract_id": contract['contract_id'],
            "issued_by": resolved_ids[contract['issuer_id']]['name'],
            "issued_by_type": resolved_ids[contract['issuer_id']]['type'],
            "date_created": contract['date_issued'],
            "contract_type": contract['type'],
            "contract_status": contract['status'].replace("_", " ").upper()
        }

        if 'assignee_id' in contract:
            if contract['assignee_id'] != 0:
                resolved_contract['issued_to'] = resolved_ids[
                    contract['assignee_id']]['name']
                resolved_contract['issued_to_type'] = resolved_ids[
                    contract['assignee_id']]['type']
            else:
                resolved_contract['issued_to'] = None
                resolved_contract['issued_to_type'] = None

        if 'acceptor_id' in contract:
            if contract['acceptor_id'] != 0:
                resolved_contract['accepted_by'] = resolved_ids[
                    contract['acceptor_id']]['name']
                resolved_contract['accepted_by_type'] = resolved_ids[
                    contract['acceptor_id']]['type']
            else:
                resolved_contract['accepted_by'] = None
                resolved_contract['accepted_by_type'] = None

        if 'price' in contract:
            resolved_contract['contract_value'] = contract['price']
        elif 'reward' in contract:
            resolved_contract['contract_value'] = contract['reward']
        else:
            resolved_contract['contract_value'] = 0

        resolved_contract['items'] = get_contract_items(
            character_id, contract['contract_id'])

        contracts.append(resolved_contract)

    return contracts
Beispiel #28
0
def update_sso_token(request, token_id):
    eve_token = EveToken.objects.get(pk=token_id)
    return redirect(EveClient.get_instance().get_sso_url(
        EveScope.convert_to_list(eve_token.requested_scopes.all())))
Beispiel #29
0
def add_sso_token(request):
    return redirect(EveClient.get_instance().esi_sso_url)
Beispiel #30
0
def get_type_id(type_id):
    return EveClient.call('get_universe_types_type_id',
                          token=None,
                          type_id=type_id)