X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FUserExtra.pl;h=ada60ce8113155e9c07a0e378c67793df0f403a1;hb=f7cae48a17d6decd0a9bd997188271daa0a885b1;hp=7079f6a7b96b4b13d7b6676d8b1e3756090d66c8;hpb=c53a047e7a5f63c954a2ce515687a937ca8720f3;p=infobot.git diff --git a/src/UserExtra.pl b/src/UserExtra.pl index 7079f6a..ada60ce 100644 --- a/src/UserExtra.pl +++ b/src/UserExtra.pl @@ -5,10 +5,11 @@ # Created: 20000107 # -if (&IsParam("useStrict")) { use strict; } - -use vars qw($message $arg $qWord $verb $lobotomized); -use vars qw(%channels %chanstats %cmdstats); +use strict; +use vars qw($message $arg $qWord $verb $lobotomized $who $result $chan + $conn $msgType $query $talkchannel $ident $memusage); +use vars qw(%channels %chanstats %cmdstats %count %ircstats %param + %cache %mask %userstats %hooks_main); ### ### Start of command hooks for UserExtra. @@ -16,25 +17,25 @@ use vars qw(%channels %chanstats %cmdstats); &addCmdHook("main", 'chan(stats|info)', ('CODEREF' => 'chaninfo', ) ); &addCmdHook("main", 'cmd(stats|info)', ('CODEREF' => 'cmdstats', ) ); -&addCmdHook("main", 'factinfo', ('CODEREF' => 'factinfo', +&addCmdHook("main", 'factinfo', ('CODEREF' => 'factinfo', 'Cmdstats' => 'Factoid Info', Module => 'factoids', ) ); -&addCmdHook("main", 'factstats?', ('CODEREF' => 'factstats', - 'Cmdstats' => 'Factoid Statistics', Help => "factstats", +&addCmdHook("main", 'factstats?', ('CODEREF' => 'factstats', + 'Cmdstats' => 'Factoid Stats', Help => "factstats", Forker => 1, 'Identifier' => 'factoids', ) ); -&addCmdHook("main", 'help', ('CODEREF' => 'help', +&addCmdHook("main", 'help', ('CODEREF' => 'help', 'Cmdstats' => 'Help', ) ); &addCmdHook("main", 'karma', ('CODEREF' => 'karma', ) ); -&addCmdHook("main", 'i?spell', ('CODEREF' => 'ispell', +&addCmdHook("main", 'i?spell', ('CODEREF' => 'ispell', Help => 'spell', Identifier => 'spell', ) ); -&addCmdHook("main", 'd?nslookup', ('CODEREF' => 'DNS', +&addCmdHook("main", 'd?nslookup', ('CODEREF' => 'DNS', Help => 'nslookup', Identifier => 'allowDNS', Forker => "NULL", ) ); -&addCmdHook("main", 'tell|explain', ('CODEREF' => 'tell', +&addCmdHook("main", 'tell|explain', ('CODEREF' => 'tell', Help => 'tell', Identifier => 'allowTelling', Cmdstats => 'Tell') ); -&addCmdHook("main", 'news', ('CODEREF' => 'News::Parse', +&addCmdHook("main", 'news', ('CODEREF' => 'News::Parse', Module => 'news', 'Cmdstats' => 'News' ) ); -&addCmdHook("main", 'countrystats', ('CODEREF' => 'countryStats', +&addCmdHook("main", 'countrystats', ('CODEREF' => 'countryStats', # Forker => "NULL", ) ); @@ -57,14 +58,17 @@ sub chaninfo { ### line 1. foreach (sort keys %channels) { - if (/^\s*$/ or / /) { + if ( /^\s*$/ or / / ) { &status("chanstats: fe channels: chan == NULL."); &ircCheck(); next; } - push(@array, "$_ (".scalar(keys %{ $channels{$_}{''} }).")"); + next if (/^_default$/); + + my $str = sprintf("%s (%d)", $_, scalar(keys %{ $channels{$_}{''} })); + push(@array, $str); } - &pSReply($reply.": ".join(' ', @array)); + &pSReply($reply.": ".join(', ', @array)); ### total user count. foreach $chan (keys %channels) { @@ -80,7 +84,7 @@ sub chaninfo { push(@nicks, $_); } } - &DEBUG("nicks => '".scalar(@nicks)."'..."); + if (scalar @nicks != $uucount) { &DEBUG("nicks != uucount..."); } @@ -160,7 +164,8 @@ sub chaninfo { $new{$_} = $userstats{$_}{'Count'}; } - my($count) = (sort { $a <=> $b } keys %new)[0]; + # todo: show top 3 with percentages? + my($count) = (sort { $new{$a} <=> $new{$b} } keys %new)[0]; if ($count) { $reply .= ". \002$count\002 has said the most with a total of \002$new{$count}\002 messages"; } @@ -219,8 +224,8 @@ sub factstats { sub karma { my $target = lc( shift || $who ); - my $karma = &dbGet("stats", "counter", "nick=". - &dbQuote($target)." AND type='karma'") || 0; + my $karma = &sqlSelect("stats", "counter", + { nick => $target, type => "karma" }) || 0; if ($karma != 0) { &pSReply("$target has karma of $karma"); @@ -232,7 +237,7 @@ sub karma { sub ispell { my $query = shift; - if (! -x "/usr/bin/spell") { + if (! -x "/usr/bin/ispell") { &msg($who, "no binary found."); return; } @@ -262,6 +267,9 @@ sub ispell { } elsif (/^\+/) { &DEBUG("spell: '+' found => '$_'."); last; + } elsif (/^# (.*?) 0$/) { + # none found. + last; } else { &DEBUG("spell: unknown: '$_'."); } @@ -322,7 +330,7 @@ sub tell { $target = $talkchannel if ($target =~ /^us$/i); $target = $who if ($target =~ /^(me|myself)$/i); - &status("tell: target = $target, query = $query"); + &status("tell: target = $target, query = $query"); # "intrusive". # if ($target !~ /^$mask{chan}$/ and !&IsNickInAnyChan($target)) { @@ -344,7 +352,7 @@ sub tell { $who = $oldwho; # no such factoid. - if ($result =~ /^0?$/) { + if (!defined $result || $result =~ /^0?$/) { $who = $target; $msgType = "private"; @@ -392,6 +400,11 @@ sub DNS { my $pid; $dns =~ s/^\s+|\s+$//g; + if (!defined $dns or $dns =~ /^\s*$/ or $dns =~ / /) { + &help("dns"); + return; + } + if ($dns =~ /(\d+\.\d+\.\d+\.\d+)/) { $match = $1; &status("DNS query by IP address: $match"); @@ -403,7 +416,7 @@ sub DNS { $result = $match." is ".$x unless ($x =~ /^\s*$/); } else { $result = "I can't seem to find that address in DNS"; - } + } } else { @@ -435,7 +448,7 @@ sub countryStats { return; } - &rawout("WHO $chan"); + $conn->who($chan); $cache{countryStats}{chan} = $chan; $cache{countryStats}{mtype} = $msgType; $cache{countryStats}{who} = $who; @@ -603,6 +616,17 @@ sub userCommands { return; } + # reload. + if ($message =~ /^reload$/i) { + return unless (&hasFlag("n")); + + &status("USER reload $who"); + &pSReply("reloading..."); + my $modules = &reloadAllModules(); + &pSReply("reloaded:$modules"); + return; + } + # redir. if ($message =~ /^redir(\s+(.*))?/i) { return unless (&hasFlag("o")); @@ -693,19 +717,28 @@ sub userCommands { my $raw_perc2 = $cpu_usage2*100/$time; my $perc; my $perc2; + my $total; + my $ratio; if ($raw_perc > 1) { $perc = sprintf("%.01f", $raw_perc); $perc2 = sprintf("%.01f", $raw_perc2); + $total = sprintf("%.01f", $raw_perc+$raw_perc2); } elsif ($raw_perc > 0.1) { $perc = sprintf("%.02f", $raw_perc); $perc2 = sprintf("%.02f", $raw_perc2); + $total = sprintf("%.02f", $raw_perc+$raw_perc2); } else { # <=0.1 $perc = sprintf("%.03f", $raw_perc); $perc2 = sprintf("%.03f", $raw_perc2); + $total = sprintf("%.03f", $raw_perc+$raw_perc2); } + $ratio = sprintf("%.01f", 100*$perc/($perc+$perc2) ); - &pSReply("Total CPU usage: $cpu_usage s ... Percentage CPU used: $perc % (+childs: $perc2 %)"); + &pSReply("Total CPU usage: \002$cpu_usage\002 s ... ". + "Total used: \002$total\002 % ". + "(parent/child ratio: $ratio %)" + ); return; } @@ -754,16 +787,20 @@ sub userCommands { } &pSReply($reply); - + return; } # status. if ($message =~ /^statu?s$/i) { - my $startString = scalar(localtime $^T); + my $startString = scalar(gmtime $^T); my $upString = &Time2String(time() - $^T); - my $count = &countKeys("factoids"); - + my $factoids = &countKeys("factoids"); + my $forks = 0; + foreach (keys %forked) { + $forks += scalar keys %{ $forked{$_} }; + } + $forks /= 2; $count{'Commands'} = 0; foreach (keys %cmdstats) { $count{'Commands'} += $cmdstats{$_}; @@ -773,47 +810,78 @@ sub userCommands { "Since $startString, there have been". " \002$count{'Update'}\002 ". &fixPlural("modification", $count{'Update'}). - " and \002$count{'Question'}\002 ". + ", \002$count{'Question'}\002 ". &fixPlural("question",$count{'Question'}). - " and \002$count{'Dunno'}\002 ". + ", \002$count{'Dunno'}\002 ". &fixPlural("dunno",$count{'Dunno'}). - " and \002$count{'Moron'}\002 ". + ", \002$count{'Moron'}\002 ". &fixPlural("moron",$count{'Moron'}). " and \002$count{'Commands'}\002 ". &fixPlural("command",$count{'Commands'}). ". I have been awake for $upString this session, and ". - "currently reference \002$count\002 factoids. ". + "currently reference \002$factoids\002 factoids. ". "I'm using about \002$memusage\002 ". - "kB of memory." + "kB of memory. With \002$forks\002 active ". + &fixPlural("fork",$forks). + "." ); - # todo: make dbGetColNiceHash(). - my %hash = &dbGetCol("stats", "nick,counter", "type='cmdstats'". -# " ORDER BY counter DESC LIMIT 3", 1); - " ORDER BY counter DESC", 1); + return; + + my %hash = &sqlSelectColHash("stats", "nick,counter", + { type => "cmdstats" }, 1); +# ORDER won't be retained in a hash +# " ORDER BY counter DESC", 1); +if (0) { foreach (keys %hash) { - &DEBUG("cmdstats: hash{$_} => $hash{$_}"); + my $i = $_; + foreach (keys %{ $hash{$i} }) { + &DEBUG("cmdstats: $hash{$i}{$_} = $_"); + } } &DEBUG("end of cmdstats."); +} return; } # wantNick. xk++ - if ($message =~ /^wantNick$/i) { + if ($message =~ /^wantNick(\+)?$/i) { + my ($force) = ($1) ? 1 : 0; + $force = 0 unless (&IsFlag("n")); + + # cannot trust Net::IRC's nick() if ($param{'ircNick'} eq $ident) { &msg($who, "I hope you're right. I'll try anyway."); + &DEBUG("ircNick => $param{'ircNick'}"); + &DEBUG("ident => $ident"); } - if (! &IsNickInAnyChan( $param{ircNick} ) ) { + # fallback check, I guess. needed? + if (! &IsNickInAnyChan( $param{'ircNick'} ) ) { my $str = "attempting to change nick to $param{'ircNick'}"; &status($str); &msg($who, $str); - &nick($param{'ircNick'}); - } else { - &msg($who, "hrm... can't do it"); - &DEBUG("wN: nick is somewhere... should try later."); + &nick($param{ 'ircNick' }); + return; + } + + # idea from dondelecarlo :) + # todo: use cache{nickserv} + if ($param{'nickServ_pass'}) { + return if ($param{'ircNick'} eq $ident or $force == 0); + + &status("someone is using our nick; GHOSTing"); + &msg($who, "using GHOST on $param{'ircNick'}."); + &msg("NickServ", "GHOST $param{'ircNick'} $param{'nickServ_pass'}"); + + $conn->schedule(5, sub { + &status("going to change nick after GHOST."); + &nick( $param{'ircNick'} ); + } ); + + return; } return;