From 3f65d48264430428a2165f6a9f5a4e16f823f6b8 Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Thu, 19 May 2016 19:49:39 -0400 Subject: Start new design docs --- lib/IRC/Client.pm6 | 174 ------------------------------------- lib/IRC/Client/Plugin.pm6 | 3 - lib/IRC/Client/Plugin/Debugger.pm6 | 8 -- lib/IRC/Client/Plugin/PingPong.pm6 | 2 - lib/IRC/Grammar.pm6 | 20 ----- lib/IRC/Grammar/Actions.pm6 | 26 ------ lib/IRC/Parser.pm6 | 7 -- 7 files changed, 240 deletions(-) delete mode 100644 lib/IRC/Client/Plugin.pm6 delete mode 100644 lib/IRC/Client/Plugin/Debugger.pm6 delete mode 100644 lib/IRC/Client/Plugin/PingPong.pm6 delete mode 100644 lib/IRC/Grammar.pm6 delete mode 100644 lib/IRC/Grammar/Actions.pm6 delete mode 100644 lib/IRC/Parser.pm6 (limited to 'lib/IRC') diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6 index 700739c..e69de29 100644 --- a/lib/IRC/Client.pm6 +++ b/lib/IRC/Client.pm6 @@ -1,174 +0,0 @@ -use v6; -use IRC::Parser; # parse-irc -use IRC::Client::Plugin::PingPong; -use IRC::Client::Plugin; -unit class IRC::Client; - -has Bool:D $.debug = False; -has Str:D $.host = 'localhost'; -has Str $.password; -has Int:D $.port where 0 <= $_ <= 65535 = 6667; -has Str:D $.nick = 'Perl6IRC'; -has Str:D $.username = 'Perl6IRC'; -has Str:D $.userhost = 'localhost'; -has Str:D $.userreal = 'Perl6 IRC Client'; -has Str:D @.channels = ['#perl6bot']; -has IO::Socket::Async $.sock; -has @.plugins = []; -has @.plugins-essential = [ - IRC::Client::Plugin::PingPong.new -]; -has @!plugs = [|@!plugins-essential, |@!plugins]; - -method handle-event ($e) { - $e = {}; - - for @!plugs.grep(*.^can: 'irc-all-events') -> $p { - my $res = $p.irc-all-events(self, $e); - return unless $res === IRC_NOT_HANDLED; - } - - # Wait for END_MOTD or ERR_NOMOTD before attempting to join - if $e eq '422' | '376' { - $.ssay("JOIN {@!channels[]}\n"); - .irc-connected: self for @!plugs.grep(*.^can: 'irc-connected'); - } - - my $nick = $!nick; - if ( ( $e eq 'PRIVMSG' and $e[0] eq $nick ) - or ( $e eq 'NOTICE' and $e[0] eq $nick ) - or ( $e eq 'PRIVMSG' - and $e[1] ~~ /:i ^ $nick <[,:]> \s+/ - ) - ) { - my %res = :where($e ), - :who( $e ), - :how( $e ), - :what( $e[1] ); - - %res = $e[0] # this message was said in the channel - unless ( $e eq 'PRIVMSG' and $e[0] eq $nick ) - or ( $e eq 'NOTICE' and $e[0] eq $nick ); - - %res.subst-mutate: /:i ^ $nick <[,:]> \s+/, '' - if %res ~~ /^ <[#&]>/; - - for @!plugs.grep(*.^can: 'irc-to-me') -> $p { - my $res = $p.irc-to-me(self, $e, %res); - return unless $res === IRC_NOT_HANDLED; - } - } - - if ( $e eq 'PRIVMSG' and $e[0] eq $!nick ) { - for @!plugs.grep(*.^can: 'irc-privmsg-me') -> $p { - my $res = $p.irc-privmsg-me(self, $e); - return unless $res === IRC_NOT_HANDLED; - } - } - - if ( $e eq 'NOTICE' and $e[0] eq $!nick ) { - for @!plugs.grep(*.^can: 'irc-notice-me') -> $p { - my $res = $p.irc-notice-me(self, $e); - return unless $res === IRC_NOT_HANDLED; - } - } - - my $cmd = 'irc-' ~ $e.lc; - for @!plugs.grep(*.^can: $cmd) -> $p { - my $res = $p."$cmd"(self, $e); - return unless $res === IRC_NOT_HANDLED; - } - - for @!plugs.grep(*.^can: 'irc-unhandled') -> $p { - my $res = $p.irc-unhandled(self, $e); - return unless $res === IRC_NOT_HANDLED; - } -} - -method notice (Str $who, Str $what) { - my $msg = "NOTICE $who :$what\n"; - $!debug and "{plug-name}$msg".put; - $!sock.print("$msg\n"); - self; -} - -method privmsg (Str $who, Str $what) { - my $msg = "PRIVMSG $who :$what\n"; - $!debug and "{plug-name}$msg".put; - $!sock.print("$msg\n"); - self; -} - -method respond ( - Str:D :$how = 'privmsg', - Str:D :$where is required, - Str:D :$what is required is copy, - Str:D :$who, - :$when where Any|Dateish|Instant; - # TODO: remove Any: https://rt.perl.org/Ticket/Display.html?id=127142 -) { - $what = "$who, $what" if $who and $where ~~ /^<[#&]>/; - my $method = $how.fc eq 'PRIVMSG'.fc ?? 'privmsg' - !! $how.fc eq 'NOTICE'.fc ?? 'notice' - !! fail 'Unknown :$how specified. Use PRIVMSG or NOTICE'; - - if $when { - Promise.at($when).then: { self."$method"($where, $what) }; - CATCH { warn .backtrace } - } - else { - self."$method"($where, $what); - } - self; -} - -method run { - .irc-start-up: self for @!plugs.grep(*.^can: 'irc-start-up'); - - await IO::Socket::Async.connect( $!host, $!port ).then({ - $!sock = .result; - $.ssay("PASS $!password\n") if $!password.defined; - $.ssay("NICK $!nick\n"); - $.ssay("USER $!username $!username $!host :$!userreal\n"); - - # my $left-overs = ''; - react { - whenever $!sock.Supply :bin -> $buf is copy { - 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 = parse-irc $str; - for @$events -> $e { - self.handle-event: $e; - CATCH { warn .backtrace } - } - } - - CATCH { warn .backtrace } - } - - say "Closing connection"; - $!sock.close; - - # CATCH { warn .backtrace } - }); -} - -method ssay (Str:D $msg) { - $!debug and "{plug-name}$msg".put; - $!sock.print("$msg\n"); - self; -} - -#### HELPER SUBS - -sub plug-name { - my $plug = callframe(3).file; - my $cur = $?FILE; - return '[core] ' if $plug eq $cur; - $cur ~~ s/'.pm6'$//; - $plug ~~ s:g/^ $cur '/' | '.pm6'$//; - $plug ~~ s/'/'/::/; - return "[$plug] "; -} diff --git a/lib/IRC/Client/Plugin.pm6 b/lib/IRC/Client/Plugin.pm6 deleted file mode 100644 index d73d7bd..0000000 --- a/lib/IRC/Client/Plugin.pm6 +++ /dev/null @@ -1,3 +0,0 @@ -constant IRC_HANDLED = "irc plugin handled \x1"; -constant IRC_NOT_HANDLED = "irc plugin not-handled \x2"; -unit class IRC::Client::Plugin; diff --git a/lib/IRC/Client/Plugin/Debugger.pm6 b/lib/IRC/Client/Plugin/Debugger.pm6 deleted file mode 100644 index 13b1461..0000000 --- a/lib/IRC/Client/Plugin/Debugger.pm6 +++ /dev/null @@ -1,8 +0,0 @@ -use Data::Dump; -use IRC::Client::Plugin; -unit class IRC::Client::Plugin::Debugger is IRC::Client::Plugin; - -method irc-all-events ($irc, $e) { - say Dump $e, :indent(4); - return IRC_NOT_HANDLED; -} diff --git a/lib/IRC/Client/Plugin/PingPong.pm6 b/lib/IRC/Client/Plugin/PingPong.pm6 deleted file mode 100644 index 2651fd6..0000000 --- a/lib/IRC/Client/Plugin/PingPong.pm6 +++ /dev/null @@ -1,2 +0,0 @@ -unit class IRC::Client::Plugin::PingPong; -method irc-ping ($irc, $e) { $irc.ssay("PONG {$irc.nick} $e[0]") } diff --git a/lib/IRC/Grammar.pm6 b/lib/IRC/Grammar.pm6 deleted file mode 100644 index c05322c..0000000 --- a/lib/IRC/Grammar.pm6 +++ /dev/null @@ -1,20 +0,0 @@ -unit grammar IRC::Grammar; -token TOP { + } -token SPACE { ' '+ } -token message { [':' ]? \n } - token prefix { - [ || ['!' ]? ['@' ]? ] - > - } - token servername { } - token nick { [ | | ]* } - token user { <-[\ \x0\r\n]>+? | '@']>} - token host { <-[\s!@]>+ } - token command { + | **3 } - token params { * [ ':' | ]? } - token middle { <-[:\ \x0\r\n]> <-[\ \x0\r\n]>* } - token trailing { <-[\x0\r\n]>* } - - token letter { <[a..zA..Z]> } - token number { <[0..9]> } - token special { <[-_\[\]\\`^{}]> } diff --git a/lib/IRC/Grammar/Actions.pm6 b/lib/IRC/Grammar/Actions.pm6 deleted file mode 100644 index 234e392..0000000 --- a/lib/IRC/Grammar/Actions.pm6 +++ /dev/null @@ -1,26 +0,0 @@ -unit class IRC::Grammar::Actions; -method TOP ($/) { $/.make: $>>.made } -method message ($/) { - my $pref = $/; - my %args = command => ~$/; - for qw/nick user host/ { - $pref{$_}.defined or next; - %args{$_} = $pref{$_}.Str; - } - %args = ~$pref if $pref.defined; - - my $p = $/; - - for ^100 { # bail out after 100 iterations; we're stuck - if ( $p.defined ) { - %args.append: ~$p; - } - if ( $p.defined ) { - %args.append: ~$p; - last; - } - $p = $p; - } - - $/.make: %args; -} diff --git a/lib/IRC/Parser.pm6 b/lib/IRC/Parser.pm6 deleted file mode 100644 index dda05e6..0000000 --- a/lib/IRC/Parser.pm6 +++ /dev/null @@ -1,7 +0,0 @@ -use IRC::Grammar; -use IRC::Grammar::Actions; -unit class IRC::Parser; - -sub parse-irc (Str:D $input) is export { - IRC::Grammar.parse($input, actions => IRC::Grammar::Actions).made // []; -} -- cgit v1.1