changeset 56:c604d8d6ccc5

Caching skill info in friend hash, instead of calling the API
author Dominic Cleal <dominic@computerkb.co.uk>
date Sun, 28 Dec 2008 16:38:57 +0000
parents c5ce2fff9b85
children fabae7870b52
files skillbot.pl
diffstat 1 files changed, 28 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/skillbot.pl	Sun Dec 28 12:11:28 2008 +0000
+++ b/skillbot.pl	Sun Dec 28 16:38:57 2008 +0000
@@ -225,11 +225,11 @@
 		my @filtered =
 			sort {
 				(defined $a->{skill} && defined $b->{skill})
-				  ? $a->{skill}->finish_time <=> $b->{skill}->finish_time
+				  ? $a->{skill_finish} <=> $b->{skill_finish}
 				  : 0
 			}
 			grep {
-				((defined $2 && (lc($_->{char}->name) eq lc($2)
+				((defined $2 && (lc($_->{char}) eq lc($2)
 						|| lc($2) eq 'all' || lc($2) eq '*'))
 					|| (!defined $2 && $_->{nick} eq $their_nick))
 			} @friends;
@@ -240,18 +240,17 @@
 			my $text;
 			if (defined $f->{skill}) {
 				my $downtime = '';
-				if (skill_finish_in_downtime($f->{skill})) {
+				if (skill_finish_in_downtime($f->{skill_finish})) {
 					$downtime = ", coincides with downtime";
 				}
 
 				my $finish = DateTime->from_epoch(
-						epoch => $f->{skill}->finish_time,
+						epoch => $f->{skill_finish},
 						time_zone => $f->{tz});
 
-				$text = sprintf("Currently training %s %s ".
+				$text = sprintf("Currently training %s ".
 								"(finish in %s, %s %s%s)",
-								$f->{skill}->name, $f->{skill}->level,
-								$f->{skill}->time_remaining,
+								$f->{skill_name}, $f->{skill_countdown},
 								$finish->strftime("%A %R"),
 								$finish->time_zone_short_name(),
 								$downtime);
@@ -260,7 +259,7 @@
 			}
 
 			$self->privmsg('#' . $config{channel}, sprintf(
-						   "\002%s:\002 %s", $f->{char}->name,
+						   "\002%s:\002 %s", $f->{char},
 						   encode("utf8", $text)));
 			$found++;
 		}
@@ -276,12 +275,12 @@
 
 		check_training($self);
 		my @training = sort {
-				$a->{skill}->finish_time <=> $b->{skill}->finish_time
+				$a->{skill_finish} <=> $b->{skill_finish}
 			} grep { defined $_->{skill} } @friends;
 		
 		for my $f (@training) {
 			$nreply .= sprintf("\002%s\002 (%s) | ",
-							   $f->{char}->name, $f->{skill}->time_remaining);
+							   $f->{char}, $f->{skill_countdown});
 		}
 		
 		$self->privmsg('#' . $config{channel}, substr($nreply, 0, -3));
@@ -436,7 +435,8 @@
 				foreach my $character ($api->characters) {
 					next if defined $c && $c ne $character->name;
 					my $f = {
-						char => $character,
+						char_api => $character,
+						char => $character->name,
 						api => $api,
 						nick => $nick,
 						tz => $tz
@@ -481,7 +481,7 @@
 	my $self = shift;
 	my $f = shift;
 
-	my $skill = $f->{char}->skill->in_training;
+	my $skill = $f->{char_api}->skill->in_training;
 	
 	# Nothing training
 	unless (defined $skill)
@@ -497,7 +497,7 @@
 
 	# Check for changes in the skill, skip or cancel announcement
 	if (defined $f->{skill}) {
-		return if $skill->id eq $f->{skill}->id;
+		return if $skill->id eq $f->{skill};
 
 		del_one_shot_timer($f->{timer});
 		delete $f->{timer};
@@ -507,7 +507,7 @@
 	my $prefinish = $finish - 60;
 
 	irc_debug("Character %s is training %s %d (%s == %d sec)",
-			  $f->{char}->name, $skill->name, $skill->level,
+			  $f->{char}, $skill->name, $skill->level,
 			  $skill->time_remaining, $finish);
 
 	# Ignore bad data
@@ -518,21 +518,23 @@
 		return;
 	}
 
-	$f->{skill} = $skill;
+	$f->{skill} = $skill->id;
+	$f->{skill_finish} = $skill->finish_time;
+	$f->{skill_countdown} = $skill->time_remaining;
+	$f->{skill_name} = sprintf("%s %d", $skill->name, $skill->level);
 
 	# Check if the finish time is within scheduled EVE downtime
-	if (skill_finish_in_downtime($f->{skill}))
+	if (skill_finish_in_downtime($f->{skill_finish}))
 	{
 		$self->privmsg('#' . $config{channel}, sprintf(
-					   "\002%s:\002 Completion time of %s's %s %lu " .
+					   "\002%s:\002 Completion time of %s's %s " .
 					   "skill will coincide with scheduled downtime at %s",
-					   $f->{nick}, $f->{char}->name,
-					   $f->{skill}->name, $f->{skill}->level,
-					   scalar(gmtime($f->{skill}->finish_time))));
+					   $f->{nick}, $f->{char}, $f->{skill_name},
+					   scalar(gmtime($f->{skill_finish}))));
 	}
 
-	my $text = sprintf("%s has completed training skill %s %s",
-					   $f->{char}->name, $skill->name, $skill->level);
+	my $text = sprintf("%s has completed training skill %s",
+					   $f->{char}, $f->{skill_name});
 	
 	if ($text =~ /[\n\r]/) {
 		$text =~ s/[\n\r]/ /g;
@@ -551,6 +553,9 @@
 					   "\002%s:\002 %s", $f->{nick},
 					   encode("utf8", $text)));
 		delete $f->{skill};
+		delete $f->{skill_finish};
+		delete $f->{skill_countdown};
+		delete $f->{skill_name};
 	});
 }
 
@@ -565,7 +570,7 @@
 	my $skill = shift;
 
 	# Check if the finish time is within 11:00-11:59 (EVE downtime)
-	return ([gmtime($skill->finish_time)]->[2] == 11);
+	return ([gmtime($skill)]->[2] == 11);
 }
 
 END {