Skip to content

Instantly share code, notes, and snippets.

@JEEN
Created November 26, 2009 07:28
Show Gist options
  • Save JEEN/243306 to your computer and use it in GitHub Desktop.
Save JEEN/243306 to your computer and use it in GitHub Desktop.
package Morris::Plugin::Relay;
use Moose;
use AnyEvent::MP qw(snd);
use AnyEvent::MP::Global qw(grp_mon);
use namespace::clean -except => qw(meta);
use Encode ();
extends 'Morris::Plugin';
has from => (
traits => [ 'Hash' ],
is => 'ro',
isa => 'HashRef',
required => 1,
handles => {
get_instance => 'get',
}
);
has __guard => (
is => 'rw',
clearer => 'clear_guard',
);
around BUILDARGS => sub {
my ($next, $class, @args) = @_;
my $args = $next->($class, @args);
my $configs = $args->{from};
foreach my $name (keys %{ $configs }) {
my $config = $configs->{$name};
$config->{to} = [ (split /,/, $config->{to}) ];
$config->{type} = 'privmsg' unless $config && $config->{type} && $config->{type} =~ /(?:privmsg|notice)/;
}
return $args;
};
after register => sub {
my ($self, $conn) = @_;
$conn->register_hook( 'chat.privmsg', sub { $self->handle_message(@_) } );
};
sub handle_message {
my ($self, $msg) = @_;
my $channel = $msg->channel;
my $message = $msg->message;
my $nickname = $msg->from->nickname;
return unless $channel;
return unless $message;
my $config = $self->from->{$channel} or return;
$self->__guard(grp_mon $config->{target}, sub {
my ($ports, $add, $del) = @_;
my $server = $ports->[0];
my $msg = sprintf('<%s::%s::%s> %s', $self->profile, $channel, $nickname, $message);
if ($config->{encode} && $config->{decode}) {
$msg = Encode::encode($config->{encode}, Encode::decode($config->{decode}, $msg));
}
snd $server, $config->{type} => $_, $msg for @{ $config->{to} };
});
}
__PACKAGE__->meta->make_immutable();
1;
__END__
config
...
<Plugin Relay>
<From \#perl-kr>
Target freenode
To \#perl
Type privmsg
</From>
</Plugin>
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment