]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/RootWarn.pl
take a few more things literally
[infobot.git] / src / Modules / RootWarn.pl
index 712ec0ce6c78aba2e8855218325d6b6049e576fb..80d228ef768113fa336c754b8ffa811c6147c3ae 100644 (file)
@@ -1,72 +1,93 @@
 #
 # RootWarn.pl: Warn people about usage of root on IRC.
-#      Author: xk <xk@leguin.openprojects.net>
-#     Version: v0.2c (19991125)
+#      Author: dms
+#     Version: v0.3 (20000923)
 #     Created: 19991008
 #
 
 use strict;
 
+use vars qw(%channels %param);
+use vars qw($dbh $found $ident);
+
 sub rootWarn {
     my ($nick,$user,$host,$chan) = @_;
-    my $attempt = &dbGet("rootwarn", "nick", lc($nick), "attempt") || 0;
+    my $n      = lc $nick;
+    my $attempt = &sqlSelect('rootwarn', 'attempt', { nick => $n } ) || 0;
+    my $warnmode       = &getChanConf('rootWarnMode');
 
     if ($attempt == 0) {       # first timer.
-       if (&IsParam("rootWarnMode") && $param{'rootWarnMode'} =~ /aggressive/i) {
-           &status(">>> Detected root user; notifying nick and channel.");
-           rawout("PRIVMSG $chan :R".("O" x int(rand 80 + 2))."T has landed!");
+       if (defined $warnmode and $warnmode =~ /quiet/i) {
+           &status('RootWarn: Detected root user; notifying user');
        } else {
-           &status(">>> Detected root user; notifying user");
+           &status('RootWarn: Detected root user; notifying nick and channel.');
+           &msg($chan, 'ROO'.('O' x int(rand 8))."T has landed!");
        }
 
-       if ($_ = &getFactoid("root")) {
-           &msg($nick, "root is $_");
+       if ($_ = &getFactoid('root')) {
+           &msg($nick, "RootWarn: $attempt : $_");
        } else {
-           &status("root needs to be defined in database.");
+           &status('"root" needs to be defined in database.');
        }
 
     } elsif ($attempt < 2) {   # 2nd/3rd time occurrance.
-       &status("RootWarn: not first time root user; msg'ing $nick.");
-       if ($_ = &getFactoid("root again")) {
-           &msg($nick, $_);
+       if ($_ = &getFactoid('root again')) {
+           &status("RootWarn: not first time root user; msg'ing $nick.");
+           &msg($nick, "RootWarn: $attempt : $_");
        } else {
-           &status("root again needs to be defined in database.");
+           &status('"root again" needs to be defined in database.');
        }
 
     } else {                   # >3rd time occurrance.
-       if (&IsParam("rootWarnMode")) {
-           if ($param{'rootWarnMode'} =~ /aggressive/i) {
-               if ($channels{$chan}{'o'}{$ident}) {
-                   &status("RootWarn: $nick... sigh... bye bye.");
-                   rawout("MODE $chan +b *!root\@$host");      # ban
-                   &kick($chan,$nick,"bye bye");
-               }
+       # disable this for the time being.
+       if (0 and $warnmode =~ /aggressive/i) {
+           if ($channels{$chan}{'o'}{$ident}) {
+               &status("RootWarn: $nick... sigh... bye bye.");
+               rawout("MODE $chan +b *!root\@$host");  # ban
+               &kick($chan,$nick,'bye bye');
            }
+       } elsif ($_ = &getFactoid('root again')) {
+           &status("RootWarn: $attempt times; msg'ing $nick.");
+           &msg($nick, "RootWarn: $attempt : $_");
+       } else {
+           &status("root again needs to be defined in database.");
        }
     }
 
     $attempt++;
     ### TODO: OPTIMIZE THIS.
-    &dbSet("rootwarn", "nick", lc($nick), "attempt", $attempt);
-    &dbSet("rootwarn", "nick", lc($nick), "time", time());
-    &dbSet("rootwarn", "nick", lc($nick), "host", $user."\@".$host);
-    &dbSet("rootwarn", "nick", lc($nick), "channel", $chan);
+    # ok... don't record the attempt if nick==root.
+    return if ($nick eq 'root');
+
+    &sqlSet('rootwarn', { nick => lc($nick) }, {
+       attempt => $attempt,
+       time    => time(),
+       host    => $user."\@".$host,
+       channel => $chan,
+    } );
 
     return;
 }
 
 # Extras function.
+# TODO: support arguments to get info on a particular nick?
 sub CmdrootWarn {
     my $reply;
-    my $count = &countKeys("rootwarn");
+    my $count = &countKeys('rootwarn');
 
     if ($count == 0) {
-       return "no-one has been warned about root, woohoo";
+       &performReply("no-one has been warned about root, woohoo");
+       return;
     }
 
     # reply #1.
-    $reply = "there ".&fixPlural("has",$count) ." been \002$i\002 ".
-               &fixPlural("rooter",$count) ." warned about root.";
+    $reply = 'there '.&fixPlural('has',$count) ." been \002$count\002 ".
+               &fixPlural('rooter',$count) ." warned about root.";
+
+    if ($param{'DBType'} !~ /^(pg|my)sql$/i) {
+       &FIXME("rootwarn does not yet support non-{my,pg}sql.");
+       return;
+    }
 
     # reply #2.
     $found = 0;
@@ -82,12 +103,12 @@ sub CmdrootWarn {
 
     if ($found) {
        $reply .= " Of which, \002$found\002 ".
-               &fixPlural("rooter",$found)." ".
-               &fixPlural("has",$found).
+               &fixPlural('rooter',$found).' '.
+               &fixPlural('has',$found).
                " done it at least 3 times.";
     }
 
-    return $reply;
+    &performStrictReply($reply);
 }
 
 1;