use strict;
use Socket;
-use IO::Select;
-
#Options
my %BOPM = (
'NICK' => \&m_nick,
);
-my $SELECT = new IO::Select;
-
my $IRC_SOCKET;
my $IRC_DATA;
# main
#
-# Main initializes the main listening socket
+# Main connects to the IRC server
# and handles the main daemon loop.
sub main #()
irc_init();
irc_connect();
- while(true)
- {
- irc_cycle();
+ while(1) {
+ if($IRC_SOCKET)
+ {
+ irc_read();
+ }
+ irc_reconnect();
}
-
}
do_log(sprintf('IRC -> Error initializing IRC socket: %s', $!));
die;
}
-
- $SELECT->add($$IRC_SOCKET);
}
-# irc_cycle
-#
-# Run select() on the IRC client and bopm connections to
-# check for new data. Reconnect if needed.
-
-sub irc_cycle #()
-{
- my $handle;
- my $dcc;
- my @ready;
- my @errored;
-
- #do error events
- @errored = $SELECT->has_error(0);
-
- foreach $handle (@errored)
- {
- if($handle == $$IRC_SOCKET)
- {
- do_log('IRC -> IRC socket has_error');
- irc_reconnect();
- next;
- }
- }
-
-
- #do read events
- @ready = $SELECT->can_read(.1);
-
- foreach $handle (@ready)
- {
- #Data from IRC server
- if($handle == $$IRC_SOCKET)
- {
- irc_read();
- next;
- }
- }
-}
-
# irc_connect
#
# Connect to IRC and send registration data
sub irc_connect #()
{
- if(!connect($$IRC_SOCKET, sockaddr_in($IRC{PORT}, inet_aton($IRC{HOST}))))
+ if(!connect($IRC_SOCKET, sockaddr_in($IRC{PORT}, inet_aton($IRC{HOST}))))
{
do_log(sprintf('IRC -> Error connecting to IRC host: %s', $!));
+ return;
}
irc_send(sprintf('PASS %s', $IRC{PASS}));
sub irc_reconnect #()
{
- do_log('IRC -> Reconnecting to server');
+ do_log('IRC -> Reconnecting to server in 30 seconds..');
- close($$IRC_SOCKET);
- $SELECT->remove($$IRC_SOCKET);
+ close($IRC_SOCKET);
sleep(30);
$data .= "\n\n";
- if(!send($$IRC_SOCKET, $data, 0))
+ if(!send($IRC_SOCKET, $data, 0))
{
do_log(sprintf('IRC -> send() error: %s', $!));
irc_reconnect();
sub irc_read #()
{
- my $data;
- my $pos;
- my $line;
-
- if(sysread($$IRC_SOCKET, $data, 512) == 0)
- {
- do_log('IRC -> Read error from server');
- irc_reconnect();
- return;
- }
-
- $data = $IRC_DATA . $data;
-
- while(($pos = index($data, "\n")) != -1)
+ while(<$IRC_SOCKET>)
{
- $line = substr($data, 0, $pos + 1, "");
- chomp $line;
- irc_parse($line);
+ chomp;
+ irc_parse($_);
}
- $IRC_DATA = $data;
}