package ParseIRC; # # This is a really cheesy module that I threw together # for parsing IRC lines. It is a tool of the parse_irc program. # # * My friends, coral and japhy, rescued me, by sorting-out the # (?: ($blah) | ($foo)) => defined($1) ? $1 : $2 # regular expression things, on 01/07/01. # # THERE ARE NO COMMENTS. YOU'RE ON YOU'RE OWN. # use strict; use base qw(Exporter); use vars qw($VERSION @EXPORT @EXPORT_OK); $VERSION = '0.0.5'; @EXPORT_OK = @EXPORT = qw( add_nick all_nicks del_nick is_nick match_target parse_line register_target ); # Use substring matching and nore flexible punctuation. #use String::Approx qw(amatch); # too! my %NICKNAMES = (); my $TIMESTAMP = '[^\]]+\]'; my $NICK_RE = '[\w\-\[\]{}`]+'; my $CHANNEL = '(?: \/\#[^>]+ )?'; my $HELLO = '(?: hello|heya|hi|howdy|salut|yo )?'; my $HELLO_PUNCTUATION = '[!,.]'; my $TARGET_PUNCTUATION = '(?: [\-:>] )?'; sub parse_line { $_ = shift; return m/^ \s* ($TIMESTAMP) \s+ (?: \* \s+ ($NICK_RE) | < ($NICK_RE) $CHANNEL > ) \s+ (.+?) \s* $/iox ? ($1, defined($2) ? $2 : $3, $4) : (); } sub match_target { $_ = shift; return m/^ \s* (?: ($NICK_RE) \s* $TARGET_PUNCTUATION | $HELLO \s+ ($NICK_RE) \s* $HELLO_PUNCTUATION ) \s+ (.*?) \s* $/iox ? ($1, $2) : (); } sub all_nicks { return \%NICKNAMES } sub is_nick { my $nick = shift; return exists $NICKNAMES{$nick}; } sub add_nick { my $nick = shift; $NICKNAMES{$nick} = {}; return "Added: $nick"; } sub del_nick { my $nick = shift; if (is_nick($nick)) { delete $NICKNAMES{$nick}; return "Deleted: $nick"; } else { return "Delete error - No such nick: '$nick'" } } sub register_target { my ($nick, $target) = @_; if (is_nick($nick)) { if ($target) { $NICKNAMES{$nick}->{$target}++ } else { warn "No target provided for '$nick'" } } else { die "'$nick' is not in the list of nicknames." } } #--------------------# 1;