chiark / gitweb /
Move most .pl scripts to names without extensions. Drop ssize.pl, which I
[bin.git] / taskbot
diff --git a/taskbot b/taskbot
new file mode 100755 (executable)
index 0000000..c17621f
--- /dev/null
+++ b/taskbot
@@ -0,0 +1,116 @@
+#! /usr/bin/perl -w
+use diagnostics;
+use strict;
+
+use Net::IRC;
+
+sub usage ()
+{
+       die <<"EOF";
+Usage: $0 server bot-name target-channel
+EOF
+}
+
+my %tasks = ();
+
+my $server = shift or usage;
+my $botname = shift or usage;
+my $channel = shift or usage;
+
+my $irc = new Net::IRC;
+
+my $conn = $irc->newconn(Nick => $botname, Server => $server)
+       or die "$0: can't connect to IRC server";
+
+my $joined = 0;
+
+sub on_connect
+{
+       my $self = shift;
+       $self->join($channel);
+}
+
+sub on_topic
+{
+       my $self = shift;
+       $joined = 1;
+}
+
+sub on_public
+{
+       my ($self, $event) = @_;
+       my ($args) = $event->args;
+       my $from = $event->from;
+       $from =~ s/!.*//;
+       if ($args =~ s/^$botname:?\s*//io)
+       {
+               my ($victim, $task, $tasksref);
+               (my $command, $args) = split ' ', $args, 2;
+               $command = lc $command;
+               if ($command eq 'add' && $args =~ /^([^ \t]+)\s+(.*[^ \t])/)
+               {
+                       ($victim, $task) = ($1, $2);
+                       $tasksref = $tasks{$victim};
+                       $tasksref = $tasks{$victim} = [] if not defined $tasksref;
+                       $$tasksref[scalar @$tasksref] = $task;
+                       $self->privmsg($channel, "cheers, added task for $victim:");
+                       $self->privmsg($channel, "  $task");
+               }
+               elsif ($command eq 'delete' && $args =~ /^([^ \t]+)\s+(.*[^ \t])/)
+               {
+                       ($victim, $task) = ($1, $2);
+                       $tasksref = $tasks{$victim};
+                       if (defined $tasksref && scalar grep {$_ eq $task} @$tasksref)
+                       {
+                               @$tasksref = grep {$_ ne $task} @$tasksref;
+                               $self->privmsg($channel, "cheers, deleted task for $victim:");
+                               $self->privmsg($channel, "  $task");
+                       }
+                       else
+                       {
+                               $self->privmsg($channel,
+                                                          "sorry, never heard of that task for $victim:");
+                               $self->privmsg($channel, "  $task");
+                       }
+               }
+               elsif ($command eq 'deleteall' && $args =~ /^([^ \t]+)/)
+               {
+                       $victim = $1;
+                       undef $tasks{$victim};
+                       $self->privmsg($channel, "$victim is free! For a short time ...");
+               }
+               elsif ($command eq 'help')
+               {
+                       $self->privmsg($channel, "No.");
+               }
+               elsif ($command eq 'list' && $args =~ /^([^ \t]+)/)
+               {
+                       $victim = $1;
+                       $tasksref = $tasks{$victim};
+                       if (defined $tasksref && scalar @{$tasks{$victim}})
+                       {
+                               $self->privmsg($channel, "$victim is supposed to be doing:");
+                       }
+                       else
+                       {
+                               $self->privmsg($channel, "No tasks for $victim.");
+                       }
+                       foreach my $task (@{$tasks{$victim}})
+                       {
+                               $self->privmsg($channel, "  $task");
+                       }
+               }
+               elsif ($command eq 'quit')
+               {
+                       $self->privmsg($channel, "They killed $botname! The bastards ...");
+                       $self->quit;
+                       exit;
+               }
+       }
+}
+
+$conn->add_handler('376', \&on_connect);
+$conn->add_handler('332', \&on_topic);
+$conn->add_handler('public', \&on_public);
+
+$irc->start;