The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
# $Revision: 1.1 $
use strict;
use Weather::Com::Simple;

$| = 1;

# have a cvs driven version...
our $VERSION = sprintf "%d.%03d", q$Revision: 1.1 $ =~ /(\d+)/g;

# you have to fill in your ids from weather.com here
my $PartnerId  = '';
my $LicenseKey = '';

# if you need a proxy... maybe with authentication
my $Proxy      = '';
my $Proxy_User = '';
my $Proxy_Pass = '';                     

# debugging on/off
my $debugmode = 0;
if ( $ARGV[0] && ( $ARGV[0] eq "-d" ) ) {
	warn "Debug mode turned on.\n";
	$debugmode = 1;
}

my %weatherargs = (
					'partner_id' => $PartnerId,
					'license'    => $LicenseKey,
					'debug'      => $debugmode,
					'proxy'      => $Proxy,
					'proxy_user' => $Proxy_User,
					'proxy_pass' => $Proxy_Pass,
);

# print greeting
print "\nWelcome to Uncle Tom's weather station...\n";
print "This is V$VERSION\n";
print "\nPlease enter a location name to look for, e.g\n";
print "'Heidelberg' or 'Seattle, WA', or 'Munich, Germany'\n\n";

# define prompt
my $prompt = '$> ';
print $prompt;

while ( chomp( my $input = <STDIN> ) ) {

	# don't want any empty input
	unless ( $input =~ /\S+/ ) {
		print $prompt;
		next;
	}

	# and if the user wants to exit...
	last if ( $input =~ /^end|quit|exit$/ );

	# add place to config hash and get weather
	$weatherargs{'place'}      = $input;

	my $ws      = Weather::Com::Simple->new(%weatherargs);
	my $weather = $ws->get_weather();

	# if $ws->get_weather() returned 'undef', we haven't found anything...
	unless ($weather) {
		print "No weather found for location '$input'\n";
		print $prompt;
		next;
	}

	# if we found anything we'll print it out...
	# Weather::Simple allways returns an arrayref. maybe we found more
	# than 1 location's weather
	print "\nFound weather data for "
	  . ( $#{$weather} + 1 )
	  . " locations:\n\n";
	foreach my $location_weather ( @{$weather} ) {

		# print a nice heading underlined by '===='
		my $heading =
		  "These are the current conditions for "
		  . $location_weather->{place} . "\n";
		print $heading;
		print "=" x length($heading), "\n";

		# print weather data we're interested in
		print " * current conditions are ", $location_weather->{conditions},
		  "\n";
		print " * the current temperature is ",
		  $location_weather->{temperature_celsius}, " degrees celsius\n";
		print " * the current windchill is ",
		  $location_weather->{windchill_celsius}, " degrees celsius\n";
		print " * wind is ",         $location_weather->{wind},     "\n";
		print " * humidity is ",     $location_weather->{humidity}, "%\n";
		print " * air pressure is ", $location_weather->{pressure}, "\n";
		print "   => this data has been updated on ",
		  $location_weather->{updated}, "\n\n";
	}

	# last but not least print the next prompt
	print $prompt;
}

__END__

=pod

=head1 NAME

weather.pl - Sample script to show the usage of the I<Weather::Com::Simple>
module

=head1 SYNOPSIS

  #> ./weather.pl [-d]
  
  Welcome to Uncle Tom's weather station...
  
  Please enter a location name to look for, e.g
  'Heidelberg' or 'Seattle, WA', or 'Munich, Germany'
  
  Type 'end' to exit.
  
  $>

=head1 DESCRIPTION

**IMPORTANT** You first have to register at I<weather.com> to get a
partner id and a license key for free. Please visit their web site
L<http://www.weather.com/services/xmloap.html>. Then edit this script
and fill in the data into the corresponding variables at the top of 
the script.

The sample script I<weather.pl> asks you for a location name - either 
a city or a 'city, region' or 'city, country' combination. It then uses 
the I<Weather::Com::Simple> module to get the current weather conditions 
for this location(s).

If no location matching your input is found, a "no locations found" 
message is printed out.

Else, the number of locations found is printed followed by nicely
formatted weather data for each location.

The command line parameter '-d' enables debugging mode (which is
enabling debugging within all used packages (Weather::Com::Simple,
Weather::Com::Cached, Weather::Com::Base).

=head1 AUTHOR

Thomas Schnuecker, E<lt>thomas@schnuecker.deE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2004-2005 by Thomas Schnuecker

This script is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut