# HG changeset patch # User Dominic Cleal # Date 1265847005 0 # Node ID 999787ab415d0357d8d4c2f01336cd75d73e6984 # Parent 3455a0ab92647efba77f3841275180657eb5d9ad Replacing WebService::EveOnline with EVEAPI to add skill queue support later. - EVEAPI: http://www.xb95.com/svn/eveapi/trunk/ Not yet stable, crashes with hash related error on second command. diff -r 3455a0ab9264 -r 999787ab415d skillbot.pl --- a/skillbot.pl Sun Feb 07 21:42:43 2010 +0000 +++ b/skillbot.pl Thu Feb 11 00:10:05 2010 +0000 @@ -20,12 +20,13 @@ use strict; use warnings; -use WebService::EveOnline; +use EVEAPI; use Data::Dumper; use Net::IRC; use POSIX; use Encode; use DateTime; +use Time::Local require 'timers.pl'; @@ -35,6 +36,17 @@ my %frienduids; my @friends; +# Load up the full EVE skill tree and then create a hash of skill IDs to names +my $skill_api = EVEAPI->new(version => 2)->eve->SkillTree->load; +my %skilltree; + +for my $skill_group (@{$skill_api->skillGroups}) { + $skilltree{$_->typeID} = $_->typeName foreach (@{$skill_group->skills}); +} + +my $skills_loaded = scalar keys %skilltree; +printf("Init: Loaded a total of %d entries into the skill tree\n", $skills_loaded); + open(CONFIG, "< skillbot.conf") or die "can't open skillbot.conf for reading: $!"; while() { chomp; @@ -436,18 +448,19 @@ $tz = 'UTC'; } - my $api = WebService::EveOnline->new( { user_id => $uid, - api_key => $key } ); + my $api = EVEAPI->new( userID => $uid, apiKey => $key, + version => 2 ); + my $api_chars = $api->account->Characters->load; my $loaded = 0; - foreach my $character ($api->characters) { + foreach my $character (@{$api_chars->characters}) { next if defined $c && $c ne $character->name; push @friends, { - char_api => $character, char => $character->name, + char_id => $character->characterID, api => $api, nick => $nick, - tz => $tz + tz => $tz, }; $loaded++; } @@ -490,17 +503,16 @@ # Don't attempt updates during downtime, can cause crash # return if (timestamp_in_downtime(time)); - my $char_skill; - eval { $char_skill = $f->{char_api}->skill; }; + my ($skill, $skill_finish); + eval { $skill = $f->{api}->char->SkillInTraining( + characterID => $f->{char_id} ); }; warn $@ if $@; # Sometimes this is undefined if there's an API error, try later - return unless defined $char_skill; + return unless defined $skill; - my $skill = $char_skill->in_training; - # Nothing training - unless (defined $skill) + unless ($skill->skillInTraining eq '1') { # If the char was training before and now has stopped then cancel # the announcement @@ -511,24 +523,32 @@ return; } + # Convert EVE's completion timestamp to epoch + unless ($skill->trainingEndTime =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/) { + irc_debug("Unable to parse skill finish time %s", + $skill->trainingEndTime); + return; + } + $skill_finish = timegm($6, $5, $4, $3, $2 - 1, $1); + # Check for changes in the skill, skip or cancel announcement if (defined $f->{skill}) { # If the skill's the same, check the finish time and skip if # nothing's changed - return if ($skill->id eq $f->{skill} - && $f->{skill_finish} == $skill->finish_time); + return if ($skill->trainingTypeID eq $f->{skill} + && $f->{skill_finish} == $skill_finish); # Skill or finish time has changed, delete previous announcement del_one_shot_timer($f->{timer}); delete $f->{timer}; } - my $finish = $skill->finish_time - time(); + my $finish = $skill_finish - time(); my $prefinish = $finish - 60; irc_debug("Character %s is training %s %d (%s == %d sec)", - $f->{char}, $skill->name, $skill->level, - $skill->time_remaining, $finish); + $f->{char}, $skilltree{$skill->trainingTypeID}, + $skill->trainingToLevel, $skill->trainingEndTime, $finish); # Ignore bad data if ($finish < 0) @@ -538,9 +558,11 @@ return; } - $f->{skill} = $skill->id; - $f->{skill_finish} = $skill->finish_time; - $f->{skill_name} = sprintf("%s %d", $skill->name, $skill->level); + $f->{skill} = 1; #scalar $skill->trainingTypeID; + irc_debug("Skill was %s", $f->{skill}); + $f->{skill_finish} = $skill_finish; + $f->{skill_name} = sprintf("%s %d", $skilltree{$skill->trainingTypeID}, + $skill->trainingToLevel); # Check if the finish time is within scheduled EVE downtime if (timestamp_in_downtime($f->{skill_finish}))