#!/usr/bin/perl use strict; use AnyEvent::Impl::Perl; use JSON::Syck; use JSONConnection; use Net::IRC3::Client::Connection; $Net::IRC3::Client::Connection::DEBUG = 1; our $CFG; our %CONNS; sub load_cfg { $CFG ||= {}; return unless -e "$ENV{HOME}/.jsonircrc"; open CFGH, "<", "$ENV{HOME}/.jsonircrc" or die "Couldn't open ~/.jsonircrc: $!"; $::CFG = JSON::Syck::Load (do { local $/; }); } sub save_cfg { open CFGH, ">", "$ENV{HOME}/.jsonircrc" or die "Couldn't open for writing ~/.jsonircrc: $!"; print CFGH (JSON::Syck::Dump ($::CFG)); close CFGH; } load_cfg; my $c = AnyEvent->condvar; my $js = JSONConnection->new ( packet_cb => sub { my ($js, $lid, $data) = @_; my $con = $CONNS{$data->{con}}; if ($data->{type} eq 'public') { $con->send_srv (PRIVMSG => $data->{message} => $data->{channel}); } elsif ($data->{type} eq 'private') { $con->send_srv (PRIVMSG => $data->{message} => $data->{target}); } }, connect_cb => sub { my ($js, $lid) = @_; $js->send_data ($lid, { type => "channels", connections => { map { $_ => [ keys %{$CONNS{$_}->channel_list} ] } keys %CONNS } } ); }); for my $con (@{$CFG->{servers}}) { my ($host, $port) = ($con->{host}, $con->{port} || 6667); my $ircid = "$host:$port"; my $pc = $CONNS{$ircid} = Net::IRC3::Client::Connection->new; $pc->reg_cb ( publicmsg => sub { my ($pc, $chan, $msg) = @_; my ($nick) = Net::IRC3::Util::split_prefix ($msg->{prefix}); $js->broadcast ({ con => $ircid, type => "public", channel => $chan, message => $msg->{trailing}, timestamp => time (), from => { nick => $nick, info => $msg->{prefix} }, }); 1; }, privatemsg => sub { my ($pc, $dsgnick, $msg) = @_; my ($nick) = Net::IRC3::Util::split_prefix ($msg->{prefix}); $js->broadcast ({ con => $ircid, type => "private", message => $msg->{trailing}, timestamp => time (), from => { nick => $nick, info => $msg->{prefix} }, }); 1; }, ); $pc->connect ($host, $port); $pc->register (qw/elmex2 elmex2 elmex2/); for (@{$con->{channels}}) { $pc->send_srv (JOIN => undef => $_); } } $js->start_listener; $c->wait;