# 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.");
### 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"));
# dump variables.
if ($message =~ /^dumpvars$/i) {
return unless (&hasFlag("o"));
- return '' unless (&IsParam("dumpvars"));
+ return unless (&IsParam("dumpvars"));
&status("Dumping all variables...");
&dumpallvars();
# kick.
if ($message =~ /^mode(\s+(.*))?$/) {
- return unless (&hasFlag("m"));
+ return unless (&hasFlag("n"));
my ($chan,$mode) = split /\s+/,$2,2;
if ($chan eq "") {
# 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;
}
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;
return unless (&hasFlag("n"));
&status("USER reload $who");
- &msg($who,"reloading...");
+ &pSReply("reloading...");
&reloadAllModules();
- &msg($who,"reloaded.");
+ &pSReply("reloaded.");
+
+ 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;
}
# +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 @chans;
+ while ($args =~ s/^($mask{chan})\s*//) {
+ push(@chans, $1);
}
- 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;
+ if (!scalar @chans) {
+ push(@chans, "_default");
+ $no_chan = 1;
}
- if (!exists $chanconf{$chan}) {
- &pSReply("no such channel $chan");
- return;
- }
-
- my $update = 0;
- if ($what =~ /^\+(\S+)/) {
- my $was = $chanconf{$chan}{$1};
- $was = ($was) ? "; was '$was'" : "";
- &pSReply("Setting $1 for $chan to '1'$was.");
-
- $chanconf{$chan}{$1} = 1;
+ my($what,$val) = split /[\s\t]+/, $args, 2;
- $update++;
- } elsif ($what =~ /^\-(\S+)/) {
- my $was = $chanconf{$chan}{$1};
- $was = ($was) ? "; was '$was'" : "";
- &pSReply("Setting $1 for $chan to '0'$was.");
+ ### TODO: "cannot set values without +m".
+ return unless (&hasFlag("n"));
- $chanconf{$chan}{$1} = 0;
+ # READ ONLY.
+ if (defined $what and $what !~ /^[-+]/ and !defined $val and $no_chan) {
+ &pSReply("Showing $what values on all channels...");
- $update++;
- } elsif (defined $val) {
- my $was = $chanconf{$chan}{$what};
- $was = ($was) ? "; was '$was'" : "";
- &pSReply("Setting $what for $chan to '$val'$was.");
+ my %vals;
+ foreach (keys %chanconf) {
+ my $val = $chanconf{$_}{$what} || "NOT-SET";
+ $vals{$val}{$_} = 1;
+ }
- $chanconf{$chan}{$what} = $val;
+ foreach (keys %vals) {
+ &pSReply(" $what = $_: ".join(' ', keys %{ $vals{$_} } ) );
+ }
- $update++;
- } elsif (defined $what) {
- &pSReply("$what for $chan is '$chanconf{$chan}{$what}'");
- }
+ &pSReply("End of list.");
- if ($update) {
- $utime_chanfile = time();
- $ucount_chanfile++;
return;
}
+ ### TODO: move to UserDCC again.
if ($cmd eq "chanset" and !defined $what) {
&DEBUG("showing channel conf.");
- foreach (keys %{ $chanconf{$chan} }) {
- &DEBUG("$chan: $_ => $chanconf{$chan}{$_}");
+ 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 > 60) {
+ &pSReply(" $str");
+ @items = ();
+ }
+ $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");
$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}) {
}
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;
}
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 || '';
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;
}
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;
}
if (!defined $user) {
- &pSReply("user $user does not exist.");
+ &pSReply("user does not exist.");
return;
}
&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";
}
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;
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>
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;
}
}
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.");
}
$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;
}
}
my $c;
- &pSReply(" expire, count, who-by, time-added, reason");
+ &pSReply(" mask: expire, time-added, count, who-by, reason");
foreach $c (keys %bans) {
next unless (!defined $arg or $arg =~ /^\Q$c\E$/i);
&pSReply(" $c:");
if (ref $val eq "ARRAY") {
my @array = @{ $val };
- &pSReply(" @array");
+ &pSReply(" $_: @array");
} else {
&DEBUG("unknown ban: $val");
}
&writeUserFile();
&writeChanFile();
+ &News::writeNews() if (&ChanConfList("news"));
return;
}
# chan.
if ($args =~ s/^($mask{chan}|\*)\s*//) {
$chan = $1;
- &DEBUG("chan => $chan");
} else {
$chan = "*";
}
# time.
if ($args =~ s/^(\d+)\s*//) {
$time = $1*60; # ??
- &DEBUG("time => $time");
} else {
$time = 0;
}
# time.
if ($args) {
$comment = $args;
- &DEBUG("comment => $comment");
} else {
$comment = "added by $who";
}
if ( &ignoreAdd($mask, $chan, $time, $comment) > 1) {
- &pSReply("added $mask to ignore list.");
- } else {
&pSReply("warn: $mask already in ignore list; written over anyway. FIXME");
+ } else {
+ &pSReply("added $mask to ignore list.");
}
return;
### TODO: proper (eggdrop-like) formatting.
my $c;
- &pSReply(" expire, count, who, added, comment");
+ &pSReply(" mask: expire, time-added, who, comment");
foreach $c (keys %ignore) {
next unless (!defined $arg or $arg =~ /^\Q$c\E$/i);
&pSReply(" $c:");
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;