http skeleton using AnyEvent::HTTPD
[MQR.git] / scripts / mqr-irc-client.pl
index b5a0de4..408b2db 100755 (executable)
@@ -9,18 +9,38 @@ use IO::Handle;
 use AnyEvent;
 use AnyEvent::IRC::Client;
 use AnyEvent::IRC::Util qw/mk_msg parse_irc_msg encode_ctcp/;
-use Data::Dumper;
+use AnyEvent::Redis;
+use Data::Dump qw(dump);
+use Carp qw(confess);
 
-my ($nick, $server, $port) = @ARGV;
+use lib 'lib';
+use MQR::Redis;
 
-$nick ||= 'mqr-irc';
-$server ||= 'irc.freenode.net';
-$port ||= 6667;
+my $nick = $ENV{IRC_NICK} || die "IRC_NICK";
+my $room = $ENV{IRC_ROOM} || die "IRC_ROOM";
+my $server = $ENV{IRC_SERVER} || die 'IRC_SERVER';
+my $subscribe  = $ENV{IRC_SUBSCRIBE} || die 'IRC_SUBSCRIBE';
 
 my $c = AnyEvent->condvar;
 my $stdout = AnyEvent::Handle->new (fh => \*STDOUT);
 my $con = new AnyEvent::IRC::Client;
 
+warn "# server:$ENV{IRC_SERVER}:$ENV{IRC_PORT} room:$room nick:$nick subscribe:$subscribe\n";
+
+MQR::Redis->redis->psubscribe( "MSG $subscribe", sub {
+       my ( $message, $from ) = @_;
+       warn "<<<< ",dump( $from, $message );
+       return unless $from !~ m/\Q($nick|$room)\E/; # FIXME: skip our messages
+       my ( undef, $gw, $type, $user ) = split(/ /,$from);
+       MQR::Redis->publish( "SEND $nick\@$server $room $user" => "<$user> $message" );
+});
+
+MQR::Redis->redis->psubscribe( "SEND $nick\@$server $room *", sub {
+       my ( $message, $from ) = @_;
+       warn "PRIVMSG $room $message\n";
+       $con->send_msg( 'PRIVMSG', $room => $message );
+});
+
 $con->reg_cb (
    connect => sub {
       my ($con, $err) = @_;
@@ -41,12 +61,23 @@ $con->reg_cb (
          . mk_msg ($msg->{prefix}, $msg->{command}, @{$msg->{params}})
          . "\n"
       );
+
+               if ( $msg->{command} eq 'PRIVMSG' ) {
+                       my ( $to, $body ) = @{ $msg->{params} };
+                       my $uid = $msg->{prefix};
+                       my $user = $uid;
+                       $user =~ s{!.+$}{};
+                       MQR::Redis->publish( "MSG $nick\@$server $to $user $uid" => $body );
+               } elsif ( $msg->{command} eq 'MODE' ) {
+                       $con->send_srv( JOIN => $room );
+               }
    },
    debug_send => sub {
       my ($con, @msg) = @_;
       $stdout->push_write (
          "> " . mk_msg (undef, @msg) . "\n"
       );
+warn dump(@msg);
    },
    registered => sub {
       my ($con) = @_;
@@ -71,7 +102,7 @@ $con->reg_cb (
                      warn "eval error: $@\n";
                   } else {
                      $Data::Dumper::Terse = 1;
-                     $stdout->push_write ("result: " . Data::Dumper::Dumper ($r));
+                     $stdout->push_write ("result: " . dump($r));
                   }
                } else {
                   my $msg = parse_irc_msg ($line);
@@ -87,8 +118,8 @@ $con->reg_cb (
    },
 );
 
-$con->ctcp_auto_reply ('VERSION', ['VERSION', 'DebugConsole:0.1:Perl']);
+$con->ctcp_auto_reply('VERSION', ['VERSION', 'MQR-IRC:0.1:Perl']);
 
-$con->connect ($server, $port || 6667);
+$con->connect ($server, $ENV{IRC_PORT} || 6667);
 
 $c->wait;