OSDN Git Service

fixed Keitairc::IrcBuffer::part()
[keitairc/keitairc.git] / lib / Keitairc / IrcBuffer.pm
index 6a4beba..439dc14 100644 (file)
@@ -1,6 +1,6 @@
 # -*-perl-*-
 # Keitairc::IrcBuffer
-# $Id: IrcBuffer.pm,v 1.3 2008-01-11 18:34:33 morimoto Exp $
+# $Id: IrcBuffer.pm,v 1.8 2008-01-18 16:55:46 morimoto Exp $
 # $Source: /home/ishikawa/work/keitairc/tmp/keitairc/lib/Keitairc/IrcBuffer.pm,v $
 #
 # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
@@ -9,6 +9,7 @@
 package Keitairc::IrcBuffer;
 use strict;
 use Encode;
+use Data::Dumper;
 
 ################################################################
 sub new{
@@ -16,21 +17,26 @@ sub new{
        my $arg = shift;
        my $me = {};
 
+       $me->{cid2name} = {};
+       $me->{name2cid} = {};
+
        $me->{history} = $arg->{history};
 
-       # join ¤·¤Æ¤¤¤ë¥Á¥ã¥Í¥ë¤Î̾¾Î¤òµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (jis)
+       # join しているchannelの名称を記録するハッシュ (jis)
        $me->{name} = {};
 
-       # join ¤·¤Æ¤¤¤ë¥Á¥ã¥Í¥ë¤Î̾¾Î¤òµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (jis)
+       # join しているtopicの名称を記録するハッシュ (jis)
        $me->{topic} = {};
 
-       # ¥Á¥ã¥Í¥ë¤Î²ñÏÃÆâÍƤòµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (euc-jp)
+       $me->{nicks} = {};
+
+       # チャネルの会話内容を記録するハッシュ (euc-jp)
        $me->{buffer} = {};
        $me->{unread} = {};
 
-       # ³Æ¥Á¥ã¥Í¥ë¤ÎºÇ½ªÈ¯¸À»þ¹ï
+       # 各チャネルの最終発言時刻
        $me->{mtime} = {};
-       # ³Æ¥Á¥ã¥Í¥ë¤Î̤ÆɹԿô
+       # 各チャネルの未読行数
        $me->{unread_lines} = {};
 
        # chk
@@ -40,11 +46,64 @@ sub new{
 }
 
 ################################################################
+sub add_nick{
+       my($me, $cid, $nick, $chop, $realname) = @_;
+       $me->{nicks}->{$cid}->{$nick}->{realname} = $realname;
+       $me->{nicks}->{$cid}->{$nick}->{chop} = $chop;
+}
+
+################################################################
+sub list_nick{
+       my($me, $cid, $nick, $chop, $realname) = @_;
+       keys %{$me->{nicks}->{$cid}};
+}
+
+################################################################
+sub remove_nick{
+       my($me, $cid, $nick) = @_;
+       delete $me->{nicks}->{$cid}->{$nick};
+}
+
+################################################################
+sub get_nick_realname{
+       my($me, $cid, $nick) = @_;
+       $me->{nicks}->{$cid}->{$nick}->{realname};
+}
+
+################################################################
+sub op_nick{
+       my($me, $cid, $nick) = @_;
+       if(defined $me->{nicks}->{$cid}){
+               if(defined $me->{nicks}->{$cid}->{$nick}){
+                       $me->{nicks}->{$cid}->{$nick}->{chop} = 1;
+               }
+       }
+}
+
+################################################################
+sub deop_nick{
+       my($me, $cid, $nick) = @_;
+       if(defined $me->{nicks}->{$cid}){
+               if(defined $me->{nicks}->{$cid}->{$nick}){
+                       $me->{nicks}->{$cid}->{$nick}->{chop} = 0;
+               }
+       }
+}
+
+################################################################
+sub get_nick_op{
+       my($me, $cid, $nick) = @_;
+       if(defined $me->{nicks}->{$cid}){
+               if(defined $me->{nicks}->{$cid}->{$nick}){
+                       return $me->{nicks}->{$cid}->{$nick}->{chop};
+               }
+       }
+}
+
+################################################################
 sub channels{
        my $me = shift;
-       map {
-               $me->{name}->{$_}
-       }(sort { $me->mtime($b) <=> $me->mtime($a) } keys %{$me->{name}})
+       sort { $me->mtime($b) <=> $me->mtime($a) } keys %{$me->{cid2name}};
 }
 
 ################################################################
@@ -54,38 +113,50 @@ sub now{
 }
 
 ################################################################
-sub canon_name{
-       local($_) = shift;
-       tr/A-Z[\\]^/a-z{|}~/;
-       $_;
+# 生のiso-2022-jpのまま扱うこと。こういう仕様なのでしょうがない。
+sub name2cid{
+       my($me, $name) = @_;
+       $name =~ tr/A-Z[\\]^/a-z{|}~/;
+
+       unless(defined $me->{name2cid}->{$name}){
+               my @sort = sort(keys %{$me->{cid2name}});
+               my $cid = 1 + pop @sort;
+               $me->{cid2name}->{$cid} = $name;
+               $me->{name2cid}->{$name} = $cid;
+       }
+
+       $me->{name2cid}->{$name};
+}
+
+################################################################
+sub cid2name{
+       my($me, $cid) = @_;
+       $me->{cid2name}->{$cid};
 }
 
 ################################################################
 sub part{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       delete $me->{name}->{$cc};
+       my($me, $cid) = @_;
+       delete $me->{cid2name}->{$cid};
 }
 
 ################################################################
 sub join{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{name}->{$cc} = $channel;
+       my ($me, $name) = @_;
+       my $cid = $me->name2cid($name);
+       $me->{name}->{$cid} = $name;
 }
 
 ################################################################
 sub mtime{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{mtime}->{$cc};
+       my($me, $cid) = @_;
+       $me->{mtime}->{$cid};
 }
 
 ################################################################
 sub name{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{name}->{$cc};
+       my($me, $cid) = @_;
+       $me->{name}->{$cid};
 }
 
 ################################################################
@@ -99,48 +170,42 @@ sub message_added{
 
 ################################################################
 sub unread_lines{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{unread_lines}->{$cc};
+       my($me, $cid) = @_;
+       $me->{unread_lines}->{$cid};
 }
 
 ################################################################
 sub unread{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{unread}->{$cc};
+       my($me, $cid) = @_;
+       $me->{unread}->{$cid};
 }
 
 ################################################################
 sub clear_unread{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{unread}->{$cc} = '';
-       $me->{unread_lines}->{$cc} = 0;
+       my($me, $cid) = @_;
+       $me->{unread}->{$cid} = '';
+       $me->{unread_lines}->{$cid} = 0;
 }
 
 ################################################################
 sub topic{
-       my($me, $channel, $topic) = @_;
-       my $cc = canon_name($channel);
+       my($me, $cid, $topic) = @_;
        if(defined $topic){
-               $me->{topic}->{$cc} = $topic;
+               $me->{topic}->{$cid} = $topic;
        }
-       $me->{topic}->{$cc};
+       $me->{topic}->{$cid};
 }
 
 ################################################################
 sub buffer{
-       my($me, $channel) = @_;
-       my $cc = canon_name($channel);
-       $me->{buffer}->{$cc};
+       my($me, $cid) = @_;
+       $me->{buffer}->{$cid};
 }
 
 ################################################################
-# °ú¿ô¤Î $msg ¤Ï euc-jp, $channel ¤Ï jis
+# 引数の $msg は euc-jp, $channel は jis
 sub add_message{
-       my($me, $channel, $message, $who) = @_;
-       my $cc = canon_name($channel);
+       my($me, $cid, $message, $who) = @_;
 
        if(length $who){
                $message = sprintf('%s %s> %s', now(), $who, $message);
@@ -149,52 +214,53 @@ sub add_message{
        }
 
        {
-               my @tmp = split("\n", $me->{buffer}->{$cc});
+               my @tmp = split("\n", $me->{buffer}->{$cid});
                push @tmp, $message;
 
                if(@tmp > $me->{history}){
-                       $me->{buffer}->{$cc} =
+                       $me->{buffer}->{$cid} =
                                CORE::join("\n", splice(@tmp, -$me->{history}));
                }else{
-                       $me->{buffer}->{$cc} = CORE::join("\n", @tmp);
+                       $me->{buffer}->{$cid} = CORE::join("\n", @tmp);
                }
        }
 
        {
-               my @tmp = split("\n", $me->{unread}->{$cc});
+               my @tmp = split("\n", $me->{unread}->{$cid});
                push @tmp, $message;
 
                if(@tmp > $me->{history}){
-                       $me->{unread}->{$cc} =
+                       $me->{unread}->{$cid} =
                                CORE::join("\n", @tmp[1 .. $me->{history}]);
                }else{
-                       $me->{unread}->{$cc} = CORE::join("\n", @tmp);
+                       $me->{unread}->{$cid} = CORE::join("\n", @tmp);
                }
 
-               $me->{unread_lines}->{$cc} = scalar(@tmp);
+               $me->{unread_lines}->{$cid} = scalar(@tmp);
        }
 
-       if($me->{unread_lines}->{$cc} > $me->{history}){
-               $me->{unread_lines}->{$cc} = $me->{history};
+       if($me->{unread_lines}->{$cid} > $me->{history}){
+               $me->{unread_lines}->{$cid} = $me->{history};
        }
 
-       $me->{mtime}->{$cc} = time;
+       $me->{mtime}->{$cid} = time;
 }
 
 ################################################################
-# ¥Á¥ã¥Í¥ë̾¾Î¤òû¤«¤¯¤¹¤ë
+# チャネル名称を短かくする
 sub compact_channel_name{
        my $me = shift;
-       my $name = shift;
+       my $cid = shift;
+       my $name = $me->name($cid);
 
        $name = decode('jis', $name);
 
-       # #name:*.jp ¤ò %name ¤Ë
+       # #name:*.jp を %name に
        if($name =~ s/:\*\.jp$//){
                $name =~ s/^#/%/;
        }
 
-       # ËöÈø¤ÎñÆȤΠ@ ¤Ï¼è¤ë (plum¥×¥é¥°¥¤¥ó¤Îmulticast.plmÂкö)
+       # 末尾の単独の @ は取る (plumプラグインのmulticast.plm対策)
        $name =~ s/\@$//;
 
        encode('shiftjis', $name);
@@ -210,4 +276,48 @@ sub simple_escape{
         $_;
 }
 
+################################################################
+sub colorize{
+       my $me = shift;
+        local($_) = shift;
+
+       my %ct = (
+               1 => 'Black',
+               2 => '#000080', # Navy Blue
+               3 => 'Green',
+               4 => 'Red',
+               5 => 'Maroon',
+               6 => 'Purple',
+               7 => 'Olive',
+               8 => 'Yellow',
+               9 => '#32cd32', # Lime Green
+               10 => 'Teal',
+               11 => 'Aqua',
+               12 => '#4169e1', # Royal Blue
+               13 => '#ff69b4', # Hot Pink
+               14 => '#a9a9a9', # Dark Gray
+               15 => '#d3d3d3', # Light Gray
+               16 => 'White');
+       my $colored = 0;
+
+       do{
+               if($colored){
+                       s|\x03(\d{1,2})|sprintf('</font><font color="%s">', $ct{0+$1})|e;
+                       if(s|\x03|</font>|){
+                               $colored = 0;
+                       }
+               }else{
+                       if(s|\x03(\d{1,2})|sprintf('<font color="%s">', $ct{0+$1})|e){
+                               $colored = 1;
+                       }
+               }
+       }while(m|\x03\d{1,2}|);
+
+       if($colored){
+               $_ .= '</font>';
+       }
+
+       $_;
+}
+
 1;