Show
Ignore:
Timestamp:
04/06/08 14:00:17 (7 years ago)
Author:
hio
Message:

lang/perl/tiarra: TALK時の整形をLog::Channelから拝借.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/tiarra/trunk/module/Log/Logger.pm

    r3004 r8977  
    66use warnings; 
    77use Multicast; 
     8 
     9our $MARKER = { 
     10  myself => { 
     11    PRIVMSG => ['>','<'], 
     12    NOTICE  => [')','('], 
     13  }, 
     14  priv => { 
     15    PRIVMSG => ['-','-'], 
     16    NOTICE  => ['=','='], 
     17  }, 
     18  channel => { 
     19    PRIVMSG => ['<','>'], 
     20    NOTICE  => ['(',')'], 
     21  }, 
     22}; 
    823 
    924sub new { 
     
    131146    }; 
    132147    my @result; 
    133     foreach my $ch_name (@{$msg->remark('affected-channels')}) { 
     148    if( my $ch_short_list = $msg->remark('affected-channels') ){ 
     149    foreach my $ch_name (@$ch_short_list) { 
    134150        push @result,[Multicast::attach($ch_name,$network_name), 
    135151                      $line]; 
    136152    } 
     153    } 
    137154    @result; 
    138155} 
    139156 
     157{ 
     158no warnings 'once'; 
    140159*S_KILL = \&S_QUIT; 
     160} 
     161 
    141162sub S_QUIT { 
    142163    my ($this,$msg,$sender) = @_; 
    143164    my $network_name = $sender->network_name; 
    144165    my @result; 
    145     foreach my $ch_name (@{$msg->remark('affected-channels')}) { 
     166    if( my $ch_short_list = $msg->remark('affected-channels') ){ 
     167    foreach my $ch_name (@$ch_short_list) { 
    146168        push @result,[Multicast::attach($ch_name,$network_name), 
    147169                      sprintf '! %s (%s)',$msg->nick,$msg->param(0)]; 
     170    } 
    148171    } 
    149172    @result; 
     
    159182} 
    160183 
     184{ 
     185no warnings 'once'; 
     186*S_PRIVMSG = \&PRIVMSG_or_NOTICE; 
     187*S_NOTICE  = \&PRIVMSG_or_NOTICE; 
     188*C_PRIVMSG = \&PRIVMSG_or_NOTICE; 
     189*C_NOTICE  = \&PRIVMSG_or_NOTICE; 
     190} 
     191 
     192sub PRIVMSG_or_NOTICE 
     193{ 
     194  my ($this,$msg,$sender) = @_; 
     195  my $line = $this->_build_message($msg, $sender); 
     196  my $channel = $line->{is_priv} ? 'priv' : $line->{ch_long}; 
     197  [$channel, $line->{formatted}]; 
     198} 
     199 
     200# ----------------------------------------------------------------------------- 
     201# $hashref = $obj->_build_message($msg, $sender). 
     202# Log/Channel から拝借. 
     203# ただ 
     204# - distinguish_myself が省かれている. 
     205# - PRIVでも相手の名前がchannel名として使われる. 
     206# - 好きにformat出来るように解析した情報をHASHREFで返している. 
     207# という点で変更されている. 
     208# 
     209sub _build_message 
     210{ 
     211  my ($this, $msg, $sender) = @_; 
     212 
     213  my $raw_target = $msg->param(0); 
     214  my ($target,$netname,$_explicit) = Multicast::detatch( $raw_target ); 
     215  my $is_priv = Multicast::nick_p($target); 
     216  my $cmd     = $msg->command; 
     217 
     218  my $marker_id; 
     219  if( $sender->isa('IrcIO::Client') ) 
     220  { 
     221    $marker_id = 'myself'; 
     222  }elsif( $is_priv ) 
     223  { 
     224    $marker_id = 'priv'; 
     225  }else 
     226  { 
     227    $marker_id = 'channel'; 
     228  } 
     229  my $marker = $MARKER->{$marker_id}{$cmd}; 
     230  $marker or die "no marker for $marker_id/$cmd"; 
     231 
     232  my ($speaker, $ch_short); 
     233  if( $sender->isa('IrcIO::Client') ) 
     234  { 
     235    # 自分の発言. 
     236    $speaker  = RunLoop->shared_loop->network( $netname )->current_nick; 
     237    $ch_short = $target; 
     238  }else 
     239  { 
     240    # 相手の. 
     241    $speaker  = $msg->nick || $sender->current_nick; 
     242    $ch_short = $is_priv ? $speaker : $target; 
     243  } 
     244  my $ch_long = Multicast::attach($ch_short, $netname); 
     245 
     246  my $line = sprintf( 
     247    '%s%s:%s%s %s', 
     248    $marker->[0], 
     249    $ch_long, 
     250    $speaker, 
     251    $marker->[1], 
     252    $msg->param(1), 
     253  ); 
     254 
     255  +{ 
     256    marker_id => $marker_id, # 'myself' / 'priv' / 'channel' 
     257    is_priv   => $is_priv, 
     258    marker    => $marker,    # ['<', '>'], etc. 
     259    speaker   => $speaker, 
     260    ch_long   => $ch_long, 
     261    ch_short  => $ch_short, 
     262    netname   => $netname, 
     263    msg       => $msg->param(1), 
     264    formatted => $line, 
     265  }; 
     266} 
     267 
    1612681;