]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/UserDCC.pl
- dbGet: warn if $select is NULL
[infobot.git] / src / Modules / UserDCC.pl
index 6967881d03f964be5b488d866ac1daf2e81f3bf8..09082a86ee22c116f6a64ddcdb6b5e2cdfc154ba 100644 (file)
@@ -17,18 +17,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 +38,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"));
@@ -95,7 +108,7 @@ sub userDCC {
     # dump variables.
     if ($message =~ /^dumpvars$/i) {
        return unless (&hasFlag("o"));
-       return '' unless (&IsParam("dumpvars"));
+       return unless (&IsParam("dumpvars"));
 
        &status("Dumping all variables...");
        &dumpallvars();
@@ -130,7 +143,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 +204,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 +245,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;
@@ -421,6 +437,29 @@ sub userDCC {
        return;
     }
 
+    # reset.
+    if ($message =~ /^reset$/i) {
+       return unless (&hasFlag("n"));
+
+       &msg($who,"resetting...");
+       my @done;
+       foreach ( keys %channels, keys %chanconf ) {
+           next if (grep /^\Q$_\E$/i, @done);
+
+           &part($_);
+
+           push(@done, $_);
+           sleep 1;
+       }
+       &clearIRCVars();
+       &joinNextChan();
+
+       &status("USER reset $who");
+       &msg($who,"resetted");
+
+       return;
+    }
+
     # rehash.
     if ($message =~ /^rehash$/) {
        return unless (&hasFlag("n"));
@@ -461,83 +500,50 @@ sub userDCC {
 
     # +chan.
     if ($message =~ /^(chanset|\+chan)(\s+(.*?))?$/) {
-       my $cmd  = $1;
-       my $args = $3;
+       my $cmd         = $1;
+       my $args        = $3;
+       my $no_chan     = 0;
 
        if (!defined $args) {
            &help($cmd);
            return;
        }
 
-       my ($chan);
-       if ($args =~ s/^($mask{chan})\s*//) {
-           $chan       = $1;
-           &DEBUG("chan => $chan.");
-       } else {
-           &DEBUG("no chan arg; setting to default.");
-           $chan       = "_default";
-       }
-
-       my($what,$val) = split /[\s\t]+/, $args, 2;
-
-       ### TODO: "cannot set values without +m".
-       return unless (&hasFlag("m"));
-
-       if ($cmd eq "+chan") {
-           &DEBUG("setting _time_added...");
-           $chanconf{$chan}{_time_added}       = time();
-
-           &pSReply("Joining $chan...");
-           &joinchan($chan);
-
-           return;
+       my @chans;
+       while ($args =~ s/^($mask{chan})\s*//) {
+           push(@chans, $1);
        }
 
-       if (!exists $chanconf{$chan}) {
-           &pSReply("no such channel $chan");
-           return;
+       if (!scalar @chans) {
+           push(@chans, "_default");
+           $no_chan    = 1;
        }
 
-       my $update      = 0;
-       ### TODO: $what can be undefined. fix it!
-       if ($what =~ /^\+(\S+)/) {
-           my $was     = $chanconf{$chan}{$1};
-           $was        = ($was) ? "; was '$was'" : "";
-           &pSReply("Setting $1 for $chan to '1'$was.");
-
-           $chanconf{$chan}{$1} = 1;
-
-           $update++;
-       } elsif ($what =~ /^\-(\S+)/) {
-           my $was     = $chanconf{$chan}{$1};
-           $was        = ($was) ? "; was '$was'" : "";
-           &pSReply("Setting $1 for $chan to '0'$was.");
+       my($what,$val) = split /[\s\t]+/, $args, 2;
 
-           $chanconf{$chan}{$1} = 0;
+       ### TODO: "cannot set values without +m".
+       return unless (&hasFlag("n"));
 
-           $update++;
-       } elsif (defined $val) {
-           my $was     = $chanconf{$chan}{$what};
-           $was        = ($was) ? "; was '$was'" : "";
-           &pSReply("Setting $what for $chan to '$val'$was.");
+       # READ ONLY.
+       if (defined $what and $what !~ /^[-+]/ and !defined $val and $no_chan) {
+           &pSReply("Showing $what values on all channels...");
 
-           $chanconf{$chan}{$what} = $val;
+           my %vals;
+           foreach (keys %chanconf) {
+               my $val = $chanconf{$_}{$what} || "NOT-SET";
+               $vals{$val}{$_} = 1;
+           }
 
-           $update++;
-       } elsif (defined $what) {
-           if (exists $chanconf{$chan}{$what}) {
-               &pSReply("$what for $chan is '$chanconf{$chan}{$what}'");
-           } else {
-               &pSReply("$what for $chan is not set.'");
+           foreach (keys %vals) {
+               &pSReply("  $what = $_: ".join(' ', keys %{ $vals{$_} } ) );
            }
-       }
 
-       if ($update) {
-           $utime_chanfile = time();
-           $ucount_chanfile++;
+           &pSReply("End of list.");
+
            return;
        }
 
+       ### TODO: move to UserDCC again.
        if ($cmd eq "chanset" and !defined $what) {
            &DEBUG("showing channel conf.");
 
@@ -555,17 +561,22 @@ sub userDCC {
                    $str = $newstr;
                    push(@items, "$_ => $chanconf{$chan}{$_}");
                }
+               &pSReply("    $str") if (@items);
            }
-
            return;
        }
 
+       foreach (@chans) {
+           &chanSet($cmd, $_, $what, $val);
+       }
+
        return;
     }
 
     if ($message =~ /^(chanunset|\-chan)(\s+(.*))?$/) {
-       return unless (&hasFlag("m"));
+       return unless (&hasFlag("n"));
        my $args        = $3;
+       my $no_chan     = 0;
 
        if (!defined $args) {
            &help("chanunset");
@@ -579,8 +590,9 @@ sub userDCC {
            $delete     = ($1) ? 1 : 0;
            &DEBUG("chan => $chan.");
        } else {
-           &DEBUG("no chan arg; setting to default.");
+           &VERB("no chan arg; setting to default.",2);
            $chan       = "_default";
+           $no_chan    = 1;
        }
 
        if (!exists $chanconf{$chan}) {
@@ -589,14 +601,41 @@ sub userDCC {
        }
 
        if ($args ne "") {
-           if (&getChanConf($args,$chan)) {
-               &pSReply("Unsetting channel ($chan) option $args. (was $chanconf{$chan}{$args})");
-               undef $chanconf{$chan}{$args};
 
-           } else {
+           if (!&getChanConf($args,$chan)) {
                &pSReply("$args does not exist for $chan");
+               return;
            }
 
+           my @chans = &ChanConfList($args);
+           &DEBUG("scalar chans => ".scalar(@chans) );
+           if (scalar @chans == 1 and $chans[0] eq "_default" and !$no_chan) {
+               &psReply("ok, $args was set only for _default; unsetting for _defaul but setting for other chans.");
+
+               my $val = $chanconf{$_}{_default};
+               foreach (keys %chanconf) {
+                   $chanconf{$_}{$args} = $val;
+               }
+               delete $chanconf{_default}{$args};
+
+               return;
+           }
+
+           if ($no_chan and !exists($chanconf{_default}{$args})) {
+               &pSReply("ok, $args for _default does not exist, removing from all chans.");
+
+               foreach (keys %chanconf) {
+                   next unless (exists $chanconf{$_}{$args});
+                   &DEBUG("delete chanconf{$_}{$args};");
+                   delete $chanconf{$_}{$args};
+               }
+
+               return;
+           }
+
+           &pSReply("Unsetting channel ($chan) option $args. (was $chanconf{$chan}{$args})");
+           delete $chanconf{$chan}{$args};
+
            return;
        }
 
@@ -616,6 +655,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 || '';
@@ -630,10 +688,14 @@ 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) {
+           if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) {
                &pSReply("cannto remove passwd of others.");
                return;
            }
@@ -653,8 +715,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;
 
@@ -684,7 +745,7 @@ sub userDCC {
        }
 
        if (!defined $user) {
-           &pSReply("user $user does not exist.");
+           &pSReply("user does not exist.");
            return;
        }
 
@@ -696,7 +757,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";
        }
@@ -779,7 +840,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;
@@ -816,7 +877,7 @@ 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>
@@ -837,7 +898,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;
        }
@@ -910,10 +971,14 @@ sub userDCC {
        }
 
        if ($state == 0) {              # delete.
-           my $c = join(' ', &banDel($mask) );
+           my @c = &banDel($mask);
+
+           foreach (@c) {
+               &unban($mask, $_);
+           }
 
            if ($c) {
-               &pSReply("Removed $mask from chans: $c");
+               &pSReply("Removed $mask from chans: @c");
            } else {
                &pSReply("$mask was not found in ban list.");
            }
@@ -941,7 +1006,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;
        }
@@ -1055,6 +1120,7 @@ sub userDCC {
 
        &writeUserFile();
        &writeChanFile();
+       &News::writeNews() if (&ChanConfList("news"));
 
        return;
     }
@@ -1227,15 +1293,26 @@ sub userDCC {
     if ($message =~ /^sched$/) {
        my @list;
        my @run;
+
+       my %time;
        foreach (keys %sched) {
            next unless (exists $sched{$_}{TIME});
+           $time{ $sched{$_}{TIME}-time() }{$_} = 1;
            push(@list,$_);
 
            next unless (exists $sched{$_}{RUNNING});
            push(@run,$_);
        }
 
-       &pSReply( &formListReply(0,"Scheds to run: ", sort @list ) );
+       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: ", @time ) );
+       &pSReply( &formListReply(0, "Scheds to run: ", sort @list ) );
        &pSReply( &formListReply(0, "Scheds running(should not happen?) ", sort @run ) );
 
        return;