--- deliantra/server/ext/irc.ext 2009/03/11 22:36:39 1.16 +++ deliantra/server/ext/irc.ext 2012/11/11 02:38:10 1.22 @@ -1,6 +1,5 @@ #! perl -use Time::HiRes; use AnyEvent::IRC::Client; use AnyEvent::IRC::Util qw/filter_colors/; @@ -8,12 +7,12 @@ 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,7 +104,7 @@ 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 = filter_colors ($msg->{params}->[-1]); $tmsg =~ s/\x01[^\x01]*\x01//g; @@ -102,29 +125,29 @@ my ($con, $error) = @_; if ($error) { - warn "IRC: CONNECT ERROR to IRC server: $BOTSERVER:$BOTPORT: $error\n"; + cf::error "IRC: CONNECT ERROR to IRC server: $BOTSERVER:$BOTPORT: $error\n"; undef $CON; } else { - warn "IRC: connected to IRC server: $BOTSERVER:$BOTPORT\n"; + 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; };