--- deliantra/server/ext/irc.ext 2008/09/23 14:41:26 1.14 +++ deliantra/server/ext/irc.ext 2012/11/11 02:38:10 1.22 @@ -1,19 +1,18 @@ #! perl -use Time::HiRes; use AnyEvent::IRC::Client; -use AnyEvent::IRC::Util; +use AnyEvent::IRC::Util qw/filter_colors/; # requires: commands.ext return unless exists $cf::CFG{irc_server}; -my $BOTSERVER = $cf::CFG{irc_server} || "localhost"; -my $BOTPORT = $cf::CFG{irc_port} || 6667; -my $BOTNAME = $cf::CFG{irc_nick} || "server"; -my $BOTCHAN = $cf::CFG{irc_chan} || "cf"; +CONF BOTSERVER : irc_server = undef; +CONF BOTPORT : irc_port = undef; +CONF BOTNAME : irc_nick = undef; +CONF BOTCHAN : irc_chan = undef; -my $CON; # the connection +our $CON; # the connection sub unload { $CON->disconnect if $CON; @@ -31,9 +30,29 @@ sub users { $CON ? grep $_ ne $CON->nick, keys %{ $CON->channel_list->{$BOTCHAN} || {} } - : () + : () } +# for nicklist monitoring, #d# should be done event-based +our %NICKLIST; +our $NICKLIST = AE::timer 20, 59.17, sub { + return unless defined &ext::nickmon::NT_OTHER; + + my %NEXTLIST; + for (users) { + &ext::nickmon::upd ("irc/$_", &ext::nickmon::NT_OTHER, "irc") + unless exists $NICKLIST{$_}; + + delete $NICKLIST{$_}; + undef $NEXTLIST{$_}; + } + + &ext::nickmon::del ("irc/$_") + for keys %NICKLIST; + + %NICKLIST = %NEXTLIST; +}; + sub handle_fcmd { my ($name, $me, $msg) = @_; @@ -70,6 +89,10 @@ return if $CON; $CON = AnyEvent::IRC::Client->new; + $CON->set_exception_cb (sub { + my ($exp, $ev) = @_; + cf::error "IRC: IRC EXCEPTION (event $ev): $exp\n"; + }); $CON->connect ($BOTSERVER, $BOTPORT, { nick => $BOTNAME, user => $BOTNAME, @@ -81,9 +104,9 @@ my ($con, $msg) = @_; my $name = 'irc'; my $nick = AnyEvent::IRC::Util::prefix_nick ($msg); - my $NOW = Time::HiRes::time; + my $NOW = EV::time; - my $tmsg = $msg->{params}->[-1]; + my $tmsg = filter_colors ($msg->{params}->[-1]); $tmsg =~ s/\x01[^\x01]*\x01//g; $tmsg =~ s/\015?\012/ /g; @@ -99,24 +122,32 @@ } }, connect => sub { - warn "IRC: connected to IRC server: $BOTSERVER:$BOTPORT\n"; + my ($con, $error) = @_; + + if ($error) { + cf::error "IRC: CONNECT ERROR to IRC server: $BOTSERVER:$BOTPORT: $error\n"; + undef $CON; + + } else { + cf::info "IRC: connected to IRC server: $BOTSERVER:$BOTPORT\n"; + } }, registered => sub { - warn "IRC: successfully logged into IRC server: $BOTSERVER:$BOTPORT\n"; + cf::info "IRC: successfully logged into IRC server: $BOTSERVER:$BOTPORT\n"; }, error => sub { my ($con, $code, $message) = @_; - warn "IRC: IRC ERROR ($code) $message\n"; + cf::error "IRC: IRC ERROR ($code) $message\n"; }, disconnect => sub { my ($con, $reason) = @_; - warn "IRC: disconnect: $reason\n"; + cf::warn "IRC: disconnect: $reason\n"; undef $CON; } ); } -our $RECONNECT = cf::periodic 30, Coro::unblock_sub { +our $RECONNECT = length $BOTSERVER && cf::periodic 30, Coro::unblock_sub { check_connection; };