]> git.donarmstrong.com Git - infobot.git/blob - src/Modules/Countdown.pl
remove Berkeley DBM support
[infobot.git] / src / Modules / Countdown.pl
1 #
2 # Countdown.pl: Count down to a particular date.
3 #       Author: dms
4 #      Version: v0.1 (20000104)
5 #      Created: 20000104
6 #
7
8 use strict;
9
10 #use vars qw();
11
12 sub Countdown {
13     my ($query) = @_;
14     my $file = "$bot_base_dir/$param{'ircUser'}.countdown";
15     my (%date, %desc);
16     my $reply;
17
18     if (!open(IN,$file)) {
19         &ERROR("cannot open $file.");
20         return 0;
21     }
22
23     while (<IN>) {
24         chop;
25         s/[\s\t]+/ /g;
26
27         if (/^(\d{8}) (\S+) (.*)$/) {
28             $date{$2} = $1;
29             $desc{$2} = $3;
30         }
31     }
32     close IN;
33
34     if (defined $query) {                       # argument.
35         if (!exists $date{$query}) {
36             &msg($who,"error: $query is not in my countdown list.");
37             return 0;
38         }
39
40         $date{$query} =~ /^(\d{4})(\d{2})(\d{2})$/;
41         my($year,$month,$day) = ($1,$2,$3);
42         my $sqldate = "$1-$2-$3";
43
44         ### SQL SPECIFIC.
45         my ($to_days,$dayname,$monname);
46
47         if ($param{'DBType'} =~ /^mysql|sqlite$/i) {
48             $to_days = (&sqlRawReturn("SELECT TO_DAYS(NOW()) - TO_DAYS('$sqldate')"))[0];
49             $dayname = (&sqlRawReturn("SELECT DAYNAME('$sqldate')"))[0];
50             $monname = (&sqlRawReturn("SELECT MONTHNAME('$sqldate')"))[0];
51
52         } elsif ($param{'DBType'} =~ /^pgsql$/i) {
53             $to_days = (&sqlRawReturn("SELECT date_trunc('day', 
54                                 'now'::timestamp - '$sqldate')"))[0];
55             $dayname = qw(Sun Mon Tue Wed Thu Fri Sat)[(&sqlRawReturn("SELECT extract(dow from timestamp '$sqldate')"))[0]];
56             $monname = qw(BAD Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[(&sqlRawReturn("SELECT extract(month from timestamp '$sqldate')"))[0]];
57
58         } else {
59             &ERROR("Countdown: invalid DBType " . $param{'DBType'} . ".");
60             return 1;
61         }
62
63         if ($to_days =~ /^\D+$/) {
64             my $str = "to_days is not integer.";
65             &msg($who,$str);
66             &ERROR($str);
67
68             return 1;
69         }
70
71         my @gmtime = gmtime(time());
72         my $daysec = ($gmtime[2]*60*60) + ($gmtime[1]*60) + ($gmtime[0]);
73         my $time   = ($to_days*24*60*60);
74
75         if ($to_days >= 0) {    # already passed.
76             $time  += $daysec;
77             $reply  = "T plus ". &Time2String($time) ." ago";
78         } else {                # time to go.
79             $time   = -$time - $daysec;
80             $reply  = "T minus ". &Time2String($time);
81         }
82         $reply    .= ", \002(\002$desc{$query}\002)\002 at $dayname, $monname $day $year";
83
84         &performStrictReply($reply .".");
85         return 1;
86     } else {                            # no argument.
87         my $prefix = "Countdown list ";
88
89         &performStrictReply( &formListReply(0, $prefix, sort keys %date) );
90
91         return 1;
92     }
93 }
94
95 1;