3 # $Id: IrcBuffer.pm,v 1.10 2008-02-25 16:52:20 morimoto Exp $
4 # $Source: /home/ishikawa/work/keitairc/tmp/keitairc/lib/Keitairc/IrcBuffer.pm,v $
6 # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
7 # This program is covered by the GNU General Public License 2
9 package Keitairc::IrcBuffer;
14 ################################################################
20 $me->{history} = $arg->{history};
22 # join しているchannelの名称を記録するハッシュ (jis)
26 # join しているtopicの名称を記録するハッシュ (jis)
31 # チャネルの会話内容を記録するハッシュ (euc-jp)
38 $me->{unread_lines} = {};
41 $me->{message_added} = 0;
46 ################################################################
48 my($me, $cid, $nick, $chop, $realname) = @_;
49 $me->{nicks}->{$cid}->{$nick}->{realname} = $realname;
50 $me->{nicks}->{$cid}->{$nick}->{chop} = $chop;
53 ################################################################
55 my($me, $cid, $nick, $chop, $realname) = @_;
56 keys %{$me->{nicks}->{$cid}};
59 ################################################################
61 my($me, $cid, $nick) = @_;
62 delete $me->{nicks}->{$cid}->{$nick};
65 ################################################################
66 sub get_nick_realname{
67 my($me, $cid, $nick) = @_;
68 $me->{nicks}->{$cid}->{$nick}->{realname};
71 ################################################################
73 my($me, $cid, $nick) = @_;
74 if(defined $me->{nicks}->{$cid}){
75 if(defined $me->{nicks}->{$cid}->{$nick}){
76 $me->{nicks}->{$cid}->{$nick}->{chop} = 1;
81 ################################################################
83 my($me, $cid, $nick) = @_;
84 if(defined $me->{nicks}->{$cid}){
85 if(defined $me->{nicks}->{$cid}->{$nick}){
86 $me->{nicks}->{$cid}->{$nick}->{chop} = 0;
91 ################################################################
93 my($me, $cid, $nick) = @_;
94 if(defined $me->{nicks}->{$cid}){
95 if(defined $me->{nicks}->{$cid}->{$nick}){
96 return $me->{nicks}->{$cid}->{$nick}->{chop};
101 ################################################################
108 $me->mtime($b) <=> $me->mtime($a)
109 } keys %{$me->{cid2name}});
112 ################################################################
114 my ($sec, $min, $hour) = localtime(time);
115 sprintf('%02d:%02d', $hour, $min);
118 ################################################################
119 # 生のiso-2022-jpのまま扱うこと。こういう仕様なのでしょうがない。
122 $name =~ tr/A-Z[\\]^/a-z{|}~/;
124 unless(defined $me->{name2cid}->{$name}){
125 my @sort = sort { $a - $b } (keys %{$me->{cid2name}});
126 my $cid = 1 + pop @sort;
127 $me->{cid2name}->{$cid} = $name;
128 $me->{name2cid}->{$name} = $cid;
131 $me->{name2cid}->{$name};
134 ################################################################
137 $me->{cid2name}->{$cid};
140 ################################################################
143 delete $me->{cid2name}->{$cid};
146 ################################################################
148 my ($me, $name) = @_;
149 my $cid = $me->name2cid($name);
150 $me->{cid2name}->{$cid} = $name;
153 ################################################################
156 $me->{mtime}->{$cid};
159 ################################################################
163 $me->{message_added} = $v;
165 $me->{message_added};
168 ################################################################
171 $me->{unread_lines}->{$cid};
174 ################################################################
177 $me->{unread}->{$cid};
180 ################################################################
183 $me->{unread}->{$cid} = '';
184 $me->{unread_lines}->{$cid} = 0;
187 ################################################################
189 my($me, $cid, $topic) = @_;
191 $me->{topic}->{$cid} = $topic;
193 $me->{topic}->{$cid};
196 ################################################################
199 $me->{buffer}->{$cid};
202 ################################################################
203 # 引数の $msg は euc-jp, $channel は jis
205 my($me, $cid, $message, $who) = @_;
208 $message = sprintf('%s %s> %s', now(), $who, $message);
210 $message = sprintf('%s %s', now(), $message);
214 my @tmp = split("\n", $me->{buffer}->{$cid});
217 if(@tmp > $me->{history}){
218 $me->{buffer}->{$cid} =
219 CORE::join("\n", splice(@tmp, -$me->{history}));
221 $me->{buffer}->{$cid} = CORE::join("\n", @tmp);
226 my @tmp = split("\n", $me->{unread}->{$cid});
229 if(@tmp > $me->{history}){
230 $me->{unread}->{$cid} =
231 CORE::join("\n", @tmp[1 .. $me->{history}]);
233 $me->{unread}->{$cid} = CORE::join("\n", @tmp);
236 $me->{unread_lines}->{$cid} = scalar(@tmp);
239 if($me->{unread_lines}->{$cid} > $me->{history}){
240 $me->{unread_lines}->{$cid} = $me->{history};
243 $me->{mtime}->{$cid} = time;
246 ################################################################
248 sub compact_channel_name{
251 my $name = $me->cid2name($cid);
253 $name = decode('jis', $name);
255 # #name:*.jp を %name に
256 if($name =~ s/:\*\.jp$//){
260 # 末尾の単独の @ は取る (plumプラグインのmulticast.plm対策)
263 encode('shiftjis', $name);
266 ################################################################
276 ################################################################
283 2 => '#000080', # Navy Blue
290 9 => '#32cd32', # Lime Green
293 12 => '#4169e1', # Royal Blue
294 13 => '#ff69b4', # Hot Pink
295 14 => '#a9a9a9', # Dark Gray
296 15 => '#d3d3d3', # Light Gray
302 s|\x03(\d{1,2})|sprintf('</font><font color="%s">', $ct{0+$1})|e;
307 if(s|\x03(\d{1,2})|sprintf('<font color="%s">', $ct{0+$1})|e){
311 }while(m|\x03\d{1,2}|);