use crate::groups::{Blueprint, CorporationRole, MedalStatus, Standing};
use crate::prelude::*;
#[derive(Debug, Deserialize, Serialize, Clone)]
#[allow(missing_docs)]
pub struct CorporationPublicInfo {
pub alliance_id: Option<i64>,
pub ceo_id: Option<i64>,
pub creator_id: Option<i64>,
pub date_founded: Option<String>,
pub description: Option<String>,
pub enlisted_faction_id: Option<i64>,
pub friendly_fire: Option<String>,
pub home_station_id: Option<i64>,
pub member_count: i64,
pub name: String,
pub palette: Option<CorporationPalette>,
pub shares: Option<i64>,
pub state: Option<String>,
pub tax_rates: Option<CorporationTaxRates>,
pub ticker: Option<String>,
#[serde(rename = "type")]
pub corporation_type: Option<String>,
pub url: Option<String>,
pub war_eligible: Option<bool>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CorporationTaxRates {
pub isk: Option<f64>,
pub loyalty_point: Option<f64>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CorporationPalette {
pub main_color: Option<String>,
pub secondary_color: Option<String>,
pub tertiary_color: Option<String>,
}
#[derive(Debug, Deserialize)]
#[allow(missing_docs)]
pub struct CorporationHistoryItem {
pub alliance_id: Option<i64>,
pub is_deleted: Option<bool>,
pub record_id: i64,
pub start_date: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CorporationIcons {
pub px128x128: Option<String>,
pub px256x256: Option<String>,
pub px64x64: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ContainerAction {
Add,
Assemble,
Configure,
EnterPassword,
Lock,
Move,
Repackage,
SetName,
SetPassword,
Unlock,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ContainerPasswordType {
Config,
General,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct ContainerLogEntry {
pub action: ContainerAction,
pub character_id: i64,
pub container_id: i64,
pub container_type_id: i64,
pub location_flag: String,
pub location_id: i64,
pub logged_at: String,
pub new_config_bitmask: Option<i64>,
pub old_config_bitmask: Option<i64>,
pub password_type: ContainerPasswordType,
pub quantity: Option<i64>,
pub type_id: Option<i64>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct Division {
pub division: Option<i64>,
pub name: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct CorporationDivisions {
#[serde(default)]
pub hangar: Vec<Division>,
#[serde(default)]
pub wallet: Vec<Division>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct CorporationFacility {
pub facility_id: i64,
pub system_id: i64,
pub type_id: i64,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct CorporationMedal {
pub created_at: String,
pub creator_id: i64,
pub description: String,
pub medal_id: i64,
pub title: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct IssuedMedal {
pub character_id: i64,
pub issued_at: String,
pub issuer_id: i64,
pub medal_id: i64,
pub reason: String,
pub status: MedalStatus,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct MemberTitles {
pub character_id: i64,
pub titles: Vec<i64>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct MemberTracking {
pub base_id: Option<i64>,
pub character_id: i64,
pub location_id: Option<i64>,
pub logoff_date: Option<String>,
pub logon_date: Option<String>,
pub ship_type_id: Option<i64>,
pub start_date: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct MemberRoles {
pub character_id: i64,
#[serde(default)]
pub grantable_roles: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_base: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_hq: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_other: Vec<CorporationRole>,
#[serde(default)]
pub roles: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_base: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_hq: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_other: Vec<CorporationRole>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RoleType {
GrantableRoles,
GrantableRolesAtBase,
GrantableRolesAtHq,
GrantableRolesAtOther,
Roles,
RolesAtBase,
RolesAtHq,
RolesAtOther,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct RoleHistoryEntry {
pub changed_at: String,
pub character_id: i64,
pub issuer_id: i64,
pub new_roles: Vec<CorporationRole>,
pub old_roles: Vec<CorporationRole>,
pub role_type: RoleType,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ShareholderType {
Character,
Corporation,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct Shareholder {
pub share_count: i64,
pub shareholder_id: i64,
pub shareholder_type: ShareholderType,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum StarbaseState {
Offline,
Online,
Onlining,
Reinforced,
Unanchoring,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct Starbase {
pub moon_id: Option<i64>,
pub onlined_since: Option<String>,
pub reinforced_until: Option<String>,
pub starbase_id: i64,
pub state: Option<StarbaseState>,
pub system_id: i64,
pub type_id: i64,
pub unanchor_at: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum StarbasePermission {
AllianceMember,
ConfigStarbaseEquipmentRole,
CorporationMember,
StarbaseFuelTechnicianRole,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct StarbaseFuel {
pub quantity: i64,
pub type_id: i64,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct StarbaseDetails {
pub allow_alliance_members: bool,
pub allow_corporation_members: bool,
pub anchor: StarbasePermission,
pub attack_if_at_war: bool,
pub attack_if_other_security_status_dropping: bool,
pub attack_security_status_threshold: Option<f64>,
pub attack_standing_threshold: Option<f64>,
pub fuel_bay_take: StarbasePermission,
pub fuel_bay_view: StarbasePermission,
#[serde(default)]
pub fuels: Vec<StarbaseFuel>,
pub offline: StarbasePermission,
pub online: StarbasePermission,
pub unanchor: StarbasePermission,
pub use_alliance_standings: bool,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ServiceState {
Online,
Offline,
Cleanup,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct StructureService {
pub name: String,
pub state: ServiceState,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum StructureState {
AnchorVulnerable,
Anchoring,
ArmorReinforce,
ArmorVulnerable,
DeployVulnerable,
FittingInvulnerable,
HullReinforce,
HullVulnerable,
OnlineDeprecated,
OnliningVulnerable,
ShieldVulnerable,
Unanchored,
Unknown,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct CorporationStructure {
pub corporation_id: i64,
pub fuel_expires: Option<String>,
pub name: Option<String>,
pub next_reinforce_apply: Option<String>,
pub next_reinforce_hour: Option<i64>,
pub profile_id: i64,
pub reinforce_hour: Option<i64>,
#[serde(default)]
pub services: Vec<StructureService>,
pub state: StructureState,
pub state_timer_end: Option<String>,
pub state_timer_start: Option<String>,
pub structure_id: i64,
pub system_id: i64,
pub type_id: i64,
pub unanchors_at: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct CorporationTitle {
#[serde(default)]
pub grantable_roles: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_base: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_hq: Vec<CorporationRole>,
#[serde(default)]
pub grantable_roles_at_other: Vec<CorporationRole>,
pub name: Option<String>,
#[serde(default)]
pub roles: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_base: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_hq: Vec<CorporationRole>,
#[serde(default)]
pub roles_at_other: Vec<CorporationRole>,
pub title_id: Option<i64>,
}
pub struct CorporationGroup<'a> {
pub(crate) esi: &'a Esi,
}
impl CorporationGroup<'_> {
api_get!(
get_public_info,
"GetCorporationsCorporationId",
RequestType::Public,
CorporationPublicInfo,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_history,
"GetCorporationsCorporationIdAlliancehistory",
RequestType::Public,
Vec<CorporationHistoryItem>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_members,
"GetCorporationsCorporationIdMembers",
RequestType::Authenticated,
Vec<i64>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_npc_corps,
"GetCorporationsNpccorps",
RequestType::Public,
Vec<i64>,
);
api_get!(
get_blueprints,
"GetCorporationsCorporationIdBlueprints",
RequestType::Authenticated,
Vec<Blueprint>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_container_logs,
"GetCorporationsCorporationIdContainersLogs",
RequestType::Authenticated,
Vec<ContainerLogEntry>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_divisions,
"GetCorporationsCorporationIdDivisions",
RequestType::Authenticated,
CorporationDivisions,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_facilities,
"GetCorporationsCorporationIdFacilities",
RequestType::Authenticated,
Vec<CorporationFacility>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_icons,
"GetCorporationsCorporationIdIcons",
RequestType::Public,
CorporationIcons,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_medals,
"GetCorporationsCorporationIdMedals",
RequestType::Authenticated,
Vec<CorporationMedal>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_issued_medals,
"GetCorporationsCorporationIdMedalsIssued",
RequestType::Authenticated,
Vec<IssuedMedal>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_members_limit,
"GetCorporationsCorporationIdMembersLimit",
RequestType::Authenticated,
i64,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_member_titles,
"GetCorporationsCorporationIdMembersTitles",
RequestType::Authenticated,
Vec<MemberTitles>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_member_tracking,
"GetCorporationsCorporationIdMembertracking",
RequestType::Authenticated,
Vec<MemberTracking>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_roles,
"GetCorporationsCorporationIdRoles",
RequestType::Authenticated,
Vec<MemberRoles>,
(corporation_id: i64) => "{corporation_id}"
);
api_get!(
get_roles_history,
"GetCorporationsCorporationIdRolesHistory",
RequestType::Authenticated,
Vec<RoleHistoryEntry>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_shareholders,
"GetCorporationsCorporationIdShareholders",
RequestType::Authenticated,
Vec<Shareholder>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_standings,
"GetCorporationsCorporationIdStandings",
RequestType::Authenticated,
Vec<Standing>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_starbases,
"GetCorporationsCorporationIdStarbases",
RequestType::Authenticated,
Vec<Starbase>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_starbase,
"GetCorporationsCorporationIdStarbasesStarbaseId",
RequestType::Authenticated,
StarbaseDetails,
(corporation_id: i64) => "{corporation_id}",
(starbase_id: i64) => "{starbase_id}";
Required(system_id: i64) => "system_id"
);
api_get!(
get_structures,
"GetCorporationsCorporationIdStructures",
RequestType::Authenticated,
Vec<CorporationStructure>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
api_get!(
get_titles,
"GetCorporationsCorporationIdTitles",
RequestType::Authenticated,
Vec<CorporationTitle>,
(corporation_id: i64) => "{corporation_id}"
);
}
#[cfg(test)]
mod corporation_management_tests {
use super::*;
#[test]
fn test_parse_roles_and_history() {
let r: Vec<MemberRoles> = serde_json::from_str(
r#"[{"character_id": 2124758468, "roles": ["Director", "Brand_New_Role"],
"roles_at_hq": ["Trader"]}]"#,
)
.unwrap();
assert_eq!(r[0].roles[0], CorporationRole::Director);
assert_eq!(r[0].roles[1], CorporationRole::Unrecognized);
assert!(r[0].grantable_roles.is_empty());
let h: Vec<RoleHistoryEntry> = serde_json::from_str(
r#"[{"changed_at": "t", "character_id": 1, "issuer_id": 2, "new_roles": ["Trader"],
"old_roles": [], "role_type": "roles_at_hq"}]"#,
)
.unwrap();
assert_eq!(h[0].role_type, RoleType::RolesAtHq);
}
#[test]
fn test_parse_structures_and_starbases() {
let s: Vec<CorporationStructure> = serde_json::from_str(
r#"[{"corporation_id": 98000001, "profile_id": 1, "state": "shield_vulnerable",
"structure_id": 1040000000000, "system_id": 30000142, "type_id": 35832,
"services": [{"name": "Market", "state": "online"}]},
{"corporation_id": 98000001, "profile_id": 1, "state": "something_new",
"structure_id": 1, "system_id": 1, "type_id": 1}]"#,
)
.unwrap();
assert_eq!(s[0].structure_id, 1_040_000_000_000);
assert_eq!(s[0].services[0].state, ServiceState::Online);
assert_eq!(s[1].state, StructureState::Unrecognized);
let d: StarbaseDetails = serde_json::from_str(
r#"{"allow_alliance_members": true, "allow_corporation_members": true,
"anchor": "alliance_member", "attack_if_at_war": false,
"attack_if_other_security_status_dropping": false,
"fuel_bay_take": "corporation_member", "fuel_bay_view": "corporation_member",
"offline": "starbase_fuel_technician_role", "online": "x", "unanchor": "alliance_member",
"use_alliance_standings": false, "fuels": [{"quantity": 4000000000, "type_id": 4247}]}"#,
)
.unwrap();
assert_eq!(d.offline, StarbasePermission::StarbaseFuelTechnicianRole);
assert_eq!(d.online, StarbasePermission::Unrecognized);
assert_eq!(d.fuels[0].quantity, 4_000_000_000);
}
#[test]
fn test_parse_misc() {
let d: CorporationDivisions =
serde_json::from_str(r#"{"hangar": [{"division": 1, "name": "Main"}]}"#).unwrap();
assert_eq!(d.hangar[0].division, Some(1));
assert!(d.wallet.is_empty());
let l: Vec<ContainerLogEntry> = serde_json::from_str(
r#"[{"action": "enter_password", "character_id": 1, "container_id": 1000000000000,
"container_type_id": 17366, "location_flag": "CorpSAG1", "location_id": 2,
"logged_at": "t", "password_type": "config"}]"#,
)
.unwrap();
assert_eq!(l[0].action, ContainerAction::EnterPassword);
let t: Vec<CorporationTitle> =
serde_json::from_str(r#"[{"title_id": 1, "name": "CEO", "roles": ["Director"]}]"#)
.unwrap();
assert_eq!(t[0].roles, vec![CorporationRole::Director]);
let sh: Vec<Shareholder> = serde_json::from_str(
r#"[{"share_count": 5000000000, "shareholder_id": 1, "shareholder_type": "character"}]"#,
)
.unwrap();
assert_eq!(sh[0].share_count, 5_000_000_000);
}
}