import { CharacterHelper, type Character } from '@/db'; import { esiFetch } from './fetch'; import { tokenHasScopes } from './scopes'; // PUBLIC APIS --------------------------------------------------------------- export interface CharacterData { alliance_id: number; birthday: string; bloodline_id: number; corporation_id: number; description: string; faction_id: number; gender: 'male' | 'female'; name: string; race_id: number; security_status: number; title: string; } export function getCharacterPublicData(id: number) { return esiFetch>(`/characters/${id}/`); } export interface CharacterAffiliations { alliance_id: number; character_id: number; corporation_id: number; faction_id: number; } export function getCharacterAffiliations(ids: number[]) { return esiFetch[]>(`/characters/affiliation/`, undefined, { method: 'POST', body: JSON.stringify(ids), })[0] as Partial; } export interface CharacterPortraits { px128x128: string; px256x256: string; px512x512: string; px64x64: string; } export function getCharacterPortraits(id: number) { return esiFetch>(`/characters/${id}/portrait/`); } export interface CharacterCorporationHistory { corporation_id: number; is_deleted: boolean; record_id: number; start_date: string; } export function getCharacterCorporationHistory(id: number) { return esiFetch[]>(`/characters/${id}/corporationhistory/`); } export function getPortraitURL(id: number) { return `https://images.evetech.net/characters/${id}/portrait`; } // PRIVATE APIS -------------------------------------------------------------- export interface CharacterRoles { roles: string[]; roles_at_base: string[]; roles_at_hq: string[]; roles_at_other: string[]; } // required scope: esi-characters.read_corporation_roles.v1 export function getCharacterRoles(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_corporation_roles.v1')) return null; return esiFetch>(`/characters/${character.eveID}/roles/`, character); } export interface CharacterTitles { titles: { name: string; title_id: number; }[]; } // required scope: esi-characters.read_titles.v1 export function getCharacterTitles(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_titles.v1')) return null; return esiFetch>(`/characters/${character.eveID}/titles/`, character); } export interface CharacterStandings { from_id: number; from_type: 'agent' | 'npc_corp' | 'faction'; standing: number; } // required scope: esi-characters.read_standings.v1 export function getCharacterStandings(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_standings.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/standings/`, character); } export interface Notification { is_read: boolean; sender_id: number; sender_type: 'character' | 'corporation' | 'alliance' | 'faction' | 'system'; text: string; timestamp: string; type: | 'character' | 'corporation' | 'alliance' | 'faction' | 'inventory' | 'industry' | 'loyalty' | 'skills' | 'sov' | 'structures' | 'war'; } // required scope: esi-characters.read_notifications.v1 export function getCharacterNotifications(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_notifications.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/notifications/`, character); } export interface ContactNotification { message: string; notification_id: number; send_date: string; sender_character_id: number; standing_level: number; } // required scope: esi-characters.read_notifications.v1 export function getCharacterContactNotifications(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_notifications.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/notifications/contacts`, character); } export interface Medals { corporation_id: number; date: string; description: string; graphics: { color: number; graphic: number; layer: number; part: number; }[]; issuer_id: number; medal_id: number; reason: string; status: 'private' | 'public'; title: string; } // required scope: esi-characters.read_medals.v1 export function getCharacterMedals(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_medals.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/medals/`, character); } export interface JumpFatigue { jump_fatigue_expire_date: string; last_jump_date: string; last_update_date: string; } // required scope: esi-characters.read_fatigue.v1 export function getCharacterJumpFatigue(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_fatigue.v1')) return null; return esiFetch>(`/characters/${character.eveID}/fatigue/`, character); } export interface Blueprint { item_id: number; location_flag: string; location_id: number; material_efficiency: number; quantity: number; runs: number; time_efficiency: number; type_id: number; } // required scope: esi-characters.read_blueprints.v1 export function getCharacterBlueprints(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_blueprints.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/blueprints/`, character); } export interface AgentResearch { agent_id: number; points_per_day: number; remainder_points: number; skill_type_id: number; started_at: string; } // required scope: esi-characters.read_agents_research.v1 export function getCharacterAgentResearch(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-characters.read_agents_research.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/agents_research/`, character); } // CLONES -------------------------------------------------------------------- export interface Clones { home_location: { location_id: number; location_type: 'station' | 'structure'; }; jump_clones: { implants: number[]; jump_clone_id: number; location_id: number; location_type: 'station' | 'structure'; name: string; }[]; last_clone_jump_date: string; last_station_change_date: string; } // required scope: esi-clones.read_clones.v1 export function getCharacterClones(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-clones.read_clones.v1')) return null; return esiFetch>(`/characters/${character.eveID}/clones/`, character); } // required scope: esi-clones.read_implants.v1 export function getCharacterImplants(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-clones.read_implants.v1')) return null; return esiFetch(`/characters/${character.eveID}/implants/`, character); } // ASSETS -------------------------------------------------------------------- export interface Asset { is_blueprint_copy: boolean; is_singleton: boolean; item_id: number; location_flag: string; location_id: number; location_type: 'station' | 'solar_system' | 'other'; quantity: number; type_id: number; } // required scope: esi-assets.read_assets.v1 export function getCharacterAssets(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-assets.read_assets.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/assets/`, character); } export interface AssetLocation { item_id: number; position: { x: number; y: number; z: number; }; } // required scope: esi-assets.read_assets.v1 export function getCharacterAssetLocations(character: Character, ids: number[]) { if (!CharacterHelper.hasScope(character, 'esi-assets.read_assets.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/assets/locations/`, character, { method: 'POST', body: JSON.stringify(ids), }); } export interface AssetNames { item_id: number; name: string; } // required scope: esi-assets.read_assets.v1 export function getCharacterAssetNames(character: Character, ids: number[]) { if (!CharacterHelper.hasScope(character, 'esi-assets.read_assets.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/assets/names/`, character, { method: 'POST', body: JSON.stringify(ids), }); } // WALLET -------------------------------------------------------------------- // required scope: esi-wallet.read_character_wallet.v1 export function getCharacterWallet(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-wallet.read_character_wallet.v1')) return null; return esiFetch(`/characters/${character.eveID}/wallet/`, character); } export interface WalletTransaction { client_id: number; date: string; is_buy: boolean; is_personal: boolean; journal_ref_id: number; location_id: number; quantity: number; transaction_id: number; type_id: number; unit_price: number; } // required scope: esi-wallet.read_character_wallet.v1 export function getCharacterWalletTransactions(character: Character, fromId: number) { if (!CharacterHelper.hasScope(character, 'esi-wallet.read_character_wallet.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/wallet/transactions/`, character, { method: 'POST', body: JSON.stringify(fromId), }); } export interface WalletJournalEntry { amount: number; // The amount of ISK given or taken from the wallet as a result of the given transaction. Positive when ISK is deposited into the wallet and negative when ISK is withdrawn balance: number; // Wallet balance after transaction occurred context_id: number; // And ID that gives extra context to the particualr transaction. Because of legacy reasons the context is completely different per ref_type and means different things. It is also possible to not have a context_id context_id_type: 'character' | 'corporation' | 'alliance' | 'faction'; // The type of the given context_id if present date: string; // Date and time of transaction description: string; first_party_id: number; id: number; reason: string; ref_type: 'agent' | 'assetSafety' | 'bounty' | 'bountyPrizes' | 'contract' | 'dividend' | 'marketTransaction' | 'other'; second_party_id: number; tax: number; tax_receiver_id: number; } // required scope: esi-wallet.read_character_wallet.v1 export function getCharacterWalletJournal(character: Character, page: number = 1) { if (!CharacterHelper.hasScope(character, 'esi-wallet.read_character_wallet.v1')) return null; return esiFetch[]>(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character); } // LOCATION -------------------------------------------------- export interface Location { solar_system_id: number; station_id: number; structure_id: number; } // required scope: esi-location.read_location.v1 export function getCharacterLocation(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-location.read_location.v1')) return null; return esiFetch>(`/characters/${character.eveID}/location/`, character); } export interface Online { last_login: string; last_logout: string; logins: number; online: boolean; } // required scope: esi-location.read_online.v1 export function getCharacterOnline(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-location.read_online.v1')) return null; return esiFetch>(`/characters/${character.eveID}/online/`, character); } export interface CurrentShip { ship_item_id: number; ship_type_id: number; ship_name: string; } // required scope: esi-location.read_ship_type.v1 export function getCharacterCurrentShip(character: Character) { if (!CharacterHelper.hasScope(character, 'esi-location.read_ship_type.v1')) return null; return esiFetch>(`/characters/${character.eveID}/ship/`, character); }