private static void LoadSkillInformation(ref Character c) { var type_ids = new List<int>(); c.skills.ForEach(x => type_ids.Add(x.type_id)); var types = invTypeRepo.FindMany(type_ids); var group_ids = new List<int>(); types.ForEach(x => { if (x.groupID != null) { group_ids.Add((int)x.groupID); } }); var dgmTypeAttributeRepo = new dgmTypeAttributeRepository(); var primaryAttributes = dgmTypeAttributeRepo.FindMany(180, type_ids); var secondaryAttributes = dgmTypeAttributeRepo.FindMany(181, type_ids); var ranks = dgmTypeAttributeRepo.FindMany(275, type_ids); var groups = invGroupRepo.FindMany(group_ids); var all_skills = new List<Skill>(); all_skills.AddRange(c.skills); all_skills.AddRange(c.queue); foreach (var x in all_skills) { var matching_skill = types.FirstOrDefault(y => y.typeID == x.type_id); var matching_primary_attribute = primaryAttributes.FirstOrDefault(y => y.typeID == x.type_id); var matching_secondary_attribute = secondaryAttributes.FirstOrDefault(y => y.typeID == x.type_id); var matching_rank = ranks.FirstOrDefault(y => y.typeID == x.type_id); x.name = matching_skill != null ? matching_skill.typeName : "Unknown"; if (matching_primary_attribute != null && matching_primary_attribute.valueInt != null) { int attr = matching_primary_attribute.valueInt != null ? (int)matching_primary_attribute.valueInt : -1; if (attributeDict.ContainsKey(attr)) { x.primary_attribute = attributeDict[(int)matching_primary_attribute.valueInt]; } } if (matching_secondary_attribute != null) { int attr = matching_primary_attribute.valueInt != null ? (int)matching_primary_attribute.valueInt : -1; if (attributeDict.ContainsKey(attr)) { x.secondary_attribute = attributeDict[(int)matching_secondary_attribute.valueInt]; } } x.rank = matching_rank != null ? (int)matching_rank.valueFloat : 1; if (x is TrainedSkill && matching_skill.groupID != null) { var group = groups.FirstOrDefault(y => (y.groupID == (int)matching_skill.groupID)); if (group != null) { var ts = x as TrainedSkill; ts.category = group.groupName; } } } foreach (var x in c.queue) { var matching_skill = c.skills.FirstOrDefault(y => y.type_id == x.type_id); if (matching_skill != null) { x.trained_level = matching_skill.current_level; if (matching_skill.queued_level < x.queued_level) { matching_skill.queued_level = x.queued_level; } } } }
public async Task<Character> Post([FromBody] CharacterCredentials credentials) { HttpClient httpClient = new HttpClient() { MaxResponseContentBufferSize = 1000000 }; string param = "?characterID=" + credentials.characterID + "&keyID=" + credentials.keyID + "&vCode=" + credentials.vCode; Uri character_info_url = new Uri(base_url + "/eve/CharacterInfo.xml.aspx" + param); Uri character_sheet_url = new Uri(base_url + "/char/CharacterSheet.xml.aspx" + param); Uri character_queue_url = new Uri(base_url + "/char/SkillQueue.xml.aspx" + param); Task<HttpResponseMessage>[] requests = new Task<HttpResponseMessage>[]{ httpClient.GetAsync(character_info_url), httpClient.GetAsync(character_sheet_url), httpClient.GetAsync(character_queue_url), }; HttpResponseMessage[] responses = await Task.WhenAll(requests); if (!responses.All(x => x.IsSuccessStatusCode)) { return null; } Character c = new Character(); using (Stream character_info_data = await responses[0].Content.ReadAsStreamAsync()) { LoadCharacterInfo(ref c, character_info_data); } using (Stream character_sheet_data = await responses[1].Content.ReadAsStreamAsync()) { LoadCharacterSheet(ref c, character_sheet_data); } using (Stream character_queue_data = await responses[2].Content.ReadAsStreamAsync()) { LoadSkillQueue(ref c, character_queue_data); } LoadSkillInformation(ref c); var skillGroupsDict = new Dictionary<string, TrainedSkillGroup>(); DateTime currentDateTime; DateTime.TryParse(c.updated, out currentDateTime); foreach (var skill in c.queue) { DateTime? startTime = null; DateTime? endTime = null; if (!string.IsNullOrEmpty(skill.start_time)) { startTime = DateTime.Parse(skill.start_time); } if (!string.IsNullOrEmpty(skill.end_time)) { endTime = DateTime.Parse(skill.end_time); } if (startTime != null && endTime != null) { if (startTime < DateTime.UtcNow) { if (skill.position == 0) { TimeSpan trainTime = (TimeSpan)(endTime - startTime); TimeSpan elapsedTime = (TimeSpan)(currentDateTime - startTime); double percent = (elapsedTime.TotalSeconds / trainTime.TotalSeconds); int curSP = skill.start_skillpoints + ((int)(percent * (skill.end_skillpoints - skill.start_skillpoints))); var matchingSkill = c.skills.FirstOrDefault(x => x.type_id == skill.type_id); if (matchingSkill != null && matchingSkill.skillpoints < curSP) { matchingSkill.skillpoints = curSP; } } skill.time = ((DateTime)endTime - DateTime.UtcNow).Describe(); } else { skill.time = ((DateTime)endTime - (DateTime)startTime).Describe(); } } } foreach (var skill in c.skills) { int[] level_skillpoints = new int[] { 0, 250*skill.rank, 1415*skill.rank, 8000*skill.rank, 45255*skill.rank, 256000*skill.rank }; if (skill.current_level < 5) { int prevLevelPoints = level_skillpoints[skill.current_level]; int nextLevelPoints = level_skillpoints[skill.current_level + 1]; int curLevelPoints = nextLevelPoints - prevLevelPoints; int curLevelProgress = skill.skillpoints - prevLevelPoints; skill.progress = Math.Max(0, curLevelProgress / (1.0 * curLevelPoints)); var matching_queued_skill = c.queue.FirstOrDefault(x => x.type_id == skill.type_id && x.queued_level == skill.current_level + 1); if (matching_queued_skill != null) { matching_queued_skill.progress = skill.progress; } } else { skill.progress = 0.0; } if (!skillGroupsDict.ContainsKey(skill.category)) { skillGroupsDict[skill.category] = new TrainedSkillGroup(); skillGroupsDict[skill.category].groupName = skill.category; } skillGroupsDict[skill.category].Add(skill); } c.skill_groups = new List<TrainedSkillGroup>(skillGroupsDict.Values.ToList().OrderBy(x => x.groupName).ToList()); foreach (var group in c.skill_groups) { group.Sort((a, b) => a.name.CompareTo(b.name)); } c.queue.Sort((a, b) => a.position.CompareTo(b.position)); c.paused = false; c.empty = false; QueuedSkill first = c.queue.FirstOrDefault(); QueuedSkill last = c.queue.LastOrDefault(); TimeSpan span = TimeSpan.FromSeconds(0); if (first != null && last != null) { var firstStartTime = DateTime.Parse(first.start_time); var firstEndTime = DateTime.Parse(first.end_time); var lastStartTime = DateTime.Parse(last.start_time); var lastEndTime = DateTime.Parse(last.end_time); if (firstStartTime != null && lastEndTime != null) { if (firstStartTime < DateTime.UtcNow) { span = (lastEndTime - DateTime.UtcNow); } else { span = (lastEndTime - firstStartTime); } if (span.Ticks < 0) { c.queue_length_description = "Queue finished"; c.queue_length_short_description = "Finished"; c.queue_length_hours = 0; } else { c.queue_length_description ="Queue completes in " + span.Describe(); c.queue_length_short_description = span.Describe(); c.queue_length_hours = span.TotalHours; } } else { c.queue_length_description = "Queue is paused"; c.queue_length_short_description = "Paused"; c.queue_length_hours = 0; c.paused = true; } } else { c.queue_length_description = "Queue is empty"; c.queue_length_short_description = "Empty"; c.queue_length_hours = 0; c.empty = true; } return c; }
private static void LoadCharacterSheet(ref Character c, Stream readStream) { var xmldoc = XDocument.Load(readStream); var char_sheet_response = xmldoc.Element("eveapi"); var result = char_sheet_response.Element("result"); var skills_rowset = result.RowSet("skills"); c.date_of_birth = result.ElementString("DoB") + "Z"; c.gender = result.ElementString("gender"); c.wealth = result.ElementDouble("balance"); c.clone_skillpoints = result.ElementInt("cloneSkillPoints"); var attributes = result.Element("attributes"); c.intelligence = attributes.ElementInt("intelligence"); c.memory = attributes.ElementInt("memory"); c.charisma = attributes.ElementInt("charisma"); c.perception = attributes.ElementInt("perception"); c.willpower = attributes.ElementInt("willpower"); var attributeEnhancers = result.Element("attributeEnhancers"); if (attributeEnhancers != null) { Func<string, int> bonusValue = (string bonusName) => { var bonus = attributeEnhancers.Element(bonusName + "Bonus"); if (bonus != null) { int augmentValue = bonus.ElementInt("augmentatorValue"); if (augmentValue != -1) { return augmentValue; } } return 0; }; c.intelligence += bonusValue("intelligence"); c.perception += bonusValue("perception"); c.charisma += bonusValue("charisma"); c.memory += bonusValue("memory"); c.willpower += bonusValue("willpower"); } c.skills = new List<TrainedSkill>(); var skills_list = skills_rowset.Elements("row"); foreach (var skill in skills_list) { var cur = new TrainedSkill(); cur.type_id = skill.AttributeInt("typeID"); cur.current_level = skill.AttributeInt("level"); cur.skillpoints = skill.AttributeInt("skillpoints"); c.skills.Add(cur); } }
private static void LoadSkillQueue(ref Character c, Stream readStream) { var xmldoc = XDocument.Load(readStream); var skill_queue_response = xmldoc.Element("eveapi"); c.updated = skill_queue_response.ElementString("currentTime"); var skill_queue_rowset = skill_queue_response.Element("result").RowSet("skillqueue"); var skill_queue = skill_queue_rowset.Elements("row"); c.queue = new List<QueuedSkill>(); foreach (var skill in skill_queue) { QueuedSkill cur = new QueuedSkill(); cur.type_id = skill.AttributeInt("typeID"); cur.queued_level = skill.AttributeInt("level"); cur.position = skill.AttributeInt("queuePosition"); cur.start_time = skill.AttributeString("startTime") + "Z"; cur.end_time = skill.AttributeString("endTime") + "Z"; cur.start_skillpoints = skill.AttributeInt("startSP"); cur.end_skillpoints = skill.AttributeInt("endSP"); c.queue.Add(cur); } }
private static void LoadCharacterInfo(ref Character c, Stream readStream) { var xmldoc = XDocument.Load(readStream); var char_info_response = xmldoc.Element("eveapi"); var result = char_info_response.Element("result"); c.id = result.ElementInt("characterID"); c.name = result.ElementString("characterName"); c.race = result.ElementString("race"); c.skillpoints = result.ElementInt("skillPoints"); c.active_ship = result.ElementString("shipTypeName"); c.corporation = result.ElementString("corporation"); c.joined = result.ElementString("corporationDate") + "Z"; c.alliance = result.ElementString("alliance"); c.location = result.ElementString("lastKnownLocation"); c.security_status = result.ElementDouble("securityStatus"); }