my @outputstack;
my $outputprefix;
my $debug = 0;
+my %debugwindows = ();
my @grabbers;
my @getters;
my $getter;
};
#
+# This is a list of default values for the remote API. These
+# are used if the values are not registered by the library user.
+#
+my $remote_api = {
+ io => sub { print @_, "\n" },
+ config_init => \&_builtin_config_init,
+ config_get => \&_builtin_config_get,
+ config_set => \&_builtin_config_set,
+ config_has => \&_builtin_config_has,
+ config_save => \&_builtin_config_save,
+ config_del => \&_builtin_config_del,
+ color => sub { return '' },
+ module_path => sub { return dirname(realpath($0)) },
+ quote => sub { return $_ },
+ reload => sub {},
+};
+
+#
# List of known commands and handlers
#
my $videosite_commands = {
},
'reload' => sub {
- init();
+ $remote_api->{reload}->();
},
'mode' => sub {
},
'debug' => sub {
- $debug = 1;
- foreach (@grabbers, @getters) {
- $_->setdebug(1);
- }
- _io('Enabled debugging');
+ _cmd_debug(@_);
},
'nodebug' => sub {
- $debug = 0;
- foreach (@grabbers, @getters) {
- $_->setdebug(0);
- }
- _io('Disabled debugging');
+ _cmd_nodebug(@_);
},
};
#
-# This is a list of default values for the remote API. These
-# are used if the values are not registered by the library user.
-#
-my $remote_api = {
- io => sub { print @_, "\n" },
- config_init => \&_builtin_config_init,
- config_get => \&_builtin_config_get,
- config_set => \&_builtin_config_set,
- config_has => \&_builtin_config_has,
- config_save => \&_builtin_config_save,
- config_del => \&_builtin_config_del,
- color => sub { return '' },
- module_path => sub { return dirname(realpath($0)) },
- quote => sub { return $_ },
-};
-
-#
# Output a string on the client.
# Works like (s)printf in that it takes a format string and a list of
# values to be replaced. Undefined values will be printed as '(undef)'
#
@text = map { defined($_)?$remote_api->{quote}->($_):'(undef)' } @text;
- $outputstack[0]->(sprintf($format, @text));
+ $outputstack[0]->{ewpf}->(sprintf($format, @text));
}
#
# Print a message if debug is enabled
#
sub _debug {
+ my @data = @_;
+
+ $data[0] = "DEBUG: " . $data[0];
+
+ # Check for global debug
if ($debug) {
- _io(@_);
+ _io(@data);
+ } else {
+ # Check if current window is in the per-window-debug list
+ if (exists($debugwindows{$outputstack[0]->{window}})) {
+ _io(@data);
+ }
}
}
push(@g, $g);
$g->register_api({
io => \&_io,
+ io_debug => \&_debug,
connectors => sub { return _connectorlist('active-connectors') },
config_get => \&_config_get,
config_set => \&_config_set,
config_has => \&_config_has,
});
- $g->setdebug($debug);
} else {
_io('%s has wrong type (got %s, expected %s)', $p, $g->{'TYPE'}, $type);
delete($INC{$p});
}
_debug("Removing %s from list %s", $item, join('.', @{$path}));
- @c = map { $item ne $_ } split(/\s*,\s*/, _config_get($path));
+ @c = grep { $item ne $_ } split(/\s*,\s*/, _config_get($path));
- _config_set($path, join('.', @c));
+ _config_set($path, join(',', @c));
}
#
# Save the config to durable storage
#
sub _cmd_save {
- $remote_api->{config_save}->();
+ my $event = shift;
+
+ if ($remote_api->{config_save}->()) {
+ _io("Config saved");
+ } else {
+ _io(sprintf("%sConfig save failed%s", _colorpair("*red"), _colorpair()));
+ }
}
#
# Set a configuration element
#
sub _cmd_set {
+ my $event = shift;
my $target = shift;
my $key = shift;
my $val = shift;
# Enable a given module
#
sub _cmd_enable {
+ my $event = shift;
my $target = shift;
my $p;
# Disable given module
#
sub _cmd_disable {
+ my $event = shift;
my $target = shift;
my $p;
# Show settings for modules
#
sub _cmd_show {
+ my $event = shift;
my $target = shift;
my $p;
my $e;
# Show help for the commands
#
sub _cmd_help {
+ my $event = shift;
my $target = shift;
my $p;
# Set the getter to use
#
sub _cmd_getter {
+ my $event = shift;
my $target = shift;
my $p;
# Show/set the working mode
#
sub _cmd_mode {
+ my $event = shift;
my $mode = shift;
if (defined($mode)) {
# Manage the connectors
#
sub _cmd_connector {
+ my $event = shift;
my $subcmd = shift;
my $c;
$name = lc($name);
+ unless($name =~ m|^[a-z]+$|) {
+ _io("%s is not a valid connector name (only letters are allowed)", $name);
+ return;
+ }
+
if (_config_list_has(['defined-connectors'], $name)) {
_io("Connector already exists");
return;
}
#
+# Enable debug.
+# Global debug if the keyword "all" is given, or just for the
+# current window otherwise
+#
+sub _cmd_debug {
+ my $event = shift;
+ my $scope = shift;
+
+ if (defined($scope) and (lc($scope) eq 'all')) {
+ _io("Global debug enabled");
+ $debug = 1;
+ } else {
+ _io("Debug for this window enabled");
+ $debugwindows{$event->{window}} = 1;
+ }
+}
+
+#
+# Disable debug
+# Disable global debug if the keyword "all" is given (this will
+# also disable all per-window debugs) or just for the current
+# window
+#
+sub _cmd_nodebug {
+ my $event = shift;
+ my $scope = shift;
+
+ if (defined($scope) and (lc($scope) eq 'all')) {
+ $debug = 0;
+ %debugwindows = ();
+ _io("Global debug disabled");
+ } else {
+ delete($debugwindows{$event->{window}});
+ _io("Debug for this window disabled");
+ }
+}
+
+
+#
# Return the list of loaded grabbers.
# This is used by the test programs, and is not meant to be
# used in general.
$debug = $a->{_debug}->();
}
- @outputstack = ($remote_api->{'io'});
+ @outputstack = ({ewpf => $remote_api->{'io'}, window => ""});
return 1;
}
my $m;
my $p;
my $skip;
+ my $mode = _config_get(['mode']);
- # Look if we should ignore this line
+ #
+ # If /nosave is present in the message switch to display mode, regardless
+ # of config setting
+ #
if ($message =~ m,(?:\s|^)/nosave(?:\s|$),) {
- return;
+ $mode = 'display';
}
- _push_output($event->{ewpf});
+ _push_output($event);
$message = _expand_url_shortener($message);
study($message);
$skip = $remote_api->{link_callback}->($m);
}
unless($skip) {
- if ('download' eq _config_get(['mode'])) {
+ if ('download' eq $mode) {
_io(
sprintf('%s>>> %sSaving %s%%s%s %s%%s',
_colorpair('*red'),
unless($getter->get($m)) {
_io(sprintf('%s>>> FAILED', _colorpair('*red')));
}
- } elsif ('display' eq _config_get(['mode'])) {
+ } elsif ('display' eq $mode) {
_io(
sprintf('%s>>> %sSaw %s%%s%s %s%%s',
_colorpair('*magenta'),
my $event = shift;
my ($cmd, @params) = split(/\s+/, $event->{message});
- _push_output($event->{ewpf});
+ _push_output($event);
if (exists($videosite_commands->{$cmd})) {
- $videosite_commands->{$cmd}->(@params);
+ $videosite_commands->{$cmd}->($event, @params);
}
_pop_output();