#!/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; } sub to_dest_id { my ($ircid, $targ) = @_; return "$ircid/$targ"; } sub from_dest_id { my ($dest_id) = @_; if ($dest_id =~ m/^([^\/]+)\/(.*)$/) { return ($CONNS{$1}, $1, $2); } return (undef, undef, undef); } load_cfg; my $c = AnyEvent->condvar; my $js = JSONConnection->new ( packet_cb => sub { my ($js, $lid, $data) = @_; my ($con, $ircid, $dest) = from_dest_id ($data->{dest}); unless (defined $con) { warn "NO SUCH ID[$data->{dest}]\n"; return; } if ($data->{type} eq 'message') { $con->send_srv (PRIVMSG => $data->{message} => $dest); } 1 }, connect_cb => sub { my ($js, $lid) = @_; $js->send_data ($lid, { type => "hello" }); }); 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}); my $dest = to_dest_id ($ircid, $chan); my $nickdest = to_dest_id ($ircid, $nick); $js->broadcast ({ src => $dest, type => "message", msg_type => "public", message => $msg->{trailing}, timestamp => time (), to => { nick => $pc->nick, id => to_dest_id ($ircid, $pc->nick) }, from => { nick => $nick, id => $nickdest }, }); 1; }, privatemsg => sub { my ($pc, $dsgnick, $msg) = @_; my ($nick) = Net::IRC3::Util::split_prefix ($msg->{prefix}); my $dest = to_dest_id ($ircid, $nick); $js->broadcast ({ src => $dest, type => "message", msg_type => "private", message => $msg->{trailing}, timestamp => time (), to => { nick => $pc->nick, id => to_dest_id ($ircid, $pc->nick) }, from => { nick => $nick, id => $dest }, }); 1; }, ); $pc->connect ($host, $port); $pc->register (qw/elmex2 elmex2 elmex2/); for (@{$con->{channels}}) { $pc->send_srv (JOIN => undef => $_->{name}); } } $js->start_listener; $c->wait;