From 0d29a742991e39f893f00582ece8a7531915f200 Mon Sep 17 00:00:00 2001 From: timriker Date: Sun, 28 Mar 2004 02:01:18 +0000 Subject: [PATCH] ircCheck handles multiple connects better git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk@933 c11ca15a-4712-0410-83d8-924469b57eb5 --- blootbot/src/IRC/Irc.pl | 145 +++++++++++++++------------------ blootbot/src/IRC/Schedulers.pl | 57 +++++++------ 2 files changed, 95 insertions(+), 107 deletions(-) diff --git a/blootbot/src/IRC/Irc.pl b/blootbot/src/IRC/Irc.pl index 5baabaf..7931aaa 100644 --- a/blootbot/src/IRC/Irc.pl +++ b/blootbot/src/IRC/Irc.pl @@ -8,7 +8,7 @@ use strict; no strict 'refs'; -use vars qw(%floodjoin %nuh %dcc %cache %channels %param %mask +use vars qw(%floodjoin %nuh %dcc %cache %conns %channels %param %mask %chanconf %orig %ircPort %ircstats %last %netsplit); use vars qw($irc $nickserv $ident $conn $msgType $who $talkchannel $addressed); @@ -67,11 +67,15 @@ loop:; sub irc { my ($server,$port) = @_; + $irc = new Net::IRC; + + # TODO: move all this to an sql table my $iaddr = inet_aton($server); my $paddr = sockaddr_in($port, $iaddr); my $proto = getprotobyname('tcp'); - select STDOUT; + # why was this here? + #select STDOUT; # host->ip. my $resolve; @@ -87,9 +91,6 @@ sub irc { ### warning in Sys/Hostname line 78??? ### caused inside Net::IRC? } - &status("Connecting to port $port of server $server ($resolve) as $param{'ircNick'} ..."); - - $irc = new Net::IRC; my %args = ( Nick => $param{'ircNick'}, @@ -100,33 +101,65 @@ sub irc { $args{'LocalAddr'} = $param{'ircHost'} if ($param{'ircHost'}); $args{'Password'} = $param{'ircPasswd'} if ($param{'ircPasswd'}); - my $conn = $irc->newconn(%args); - - if (!defined $conn) { - &ERROR("IRC: connection failed."); - &ERROR("add \"set ircHost 0.0.0.0\" to your config. If that does not work"); - &ERROR("Please check /etc/hosts to see if you have a localhost line like:"); - &ERROR("127.0.0.1 localhost localhost"); - &ERROR("If this is still a problem, please contact the maintainer."); - return 1; - } - $conn->maxlinelen($maxlinelen); - - if ($param{'ircNick2'}) { - # prep for real multiple nick/server connects - # FIXME: all code should get nick/server out of self, not config - &status("Connecting to port $port of server $server ($resolve) as $param{'ircNick2'} ..."); - $args{'Nick'} = $param{'ircNick2'}; - my $conn = $irc->newconn(%args); - $conn->maxlinelen($maxlinelen); - } - - if ($param{'ircNick3'}) { - # prep for real multiple nick/server connects - # FIXME: all code should get nick/server out of self, not config - $args{'Nick'} = $param{'ircNick3'}; - my $conn = $irc->newconn(%args); - $conn->maxlinelen($maxlinelen); + foreach my $mynick (split ',', $param{'ircNick'}) { + &DEBUG("got $mynick"); + &status("Connecting to port $port of server $server ($resolve) as $mynick ..."); + $args{'Nick'} = $mynick; + $conns{$mynick} = $irc->newconn(%args); + if (!defined $conns{$mynick}) { + &ERROR("IRC: connection failed."); + &ERROR("add \"set ircHost 0.0.0.0\" to your config. If that does not work"); + &ERROR("Please check /etc/hosts to see if you have a localhost line like:"); + &ERROR("127.0.0.1 localhost localhost"); + &ERROR("If this is still a problem, please contact the maintainer."); + } + $conns{$mynick}->maxlinelen($maxlinelen); + # handler stuff. + $conns{$mynick}->add_global_handler('caction', \&on_action); + $conns{$mynick}->add_global_handler('cdcc', \&on_dcc); + $conns{$mynick}->add_global_handler('cping', \&on_ping); + $conns{$mynick}->add_global_handler('crping', \&on_ping_reply); + $conns{$mynick}->add_global_handler('cversion', \&on_version); + $conns{$mynick}->add_global_handler('crversion', \&on_crversion); + $conns{$mynick}->add_global_handler('dcc_open', \&on_dcc_open); + $conns{$mynick}->add_global_handler('dcc_close', \&on_dcc_close); + $conns{$mynick}->add_global_handler('chat', \&on_chat); + $conns{$mynick}->add_global_handler('msg', \&on_msg); + $conns{$mynick}->add_global_handler('public', \&on_public); + $conns{$mynick}->add_global_handler('join', \&on_join); + $conns{$mynick}->add_global_handler('part', \&on_part); + $conns{$mynick}->add_global_handler('topic', \&on_topic); + $conns{$mynick}->add_global_handler('invite', \&on_invite); + $conns{$mynick}->add_global_handler('kick', \&on_kick); + $conns{$mynick}->add_global_handler('mode', \&on_mode); + $conns{$mynick}->add_global_handler('nick', \&on_nick); + $conns{$mynick}->add_global_handler('quit', \&on_quit); + $conns{$mynick}->add_global_handler('notice', \&on_notice); + $conns{$mynick}->add_global_handler('whoischannels', \&on_whoischannels); + $conns{$mynick}->add_global_handler('useronchannel', \&on_useronchannel); + $conns{$mynick}->add_global_handler('whois', \&on_whois); + $conns{$mynick}->add_global_handler('other', \&on_other); + $conns{$mynick}->add_global_handler('disconnect', \&on_disconnect); + $conns{$mynick}->add_global_handler([251,252,253,254,255], \&on_init); +# $conns{$mynick}->add_global_handler(302, \&on_init); # userhost + $conns{$mynick}->add_global_handler(303, \&on_ison); # notify. + $conns{$mynick}->add_global_handler(315, \&on_endofwho); + $conns{$mynick}->add_global_handler(422, \&on_endofwho); # nomotd. + $conns{$mynick}->add_global_handler(324, \&on_modeis); + $conns{$mynick}->add_global_handler(333, \&on_topicinfo); + $conns{$mynick}->add_global_handler(352, \&on_who); + $conns{$mynick}->add_global_handler(353, \&on_names); + $conns{$mynick}->add_global_handler(366, \&on_endofnames); + $conns{$mynick}->add_global_handler(376, \&on_endofmotd); # on_connect. + $conns{$mynick}->add_global_handler(433, \&on_nick_taken); + $conns{$mynick}->add_global_handler(439, \&on_targettoofast); + # for proper joinnextChan behaviour + $conns{$mynick}->add_global_handler(471, \&on_chanfull); + $conns{$mynick}->add_global_handler(473, \&on_inviteonly); + $conns{$mynick}->add_global_handler(474, \&on_banned); + $conns{$mynick}->add_global_handler(475, \&on_badchankey); + $conns{$mynick}->add_global_handler(443, \&on_useronchan); + # end of handler stuff. } &clearIRCVars(); @@ -138,54 +171,6 @@ sub irc { $ircstats{'Server'} = "$server:$port"; - # handler stuff. - $conn->add_global_handler('caction', \&on_action); - $conn->add_global_handler('cdcc', \&on_dcc); - $conn->add_global_handler('cping', \&on_ping); - $conn->add_global_handler('crping', \&on_ping_reply); - $conn->add_global_handler('cversion', \&on_version); - $conn->add_global_handler('crversion', \&on_crversion); - $conn->add_global_handler('dcc_open', \&on_dcc_open); - $conn->add_global_handler('dcc_close', \&on_dcc_close); - $conn->add_global_handler('chat', \&on_chat); - $conn->add_global_handler('msg', \&on_msg); - $conn->add_global_handler('public', \&on_public); - $conn->add_global_handler('join', \&on_join); - $conn->add_global_handler('part', \&on_part); - $conn->add_global_handler('topic', \&on_topic); - $conn->add_global_handler('invite', \&on_invite); - $conn->add_global_handler('kick', \&on_kick); - $conn->add_global_handler('mode', \&on_mode); - $conn->add_global_handler('nick', \&on_nick); - $conn->add_global_handler('quit', \&on_quit); - $conn->add_global_handler('notice', \&on_notice); - $conn->add_global_handler('whoischannels', \&on_whoischannels); - $conn->add_global_handler('useronchannel', \&on_useronchannel); - $conn->add_global_handler('whois', \&on_whois); - $conn->add_global_handler('other', \&on_other); - $conn->add_global_handler('disconnect', \&on_disconnect); - $conn->add_global_handler([251,252,253,254,255], \&on_init); -# $conn->add_global_handler(302, \&on_init); # userhost - $conn->add_global_handler(303, \&on_ison); # notify. - $conn->add_global_handler(315, \&on_endofwho); - $conn->add_global_handler(422, \&on_endofwho); # nomotd. - $conn->add_global_handler(324, \&on_modeis); - $conn->add_global_handler(333, \&on_topicinfo); - $conn->add_global_handler(352, \&on_who); - $conn->add_global_handler(353, \&on_names); - $conn->add_global_handler(366, \&on_endofnames); - $conn->add_global_handler(376, \&on_endofmotd); # on_connect. - $conn->add_global_handler(433, \&on_nick_taken); - $conn->add_global_handler(439, \&on_targettoofast); - # for proper joinnextChan behaviour - $conn->add_global_handler(471, \&on_chanfull); - $conn->add_global_handler(473, \&on_inviteonly); - $conn->add_global_handler(474, \&on_banned); - $conn->add_global_handler(475, \&on_badchankey); - $conn->add_global_handler(443, \&on_useronchan); - - # end of handler stuff. - $irc->start; } diff --git a/blootbot/src/IRC/Schedulers.pl b/blootbot/src/IRC/Schedulers.pl index 298b037..8496f02 100644 --- a/blootbot/src/IRC/Schedulers.pl +++ b/blootbot/src/IRC/Schedulers.pl @@ -673,37 +673,40 @@ sub ircCheck { } $cache{statusSafe} = 1; - - my @join = &getJoinChans(1); - if (scalar @join) { - &FIXME('ircCheck: found channels to join! ' . join(',',@join)); - &joinNextChan(); - } - - # TODO: fix on_disconnect() - - if (time() - $msgtime > 3600) { - # TODO: shouldn't we use cache{connect} somewhere? - if (exists $cache{connect}) { - &WARN("ircCheck: no msg for 3600 and disco'd! reconnecting!"); - $msgtime = time(); # just in case. - &ircloop(); - delete $cache{connect}; - } else { - &status('ircCheck: possible lost in space; checking.'. - scalar(gmtime) ); - &msg($ident, "TEST"); - $cache{connect} = time(); + foreach (sort keys %conns) { + $conn=$conns{$_}; + &DEBUG("ircCheck for $_"); + my @join = &getJoinChans(1); + if (scalar @join) { + &FIXME('ircCheck: found channels to join! ' . join(',',@join)); + &joinNextChan(); } - } - if (grep /^\s*$/, keys %channels) { - &WARN('ircCheck: we have a NULL chan in hash channels? removing!'); - if (!exists $channels{''}) { - &DEBUG('ircCheck: this should never happen!'); + # TODO: fix on_disconnect() + + if (time() - $msgtime > 3600) { + # TODO: shouldn't we use cache{connect} somewhere? + if (exists $cache{connect}) { + &WARN("ircCheck: no msg for 3600 and disco'd! reconnecting!"); + $msgtime = time(); # just in case. + &ircloop(); + delete $cache{connect}; + } else { + &status('ircCheck: possible lost in space; checking.'. + scalar(gmtime) ); + &msg($ident, "TEST"); + $cache{connect} = time(); + } } - delete $channels{''}; + if (grep /^\s*$/, keys %channels) { + &WARN('ircCheck: we have a NULL chan in hash channels? removing!'); + if (!exists $channels{''}) { + &DEBUG('ircCheck: this should never happen!'); + } + + delete $channels{''}; + } } $cache{statusSafe} = 0; -- 2.39.5