X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FProcess.pl;h=36cffd423054a12cfaebfdb9fb5a5c2d1da70a76;hb=e4c134bfa2fedc5ce6699651c0af3cb468de4534;hp=dd3d80ca81ca144ee8f184309d59e191ddc10d74;hpb=34a4d11667b0a734343f82d2adbaac23f738ad18;p=infobot.git diff --git a/src/Process.pl b/src/Process.pl index dd3d80c..36cffd4 100644 --- a/src/Process.pl +++ b/src/Process.pl @@ -6,7 +6,13 @@ # process the incoming message # -if (&IsParam("useStrict")) { use strict; } +use strict; + +use vars qw($who $msgType $addressed $message $ident $user $host $chan + $learnok $talkok $force_public_reply $noreply $addrchar + $literal $addressedother $userHandle $lobotomized); +use vars qw(%channels %users %param %cache %chanconf %mask %orig %lang + ); sub process { $learnok = 0; # Able to learn? @@ -18,10 +24,23 @@ sub process { return 'addressedother set' if ($addressedother); $talkok = ($param{'addressing'} =~ /^OPTIONAL$/i or $addressed); - $learnok = ($param{'learn'} =~ /^HUNGRY$/i or $addressed); + $learnok = 1 if ($addressed); + if ($param{'learn'} =~ /^HUNGRY$/i) { + $learnok = 1; + $addrchar = 1; + $talkok = 1; + } &shmFlush(); # hack. + # hack to support channel +o as "+o" in bot user file. + # requires +O in user file. + # is $who arg lowercase? + if (exists $channels{$chan}{o}{ $orig{who} } && &IsFlag("O") eq "O") { + &status("Gave $who/$chan +o (+O)\'ness"); + $users{$userHandle}{FLAGS} .= "o"; + } + # check if we have our head intact. if ($lobotomized) { if ($addressed and IsFlag("o") eq "o") { @@ -29,7 +48,7 @@ sub process { &msg($who, "give me an unlobotomy.") if ($delta_time > 60*60); $cache{lobotomy}{$who} = time(); } - return 'LOBOTOMY'; + return 'LOBOTOMY' unless IsFlag("A"); } # talkMethod. @@ -46,32 +65,34 @@ sub process { if ($message =~ /^join(\s+(.*))?\s*$/i) { return 'join: not addr' unless ($addressed); - $2 =~ /^($mask{chan})(,(\S+))?/; - my($thischan, $key) = (lc $1, $3); - my $chankey = lc $thischan; - $chankey .= " $key" if (defined $key); + $2 =~ /^($mask{chan})(\s+(\S+))?/; + my($joinchan, $key) = (lc $1, $3); - if ($thischan eq "") { + if ($joinchan eq "") { &help("join"); return; } + if ($joinchan !~ /^$mask{chan}$/) { + &msg($who, "$joinchan is not a valid channel name."); + return; + } + if (&IsFlag("o") ne "o") { - if (!exists $chanconf{$thischan}) { - &msg($who, "I am not allowed to join $thischan."); + if (!exists $chanconf{$joinchan}) { + &msg($who, "I am not allowed to join $joinchan."); return; } - if (&validChan($thischan)) { - &msg($who,"warn: I'm already on $thischan, joining anyway..."); -# return; + if (&validChan($joinchan)) { + &msg($who,"warn: I'm already on $joinchan, joining anyway..."); } } - $cache{join}{$thischan} = $who; # used for on_join self. + $cache{join}{$joinchan} = $who; # used for on_join self. - &joinchan($chankey); - &status("JOIN $chankey <$who>"); - &msg($who, "joining $chankey"); + &status("JOIN $joinchan $key <$who>"); + &msg($who, "joining $joinchan $key"); + &joinchan($joinchan, $key); &joinNextChan(); # hack. return; @@ -83,7 +104,7 @@ sub process { my @array = split / /, $message; if ($who =~ /^_default$/i) { - &pSReply("you are too eleet."); + &performStrictReply("you are too eleet."); return; } @@ -95,25 +116,25 @@ sub process { my $do_nick = $array[1] || $who; if (!exists $users{$do_nick}) { - &pSReply("nick $do_nick is not in user list."); + &performStrictReply("nick $do_nick is not in user list."); return; } my $crypt = $users{$do_nick}{PASS}; if (!defined $crypt) { - &pSReply("user $do_nick has no passwd set."); + &performStrictReply("user $do_nick has no passwd set."); return; } if (!&ckpasswd($array[0], $crypt)) { - &pSReply("invalid passwd for $do_nick."); + &performStrictReply("invalid passwd for $do_nick."); return; } - my $mask = "*!$user@".&makeHostMask($host); + my $mask = "$who!$user@".&makeHostMask($host); ### TODO: prevent adding multiple dupe masks? ### TODO: make &addHostMask() CMD? - &pSReply("Added $mask for $do_nick..."); + &performStrictReply("Added $mask for $do_nick..."); $users{$do_nick}{HOSTS}{$mask} = 1; return; @@ -125,7 +146,7 @@ sub process { my @array = split ' ', $message; if ($who =~ /^_default$/i) { - &pSReply("you are too eleet."); + &performStrictReply("you are too eleet."); return; } @@ -134,7 +155,7 @@ sub process { return; } - # todo: use &getUser()? + # TODO: use &getUser()? my $first = 1; foreach (keys %users) { if ($users{$_}{FLAGS} =~ /n/) { @@ -144,18 +165,18 @@ sub process { } if (!exists $users{$who} and !$first) { - &pSReply("nick $who is not in user list."); + &performStrictReply("nick $who is not in user list."); return; } if ($first) { - &pSReply("First time user... adding you as Master."); - $users{$who}{FLAGS} = "mrsteon"; + &performStrictReply("First time user... adding you as Master."); + $users{$who}{FLAGS} = "aemnorst"; } my $crypt = $users{$who}{PASS}; if (defined $crypt) { - &pSReply("user $who already has pass set."); + &performStrictReply("user $who already has pass set."); return; } @@ -166,13 +187,13 @@ sub process { if (!scalar keys %{ $users{$who}{HOSTS} }) { my $mask = "*!$user@".&makeHostMask($host); - &pSReply("Added hostmask '\002$mask\002' to $who"); + &performStrictReply("Added hostmask '\002$mask\002' to $who"); $users{$who}{HOSTS}{$mask} = 1; } $crypt = &mkcrypt($array[0]); $users{$who}{PASS} = $crypt; - &pSReply("new pass for $who, crypt $crypt."); + &performStrictReply("new pass for $who, crypt $crypt."); return; } @@ -182,6 +203,8 @@ sub process { my $found = 0; foreach (keys %channels) { + # don't test for $channel{_default} elsewhere !!! + next if (/^\s*$/ || /^_?default$/); next unless (&IsNickInChan($who,$_)); $found++; @@ -206,7 +229,7 @@ sub process { # User Processing, for all users. if ($addressed) { my $retval; - return 'returned from pCH' if &parseCmdHook("main",$message); + return 'SOMETHING parseCmdHook' if &parseCmdHook($message); $retval = &userCommands(); return unless (defined $retval); @@ -240,16 +263,14 @@ sub process { # customized random message. my $tmp = (rand() < 0.5) ? ", $who" : ""; - &performStrictReply(&getRandom(keys %{ $lang{'hello'} }) . $tmp); + &performStrictReply( &getRandom(keys %{ $lang{'hello'} }) . $tmp ); return; } # greetings. if ($message =~ /how (the hell )?are (ya|you)( doin\'?g?)?\?*$/) { - my $reply = &getRandom(keys %{ $lang{'howareyou'} }); - &performReply($reply); - + &performReply(&getRandom(keys %{ $lang{'howareyou'} })); return; } @@ -259,11 +280,7 @@ sub process { { return 'praise: no addr' unless ($addressed); - &status("random praise detected"); - - my $tmp = (rand() < 0.5) ? "thanks $who " : ""; - &performStrictReply($tmp.":)"); - + &performReply(&getRandom(keys %{ $lang{'praise'} })); return; } @@ -280,33 +297,31 @@ sub process { ### # karma. set... - if ($message =~ /^(\S+)(--|\+\+)\s*$/ and $addressed) { - return '' unless (&hasParam("karma")); - - my($term,$inc) = (lc $1,$2); - - if ($msgType !~ /public/i) { - &msg($who, "karma must be done in public!"); - return; - } + if ($msgType =~ /public/i && $message =~ /^(\S+)(--|\+\+)\s*$/ && + $addressed && &IsChanConfOrWarn("karma") + ) { + # to request factoids such as "g++" or "libstdc++", append "?" to the query. + my ($term,$inc) = (lc $1,$2); if (lc $term eq lc $who) { &msg($who, "please don't karma yourself"); return; } - my $karma = &dbGet("stats", "counter", "nick=".&dbQuote($term). - " AND type='karma'") || 0; + my $karma = &sqlSelect("stats", "counter", + { nick => $term, type => "karma" }) || 0; if ($inc eq '++') { $karma++; } else { $karma--; } - &dbSet("stats", - { nick => $term, type => "karma" }, - { counter => $karma } - ); + &sqlReplace("stats", { + nick => $term, + type => "karma", + 'time' => time(), + counter => $karma, + } ); return; } @@ -314,22 +329,27 @@ sub process { # here's where the external routines get called. # if they return anything but null, that's the "answer". if ($addressed) { - if ( &parseCmdHook("extra",$message) ) { - return 'DID SOMETHING IN PCH.'; - } - my $er = &Modules(); if (!defined $er) { return 'SOMETHING 1'; } + # allow administration of bot via messages (default is DCC CHAT only) + if (&IsFlag("A")) { + &loadMyModule('UserDCC'); + $er = &userDCC(); + if (!defined $er) { + return 'SOMETHING 2'; + } + } + if (0 and $addrchar) { &msg($who, "I don't trust people to use the core commands while addressing me in a short-cut way."); return; } } - if (&IsParam("factoids") and $param{'DBType'} =~ /^(mysql|pg|postgres|dbm)/i) { + if (&IsParam("factoids") and $param{'DBType'} =~ /^(mysql|sqlite(2)?|pgsql)$/i) { &FactoidStuff(); } elsif ($param{'DBType'} =~ /^none$/i) { return "NO FACTOIDS.";