# -*-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>
package Keitairc::IrcBuffer;
use strict;
use Encode;
+use Data::Dumper;
################################################################
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
}
################################################################
+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}};
}
################################################################
}
################################################################
-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};
}
################################################################
################################################################
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);
}
{
- 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);
$_;
}
+################################################################
+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;