changeset 70:999787ab415d

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.
author Dominic Cleal <dominic@computerkb.co.uk>
date Thu, 11 Feb 2010 00:10:05 +0000
parents 3455a0ab9264
children ee8acca852f4
files skillbot.pl
diffstat 1 files changed, 42 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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(<CONFIG>) {
 	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}))