changeset 9:c797330cd371

Handles multiple characters on one account
author Dominic Cleal <dominic@computerkb.co.uk>
date Sat, 06 Dec 2008 15:29:45 +0000
parents cb6e21f2d514
children 9cc6dbc803f6
files skillbot.pl
diffstat 1 files changed, 27 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/skillbot.pl	Sat Dec 06 15:13:07 2008 +0000
+++ b/skillbot.pl	Sat Dec 06 15:29:45 2008 +0000
@@ -32,7 +32,8 @@
 # Config variables
 my %config;
 
-my %friends;
+my %frienduids;
+my @friends;
 
 open(CONFIG, "< skillbot.conf") or die "can't open skillbot.conf for reading: $!";
 while(<CONFIG>) {
@@ -345,35 +346,37 @@
 		chomp;
 		next if (/^#/);
 
-		if (/^([^\t]+)\t+([0-9]+)\t+([A-F0-9]{64})\t+([^\t]+)/i) {
-			my $c = $1;
-			my $uid = $2;
-			my $key = uc($3);
-			my $nick = $4;
+		if (/^([0-9]+)\s+([a-f0-9]{64})\s+(\S+)(\s+(.+))?/i) {
+			my $uid = $1;
+			my $key = uc($2);
+			my $nick = $3;
+			my $c = $5;
 
-			if (! $friends{$c}) {
+			if (! $frienduids{$uid}) {
 				my $api = WebService::EveOnline->new( { user_id => $uid,
 														api_key => $key } );
 
+				my $loaded = 0;
 				foreach my $character ($api->characters) {
-					next if $c ne $character->name;
-					$friends{$c}->{char} = $character;
-					last;
+					next if defined $c && $c ne $character->name;
+					push @friends, {
+						char => $character,
+						api => $api,
+						nick => $nick
+					};
+					$loaded++;
 				}
 				
-				unless (defined $friends{$c}->{char})
+				if (defined $c && $loaded == 0)
 				{
 					irc_debug("EVE: Unable to find character %s for ID %lu",
 							  $c, $uid);
 					next;
 				}
-						
-				$friends{$c}->{api} = $api;
 
-				irc_debug("EVE: Adding new friend '%s', nick %s", $c, $nick);
+				irc_debug("EVE: Adding new friend %s (%lu), %lu characters",
+						  $nick, $uid, $loaded);
 			}
-
-			$friends{$c}->{nick} = $nick;
 		}
 	}
 
@@ -390,23 +393,22 @@
 {
 	my $self = shift;
 
-	foreach my $f (keys %friends) {
+	foreach my $f (@friends) {
 		# Skip skills training that we've learnt about
-		next if defined $friends{$f}->{skill};
+		next if defined $f->{skill};
 
-		my $skill = $friends{$f}->{char}->skill->in_training;
+		my $skill = $f->{char}->skill->in_training;
 		# Nothing training
 		next unless $skill;
 
 		irc_debug("Character %s is training %s (%s)",
-				  $friends{$f}->{char}->name, $skill->name,
+				  $f->{char}->name, $skill->name,
 				  $skill->time_remaining);
 
-		$friends{$f}->{skill} = $skill;
+		$f->{skill} = $skill;
 
 		my $text = sprintf("%s has completed training skill %s %s",
-						   $friends{$f}->{char}->name,
-						   $skill->name, $skill->level);
+						   $f->{char}->name, $skill->name, $skill->level);
 		
 		if ($text =~ /[\n\r]/) {
 			$text =~ s/[\n\r]/ /g;
@@ -414,8 +416,8 @@
 
 		add_one_shot_timer($skill->finish_time - time(), sub {
 			$self->notice('#' . $config{channel}, sprintf("[%s] %s",
-					$friends{$f}->{nick}, encode("utf8", $text)));
-			delete $friends{$f}->{skill};
+						  $f->{nick}, encode("utf8", $text)));
+			delete $f->{skill};
 		});
 	}
 }