]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/UserDCC.pl
broken for +A
[infobot.git] / src / Modules / UserDCC.pl
index 9343338c1ac74a6323ef7e8617c5d62a23bac43d..bd06b8aa25fc84e834615fbe755250e916504b7f 100644 (file)
@@ -5,7 +5,14 @@
 #     Created: 20000707 (from UserExtra.pl)
 #
 
-if (&IsParam("useStrict")) { use strict; }
+use strict;
+
+use vars qw(%users %ignore %sched %bans %mask %cache %channels %param
+       %chanconf %dcc);
+use vars qw($who $chan $message $msgType $user $chnick $conn $ident
+       $verifyUser $ucount_userfile $utime_userfile $lobotomized
+       $utime_chanfile $ucount_chanfile);
+use vars qw(@backlog);
 
 sub userDCC {
     # hrm...
@@ -17,18 +24,18 @@ sub userDCC {
        # do ircII clients support remote close? if so, cool!
        &status("userDCC: quit called. FIXME");
        &dcc_close($who);
-       &status("hrmm....");
+       &status("userDCC: after dcc_close!");
 
        return;
     }
 
     # who.
     if ($message =~ /^who$/) {
-       my $count = scalar(keys %{$dcc{'CHAT'}});
+       my $count = scalar(keys %{ $dcc{'CHAT'} });
        my $dccCHAT = $message;
 
        &pSReply("Start of who ($count users).");
-       foreach (keys %{$dcc{'CHAT'}}) {
+       foreach (keys %{ $dcc{'CHAT'} }) {
            &pSReply("=> $_");
        }
        &pSReply("End of who.");
@@ -38,6 +45,19 @@ sub userDCC {
 
     ### for those users with enough flags.
 
+    if ($message =~ /^tellme(\s+(.*))?$/i) {
+       my $args = $2;
+       if ($args =~ /^\s*$/) {
+           &help("tellme");
+           return;
+       }
+
+       my $result = &doQuestion($args);
+       &pSReply($result);
+
+       return;
+    }
+
     # 4op.
     if ($message =~ /^4op(\s+($mask{chan}))?$/i) {
        return unless (&hasFlag("o"));
@@ -103,6 +123,17 @@ sub userDCC {
        return;
     }
 
+    # dump variables ][.
+    if ($message =~ /^symdump$/i) {
+       return unless (&hasFlag("o"));
+       return unless (&IsParam("symdump"));
+
+       &status("Dumping all variables...");
+       &symdumpAllFile();
+
+       return;
+    }
+
     # kick.
     if ($message =~ /^kick(\s+(\S+)(\s+(\S+))?)?/) {
        return unless (&hasFlag("o"));
@@ -130,7 +161,7 @@ sub userDCC {
 
     # kick.
     if ($message =~ /^mode(\s+(.*))?$/) {
-       return unless (&hasFlag("m"));
+       return unless (&hasFlag("n"));
        my ($chan,$mode) = split /\s+/,$2,2;
 
        if ($chan eq "") {
@@ -191,12 +222,16 @@ sub userDCC {
     # unlobotomy.
     if ($message =~ /^(unlobotomy|benoisy)$/i) {
        return unless (&hasFlag("o"));
+
        if ($lobotomized) {
            &performReply("i have been unlobotomized, woohoo");
            $lobotomized = 0;
+           delete $cache{lobotomy};
+#          undef $cache{lobotomy};     # ??
        } else {
            &performReply("i'm not lobotomized");
        }
+
        return;
     }
 
@@ -228,21 +263,20 @@ sub userDCC {
            next unless (&IsNickInChan($opee,$_));
            $found++;
            if ($channels{$_}{'o'}{$opee}) {
-               &status("op: $opee already has ops on $_");
+               &pSReply("op: $opee already has ops on $_");
                next;
            }
            $op++;
 
-           &status("opping $opee on $_ at ${who}'s request");
            &pSReply("opping $opee on $_");
            &op($_, $opee);
        }
 
        if ($found != $op) {
-           &status("op: opped on all possible channels.");
+           &pSReply("op: opped on all possible channels.");
        } else {
-           &DEBUG("found => '$found'.");
-           &DEBUG("op => '$op'.");
+           &DEBUG("op: found => '$found'.");
+           &DEBUG("op:    op => '$op'.");
        }
 
        return;
@@ -331,7 +365,7 @@ sub userDCC {
            return;
        }
 
-       ### TODO: fix up $op to support mysql/pgsql/dbm(perl)
+       ### TODO: fix up $op to support mysql/sqlite/pgsql
        ### TODO: => add db/sql specific function to fix this.
        my @list = &searchTable("factoids", "factoid_key",
                        "factoid_value", $op);
@@ -402,7 +436,7 @@ sub userDCC {
        }
 
        &status("jumping servers... $server...");
-       &rawout("QUIT :jumping to $server");
+       $conn->quit("jumping to $server");
 
        if (&irc($server,$port) == 0) {
            &ircloop();
@@ -421,6 +455,33 @@ sub userDCC {
        return;
     }
 
+    # reset.
+    if ($message =~ /^reset$/i) {
+       return unless (&hasFlag("n"));
+
+       &msg($who,"resetting...");
+       my @done;
+       foreach ( keys %channels, keys %chanconf ) {
+           my $c = $_;
+           next if (grep /^\Q$c\E$/i, @done);
+
+           &part($_);
+
+           push(@done, $_);
+           sleep 1;
+       }
+       &DEBUG("before clearircvars");
+       &clearIRCVars();
+       &DEBUG("before joinnextchan");
+       &joinNextChan();
+       &DEBUG("after joinnextchan");
+
+       &status("USER reset $who");
+       &msg($who,"resetted");
+
+       return;
+    }
+
     # rehash.
     if ($message =~ /^rehash$/) {
        return unless (&hasFlag("n"));
@@ -483,7 +544,7 @@ sub userDCC {
        my($what,$val) = split /[\s\t]+/, $args, 2;
 
        ### TODO: "cannot set values without +m".
-       return unless (&hasFlag("m"));
+       return unless (&hasFlag("n"));
 
        # READ ONLY.
        if (defined $what and $what !~ /^[-+]/ and !defined $val and $no_chan) {
@@ -504,6 +565,32 @@ sub userDCC {
            return;
        }
 
+       ### TODO: move to UserDCC again.
+       if ($cmd eq "chanset" and !defined $what) {
+           &DEBUG("showing channel conf.");
+
+           foreach $chan ($chan, "_default") {
+               &pSReply("chan: $chan");
+               ### TODO: merge 2 or 3 per line.
+               my @items;
+               my $str = "";
+               foreach (sort keys %{ $chanconf{$chan} }) {
+                   my $newstr = join(', ', @items);
+                   if (length $newstr > 63) {
+                       &pSReply(" $str");
+                       @items = ();
+                   }
+                   $str = $newstr;
+                   push(@items, "$_ => $chanconf{$chan}{$_}");
+               }
+               &pSReply(" $str") if (@items);
+           }
+           return;
+       }
+
+       $cache{confvars}{$what} = $val;
+       &rehashConfVars();
+
        foreach (@chans) {
            &chanSet($cmd, $_, $what, $val);
        }
@@ -512,7 +599,7 @@ sub userDCC {
     }
 
     if ($message =~ /^(chanunset|\-chan)(\s+(.*))?$/) {
-       return unless (&hasFlag("m"));
+       return unless (&hasFlag("n"));
        my $args        = $3;
        my $no_chan     = 0;
 
@@ -555,6 +642,8 @@ sub userDCC {
                    $chanconf{$_}{$args} = $val;
                }
                delete $chanconf{_default}{$args};
+               $cache{confvars}{$args} = 0;
+               &rehashConfVars();
 
                return;
            }
@@ -567,6 +656,8 @@ sub userDCC {
                    &DEBUG("delete chanconf{$_}{$args};");
                    delete $chanconf{$_}{$args};
                }
+               $cache{confvars}{$args} = 0;
+               &rehashConfVars();
 
                return;
            }
@@ -593,6 +684,25 @@ sub userDCC {
        return;
     }
 
+    if ($message =~ /^newpass(\s+(.*))?$/) {
+       my(@args) = split /[\s\t]+/, $2 || '';
+
+       if (scalar @args != 1) {
+           &help("newpass");
+           return;
+       }
+
+       my $u           = &getUser($who);
+       my $crypt       = &mkcrypt($args[0]);
+
+       &pSReply("Set your passwd to '$crypt'");
+       $users{$u}{PASS} = $crypt;
+
+       $utime_userfile = time();
+       $ucount_userfile++;
+
+       return;
+    }
 
     if ($message =~ /^chpass(\s+(.*))?$/) {
        my(@args) = split /[\s\t]+/, $2 || '';
@@ -607,11 +717,15 @@ sub userDCC {
            return;
        }
 
-       my $u = &getUser($who);
+       my $u = &getUser($args[0]);
+       if (!defined $u) {
+           &pSReply("Internal error, u = NULL.");
+           return;
+       }
 
        if (scalar @args == 1) {        # del pass.
-           if (!&IsFlag("m") and $who !~ /^\Q$verifyUser\E$/i) {
-               &pSReply("cannto remove passwd of others.");
+           if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
+               &pSReply("cannot remove passwd of others.");
                return;
            }
 
@@ -630,8 +744,7 @@ sub userDCC {
            return;
        }
 
-       my $salt = join '',('.','/',0..9,'A'..'Z','a'..'z')[rand 64, rand 64];
-       my $crypt = crypt($args[1], $salt);
+       my $crypt       = &mkcrypt($args[1]);
        &pSReply("Set $u's passwd to '$crypt'");
        $users{$u}{PASS} = $crypt;
 
@@ -649,6 +762,7 @@ sub userDCC {
            return;
        }
 
+       my $chflag;
        my $user;
        if ($args[0] =~ /^$mask{nick}$/i) {     # <nick>
            $user       = &getUser($args[0]);
@@ -661,7 +775,7 @@ sub userDCC {
        }
 
        if (!defined $user) {
-           &pSReply("user $user does not exist.");
+           &pSReply("user does not exist.");
            return;
        }
 
@@ -673,7 +787,7 @@ sub userDCC {
 
        &DEBUG("who => $who");
        &DEBUG("verifyUser => $verifyUser");
-       if (!&IsFlag("m") and $who !~ /^\Q$verifyUser\E$/i) {
+       if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
            &pSReply("cannto change attributes of others.");
            return "REPLY";
        }
@@ -756,7 +870,7 @@ sub userDCC {
            return;
        }
 
-       if (!&IsFlag("m") and $who !~ /^\Q$verifyUser\E$/i) {
+       if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
            &pSReply("cannto change nick of others.");
            return "REPLY" if ($who eq "_default");
            return;
@@ -793,11 +907,11 @@ sub userDCC {
 
        my ($user,$mask);
        if ($args[0] =~ /^$mask{nick}$/i) {     # <nick>
-           return unless (&hasFlag("m"));
+           return unless (&hasFlag("n"));
            $user       = &getUser($args[0]);
            $mask       = $args[1];
        } else {                                # <mask>
-           # who or verifyUser. FIXME!!!
+           # who or verifyUser. FIXME (don't remember why)
            $user       = &getUser($who);
            $mask       = $args[0];
        }
@@ -814,7 +928,7 @@ sub userDCC {
            return;
        }
 
-       if (!&IsFlag("m") and $who !~ /^\Q$verifyUser\E$/i) {
+       if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
            &pSReply("cannto change masks of others.");
            return;
        }
@@ -887,10 +1001,14 @@ sub userDCC {
        }
 
        if ($state == 0) {              # delete.
-           my $c = join(' ', &banDel($mask) );
+           my @c = &banDel($mask);
 
-           if ($c) {
-               &pSReply("Removed $mask from chans: $c");
+           foreach (@c) {
+               &unban($mask, $_);
+           }
+
+           if (@c) {
+               &pSReply("Removed $mask from chans: @c");
            } else {
                &pSReply("$mask was not found in ban list.");
            }
@@ -918,7 +1036,7 @@ sub userDCC {
            $reason     = $1;
        }
 
-       if (!&IsFlag("m") and $who !~ /^\Q$verifyUser\E$/i) {
+       if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
            &pSReply("cannto change masks of others.");
            return;
        }
@@ -1011,7 +1129,7 @@ sub userDCC {
     if ($message =~ /^banlist(\s+(.*))?$/) {
        my $arg = $2;
 
-       if (defined $arg and $arg !~ /^$mask_chan$/) {
+       if (defined $arg and $arg !~ /^$mask{chan}$/) {
            &pSReply("error: chan $chan is invalid.");
            return;
        }
@@ -1032,6 +1150,7 @@ sub userDCC {
 
        &writeUserFile();
        &writeChanFile();
+       &News::writeNews() if (&ChanConfList("news"));
 
        return;
     }
@@ -1175,14 +1294,34 @@ sub userDCC {
        if ($state) {                   # adduser.
            if (scalar @args == 1) {
                $args[1]        = &getHostMask($args[0]);
-               if (!defined $args[1]) {
-                   &ERROR("could not get hostmask?");
-                   return;
-               }
+               &pSReply("Attemping to guess $args[0]'s hostmask...");
+
+               # crude hack... crappy Net::IRC
+               $conn->schedule(5, sub {
+       # hopefully this is right.
+       my $nick = (keys %{ $cache{nuhInfo} })[0];
+       if (!defined $nick) {
+           &pSReply("couldn't get nuhinfo... adding user without a hostmask.");
+           &userAdd($nick);
+           return;
+       }
+
+       my $mask = &makeHostMask( $cache{nuhInfo}{$nick}{NUH} );
+
+       if ( &userAdd($nick, $mask) ) { # success.
+               &pSReply("Added $nick with flags $users{$nick}{FLAGS}");
+               my @hosts = keys %{ $users{$nick}{HOSTS} };
+               &pSReply("hosts: @hosts");
+       }
+});
+               return;
            }
 
+           &DEBUG("args => @args");
            if ( &userAdd(@args) ) {    # success.
-               &pSReply("Added $args[0]...");
+               &pSReply("Added $args[0] with flags $users{$args[0]}{FLAGS}");
+               my @hosts = keys %{ $users{$args[0]}{HOSTS} };
+               &pSReply("hosts: @hosts");
 
            } else {                    # failure.
                &pSReply("User $args[0] already exists");
@@ -1218,16 +1357,31 @@ sub userDCC {
        my @time;
        foreach (sort { $a <=> $b } keys %time) {
            my $str = join(", ", sort keys %{ $time{$_} });
+           &DEBUG("time => $_, str => $str");
            push(@time, "$str (".&Time2String($_).")");
        }
 
-       &pSReply( &formListReply(0, "Schedulers: ", sort @time ) );
+       &pSReply( &formListReply(0, "Schedulers: ", @time ) );
        &pSReply( &formListReply(0, "Scheds to run: ", sort @list ) );
        &pSReply( &formListReply(0, "Scheds running(should not happen?) ", sort @run ) );
 
        return;
     }
 
+    # quite a cool hack: reply in DCC CHAT.
+    # FIXME broken for +A
+    #$msgType = "chat";
+
+    my $done = 0;
+    $done++ if &parseCmdHook("main", $message);
+    $done++ if &parseCmdHook("extra", $message);
+    $done++ unless (&Modules());
+
+    if ($done) {
+       &DEBUG("running non DCC CHAT command inside DCC CHAT!");
+       return;
+    }
+
     return "REPLY";
 }