use strict; use warnings; use Irssi; use Encode; use File::Spec; use List::Util qw/first/; use YAML; our $VERSION = '0.01'; our %IRSSI = ( authors => 'Daisuke Murase', contact => 'typester@cpan.org', name => 'charset', description => 'convert message charset by rule', license => 'perl', url => 'http://unknownplace.org', changed => '2006-09-20', ); our $config = eval { YAML::LoadFile( File::Spec->catfile( Irssi::get_irssi_dir, 'charsets.yml' ) ) } || {}; sub encode_msg { my ( $msg, $server, $channel, $direction ) = @_; my $term = $config->{term} || 'utf-8'; my $charset = $config->{servers}->{$server}; if ( $charset and ref $charset eq 'ARRAY' ) { $charset = first { ($channel || '') =~ /$_->{channel}/ } @$charset; $charset = $charset->{charset} if $charset; } # TODO: Japanese channnel name support # elsif ($charset) { # $direction eq 'out' # ? Encode::from_to( $channel, $term, $charset ) # : Encode::from_to( $channel, $charset, $term ); # } if ($charset && $msg) { $direction eq 'out' ? Encode::from_to( $msg, $term, $charset ) : Encode::from_to( $msg, $charset, $term ); } $msg; } sub send_text { my ( $text, $server, $witem ) = @_; if ($server && $witem) { $text = encode_msg( $text, $server->{address}, $witem->{name}, 'out' ); } Irssi::signal_continue( $text, $server, $witem ); } Irssi::signal_add( 'send text', 'send_text' ); sub message_public { my ( $server, $msg, $nick, $addr, $target ) = @_; $msg = encode_msg( $msg, $server->{address}, $target, 'in' ); Irssi::signal_continue( $server, $msg, $nick, $addr, $target ); } Irssi::signal_add( 'message public', 'message_public' ); sub message_own_public { my ( $server, $msg, $target ) = @_; $msg = encode_msg( $msg, $server->{address}, $target, 'in' ); Irssi::signal_continue( $server, $msg, $target ); } Irssi::signal_add( 'message own_public', 'message_own_public' ); sub message_irc_action { my ( $server, $msg, $nick, $addr, $target ) = @_; $msg = encode_msg( $msg, $server->{address}, $target, 'in' ); Irssi::signal_continue( $server, $msg, $nick, $addr, $target ); } Irssi::signal_add( 'message irc action', 'message_irc_action' ); sub message_private { my ( $server, $msg, $nick, $addr ) = @_; $msg = encode_msg( $msg, $server->{address}, undef, 'in' ); Irssi::signal_continue( $server, $msg, $nick, $addr ); } Irssi::signal_add( 'message private', 'message_private' ); sub message_own_private { my ( $server, $msg, $target, $orig_target ) = @_; $msg = encode_msg( $msg, $server->{address}, undef, 'in' ); # ? Irssi::signal_continue( $server, $msg, $target, $orig_target ); } Irssi::signal_add( 'message own_private', 'message_own_private' ); sub message_notice { my ( $server, $msg, $nick, $addr, $target ) = @_; $msg = encode_msg( $msg, $server->{address}, $target, 'in' ); Irssi::signal_continue( $server, $msg, $nick, $addr, $target ); } Irssi::signal_add( 'message irc notice', 'message_notice' ); sub message_own_notice { my ( $server, $msg, $target ) = @_; $msg = encode_msg( $msg, $server->{address}, $target, 'in' ); Irssi::signal_continue( $server, $msg, $target ); } Irssi::signal_add( 'message irc own_notice', 'message_own_notice' ); sub message_part { my ( $server, $chan, $nick, $addr, $reason ) = @_; $reason = encode_msg( $reason, $server->{address}, $chan, 'in' ); Irssi::signal_continue( $server, $chan, $nick, $addr, $reason ); } Irssi::signal_add( 'message part', 'message_part' ); sub message_quit { my ( $server, $nick, $addr, $reason ) = @_; $reason = encode_msg( $reason, $server->{address}, undef, 'in' ); Irssi::signal_continue( $server, $nick, $addr, $reason ); } Irssi::signal_add( 'message quit', 'message_quit' ); sub message_kick { my ( $server, $chan, $nick, $kicker, $addr, $reason ) = @_; $reason = encode_msg( $reason, $server->{address}, $chan, 'in' ); Irssi::signal_continue( $server, $chan, $nick, $kicker, $addr, $reason ); } Irssi::signal_add( 'message kick', 'message_kick' ); sub message_topic { my ( $server, $chan, $topic, $nick, $addr ) = @_; $topic = encode_msg( $topic, $server->{address}, $chan, 'in' ); Irssi::signal_continue( $server, $chan, $topic, $nick, $addr ); } Irssi::signal_add( 'message topic', 'message_topic' );