All pastes #675954 Raw Edit

Untitled

public text v1 · immutable
#675954 ·published 2007-08-30 17:20 UTC
rendered paste body
package IRC::Parser; 

use strict; 
use warnings; 

# ok, the idea here.. 
# plugin always takes precedence, this way any protocol fixes for any ircd.. 
# can be easily added, defined.. 
# IRC does not need parsed twice, I really could give a fuck if someone thinks they 
# NEED TO in some special case.. so if they define a plugin, handle the line there!! simple enough.. 
# and I can't see any need in defining a protocol fix twice, so I'm not iterating through a list of them
# not that it'd be anymore difficult, just it'd be pointless to do so.


sub spawn { 
  my $class = shift;
  bless {
    origin => undef, 
    command => undef, 
    target => undef,
    args => undef, 
    text => undef, 
    raw => undef
  }, $class; 
} 

# ?origin? - command - ?target? - ?arguments? - ?text?
sub break { 
  my $self = shift;
  (local $_ = ($self->{raw} = shift || $_)) =~ s/[\r\n]$//g; 
  if(@{ $self }{qw(origin command target args text)} = $_ =~ /^
    (?:\x3a(\S+)\x20+)?
    (\d{3}|[A-Za-z]+)
    (?: 
      \x20+
      ((?!\x3a)\S+)
      \x20*		
      (
        (?:\x20*(?!\x3a)\S+)*
      )
    )?
    \x20*
    \x3a?
    (.*)
  $/x) { # gotta love that gibberish, IRC is a ludicrous protocol 
    my @broken = ($1, ($self->{command} = uc($2)), $3, $4, $5); 
    wantarray() ? @broken : \@broken;
  } else { warn "Failed to parse ($_); string does not conform to IRC protocol."; } 
} 

1;
__END__