OSDN Git Service

8b72c593dd22d16eba754ada9068c8ba1daf868a
[keitairc/keitairc.git] / lib / Keitairc / IrcBuffer.pm
1 # -*-perl-*-
2 # Keitairc::IrcBuffer
3 # $Id: IrcBuffer.pm,v 1.1 2008-01-08 05:52:14 morimoto Exp $
4 # $Source: /home/ishikawa/work/keitairc/tmp/keitairc/lib/Keitairc/IrcBuffer.pm,v $
5 #
6 # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
7 # This program is covered by the GNU General Public License 2
8
9 package Keitairc::IrcBuffer;
10 use strict;
11 use Encode;
12
13 ################################################################
14 sub new{
15         my $proto = shift;
16         my $arg = shift;
17         my $me = {};
18
19         $me->{history} = $arg->{history};
20
21         # join ¤·¤Æ¤¤¤ë¥Á¥ã¥Í¥ë¤Î̾¾Î¤òµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (jis)
22         $me->{name} = {};
23
24         # join ¤·¤Æ¤¤¤ë¥Á¥ã¥Í¥ë¤Î̾¾Î¤òµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (jis)
25         $me->{topic} = {};
26
27         # ¥Á¥ã¥Í¥ë¤Î²ñÏÃÆâÍƤòµ­Ï¿¤¹¤ë¥Ï¥Ã¥·¥å (euc-jp)
28         $me->{buffer} = {};
29         $me->{unread} = {};
30
31         # ³Æ¥Á¥ã¥Í¥ë¤ÎºÇ½ª¥¢¥¯¥»¥¹»þ¹ï¡¢ºÇ¿·È¯¸À»þ¹ï
32         $me->{mtime} = {};
33         # ³Æ¥Á¥ã¥Í¥ë¤Î̤ÆɹԿô
34         $me->{unread_lines} = {};
35
36         # chk
37         $me->{message_added} = 0;
38
39         bless $me;
40 }
41
42 ################################################################
43 sub channels{
44         my $me = shift;
45         sort {
46                 $me->mtime($b) <=> $me->mtime($a)
47         } keys %{$me->{name}};
48 }
49
50 ################################################################
51 sub now{
52         my ($sec, $min, $hour) = localtime(time);
53         sprintf('%02d:%02d', $hour, $min);
54 }
55
56 ################################################################
57 sub canon_name{
58         local($_) = shift;
59         tr/A-Z[\\]^/a-z{|}~/;
60         $_;
61 }
62
63 ################################################################
64 sub part{
65         my($me, $channel) = @_;
66         my $cc = canon_name($channel);
67         delete $me->{name}->{$cc};
68 }
69
70 ################################################################
71 sub join{
72         my($me, $channel) = @_;
73         my $cc = canon_name($channel);
74         $me->{name}->{$cc} = $channel;
75 }
76
77 ################################################################
78 sub mtime{
79         my($me, $channel) = @_;
80         my $cc = canon_name($channel);
81         $me->{mtime}->{$cc};
82 }
83
84 ################################################################
85 sub name{
86         my($me, $channel) = @_;
87         my $cc = canon_name($channel);
88         $me->{name}->{$cc};
89 }
90
91 ################################################################
92 sub message_added{
93         my($me, $v) = @_;
94         if(defined $v){
95                 $me->{message_added} = $v;
96         }
97         $me->{message_added};
98 }
99
100 ################################################################
101 sub unread_lines{
102         my($me, $channel) = @_;
103         my $cc = canon_name($channel);
104         $me->{unread_lines}->{$cc};
105 }
106
107 ################################################################
108 sub unread{
109         my($me, $channel) = @_;
110         my $cc = canon_name($channel);
111         $me->{unread}->{$cc};
112 }
113
114 ################################################################
115 sub clear_unread{
116         my($me, $channel) = @_;
117         my $cc = canon_name($channel);
118         $me->{unread}->{$cc} = '';
119         $me->{unread_lines}->{$cc} = 0;
120 }
121
122 ################################################################
123 sub topic{
124         my($me, $channel, $topic) = @_;
125         my $cc = canon_name($channel);
126         if(defined $topic){
127                 $me->{topic}->{$cc} = $topic;
128         }
129         $me->{topic}->{$cc};
130 }
131
132 ################################################################
133 sub buffer{
134         my($me, $channel) = @_;
135         my $cc = canon_name($channel);
136         $me->{buffer}->{$cc};
137 }
138
139 ################################################################
140 # °ú¿ô¤Î $msg ¤Ï euc-jp, $channel ¤Ï jis
141 sub add_message{
142         my($me, $channel, $message, $who) = @_;
143         my $cc = canon_name($channel);
144
145         if(length $who){
146                 $message = sprintf('%s %s> %s', now(), $who, $message);
147         }else{
148                 $message = sprintf('%s %s', now(), $message);
149         }
150
151         {
152                 my @tmp = split("\n", $me->{buffer}->{$cc});
153                 push @tmp, $message;
154
155                 if(@tmp > $me->{history}){
156                         $me->{buffer}->{$cc} =
157                                 CORE::join("\n", splice(@tmp, -$me->{history}));
158                 }else{
159                         $me->{buffer}->{$cc} = CORE::join("\n", @tmp);
160                 }
161         }
162
163         {
164                 my @tmp = split("\n", $me->{unread}->{$cc});
165                 push @tmp, $message;
166
167                 if(@tmp > $me->{history}){
168                         $me->{unread}->{$cc} =
169                                 CORE::join("\n", @tmp[1 .. $me->{history}]);
170                 }else{
171                         $me->{unread}->{$cc} = CORE::join("\n", @tmp);
172                 }
173
174                 $me->{unread_lines}->{$cc} = scalar(@tmp);
175         }
176
177         if($me->{unread_lines}->{$cc} > $me->{history}){
178                 $me->{unread_lines}->{$cc} = $me->{history};
179         }
180
181         $me->{mtime}->{$cc} = time;
182 }
183
184 ################################################################
185 # ¥Á¥ã¥Í¥ë̾¾Î¤òû¤«¤¯¤¹¤ë
186 sub compact_channel_name{
187         my $me = shift;
188         my $name = shift;
189
190         $name = decode('jis', $name);
191
192         # #name:*.jp ¤ò %name ¤Ë
193         if($name =~ s/:\*\.jp$//){
194                 $name =~ s/^#/%/;
195         }
196
197         # ËöÈø¤ÎñÆȤΠ@ ¤Ï¼è¤ë (plum¥×¥é¥°¥¤¥ó¤Îmulticast.plmÂкö)
198         $name =~ s/\@$//;
199
200         encode('shiftjis', $name);
201 }
202
203 ################################################################
204 sub simple_escape{
205         my $me = shift;
206         local($_) = shift;
207         s/&/&amp;/g;
208         s/>/&gt;/g;
209         s/</&lt;/g;
210         $_;
211 }
212
213 1;