diff options
Diffstat (limited to 'lib/IRC/Client')
-rw-r--r-- | lib/IRC/Client/Grammar.pm6 | 6 | ||||
-rw-r--r-- | lib/IRC/Client/Grammar/Actions.pm6 | 34 | ||||
-rw-r--r-- | lib/IRC/Client/Message.pm6 | 9 | ||||
-rw-r--r-- | lib/IRC/Client/Message/Numeric.pm6 | 4 |
4 files changed, 45 insertions, 8 deletions
diff --git a/lib/IRC/Client/Grammar.pm6 b/lib/IRC/Client/Grammar.pm6 index 255528a..a258e56 100644 --- a/lib/IRC/Client/Grammar.pm6 +++ b/lib/IRC/Client/Grammar.pm6 @@ -9,12 +9,12 @@ token message { [':' <prefix> <SPACE> ]? <command> <params> \n } } token servername { <host> } token nick { <letter> [ <letter> | <number> | <special> ]* } - token user { <-[\ \x0\r\n]>+? <before [<SPACE> | '@']>} + token user { <-[\ \x[0]\r\n]>+? <before [<SPACE> | '@']>} token host { <-[\s!@]>+ } token command { <letter>+ | <number>**3 } token params { <SPACE>* [ ':' <trailing> | <middle> <params> ]? } - token middle { <-[:\ \x0\r\n]> <-[\ \x0\r\n]>* } - token trailing { <-[\x0\r\n]>* } + token middle { <-[:\ \x[0]\r\n]> <-[\ \x[0]\r\n]>* } + token trailing { <-[\x[0]\r\n]>* } token letter { <[a..zA..Z]> } token number { <[0..9]> } diff --git a/lib/IRC/Client/Grammar/Actions.pm6 b/lib/IRC/Client/Grammar/Actions.pm6 index 74ae4e8..3e190cd 100644 --- a/lib/IRC/Client/Grammar/Actions.pm6 +++ b/lib/IRC/Client/Grammar/Actions.pm6 @@ -1,22 +1,28 @@ unit class IRC::Client::Grammar::Actions; +use IRC::Client::Message::Numeric; + +has $.irc; +has $.server; + method TOP ($/) { $/.make: ($<message>ยป.made, $<left-overs>) } + method left-overs ($/) { $/.made: $/.defined ?? !$/ !! ''; } method message ($/) { + my %args; my $pref = $/<prefix>; - my %args = command => ~$/<command>; for qw/nick user host/ { $pref{$_}.defined or next; - %args<who>{$_} = $pref{$_}.Str; + %args<who>{$_} = ~$pref{$_}; } %args<who><host> = ~$pref<servername> if $pref<servername>.defined; - my $p = $/<params>; + my $p = $<params>; - for ^100 { # bail out after 100 iterations; we're stuck + loop { if ( $p<middle>.defined ) { %args<params>.append: ~$p<middle>; } @@ -27,5 +33,23 @@ method message ($/) { $p = $p<params>; } - $/.make: %args; + my %msg-args = + irc => $!irc, + nick => %args<who><nick>, + username => %args<who><user>, + host => %args<who><host>, + usermask => "%args<who><nick>!%args<who><user>@%args<who><host>", + server => $!server; + + my $msg; + given ~$<command> { + when /^ ([0..9]**3) $/ { + $msg = IRC::Client::Message::Numeric.new: + :command( $<command> ), + :args( %args<params> ), + |%msg-args; + } + } + + $/.make: $msg; } diff --git a/lib/IRC/Client/Message.pm6 b/lib/IRC/Client/Message.pm6 new file mode 100644 index 0000000..6670baa --- /dev/null +++ b/lib/IRC/Client/Message.pm6 @@ -0,0 +1,9 @@ +unit role IRC::Client::Message; + +has $.irc; +has $.nick; +has $.username; +has $.host; +has $.usermask; +has $.server; +has $.command; diff --git a/lib/IRC/Client/Message/Numeric.pm6 b/lib/IRC/Client/Message/Numeric.pm6 new file mode 100644 index 0000000..c57c3c2 --- /dev/null +++ b/lib/IRC/Client/Message/Numeric.pm6 @@ -0,0 +1,4 @@ +use IRC::Client::Message; +unit role IRC::Client::Message::Numeric does IRC::Client::Message; + +has @.args; |