From cb0a6cace8871d17c9701edc1ccba26d1e6e0bfe Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Sat, 4 Jun 2016 10:32:49 -0400 Subject: Wtf --- examples/bot.pl6 | 18 +++++++++++++----- lib/IRC/Client.pm6 | 30 +++++++++++++++++------------- lib/IRC/Client/Grammar.pm6 | 6 +++--- lib/IRC/Client/Grammar/Actions.pm6 | 34 +++++++++++++++++++++++++++++----- lib/IRC/Client/Message.pm6 | 9 +++++++++ lib/IRC/Client/Message/Numeric.pm6 | 4 ++++ 6 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 lib/IRC/Client/Message.pm6 create mode 100644 lib/IRC/Client/Message/Numeric.pm6 diff --git a/examples/bot.pl6 b/examples/bot.pl6 index 3737de1..94eb929 100644 --- a/examples/bot.pl6 +++ b/examples/bot.pl6 @@ -1,8 +1,16 @@ use v6; use lib 'lib'; -use IRC::Client; +use IRC::Client::Grammar; +use IRC::Client::Grammar:Actions; -my $irc = IRC::Client.new( - :debug - :port<5667> -).run; +say IRC::Client::Grammar.parse( + 'PRIVMSG #perl6 :hello', + actions => IRC::Client::Grammar::Actions.new, +).made; + +# use IRC::Client; +# +# my $irc = IRC::Client.new( +# :debug +# :port<5667> +# ).run; diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6 index 7c30c4a..7d8369a 100644 --- a/lib/IRC/Client.pm6 +++ b/lib/IRC/Client.pm6 @@ -13,6 +13,7 @@ has Str:D $.userhost = 'localhost'; has Str:D $.userreal = 'Perl6 IRC Client'; has Str:D @.channels = ['#perl6']; has @.plugins; +has @.servers; has IO::Socket::Async $!sock; method run { @@ -28,24 +29,17 @@ method run { my $str = try $buf.decode: 'utf8'; $str or $str = $buf.decode: 'latin-1'; $str ~= $left-overs; - $!debug and "[server {DateTime.now}] {$str}".put; - (my $events, $left-overs) = IRC::Client::Grammar.parse( - $str, actions => IRC::Client::Grammar::Actions - ).made; - - for @$events -> $e { - say "[event] $e"; - CATCH { warn .backtrace } - } + + (my $events, $left-overs) = self!parse: $str; + # for @$events -> $e { + # say "[event] $e"; + # CATCH { warn .backtrace } + # } } CATCH { warn .backtrace } } - - say "Closing connection"; $!sock.close; - - # CATCH { warn .backtrace } }); } @@ -54,3 +48,13 @@ method !ssay (Str:D $msg) { $!sock.print("$msg\n"); self; } + +method !parse (Str:D $str) { + return IRC::Client::Grammar.parse( + $str, + actions => IRC::Client::Grammar::Actions.new( + irc => self, + server => 'dummy', + ), + ).made; +} 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 { [':' ]? \n } } token servername { } token nick { [ | | ]* } - token user { <-[\ \x0\r\n]>+? | '@']>} + token user { <-[\ \x[0]\r\n]>+? | '@']>} token host { <-[\s!@]>+ } token command { + | **3 } token 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: ($ยป.made, $) } + method left-overs ($/) { $/.made: $/.defined ?? !$/ !! ''; } method message ($/) { + my %args; my $pref = $/; - my %args = command => ~$/; for qw/nick user host/ { $pref{$_}.defined or next; - %args{$_} = $pref{$_}.Str; + %args{$_} = ~$pref{$_}; } %args = ~$pref if $pref.defined; - my $p = $/; + my $p = $; - for ^100 { # bail out after 100 iterations; we're stuck + loop { if ( $p.defined ) { %args.append: ~$p; } @@ -27,5 +33,23 @@ method message ($/) { $p = $p; } - $/.make: %args; + my %msg-args = + irc => $!irc, + nick => %args, + username => %args, + host => %args, + usermask => "%args!%args@%args", + server => $!server; + + my $msg; + given ~$ { + when /^ ([0..9]**3) $/ { + $msg = IRC::Client::Message::Numeric.new: + :command( $ ), + :args( %args ), + |%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; -- cgit v1.1