From baf19a959699167aa64e4733c9e5cd16d590e600 Mon Sep 17 00:00:00 2001 From: dms Date: Tue, 15 May 2001 12:34:49 +0000 Subject: [PATCH] - I broke maths when I tried to fix "999!" - fixed :-) - removed IsNickInAnyChan() for 'tell'. - CTCP VERSION now returns correct version (cvs or release) - don't use eval for factoid arguments since "next" cannot be done. - prevent endless while loop for factoid arguments - on_join: run netsplitCheck/chanlimitCheck if !%netsplit - on_quit: run fe on possible chans to remove limits. enough? - minor changes to logging output text - fixed "news #CHAN latest" - news: changed notice() to msg() to see if OPN reacts nicely. git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk/blootbot@487 c11ca15a-4712-0410-83d8-924469b57eb5 --- src/Factoids/Question.pl | 16 +++---- src/Factoids/Update.pl | 15 ++++++- src/IRC/IrcHooks.pl | 21 ++++++++-- src/IRC/Schedulers.pl | 23 ++++++---- src/Modules/Math.pl | 4 +- src/Modules/News.pl | 90 +++++++++++++++++++++------------------- src/Process.pl | 4 +- src/UserExtra.pl | 5 +-- src/core.pl | 10 ++++- src/db_mysql.pl | 1 + 10 files changed, 118 insertions(+), 71 deletions(-) diff --git a/src/Factoids/Question.pl b/src/Factoids/Question.pl index bd1d47a..62feedf 100644 --- a/src/Factoids/Question.pl +++ b/src/Factoids/Question.pl @@ -95,8 +95,14 @@ sub doQuestion { my @vals; my $arg = $_; - eval { - next unless ($query[0] =~ /^$arg$/i); + # todo: make eval work with $$i's :( +# next unless (eval { $query[0] =~ /^$arg$/i }); + next unless ($query[0] =~ /^$arg$/i); + + if ($@) { # it failed!!! + &WARN("factargs: regex failed! '$query[0]' =~ /^$_\$/"); + next; + } for ($i=1; $i<=5; $i++) { $val = $$i; @@ -104,12 +110,8 @@ sub doQuestion { push(@vals, $val); } - }; +# }; - if ($@) { # it failed!!! - &WARN("factargs: regex failed! '$query[0]' =~ /^$_\$/"); - next; - } &status("Question: factoid Arguments for '$query[0]'"); # todo: use getReply() - need to modify it :( diff --git a/src/Factoids/Update.pl b/src/Factoids/Update.pl index ff69ad9..5fa7c4e 100644 --- a/src/Factoids/Update.pl +++ b/src/Factoids/Update.pl @@ -62,15 +62,28 @@ sub update { } } + # factoid arguments handler. if (&IsChanConf("factoidArguments") and $lhs =~ /\$/) { &status("Update: Factoid Arguments found."); &status("Update: orig lhs => '$lhs'."); &status("Update: orig rhs => '$rhs'."); - $lhs =~ s/^/CMD: /; + my @list; + my $count = 0; + $lhs =~ s/^/CMD: /; while ($lhs =~ s/\$(\S+)/(.*?)/) { push(@list, "\$$1"); + $count++; + last if ($count >= 10); } + + if ($count >= 10) { + &msg($who, "error: could not SAR properly."); + &DEBUG("error: lhs => '$lhs'."); + &DEBUG("error: rhs => '$rhs'."); + return; + } + my $z = join(',',@list); $rhs =~ s/^/($z): /; diff --git a/src/IRC/IrcHooks.pl b/src/IRC/IrcHooks.pl index ade6da1..e90d267 100644 --- a/src/IRC/IrcHooks.pl +++ b/src/IRC/IrcHooks.pl @@ -433,7 +433,12 @@ sub on_join { if (exists $netsplit{lc $who}) { delete $netsplit{lc $who}; $netsplit = 1; - &netsplitCheck() if (time() != $sched{netsplitCheck}{TIME}); + if (!scalar keys %netsplit) { + &DEBUG("on_join: netsplit hash is now empty!"); + undef %netsplitservers; + &netsplitCheck(); # any point in running this? + &chanlimitCheck(); + } } if ($netsplit and !exists $cache{netsplit}) { @@ -835,9 +840,17 @@ sub on_quit { $reason = "NETSPLIT: $1 <=> $2"; # chanlimit code. - if (&ChanConfList("chanlimitcheck") and !scalar keys %netsplit) { - &DEBUG("on_quit: netsplit detected on $chan; disabling chan limit."); - &rawout("MODE $chan -l"); + if (!scalar keys %netsplit) { + my @l = &getNickInChans($nick); + &DEBUG("on_quit: l => ".scalar(@l) ); + + foreach ( &getNickInChans($nick) ) { + next unless ( &IsChanConf("chanlimitcheck") ); + next unless ( exists $channels{$_}{'l'} ); + + &status("on_quit: netsplit detected on $_; disabling chan limit."); + &rawout("MODE $_ -l"); + } } $netsplit{lc $nick} = time(); diff --git a/src/IRC/Schedulers.pl b/src/IRC/Schedulers.pl index 30ef450..403e318 100644 --- a/src/IRC/Schedulers.pl +++ b/src/IRC/Schedulers.pl @@ -347,9 +347,8 @@ sub newsFlush { } if ($delete or $duser) { - &DEBUG("newsF: Writing news."); &News::writeNews(); - &status("NEWS (newsflush) deleted: $delete news entries; $duser user cache."); + &status("NewsFlush: deleted: $delete news entries; $duser user cache."); } } @@ -428,14 +427,17 @@ sub netsplitCheck { $cache{'netsplitCache'}++; &DEBUG("running netsplitCheck... $cache{netsplitCache}"); + if (!scalar %netsplit and scalar %netsplitservers) { + &DEBUG("nsc: FIRST!!! ok hash netsplit is NULL; purging hash netsplitservers"); + undef %netsplitservers; + } + foreach $s1 (keys %netsplitservers) { - &DEBUG("nsC: s1 => $s1"); foreach $s2 (keys %{ $netsplitservers{$s1} }) { my $delta = time() - $netsplitservers{$s1}{$s2}; - &DEBUG("nss{$s1}{$s2} = $delta"); - if (time() - $netsplitservers{$s1}{$s2} > 3600) { + if ($delta > 3600) { &status("netsplit between $s1 and $s2 appears to be stale."); delete $netsplitservers{$s1}{$s2}; &chanlimitCheck(); @@ -448,23 +450,26 @@ sub netsplitCheck { # %netsplit hash checker. my $count = scalar keys %netsplit; + my(@delete); foreach (keys %netsplit) { if (&IsNickInAnyChan($_)) { &DEBUG("netsplitC: $_ is in some chan; removing from netsplit list."); delete $netsplit{$_}; next; } - next unless (time() - $netsplit{$_} > 60*10); + # todo: change time value? + next unless (time() - $netsplit{$_} > 60*30); - &DEBUG("netsplitC: $_ didn't come back from netsplit; removing from netsplit list."); + push(@delete, $_); delete $netsplit{$_}; } + &DEBUG("removed from netsplit list (".scalar(@delete)."): @delete") if (@delete); &DEBUG("nsC: netsplitservers: ".scalar(keys %netsplitservers) ); &DEBUG("nsC: netsplit: ".scalar(keys %netsplit) ); if (!scalar %netsplit and scalar %netsplitservers) { - &DEBUG("ok hash netsplit is NULL; purging hash netsplitservers"); + &DEBUG("nsc: ok hash netsplit is NULL; purging hash netsplitservers"); undef %netsplitservers; } @@ -583,7 +588,7 @@ sub seenFlush { &DEBUG("seenFlush: NO VALID FACTOID SUPPORT?"); } - &status("Flushed $flushed seen entries.") if ($flushed); + &status("Seen: Flushed $flushed entries.") if ($flushed); &VERB(sprintf(" new seen: %03.01f%% (%d/%d)", $stats{'new'}*100/($stats{'count_old'} || 1), $stats{'new'}, ( $stats{'count_old'} || 1) ), 2) if ($stats{'new'}); diff --git a/src/Modules/Math.pl b/src/Modules/Math.pl index bf1b41a..c5a1f6b 100644 --- a/src/Modules/Math.pl +++ b/src/Modules/Math.pl @@ -125,9 +125,11 @@ sub perlMath { $locMsg = ""; } - if (defined $logMsg and $locMsg ne $message) { + if (defined $locMsg and $locMsg ne $message) { + # success. return $locMsg; } else { + # no match. return ''; } } diff --git a/src/Modules/News.pl b/src/Modules/News.pl index dbe7cf0..9c4214e 100644 --- a/src/Modules/News.pl +++ b/src/Modules/News.pl @@ -23,7 +23,7 @@ sub Parse { if (!keys %::news) { if (!exists $::cache{newsFirst}) { - &::DEBUG("looks like we enabled news option just then; loading up news file just in case."); + &::DEBUG("news: looks like we enabled news option just then; loading up news file just in case."); $::cache{newsFirst} = 1; } @@ -58,7 +58,7 @@ sub Parse { } $chan = $chans[0]; - &::VERB("Guessed $::who being on chan $chan",2); + &::DEBUG("Guessed $::who being on chan $chan",2); $::chan = $chan; # hack for IsChanConf(). } @@ -114,7 +114,7 @@ sub Parse { # todo: don't notify even if "news" is called. if (!&::IsChanConf("newsNotifyAll")) { - &::DEBUG("chan => $chan, ::chan => $::chan."); + &::DEBUG("news: chan => $chan, ::chan => $::chan."); &::notice($::who, "not available for this channel or disabled altogether."); return; } @@ -139,7 +139,7 @@ sub Parse { } } else { - &::DEBUG("could not parse '$what'"); + &::DEBUG("news: could not parse '$what'"); &::notice($::who, "unknown command: $what"); } } @@ -166,7 +166,7 @@ sub readNews { if (/^[\s\t]+(\S+):[\s\t]+(.*)$/) { if (!defined $item) { - &::DEBUG("!defined item, never happen!"); + &::DEBUG("news: !defined item, never happen!"); next; } @@ -333,7 +333,7 @@ sub del { } $what = $found[0]; - &::DEBUG("del: str: guessed what => $what"); + &::DEBUG("news: del: str: guessed what => $what"); } } @@ -365,26 +365,27 @@ sub list { my $x = $::newsuser{$chan}{$::who}; if (defined $x and ($x == 0 or $x == -1)) { - &::DEBUG("not updating time for $::who."); + &::DEBUG("news: not updating time for $::who."); } else { if (!scalar keys %{ $::news{$chan} }) { - &DEBUG("news: should not add $chan/$::who to cache!"); + &::DEBUG("news: should not add $chan/$::who to cache!"); } $::newsuser{$chan}{$::who} = time(); } } + # ¬ice() breaks OPN :( - using msg() instead! my $count = scalar keys %{ $::news{$chan} }; - &::notice($::who, "|==== News for \002$chan\002: ($count items)"); + &::msg($::who, "|==== News for \002$chan\002: ($count items)"); my $newest = 0; foreach (keys %{ $::news{$chan} }) { my $t = $::news{$chan}{$_}{Time}; $newest = $t if ($t > $newest); } my $timestr = &::Time2String(time() - $newest); - &::notice($::who, "|= Last updated $timestr ago."); - &::notice($::who, " \037Num\037 \037Item ".(" "x40)." \037"); + &::msg($::who, "|= Last updated $timestr ago."); + &::msg($::who, " \037Num\037 \037Item ".(" "x40)." \037"); my $i = 1; foreach ( &getNewsAll() ) { @@ -392,18 +393,18 @@ sub list { my $setby = $::news{$chan}{$subtopic}{Author}; if (!defined $subtopic) { - &::DEBUG("warn: subtopic == undef."); + &::DEBUG("news: warn: subtopic == undef."); next; } # todo: show request stats aswell. - &::notice($::who, sprintf("\002[\002%2d\002]\002 %s", + &::msg($::who, sprintf("\002[\002%2d\002]\002 %s", $i, $subtopic)); $i++; } - &::notice($::who, "|= End of News."); - &::notice($::who, "use 'news read <#>' or 'news read '"); + &::msg($::who, "|= End of News."); + &::msg($::who, "use 'news read <#>' or 'news read '"); } sub read { @@ -479,7 +480,7 @@ sub mod { my $news = &getNewsItem($item); if (!defined $news) { - &::DEBUG("error: mod: news == undefined."); + &::DEBUG("news: error: mod: news == undefined."); return; } my $nnews = $::news{$chan}{$news}{Text}; @@ -550,14 +551,14 @@ sub set { $args =~ /^(\S+)\s+(\S+)\s+(.*)$/; my($item, $what, $value) = ($1,$2,$3); - &::DEBUG("set called."); + &::DEBUG("news: set called."); if ($item eq "") { &::help("news set"); return; } - &::DEBUG("item => '$item'."); + &::DEBUG("news: set: item => '$item'."); my $news = &getNewsItem($item); if (!defined $news) { @@ -567,7 +568,7 @@ sub set { # list all values for chan. if (!defined $what) { - &::DEBUG("set: 1"); + &::DEBUG("news: set: 1"); return; } @@ -587,7 +588,7 @@ sub set { # show (read) what. if (!defined $value) { - &::DEBUG("set: 2"); + &::DEBUG("news: set: 2"); return; } @@ -623,21 +624,21 @@ sub set { } if (!$time or ($value and $value !~ /^never$/i)) { - &::DEBUG("set: Expire... need to parse."); + &::DEBUG("news: set: Expire... need to parse."); return; } if ($time == -1) { &::notice($::who, "Set never expire for \002$item\002." ); } elsif ($time < -1) { - &::DEBUG("time should never be negative ($time)."); + &::DEBUG("news: time should never be negative ($time)."); return; } else { &::notice($::who, "Set expire for \002$item\002, to ". localtime($time) ." [".&::Time2String($time - time())."]" ); if (time() > $time) { - &::DEBUG("hrm... time() > $time, should expire."); + &::DEBUG("news: hrm... time() > $time, should expire."); } } @@ -648,12 +649,12 @@ sub set { } my $auth = 0; - &::DEBUG("who => '$::who'"); + &::DEBUG("news: who => '$::who'"); my $author = $::news{$chan}{$news}{Author}; $auth++ if ($::who eq $author); $auth++ if (&::IsFlag("o")); if (!defined $author) { - &::DEBUG("news{$chan}{$news}{Author} is not defined! auth'd anyway"); + &::DEBUG("news: news{$chan}{$news}{Author} is not defined! auth'd anyway"); $::news{$chan}{$news}{Author} = $::who; $author = $::who; $auth++; @@ -668,7 +669,7 @@ sub set { # todo: clean this up. my $old = $::news{$chan}{$news}{$what}; if (defined $old) { - &::DEBUG("old => $old."); + &::DEBUG("news: old => $old."); } $::news{$chan}{$news}{$what} = $value; &::notice($::who, "Setting [$chan]/{$news}/<$what> to '$value'."); @@ -680,7 +681,8 @@ sub latest { $chan ||= $tchan; # hack hack hack. # todo: if chan = undefined, guess. - if (!exists $::news{$chan}) { +# if (!exists $::news{$chan}) { + if (!exists $::channels{$chan}) { &::notice($::who, "invalid chan $chan") if ($flag); return; } @@ -690,19 +692,20 @@ sub latest { if ($flag) { &::notice($::who, "if you want to read news, try /msg $::ident news or /msg $::ident news notify"); } else { - &::DEBUG("not displaying any new news for $::who"); + &::DEBUG("news: not displaying any new news for $::who"); return; } } + $::chan = $chan; my $x = &::IsChanConf("newsNotifyAll"); if (&::IsChanConf("newsNotifyAll") and !defined $t) { $t = 1; } if (!defined $t) { - &::DEBUG("something went really wrong."); - &::DEBUG("chan => $chan, ::chan => $::chan"); + &::DEBUG("news: something went really wrong."); + &::DEBUG("news: chan => $chan, ::chan => $::chan"); &::notice($::who, "something went really wrong."); return; } @@ -775,7 +778,7 @@ sub latest { # lame hack to prevent dupes if we just ignore it. my $x = $::newsuser{$chan}{$::who}; if (defined $x and ($x == 0 or $x == -1)) { - &::DEBUG("not updating time for $::who. (2)"); + &::DEBUG("news: not updating time for $::who. (2)"); } else { $::newsuser{$chan}{$::who} = time(); } @@ -811,7 +814,7 @@ sub newsS2N { my $t = $::news{$chan}{$_}{Time}; if (!defined $t or $t !~ /^\d+$/) { - &::DEBUG("warn: t is undefined for news{$chan}{$_}{Time}; removing item."); + &::DEBUG("news: warn: t is undefined for news{$chan}{$_}{Time}; removing item."); delete $::news{$chan}{$_}; next; } @@ -836,7 +839,7 @@ sub getNewsItem { my $t = $::news{$chan}{$_}{Time}; if (!defined $t or $t !~ /^\d+$/) { - &::DEBUG("warn: t is undefined for news{$chan}{$_}{Time}; removing item."); + &::DEBUG("news: warn: t is undefined for news{$chan}{$_}{Time}; removing item."); delete $::news{$chan}{$_}; next; } @@ -869,21 +872,21 @@ sub getNewsItem { } if (defined $no and !@items) { - &::DEBUG("string->number resolution: $what->$no."); + &::DEBUG("news: string->number resolution: $what->$no."); return $no; } if (scalar @items > 1) { - &::DEBUG("Multiple matches, not guessing."); + &::DEBUG("news: Multiple matches, not guessing."); &::notice($::who, "Multiple matches, not guessing."); return; } if (@items) { - &::DEBUG("gNI: part_string->full_string: $what->$items[0]"); + &::DEBUG("news: gNI: part_string->full_string: $what->$items[0]"); return $items[0]; } else { - &::DEBUG("gNI: No match for '$what'"); + &::DEBUG("news: gNI: No match for '$what'"); return; } } @@ -896,20 +899,21 @@ sub do_set { my($what,$value) = @_; if (!defined $chan) { - &::DEBUG("do_set: chan not defined."); + &::DEBUG("news: do_set: chan not defined."); return; } if (!defined $what or $what =~ /^\s*$/) { - &::DEBUG("what $what is not defined."); + &::DEBUG("news: what $what is not defined."); return; } + if (!defined $value or $value =~ /^\s*$/) { - &::DEBUG("value $value is not defined."); + &::DEBUG("news: value $value is not defined."); return; } - &::DEBUG("do_set: TODO..."); + &::DEBUG("news: do_set: TODO..."); } sub stats { @@ -940,8 +944,8 @@ sub stats { $j++; } &::DEBUG("news: stats: average latest time read: total time: $i"); - &::DEBUG("... count: $j"); - &::DEBUG(" average: ".sprintf("%.02f", $i/($j||1))." sec/user"); + &::DEBUG("news: ... count: $j"); + &::DEBUG("news: average: ".sprintf("%.02f", $i/($j||1))." sec/user"); $i = $j = 0; } diff --git a/src/Process.pl b/src/Process.pl index 8595bf4..f35b41d 100644 --- a/src/Process.pl +++ b/src/Process.pl @@ -674,8 +674,10 @@ sub FactoidStuff { if (length $message > 64) { &status("unparseable-moron: $message"); - &performReply( &getRandom(keys %{ $lang{'moron'} }) ); +# &performReply( &getRandom(keys %{ $lang{'moron'} }) ); $count{'Moron'}++; + + &performReply("You are moron #".$count{'Moron'}."!"); return; } diff --git a/src/UserExtra.pl b/src/UserExtra.pl index 2fd29f9..46436ca 100644 --- a/src/UserExtra.pl +++ b/src/UserExtra.pl @@ -324,13 +324,12 @@ sub tell { &status("tell: target = $target, query = $query"); # "intrusive". - if ($target !~ /^$mask{chan}$/ and !&IsNickInAnyChan($target)) { +# if ($target !~ /^$mask{chan}$/ and !&IsNickInAnyChan($target)) { + if ($target !~ /^$mask{chan}$/) { &msg($who, "No, $target is not in any of my chans."); return; } - ### TODO: don't "tell" if sender is not in target's channel. - # self. if ($target eq $ident) { # lc? &msg($who, "Isn't that a bit silly?"); diff --git a/src/core.pl b/src/core.pl index 9111514..de587d5 100644 --- a/src/core.pl +++ b/src/core.pl @@ -10,7 +10,7 @@ use strict; # dynamic scalar. MUST BE REDUCED IN SIZE!!! ### TODO: reorder. use vars qw( - $answer $correction_plausible $talkchannel + $answer $correction_plausible $talkchannel $bot_release $statcount $memusage $user $memusageOld $bot_version $dbh $shm $host $msg $bot_misc_dir $bot_pid $bot_base_dir $noreply $bot_src_dir $conn $irc $learnok $nick $ident $no_syscall @@ -67,7 +67,13 @@ $nottime = 0; $notsize = 0; $notcount = $notsleep = 0; ### -$bot_version = "blootbot cvs (20010214) -- $^O"; +if ( -d "CVS" ) { + use POSIX qw(strftime); + $bot_release = strftime("cvs (%Y%m%d)", localtime( (stat("CVS"))[9] ) ); +} else { + $bot_release = "1.0.10 (2001xxxx)"; +} +$bot_version = "blootbot $bot_release -- $^O"; $noreply = "NOREPLY"; ########## diff --git a/src/db_mysql.pl b/src/db_mysql.pl index eaeb9cd..c51ef20 100644 --- a/src/db_mysql.pl +++ b/src/db_mysql.pl @@ -18,6 +18,7 @@ sub openDB { &status("Opened MySQL connection to $param{'SQLHost'}"); } else { &ERROR("cannot connect to $param{'SQLHost'}."); + &ERROR("since mysql is not available, shutting down bot!"); &shutdown(); &closePID(); exit 1; -- 2.39.5