X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2FUserDCC.pl;h=0a3bbfd2e13c9788cb98e8d7e72f390986131da0;hb=e4c134bfa2fedc5ce6699651c0af3cb468de4534;hp=f91e1b1bd432accff41d41a0e53b11868b87acd4;hpb=b28802c40e8775f2a9457b833e2014ccc2f4161c;p=infobot.git diff --git a/src/Modules/UserDCC.pl b/src/Modules/UserDCC.pl index f91e1b1..0a3bbfd 100644 --- a/src/Modules/UserDCC.pl +++ b/src/Modules/UserDCC.pl @@ -22,7 +22,7 @@ sub userDCC { # quit. if ($message =~ /^(exit|quit)$/i) { # do ircII clients support remote close? if so, cool! - &status("userDCC: quit called. FIXME"); + &FIXME("userDCC: quit called."); &dcc_close($who); &status("userDCC: after dcc_close!"); @@ -34,11 +34,11 @@ sub userDCC { my $count = scalar(keys %{ $dcc{'CHAT'} }); my $dccCHAT = $message; - &pSReply("Start of who ($count users)."); + &performStrictReply("Start of who ($count users)."); foreach (keys %{ $dcc{'CHAT'} }) { - &pSReply("=> $_"); + &performStrictReply("=> $_"); } - &pSReply("End of who."); + &performStrictReply("End of who."); return; } @@ -53,7 +53,7 @@ sub userDCC { } my $result = &doQuestion($args); - &pSReply($result); + &performStrictReply($result); return; } @@ -84,10 +84,28 @@ sub userDCC { return; } + # opme. + if ($message =~ /^opme(\s+($mask{chan}))?$/i) { + return unless (&hasFlag("o")); + return unless (&hasFlag("A")); + + my $chan = $2; + + if ($chan eq "") { + &help("4op"); + return; + } + + # can this be exploited? + rawout("MODE $chan +o $who"); + + return; + } + # backlog. if ($message =~ /^backlog(\s+(.*))?$/i) { return unless (&hasFlag("o")); - return unless (&hasParam("backlog")); + return unless (&IsParam("backlog")); my $num = $2; my $max = $param{'backlog'}; @@ -115,7 +133,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(); @@ -125,8 +143,8 @@ sub userDCC { # dump variables ][. if ($message =~ /^symdump$/i) { - return unless (&hasFlag("o")); - return unless (&IsParam("symdump")); + return unless (&hasFlag('o')); + return unless (&IsParam('DumpVars2')); &status("Dumping all variables..."); &symdumpAllFile(); @@ -135,14 +153,17 @@ sub userDCC { } # kick. - if ($message =~ /^kick(\s+(\S+)(\s+(\S+))?)?/) { + if ($message =~ /^kick(\s+(.*?))$/) { return unless (&hasFlag("o")); - my ($nick,$chan) = (lc $2,lc $4); - if ($nick eq "") { + my $arg = $2; + + if ($arg eq "") { &help("kick"); return; } + my @args = split(/\s+/, $arg); + my ($nick,$chan,$reason) = @args; if (&validChan($chan) == 0) { &msg($who,"error: invalid channel \002$chan\002"); @@ -154,12 +175,12 @@ sub userDCC { return; } - &kick($nick,$chan); + &kick($nick,$chan,$reason); return; } - # kick. + # mode. if ($message =~ /^mode(\s+(.*))?$/) { return unless (&hasFlag("n")); my ($chan,$mode) = split /\s+/,$2,2; @@ -263,17 +284,17 @@ sub userDCC { next unless (&IsNickInChan($opee,$_)); $found++; if ($channels{$_}{'o'}{$opee}) { - &pSReply("op: $opee already has ops on $_"); + &performStrictReply("op: $opee already has ops on $_"); next; } $op++; - &pSReply("opping $opee on $_"); + &performStrictReply("opping $opee on $_"); &op($_, $opee); } if ($found != $op) { - &pSReply("op: opped on all possible channels."); + &performStrictReply("op: opped on all possible channels."); } else { &DEBUG("op: found => '$found'."); &DEBUG("op: op => '$op'."); @@ -333,13 +354,33 @@ sub userDCC { if ($message =~ s/^say\s+(\S+)\s+(.*)//) { return unless (&hasFlag("o")); my ($chan,$msg) = (lc $1, $2); + &DEBUG("chan => '$1', msg => '$msg'."); + # TODO: add nick destination. if (&validChan($chan)) { - &msg($chan, $2); + &msg($chan, $msg); } else { - &msg($who,"i'm not on \002$1\002, sorry."); + &msg($who,"i'm not on \002$chan\002, sorry."); } + + return; + } + + # do. + if ($message =~ s/^do\s+(\S+)\s+(.*)//) { + return unless (&hasFlag("o")); + my ($chan,$msg) = (lc $1, $2); + + &DEBUG("chan => '$1', msg => '$msg'."); + + # TODO: add nick destination. + if (&validChan($chan)) { + &action($chan, $msg); + } else { + &msg($who,"i'm not on \002$chan\002, sorry."); + } + return; } @@ -448,9 +489,9 @@ sub userDCC { return unless (&hasFlag("n")); &status("USER reload $who"); - &pSReply("reloading..."); + &performStrictReply("reloading..."); &reloadAllModules(); - &pSReply("reloaded."); + &performStrictReply("reloaded."); return; } @@ -477,7 +518,7 @@ sub userDCC { &DEBUG("after joinnextchan"); &status("USER reset $who"); - &msg($who,"resetted"); + &msg($who,"reset complete"); return; } @@ -507,15 +548,15 @@ sub userDCC { } if (!exists $chanconf{$args[0]}) { - &pSReply("no such channel $args[0]"); + &performStrictReply("no such channel $args[0]"); return; } - &pSReply("showing channel conf."); + &performStrictReply("showing channel conf."); foreach (sort keys %{ $chanconf{$args[0]} }) { - &pSReply("$chan: $_ => $chanconf{$args[0]}{$_}"); + &performStrictReply("$chan: $_ => $chanconf{$args[0]}{$_}"); } - &pSReply("End of chaninfo."); + &performStrictReply("End of chaninfo."); return; } @@ -533,7 +574,7 @@ sub userDCC { my @chans; while ($args =~ s/^($mask{chan})\s*//) { - push(@chans, $1); + push(@chans, lc($1)); } if (!scalar @chans) { @@ -548,19 +589,24 @@ sub userDCC { # READ ONLY. if (defined $what and $what !~ /^[-+]/ and !defined $val and $no_chan) { - &pSReply("Showing $what values on all channels..."); + &performStrictReply("Showing $what values on all channels..."); my %vals; foreach (keys %chanconf) { - my $val = $chanconf{$_}{$what} || "NOT-SET"; + my $val; + if (defined $chanconf{$_}{$what}) { + $val = $chanconf{$_}{$what}; + } else { + $val = "NOT-SET"; + } $vals{$val}{$_} = 1; } foreach (keys %vals) { - &pSReply(" $what = $_: ".join(' ', keys %{ $vals{$_} } ) ); + &performStrictReply(" $what = $_(" . scalar(keys %{$vals{$_}}) . "): ".join(' ', sort keys %{ $vals{$_} } ) ); } - &pSReply("End of list."); + &performStrictReply("End of list."); return; } @@ -569,21 +615,25 @@ sub userDCC { 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. + foreach $chan (@chans) { + if ($chan eq '_default') { + &performStrictReply("Default channel settings"); + } else { + &performStrictReply("chan: $chan (see _default also)"); + } my @items; my $str = ""; foreach (sort keys %{ $chanconf{$chan} }) { my $newstr = join(', ', @items); - if (length $newstr > 60) { - &pSReply(" $str"); + ### TODO: make length use channel line limit? + if (length $newstr > 370) { + &performStrictReply(" $str"); @items = (); } $str = $newstr; push(@items, "$_ => $chanconf{$chan}{$_}"); } - &pSReply(" $str") if (@items); + &performStrictReply(" $str") if (@items); } return; } @@ -613,7 +663,6 @@ sub userDCC { if ($args =~ s/^(\-)?($mask{chan})\s*//) { $chan = $2; $delete = ($1) ? 1 : 0; - &DEBUG("chan => $chan."); } else { &VERB("no chan arg; setting to default.",2); $chan = "_default"; @@ -621,21 +670,21 @@ sub userDCC { } if (!exists $chanconf{$chan}) { - &pSReply("no such channel $chan"); + &performStrictReply("no such channel $chan"); return; } if ($args ne "") { if (!&getChanConf($args,$chan)) { - &pSReply("$args does not exist for $chan"); + &performStrictReply("$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."); + &performStrictReply("ok, $args was set only for _default; unsetting for _defaul but setting for other chans."); my $val = $chanconf{$_}{_default}; foreach (keys %chanconf) { @@ -649,7 +698,7 @@ sub userDCC { } if ($no_chan and !exists($chanconf{_default}{$args})) { - &pSReply("ok, $args for _default does not exist, removing from all chans."); + &performStrictReply("ok, $args for _default does not exist, removing from all chans."); foreach (keys %chanconf) { next unless (exists $chanconf{$_}{$args}); @@ -662,23 +711,23 @@ sub userDCC { return; } - &pSReply("Unsetting channel ($chan) option $args. (was $chanconf{$chan}{$args})"); + &performStrictReply("Unsetting channel ($chan) option $args. (was $chanconf{$chan}{$args})"); delete $chanconf{$chan}{$args}; return; } if ($delete) { - &pSReply("Deleting channel $chan for sure!"); + &performStrictReply("Deleting channel $chan for sure!"); $utime_chanfile = time(); $ucount_chanfile++; &part($chan); - &pSReply("Leaving $chan..."); + &performStrictReply("Leaving $chan..."); delete $chanconf{$chan}; } else { - &pSReply("Prefix channel with '-' to delete for sure."); + &performStrictReply("Prefix channel with '-' to delete for sure."); } return; @@ -692,10 +741,10 @@ sub userDCC { return; } - my $u = &getUser($who); - my $crypt = &mkcrypt($args[0]); + my $u = &getUser($who); + my $crypt = &mkcrypt($args[0]); - &pSReply("Set your passwd to '$crypt'"); + &performStrictReply("Set your passwd to '$crypt'"); $users{$u}{PASS} = $crypt; $utime_userfile = time(); @@ -713,28 +762,29 @@ sub userDCC { } if (!&IsUser($args[0])) { - &pSReply("user $args[0] is not valid."); + &performStrictReply("user $args[0] is not valid."); return; } my $u = &getUser($args[0]); if (!defined $u) { - &pSReply("Internal error, u = NULL."); + &performStrictReply("Internal error, u = NULL."); return; } - if (scalar @args == 1) { # del pass. + if (scalar @args == 1) { + # del pass. if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) { - &pSReply("cannot remove passwd of others."); + &performStrictReply("cannot remove passwd of others."); return; } if (!exists $users{$u}{PASS}) { - &pSReply("$u does not have pass set anyway."); + &performStrictReply("$u does not have pass set anyway."); return; } - &pSReply("Deleted pass from $u."); + &performStrictReply("Deleted pass from $u."); $utime_userfile = time(); $ucount_userfile++; @@ -745,7 +795,7 @@ sub userDCC { } my $crypt = &mkcrypt($args[1]); - &pSReply("Set $u's passwd to '$crypt'"); + &performStrictReply("Set $u's passwd to '$crypt'"); $users{$u}{PASS} = $crypt; $utime_userfile = time(); @@ -764,10 +814,12 @@ sub userDCC { my $chflag; my $user; - if ($args[0] =~ /^$mask{nick}$/i) { # + if ($args[0] =~ /^$mask{nick}$/i) { + # $user = &getUser($args[0]); $chflag = $args[1]; - } else { # + } else { + # $user = &getUser($who); &DEBUG("user $who... nope.") unless (defined $user); $user = &getUser($verifyUser); @@ -775,20 +827,20 @@ sub userDCC { } if (!defined $user) { - &pSReply("user does not exist."); + &performStrictReply("user does not exist."); return; } my $flags = $users{$user}{FLAGS}; if (!defined $chflag) { - &pSReply("Flags for $user: $flags"); + &performStrictReply("Flags for $user: $flags"); return; } &DEBUG("who => $who"); &DEBUG("verifyUser => $verifyUser"); if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) { - &pSReply("cannto change attributes of others."); + &performStrictReply("cannto change attributes of others."); return "REPLY"; } @@ -799,7 +851,7 @@ sub userDCC { if ($_ eq "-") { $state = 0; next; } if (!defined $state) { - &pSReply("no initial + or - was found in attr."); + &performStrictReply("no initial + or - was found in attr."); return; } @@ -811,7 +863,7 @@ sub userDCC { and $param{owner} =~ /^\Q$user\E$/i and $flags =~ /[nmo]/ ) { - &pSReply("not removing flag $_ for $user."); + &performStrictReply("not removing flag $_ for $user."); next; } next unless ($flags =~ s/\Q$_\E//); @@ -823,10 +875,12 @@ sub userDCC { if ($change) { $utime_userfile = time(); $ucount_userfile++; - &pSReply("Current flags: $flags"); + #$flags.*FLAGS sort + $flags = join('', sort split('', $flags)); + &performStrictReply("Current flags: $flags"); $users{$user}{FLAGS} = $flags; } else { - &pSReply("No flags changed: $flags"); + &performStrictReply("No flags changed: $flags"); } return; @@ -856,22 +910,22 @@ sub userDCC { } if (!defined $user) { - &pSReply("user $who or $args[0] does not exist."); + &performStrictReply("user $who or $args[0] does not exist."); return; } if ($user =~ /^\Q$chnick\E$/i) { - &pSReply("user == chnick. why should I do that?"); + &performStrictReply("user == chnick. why should I do that?"); return; } if (&getUser($chnick)) { - &pSReply("user $chnick is already used!"); + &performStrictReply("user $chnick is already used!"); return; } if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) { - &pSReply("cannto change nick of others."); + &performStrictReply("cannto change nick of others."); return "REPLY" if ($who eq "_default"); return; } @@ -885,7 +939,7 @@ sub userDCC { $utime_userfile = time(); $ucount_userfile++; - &pSReply("Changed '$user' to '$chnick' successfully."); + &performStrictReply("Changed '$user' to '$chnick' successfully."); return; } @@ -911,50 +965,48 @@ sub userDCC { $user = &getUser($args[0]); $mask = $args[1]; } else { # - # who or verifyUser. FIXME (don't remember why) + # FIXME: who or verifyUser. (don't remember why) $user = &getUser($who); $mask = $args[0]; } if (!defined $user) { - &pSReply("user $user does not exist."); + &performStrictReply("user $user does not exist."); return; } if (!defined $mask) { - ### FIXME. - &pSReply("Hostmasks for $user: $users{$user}{HOSTS}"); - + &performStrictReply("Hostmasks for $user: " . join(" ", keys %{$users{$user}{HOSTS}})); return; } if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) { - &pSReply("cannto change masks of others."); - return; - } - - if ($mask !~ /^$mask{nuh}$/) { - &pSReply("error: mask ($mask) is not a real hostmask."); + &performStrictReply("cannto change masks of others."); return; } my $count = scalar keys %{ $users{$user}{HOSTS} }; if ($state) { # add. + if ($mask !~ /^$mask{nuh}$/) { + &performStrictReply("error: mask ($mask) is not a real hostmask."); + return; + } + if (exists $users{$user}{HOSTS}{$mask}) { - &pSReply("mask $mask already exists."); + &performStrictReply("mask $mask already exists."); return; } ### TODO: override support. $users{$user}{HOSTS}{$mask} = 1; - &pSReply("Added $mask to list of masks."); + &performStrictReply("Added $mask to list of masks."); } else { # delete. if (!exists $users{$user}{HOSTS}{$mask}) { - &pSReply("mask $mask does not exist."); + &performStrictReply("mask $mask does not exist."); return; } @@ -962,9 +1014,9 @@ sub userDCC { delete $users{$user}{HOSTS}{$mask}; if (scalar keys %{ $users{$user}{HOSTS} } != $count) { - &pSReply("Removed $mask from list of masks."); + &performStrictReply("Removed $mask from list of masks."); } else { - &pSReply("error: could not find $mask in list of masks."); + &performStrictReply("error: could not find $mask in list of masks."); return; } } @@ -1008,9 +1060,9 @@ sub userDCC { } if (@c) { - &pSReply("Removed $mask from chans: @c"); + &performStrictReply("Removed $mask from chans: @c"); } else { - &pSReply("$mask was not found in ban list."); + &performStrictReply("$mask was not found in ban list."); } return; @@ -1025,7 +1077,7 @@ sub userDCC { $time = $1; &DEBUG("time = $time."); if ($time < 0) { - &pSReply("error: time cannot be negatime?"); + &performStrictReply("error: time cannot be negatime?"); return; } } else { @@ -1037,19 +1089,19 @@ sub userDCC { } if (!&IsFlag("n") and $who !~ /^\Q$verifyUser\E$/i) { - &pSReply("cannto change masks of others."); + &performStrictReply("cannto change masks of others."); return; } if ($mask !~ /^$mask{nuh}$/) { - &pSReply("error: mask ($mask) is not a real hostmask."); + &performStrictReply("error: mask ($mask) is not a real hostmask."); return; } if ( &banAdd($mask,$chan,$time,$reason) == 2) { - &pSReply("ban already exists; overwriting."); + &performStrictReply("ban already exists; overwriting."); } - &pSReply("Added $mask for $chan (time => $time, reason => $reason)"); + &performStrictReply("Added $mask for $chan (time => $time, reason => $reason)"); return; } @@ -1064,12 +1116,12 @@ sub userDCC { my $user = &getUser($arg); if (!defined $user) { - &pSReply("whois: user $user does not exist."); + &performStrictReply("whois: user $user does not exist."); return; } ### TODO: better (eggdrop-like) output. - &pSReply("user: $user"); + &performStrictReply("user: $user"); foreach (keys %{ $users{$user} }) { my $ref = ref $users{$user}{$_}; @@ -1077,14 +1129,14 @@ sub userDCC { my $type = $_; ### DOES NOT WORK??? foreach (keys %{ $users{$user}{$type} }) { - &pSReply(" $type => $_"); + &performStrictReply(" $type => $_"); } next; } - &pSReply(" $_ => $users{$user}{$_}"); + &performStrictReply(" $_ => $users{$user}{$_}"); } - &pSReply("End of USER whois."); + &performStrictReply("End of USER whois."); return; } @@ -1094,34 +1146,34 @@ sub userDCC { if (defined $arg) { if ($arg ne "_default" and !&validChan($arg) ) { - &pSReply("error: chan $chan is invalid."); + &performStrictReply("error: chan $chan is invalid."); return; } } if (!scalar keys %bans) { - &pSReply("Ban list is empty."); + &performStrictReply("Ban list is empty."); return; } my $c; - &pSReply(" mask: expire, time-added, count, who-by, reason"); + &performStrictReply(" mask: expire, time-added, count, who-by, reason"); foreach $c (keys %bans) { next unless (!defined $arg or $arg =~ /^\Q$c\E$/i); - &pSReply(" $c:"); + &performStrictReply(" $c:"); foreach (keys %{ $bans{$c} }) { my $val = $bans{$c}{$_}; if (ref $val eq "ARRAY") { my @array = @{ $val }; - &pSReply(" $_: @array"); + &performStrictReply(" $_: @array"); } else { &DEBUG("unknown ban: $val"); } } } - &pSReply("END of bans."); + &performStrictReply("END of bans."); return; } @@ -1130,7 +1182,7 @@ sub userDCC { my $arg = $2; if (defined $arg and $arg !~ /^$mask{chan}$/) { - &pSReply("error: chan $chan is invalid."); + &performStrictReply("error: chan $chan is invalid."); return; } @@ -1140,7 +1192,7 @@ sub userDCC { } &DEBUG("End of bans."); - &pSReply("END of bans."); + &performStrictReply("END of bans."); return; } @@ -1150,7 +1202,7 @@ sub userDCC { &writeUserFile(); &writeChanFile(); - &News::writeNews() if (&ChanConfList("news")); + &performStrictReply("saved user and chan files"); return; } @@ -1183,9 +1235,9 @@ sub userDCC { if (!$state) { # delignore. if ( &ignoreDel($mask) ) { - &pSReply("ok, deleted X ignores."); + &performStrictReply("ok, deleted ignores for $mask."); } else { - &pSReply("could not find $mask in ignore list."); + &performStrictReply("could not find $mask in ignore list."); } return; } @@ -1203,7 +1255,7 @@ sub userDCC { # time. if ($args =~ s/^(\d+)\s*//) { - $time = $1*60; # ?? + $time = $1; # time is in minutes } else { $time = 0; } @@ -1216,9 +1268,9 @@ sub userDCC { } if ( &ignoreAdd($mask, $chan, $time, $comment) > 1) { - &pSReply("warn: $mask already in ignore list; written over anyway. FIXME"); + &performStrictReply("FIXME: $mask already in ignore list; written over anyway."); } else { - &pSReply("added $mask to ignore list."); + &performStrictReply("added $mask to ignore list."); } return; @@ -1229,111 +1281,112 @@ sub userDCC { if (defined $arg) { if ($arg !~ /^$mask{chan}$/) { - &pSReply("error: chan $chan is invalid."); + &performStrictReply("error: chan $chan is invalid."); return; } if (!&validChan($arg)) { - &pSReply("error: chan $arg is invalid."); + &performStrictReply("error: chan $arg is invalid."); return; } - &pSReply("Showing bans for $arg only."); + &performStrictReply("Showing bans for $arg only."); } if (!scalar keys %ignore) { - &pSReply("Ignore list is empty."); + &performStrictReply("Ignore list is empty."); return; } ### TODO: proper (eggdrop-like) formatting. my $c; - &pSReply(" mask: expire, time-added, who, comment"); + &performStrictReply(" mask: expire, time-added, who, comment"); foreach $c (keys %ignore) { next unless (!defined $arg or $arg =~ /^\Q$c\E$/i); - &pSReply(" $c:"); + &performStrictReply(" $c:"); foreach (keys %{ $ignore{$c} }) { my $ref = ref $ignore{$c}{$_}; if ($ref eq "ARRAY") { my @array = @{ $ignore{$c}{$_} }; - &pSReply(" $_: @array"); + &performStrictReply(" $_: @array"); } else { &DEBUG("unknown ignore line?"); } } } - &pSReply("END of ignore."); + &performStrictReply("END of ignore."); return; } # adduser/deluser. - if ($message =~ /^(\+|\-|add|del)user(\s+(.*))?$/i) { + if ($message =~ /^(add|del)user(\s+(.*))?$/i) { my $str = $1; my $strstr = $1."user"; my @args = split /\s+/, $3 || ''; my $args = $3; - my $state = ($str =~ /^(\+|add)$/) ? 1 : 0; + my $state = ($str =~ /^(add)$/) ? 1 : 0; if (!scalar @args) { &help($strstr); return; } - if ($str eq "+") { + if ($str eq 'add') { if (scalar @args != 2) { - &pSReply(".+host requires hostmask argument."); + &performStrictReply('adduser requires hostmask argument.'); return; } } elsif (scalar @args != 1) { - &pSReply("too many arguments."); + &performStrictReply('too many arguments.'); return; } - if ($state) { # adduser. + if ($state) { + # adduser. if (scalar @args == 1) { $args[1] = &getHostMask($args[0]); - &pSReply("Attemping to guess $args[0]'s hostmask..."); + &performStrictReply("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} ); + # hopefully this is right. + my $nick = (keys %{ $cache{nuhInfo} })[0]; + if (!defined $nick) { + &performStrictReply("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"); - } -}); + if ( &userAdd($nick, $mask) ) { + # success. + &performStrictReply("Added $nick with flags $users{$nick}{FLAGS}"); + my @hosts = keys %{ $users{$nick}{HOSTS} }; + &performStrictReply("hosts: @hosts"); + } + }); return; } &DEBUG("args => @args"); if ( &userAdd(@args) ) { # success. - &pSReply("Added $args[0] with flags $users{$args[0]}{FLAGS}"); + &performStrictReply("Added $args[0] with flags $users{$args[0]}{FLAGS}"); my @hosts = keys %{ $users{$args[0]}{HOSTS} }; - &pSReply("hosts: @hosts"); + &performStrictReply("hosts: @hosts"); } else { # failure. - &pSReply("User $args[0] already exists"); + &performStrictReply("User $args[0] already exists"); } } else { # deluser. if ( &userDel($args[0]) ) { # success. - &pSReply("Deleted $args[0] successfully."); + &performStrictReply("Deleted $args[0] successfully."); } else { # failure. - &pSReply("User $args[0] does not exist."); + &performStrictReply("User $args[0] does not exist."); } } @@ -1361,19 +1414,18 @@ sub userDCC { 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 ) ); + &performStrictReply( &formListReply(0, "Schedulers: ", @time ) ); + &performStrictReply( &formListReply(0, "Scheds to run: ", sort @list ) ); + &performStrictReply( &formListReply(0, "Scheds running(should not happen?) ", sort @run ) ); return; } # quite a cool hack: reply in DCC CHAT. - $msgType = "chat"; + $msgType = "chat" if (exists $dcc{'CHAT'}{$who}); my $done = 0; - $done++ if &parseCmdHook("main", $message); - $done++ if &parseCmdHook("extra", $message); + $done++ if &parseCmdHook($message); $done++ unless (&Modules()); if ($done) {