aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZoffix Znet <cpan@zoffix.com>2016-06-04 10:32:49 -0400
committerZoffix Znet <cpan@zoffix.com>2016-06-04 10:32:49 -0400
commitcb0a6cace8871d17c9701edc1ccba26d1e6e0bfe (patch)
tree9a28a7b42927556ab6c19ed2260f5211c2ca71c4 /lib
parent0daa494480f7abe37a6e593c6238811009b7b914 (diff)
Wtf
Diffstat (limited to 'lib')
-rw-r--r--lib/IRC/Client.pm630
-rw-r--r--lib/IRC/Client/Grammar.pm66
-rw-r--r--lib/IRC/Client/Grammar/Actions.pm634
-rw-r--r--lib/IRC/Client/Message.pm69
-rw-r--r--lib/IRC/Client/Message/Numeric.pm64
5 files changed, 62 insertions, 21 deletions
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 { [':' <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;