package Plugin::Timezone; use strict; use warnings; use DateTime; use IdaliusConfig qw/assert_dict/; my $config; sub configure { my $self = shift; my $cmdref = shift; shift; # run_command $config = shift; IdaliusConfig::assert_dict($config, $self, "timezone"); $cmdref->($self, "time", sub { $self->time(@_); } ); $cmdref->($self, "tz", sub { $self->zone_convert(@_); } ); return $self; } # look a nick up and return their configured timezone, else return the input # assuming it's a timezone rather than a nick sub nick_to_zone { my ($nick) = @_; my @known_zones = (keys %{$config->{timezone}}); my ($case_nick) = grep {/^\Q$nick\E$/i} @known_zones; my $tz; if ($case_nick) { return $config->{timezone}->{$case_nick}; } else { return $nick; } } sub clock_message { my ($nick, $tz, $time_string) = @_; if ($tz eq $nick) { return "clocks in $tz read $time_string"; } else { return "$nick\'s clock reads $time_string"; } } sub make_unknown_zone_message { return "I'm unsure what the time is for $_[0]"; } sub time { my ($self, $irc, $logger, $who, $where, $ided, $rest, $no_reenter, @arguments) = @_; my $requester = (split /!/, $who)[0]; return "Syntax: time [nick]" unless @arguments <= 1; my $nick = $arguments[0] || $requester; my $tz = nick_to_zone($nick); eval { my $d = DateTime->now(); $d->set_time_zone($tz); my $timestr = $d->strftime("%H:%M on %a %d %b, %Y (%Z)"); return clock_message($nick, $tz, $timestr); } or return "$requester: ".make_unknown_zone_message $nick; } sub zone_convert { my ($self, $irc, $logger, $who, $where, $ided, $rest, $no_reenter, @arguments) = @_; my $requester = (split /!/, $who)[0]; return "Syntax: tz