File Coverage

blib/lib/Regexp/Common/IRC.pm
Criterion Covered Total %
statement 6 6 100.0
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 8 8 100.0


line stmt bran cond sub pod time code
1             package Regexp::Common::IRC;
2             $VERSION = 0.04;
3 7     7   120440 use strict;
  7         17  
  7         396  
4 7     7   1260 use Regexp::Common qw(pattern clean no_defaults);
  7         8054  
  7         268  
5              
6             =pod
7              
8             =head1 NAME
9              
10             Regexp::Common::IRC - provide patterns for parsing IRC messages
11              
12             =head1 SYNOPSIS
13              
14             use Regexp::Common qw(IRC);
15            
16             sub trigger {
17             my ($self, $msg) = @_;
18             my $CMD = qr/^summon[:,]?
19             \s*$RE{IRC}{nick}{-keep}\s*
20             (?:to\s*$RE{IRC}{channel}{-keep})?
21             [?.!]*
22             /ix;
23             if ($msg =~ $CMD) {
24             $self->{who} = $1;
25             $self->{to} = $2;
26             return 1;
27             }
28             return 0;
29             }
30            
31             =head1 EBNF for IRC
32              
33             based upon Section 2.3.1 of RFC 2812
34             (L)
35              
36             target = nickname / server
37             msgtarget = msgto *( "," msgto )
38             msgto = channel / ( user [ "%" host ] "@" servername )
39             msgto =/ ( user "%" host ) / targetmask
40             msgto =/ nickname / ( nickname "!" user "@" host )
41             channel = ( "#" / "+" / ( "!" channelid ) / "&" ) chanstring
42             [ ":" chanstring ]
43             servername = hostname
44             host = hostname / hostaddr
45             hostname = shortname *( "." shortname )
46             shortname = ( letter / digit ) *( letter / digit / "-" )
47             *( letter / digit ); as specified in RFC 1123 [HNAME]
48             hostaddr = ip4addr / ip6addr
49             ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
50             ip6addr = 1*hexdigit 7( ":" 1*hexdigit ) / "0:0:0:0:0:" ( "0" / "FFFF" ) ":" ip4addr
51            
52             nickname = ( letter / special ) *8( letter / digit / special / "-" )
53             targetmask = ( "$" / "#" ) mask; see details on allowed masks in section 3.3.1
54             chanstring = %x01-07 / %x08-09 / %x0B-0C / %x0E-1F / %x21-2B / %x2D-39 / %x3B-FF
55             ; any octet except NUL, BELL, CR, LF, " ", "," and ":"
56             channelid = 5( %x41-5A / digit ) ; 5( A-Z / 0-9 )
57             user = 1*( %x01-09 / %x0B-0C / %x0E-1F / %x21-3F / %x41-FF )
58             ; any octet except NUL, CR, LF, " " and "@"
59             key = 1*23( %x01-05 / %x07-08 / %x0C / %x0E-1F / %x21-7F )
60             ; any 7-bit US_ASCII character,
61             ; except NUL, CR, LF, FF, h/v TABs, and " "
62             letter = %x41-5A / %x61-7A ; A-Z / a-z
63             digit = %x30-39 ; 0-9
64             hexdigit = digit / "A" / "B" / "C" / "D" / "E" / "F"
65             special = %x5B-60 / %x7B-7D
66             ; "[", "]", "\", "`", "_", "^", "{", "|", "}"
67              
68             =cut
69              
70             my $letter = '[A-Za-z]';
71             pattern
72             name => [qw(IRC letter -keep)],
73             create => qq/(?k:$letter)/,
74             ;
75              
76             my $digit = '[0-9]';
77             pattern
78             name => [qw(IRC digit -keep)],
79             create => qq/(?k:$digit)/,
80             ;
81              
82             my $hexdigit = "(?:$digit|[A-F])";
83             pattern
84             name => [qw(IRC hexdigit -keep)],
85             create => qq/(?k:$hexdigit)/,
86             ;
87              
88             my $special = '[\x{5B}-\x{60}\x{7B}\x{7D}]';
89             pattern
90             name => [qw(IRC special -keep)],
91             create => qq/(?k:$special)/,
92             ;
93              
94             my $user =
95             '(?:[\x{01}-\x{09}\x{0B}-\x{0C}\x{0E}-\x{1F}\x{21}-\x{3F}\x{41}-\x{FF}])?';
96             pattern
97             name => [qw(IRC user -keep)],
98             create => qq/(?k:$user)/,
99             ;
100              
101             my $key =
102             '(?:[\x{01}-\x{05}\x{07}-\x{08}\x{0C}\x{0E}-\x{1F}\x{21}-\x{7F}]{1,23})';
103             pattern
104             name => [qw(IRC key -keep)],
105             create => qq/(?k:$key)/,
106             ;
107              
108             my $chanstring =
109             '[\x{01}-\x{07}\x{08}-\x{09}\x{0B}-\x{0C}\x{0E}-\x{1F}\x{21}-\x{2B}';
110             $chanstring .= '\x{2D}-\x{39}\x{3B}-\x{FF}]{1,29}';
111             pattern
112             name => [qw(IRC chanstring -keep)],
113             create => qq/(?k:$chanstring)/,
114             ;
115              
116             my $channelid = "(?:[A-Z]|$digit){5}";
117             pattern
118             name => [qw(IRC channelid -keep)],
119             create => qq/(?k:$channelid)/,
120             ;
121              
122             my $nowild = "(?:[\x{01}-\x{29}\x{2B}-\x{3E}\x{40}-\x{FF}])";
123             pattern
124             name => [qw(IRC mask nowild -keep)],
125             create => qq/(?k:$nowild)/,
126             ;
127              
128             my $noesc = "[\x{01}-\x{5B}\x{5D}-\x{FF}]";
129             pattern
130             name => [qw(IRC mask noesc -keep)],
131             create => qq/(?k:$noesc)/,
132             ;
133              
134             my $wildone = "[\x{3F}]";
135             pattern
136             name => [qw(IRC mask wildone -keep)],
137             create => qq/(?k:$wildone)/,
138             ;
139              
140             my $wildmany = "[\x{2A}]";
141             pattern
142             name => [qw(IRC mask wildmany -keep)],
143             create => qq/(?k:$wildmany)/,
144             ;
145              
146             my $mask = "(?:$nowild|$noesc|$wildone|$noesc$wildmany)*";
147             pattern
148             name => [qw(IRC mask -keep)],
149             create => qq/(?k:$mask)/,
150             ;
151              
152             my $targetmask = "(?:\$|\#)$mask";
153             pattern
154             name => [qw(IRC targetmask -keep)],
155             create => qq/(?k:$targetmask)/,
156             ;
157              
158             my $nick = "(?:$letter|$special)(?:$letter|$digit|$special|-){0,19}";
159             pattern
160             name => [qw(IRC nick -keep)],
161             create => qq/(?k:$nick)/,
162             ;
163              
164             my $shortname = "(?:$letter|$digit)(?:$letter|$digit|\-)*(?:$letter|$digit)*";
165             pattern
166             name => [qw(IRC shortname -keep)],
167             create => qq/(?k:$shortname)/,
168             ;
169              
170             my $hostname = "$shortname(?:\.$shortname)*";
171             pattern
172             name => [qw(IRC hostname -keep)],
173             create => qq/(?k:$hostname)/,
174             ;
175              
176             my $ip4addr =
177             "(?:$digit){1,3}\.(?:$digit){1,3}\.(?:$digit){1,3}\.(?:$digit){1,3}";
178             pattern
179             name => [qw(IRC ip4addr -keep)],
180             create => qq/(?k:$ip4addr)/,
181             ;
182              
183             my $ip6addr = "(?:$hexdigit(?:\:$hexdigit){7})";
184             $ip6addr .= "|(?:0\:0\:0\:0\:0\:(?:0|FFFF)\:$ip4addr)";
185             pattern
186             name => [qw(IRC ip6addr -keep)],
187             create => qq/(?k:$ip6addr)/,
188             ;
189              
190             my $hostaddr = "(?:$ip4addr|$ip6addr)";
191             pattern
192             name => [qw(IRC hostaddr -keep)],
193             create => qq/(?k:$hostaddr)/,
194             ;
195              
196             my $host = "$hostname|$hostaddr";
197             pattern
198             name => [qw(IRC host -keep)],
199             create => qq/(?k:$host)/,
200             ;
201              
202             my $server = $hostname;
203             pattern
204             name => [qw(IRC server -keep)],
205             create => qq/(?k:$server)/,
206             ;
207              
208             my $channel = "(?:[#+&]|!$channelid)$chanstring(?:\:$chanstring)?";
209             pattern
210             name => [qw(IRC channel -keep)],
211             create => qq/(?k:$channel)/,
212             ;
213              
214             my $msgto = "(?:$channel|$user\[\%$host\]\@$server)";
215             $msgto .= "|$user\%$host|$targetmask";
216             $msgto .= "|(?:$nick|$nick!$user\@$host)";
217             pattern
218             name => [qw(IRC msgto -keep)],
219             create => qq/(?k:$msgto/,
220             ;
221              
222             my $msgtarget = "(?:$msgto(?:,$msgto)*)";
223             pattern
224             name => [qw(IRC msgtarget -keep)],
225             create => qq/(?k:$msgtarget)/,
226             ;
227              
228             my $target = "(?:$nick|$server)";
229             pattern
230             name => [qw(IRC target -keep)],
231             create => qq/(?k:$target)/,
232             ;
233              
234             =head1 SEE ALSO
235              
236             L for a general description of how to use this interface.
237              
238             =head1 MAINTAINANCE
239              
240             This package is maintained by Chris Prather S<(I)>.
241              
242             =head1 COPYRIGHT
243              
244             Copyright (c) 2005, Chris Prather. All Rights Reserved.
245             This module is free software. It may be used, redistributed
246             and/or modified under the terms of the Perl Artistic License (see
247             L)
248              
249             =cut
250              
251             1;