X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2Fcountdown.pl;h=90fcd74c4ce4e995787bde2914756db29cf3f370;hb=ebb23e92ff953b0debf9bbb8caadc3042be3f6e2;hp=04230c3ff5aa3abeb7a94126276ac1c7b1caeb49;hpb=03e663ed8e6d40c772a776e54daaf0ede97ff81e;p=infobot.git diff --git a/src/Modules/countdown.pl b/src/Modules/countdown.pl index 04230c3..90fcd74 100644 --- a/src/Modules/countdown.pl +++ b/src/Modules/countdown.pl @@ -11,85 +11,109 @@ use strict; sub countdown { my ($query) = @_; - my $file = "$bot_base_dir/$param{'ircUser'}.countdown"; - my (%date, %desc); + my $file = "$bot_data_dir/$param{'ircUser'}.countdown"; + my ( %date, %desc ); my $reply; - if (!open(IN,$file)) { - &ERROR("cannot open $file."); - return 0; + if ( !open( IN, $file ) ) { + &ERROR("cannot open $file."); + return 0; } while () { - chop; - s/[\s\t]+/ /g; + chop; + s/[\s\t]+/ /g; - if (/^(\d{8}) (\S+) (.*)$/) { - $date{$2} = $1; - $desc{$2} = $3; - } + if (/^(\d{8}) (\S+) (.*)$/) { + $date{$2} = $1; + $desc{$2} = $3; + } } close IN; - if (defined $query) { # argument. - if (!exists $date{$query}) { - &msg($who,"error: $query is not in my countdown list."); - return 0; - } - - $date{$query} =~ /^(\d{4})(\d{2})(\d{2})$/; - my($year,$month,$day) = ($1,$2,$3); - my $sqldate = "$1-$2-$3"; - - ### SQL SPECIFIC. - my ($to_days,$dayname,$monname); - - if ($param{'DBType'} =~ /^mysql|sqlite$/i) { - $to_days = (&sqlRawReturn("SELECT TO_DAYS(NOW()) - TO_DAYS('$sqldate')"))[0]; - $dayname = (&sqlRawReturn("SELECT DAYNAME('$sqldate')"))[0]; - $monname = (&sqlRawReturn("SELECT MONTHNAME('$sqldate')"))[0]; - - } elsif ($param{'DBType'} =~ /^pgsql$/i) { - $to_days = (&sqlRawReturn("SELECT date_trunc('day', - 'now'::timestamp - '$sqldate')"))[0]; - $dayname = qw(Sun Mon Tue Wed Thu Fri Sat)[(&sqlRawReturn("SELECT extract(dow from timestamp '$sqldate')"))[0]]; - $monname = qw(BAD Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[(&sqlRawReturn("SELECT extract(month from timestamp '$sqldate')"))[0]]; - - } else { - &ERROR("countdown: invalid DBType " . $param{'DBType'} . "."); - return 1; - } - - if ($to_days =~ /^\D+$/) { - my $str = "to_days is not integer."; - &msg($who,$str); - &ERROR($str); - - return 1; - } - - my @gmtime = gmtime(time()); - my $daysec = ($gmtime[2]*60*60) + ($gmtime[1]*60) + ($gmtime[0]); - my $time = ($to_days*24*60*60); - - if ($to_days >= 0) { # already passed. - $time += $daysec; - $reply = "T plus ". &Time2String($time) ." ago"; - } else { # time to go. - $time = -$time - $daysec; - $reply = "T minus ". &Time2String($time); - } - $reply .= ", \002(\002$desc{$query}\002)\002 at $dayname, $monname $day $year"; - - &performStrictReply($reply ."."); - return 1; - } else { # no argument. - my $prefix = "countdown list "; - - &performStrictReply( &formListReply(0, $prefix, sort keys %date) ); - - return 1; + if ( defined $query ) { # argument. + if ( !exists $date{$query} ) { + &msg( $who, "error: $query is not in my countdown list." ); + return 0; + } + + $date{$query} =~ /^(\d{4})(\d{2})(\d{2})$/; + my ( $year, $month, $day ) = ( $1, $2, $3 ); + my $sqldate = "$1-$2-$3"; + + ### SQL SPECIFIC. + my ( $to_days, $dayname, $monname ); + + if ( $param{'DBType'} =~ /^(mysql|sqlite(2)?)$/i ) { + $to_days = + ( &sqlRawReturn("SELECT TO_DAYS(NOW()) - TO_DAYS('$sqldate')") ) + [0]; + $dayname = ( &sqlRawReturn("SELECT DAYNAME('$sqldate')") )[0]; + $monname = ( &sqlRawReturn("SELECT MONTHNAME('$sqldate')") )[0]; + + } + elsif ( $param{'DBType'} =~ /^pgsql$/i ) { + $to_days = ( + &sqlRawReturn( + "SELECT date_trunc('day', + 'now'::timestamp - '$sqldate')" + ) + )[0]; + $dayname = qw(Sun Mon Tue Wed Thu Fri Sat) [ + ( + &sqlRawReturn( + "SELECT extract(dow from timestamp '$sqldate')") + )[0] + ]; + $monname = qw(BAD Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) [ + ( + &sqlRawReturn( + "SELECT extract(month from timestamp '$sqldate')") + )[0] + ]; + + } + else { + &ERROR( "countdown: invalid DBType " . $param{'DBType'} . "." ); + return 1; + } + + if ( $to_days =~ /^\D+$/ ) { + my $str = "to_days is not integer."; + &msg( $who, $str ); + &ERROR($str); + + return 1; + } + + my @gmtime = gmtime( time() ); + my $daysec = + ( $gmtime[2] * 60 * 60 ) + ( $gmtime[1] * 60 ) + ( $gmtime[0] ); + my $time = ( $to_days * 24 * 60 * 60 ); + + if ( $to_days >= 0 ) { # already passed. + $time += $daysec; + $reply = "T plus " . &Time2String($time) . " ago"; + } + else { # time to go. + $time = -$time - $daysec; + $reply = "T minus " . &Time2String($time); + } + $reply .= + ", \002(\002$desc{$query}\002)\002 at $dayname, $monname $day $year"; + + &performStrictReply( $reply . "." ); + return 1; + } + else { # no argument. + my $prefix = "countdown list "; + + &performStrictReply( &formListReply( 0, $prefix, sort keys %date ) ); + + return 1; } } 1; + +# vim:ts=4:sw=4:expandtab:tw=80