aboutsummaryrefslogtreecommitdiff
path: root/lib/IRC/Client/Grammar/Actions.pm6
diff options
context:
space:
mode:
Diffstat (limited to 'lib/IRC/Client/Grammar/Actions.pm6')
-rw-r--r--lib/IRC/Client/Grammar/Actions.pm634
1 files changed, 29 insertions, 5 deletions
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;
}