1 # -*- mode: perl; coding: utf-8 -*-
4 # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
5 # This program is covered by the GNU General Public License 2
7 package Keitairc::IrcBuffer;
11 ################################################################
17 $me->{history} = $arg->{history};
19 # join しているchannelの名称を記録するハッシュ。
20 # - cid および name2cid ハッシュに格納されている値は整数。
21 # - cid2nameハッシュに格納されているのは perl decoded な チャネル名
25 # join しているtopicの名称を記録するハッシュ
26 # charset: perl internal
31 $me->{tbuffer} = {}; # time, ref to array
32 $me->{nbuffer} = {}; # nick, ref to array
33 $me->{mbuffer} = {}; # message, perl internal, ref to array
34 $me->{rbuffer} = {}; # read flag, ref to array
39 # timestamp of last posted message
45 ################################################################
47 my($me, $cid, $nick, $chop, $realname) = @_;
48 $me->{nicks}->{$cid}->{$nick}->{realname} = $realname;
49 $me->{nicks}->{$cid}->{$nick}->{chop} = $chop;
52 ################################################################
54 my($me, $cid, $nick, $chop, $realname) = @_;
55 keys %{$me->{nicks}->{$cid}};
58 ################################################################
60 my($me, $cid, $nick) = @_;
61 delete $me->{nicks}->{$cid}->{$nick};
64 ################################################################
65 sub get_nick_realname{
66 my($me, $cid, $nick) = @_;
67 $me->{nicks}->{$cid}->{$nick}->{realname};
70 ################################################################
72 my($me, $cid, $nick) = @_;
73 if(defined $me->{nicks}->{$cid}){
74 if(defined $me->{nicks}->{$cid}->{$nick}){
75 $me->{nicks}->{$cid}->{$nick}->{chop} = 1;
80 ################################################################
82 my($me, $cid, $nick) = @_;
83 if(defined $me->{nicks}->{$cid}){
84 if(defined $me->{nicks}->{$cid}->{$nick}){
85 $me->{nicks}->{$cid}->{$nick}->{chop} = 0;
90 ################################################################
92 my($me, $cid, $nick) = @_;
93 if(defined $me->{nicks}->{$cid}){
94 if(defined $me->{nicks}->{$cid}->{$nick}){
95 return $me->{nicks}->{$cid}->{$nick}->{chop};
100 ################################################################
107 $me->mtime($b) <=> $me->mtime($a)
108 } keys %{$me->{cid2name}});
111 ################################################################
114 my ($sec, $min, $hour) = localtime($t);
115 sprintf('%02d:%02d', $hour, $min);
118 ################################################################
121 my ($sec, $min, $hour, $day, $month, $year) = localtime($t);
122 sprintf('%04d/%02d/%02d', $year+1900, $month+1, $day);
125 ################################################################
128 my $raw_name = $name;
129 $name =~ tr/A-Z[\\]^/a-z{|}~/;
131 unless(defined $me->{name2cid}->{$name}){
132 my $cid = (sort { $b - $a } (keys %{$me->{cid2name}}))[0];
134 $me->{cid2name}->{$cid} = $raw_name;
135 $me->{name2cid}->{$name} = $cid;
138 $me->{name2cid}->{$name};
141 ################################################################
144 $me->{cid2name}->{$cid};
147 ################################################################
150 delete $me->{cid2name}->{$cid};
151 delete $me->{name2cid}->{$cid};
152 delete $me->{topic}->{$cid};
153 delete $me->{nicks}->{$cid};
154 delete $me->{tbuffer}->{$cid};
155 delete $me->{nbuffer}->{$cid};
156 delete $me->{mbuffer}->{$cid};
157 delete $me->{rbuffer}->{$cid};
160 ################################################################
162 my ($me, $name) = @_;
163 my $cid = $me->name2cid($name);
166 ################################################################
169 $me->{mtime}->{$cid} || 0;
172 ################################################################
175 scalar grep(/0/, @{$me->{rbuffer}->{$cid}});
178 ################################################################
180 my($me, $cid, $topic) = @_;
182 $me->{topic}->{$cid} = $topic;
184 $me->{topic}->{$cid};
187 ################################################################
190 ($me->{tbuffer}->{$cid}, $me->{nbuffer}->{$cid},
191 $me->{mbuffer}->{$cid}, $me->{rbuffer}->{$cid});
194 ################################################################
195 # 引数の $msg の charset は perl internal
197 my($me, $cid, $message, $who) = @_;
199 unless(defined $me->{tbuffer}->{$cid}){
200 $me->{tbuffer}->{$cid} = [];
202 unless(defined $me->{nbuffer}->{$cid}){
203 $me->{nbuffer}->{$cid} = [];
205 unless(defined $me->{mbuffer}->{$cid}){
206 $me->{mbuffer}->{$cid} = [];
208 unless(defined $me->{rbuffer}->{$cid}){
209 $me->{rbuffer}->{$cid} = [];
212 push @{$me->{tbuffer}->{$cid}}, time;
213 push @{$me->{nbuffer}->{$cid}}, $who;
214 push @{$me->{mbuffer}->{$cid}}, $message;
215 push @{$me->{rbuffer}->{$cid}}, 0;
217 if(@{$me->{tbuffer}->{$cid}} > $me->{history}){
218 shift @{$me->{tbuffer}->{$cid}};
220 if(@{$me->{nbuffer}->{$cid}} > $me->{history}){
221 shift @{$me->{nbuffer}->{$cid}};
223 if(@{$me->{mbuffer}->{$cid}} > $me->{history}){
224 shift @{$me->{mbuffer}->{$cid}};
226 if(@{$me->{rbuffer}->{$cid}} > $me->{history}){
227 shift @{$me->{rbuffer}->{$cid}};
230 if($me->{cid2name}->{$cid} eq '*console*') {
231 $me->{mtime}->{$cid} = -1;
233 $me->{mtime}->{$cid} = time;
237 ################################################################
239 # 返り値は Perl internal code
240 sub compact_channel_name{
243 my $name = $me->cid2name($cid);
245 return undef unless defined $name;
247 # #name:*.jp を %name に
248 if($name =~ s/:\*\.jp$//){
252 # 末尾の単独の @ は取る (plumプラグインのmulticast.plm対策)
253 # @ の後に空白が入ることもあるようだ。理由はわからない。
258 ################################################################
273 ################################################################
280 2 => '#000080', # Navy Blue
287 9 => '#32cd32', # Lime Green
290 12 => '#4169e1', # Royal Blue
291 13 => '#ff69b4', # Hot Pink
292 14 => '#a9a9a9', # Dark Gray
293 15 => '#d3d3d3', # Light Gray
297 return undef unless defined $_;
301 s|\x03(\d{1,2})|sprintf('</font><font color="%s">', $ct{0+$1})|e;
306 if(s|\x03(\d{1,2})|sprintf('<font color="%s">', $ct{0+$1})|e){
310 }while(m|\x03\d{1,2}|);
319 ################################################################
320 # 同一秒間の連続発言を防ぐためのチェック。
322 # 前回 update_timestamp() が呼ばれた時刻と同じ時刻に
323 # 再度 update_timestamp() が呼ばれたら 0 を返す。
325 # 前回 update_timestamp() が呼ばれた時刻と異なる時刻に
326 # 再度 update_timestamp() が呼ばれたら 1 を返す。
328 sub update_timestamp{
332 if($me->{timestamp} != $time){
333 $me->{timestamp} = $time;