From c8a1b2b886a9b6367e1a278e700265244d88aa25 Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Sun, 12 Jul 2020 17:36:32 -0700 Subject: [PATCH] Progress on embedding Plang --- Plang | 2 +- Plugins/Plang.pm | 82 +++++++++++++++--------------------------------- 2 files changed, 26 insertions(+), 58 deletions(-) diff --git a/Plang b/Plang index 80f9afa6..67469a66 160000 --- a/Plang +++ b/Plang @@ -1 +1 @@ -Subproject commit 80f9afa670d2e96cd4b70df69c052a490d499273 +Subproject commit 67469a66f11f00434f6d3eb946764ccfbf4a80cd diff --git a/Plugins/Plang.pm b/Plugins/Plang.pm index 3bba1e15..13190bb6 100644 --- a/Plugins/Plang.pm +++ b/Plugins/Plang.pm @@ -30,9 +30,18 @@ sub initialize { $self->{plang} = Plang::Interpreter->new(embedded => 1, debug => $debug); # register some built-in functions - $self->{plang}->{interpreter}->add_function_builtin('set', [qw/channel keyword text/], \&set_factoid); - $self->{plang}->{interpreter}->add_function_builtin('get', [qw/channel keyword/], \&get_factoid); - $self->{plang}->{interpreter}->add_function_builtin('append', [qw/channel keyword text/], \&append_factoid); + $self->{plang}->{interpreter}->add_function_builtin('factset', + # parameters are [['param1 name', default arg], ['param2 name', default arg], ...] + [['channel', undef], ['keyword', undef], ['text', undef]], + \&set_factoid); + + $self->{plang}->{interpreter}->add_function_builtin('factget', + [['channel', undef], ['keyword', undef]], + \&get_factoid); + + $self->{plang}->{interpreter}->add_function_builtin('factappend', + [['channel', undef], ['keyword', undef], ['text', undef]], + \&append_factoid); # register the `plang` command $self->{pbot}->{commands}->register(sub { $self->cmd_plang(@_) }, "plang", 0); @@ -54,16 +63,9 @@ sub cmd_plang { my $result = $self->run($context->{arguments}); # check to see if we need to append final result to output - if (defined $result) { - if (ref $result->[0] eq 'ARRAY') { - foreach my $r (@$result) { - $self->{output} .= $r->[1] if defined $r->[1]; - } - } else { - $self->{output} .= $result->[1] if defined $result->[1]; - } - } + $self->{output} .= $result->[1] if defined $result->[1]; + # return the output return length $self->{output} ? $self->{output} : "No output."; } @@ -85,58 +87,24 @@ sub run { $self->{output} = ""; # collect output of the embedded Plang program my $result; # result of the final statement - # interpret the statements - foreach my $node (@$statements) { - my $ins = $node->[0]; + eval { + # interpret the statements + foreach my $node (@$statements) { + my $ins = $node->[0]; - if ($ins eq 'STMT') { - $result = $self->{plang}->{interpreter}->statement($context, $node->[1]); - $result = $self->handle_statement_results($result); + if ($ins eq 'STMT') { + $result = $self->{plang}->{interpreter}->statement($context, $node->[1]); + } } + }; - last if $self->{error}; + if ($@) { + $self->{output} .= $@; + return; } return $result; # return result of the final statement } -use Data::Dumper; - -# handle a Plang statement result -sub handle_statement_results { - my ($self, $results) = @_; - - if (ref $results->[0] eq 'ARRAY') { - my $ret; - foreach my $result (@$results) { - $ret = $self->handle_statement_result($result); - } - return $ret; - } else { - return $self->handle_statement_result($results); - } -} - -sub handle_statement_result { - my ($self, $result) = @_; - - if ($result->[0] eq 'ERROR') { - $self->{output} .= $result->[1]; - $self->{error} = 1; - return; - } - - if ($result->[0] eq 'WARNING') { - $self->{output} .= $result->[1]; - return; - } - - if ($result->[0] eq 'STDOUT') { - $self->{output} .= $result->[1]; - return; - } - - return $result; -} # our custom PBot built-in functions for Plang