2016-10-02 08:24:28 +00:00
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use File::Find::Rule;
|
|
|
|
no strict 'subs';
|
|
|
|
|
|
|
|
my $SCRIPT_NAME = 'play';
|
|
|
|
my $SCRIPT_AUTHOR = 'The Krusty Krab <wowaname@volatile.ch>';
|
|
|
|
my $SCRIPT_VERSION = '1.0';
|
|
|
|
my $SCRIPT_LICENCE = 'Public domain';
|
|
|
|
my $SCRIPT_DESC = 'Play ASCII art';
|
2016-10-02 10:44:45 +00:00
|
|
|
our (%queue, %timer);
|
2016-10-02 08:24:28 +00:00
|
|
|
|
|
|
|
if (weechat::register($SCRIPT_NAME, $SCRIPT_AUTHOR, $SCRIPT_VERSION,
|
|
|
|
$SCRIPT_LICENCE, $SCRIPT_DESC, '', '')) {
|
|
|
|
weechat::hook_command('play', 'Play ASCII art',
|
2016-10-02 10:44:45 +00:00
|
|
|
"[-delay ms] [-find] [-pipe \"command\"] filename\n-stop",
|
2016-10-02 08:24:28 +00:00
|
|
|
"-delay: delay in milliseconds between lines\n".
|
|
|
|
"-find: list matching files, don't play\n".
|
|
|
|
"-pipe: pipe output into command\n".
|
2016-10-02 10:44:45 +00:00
|
|
|
"filename: file to play. Supports wildcards. By default, searches\n".
|
|
|
|
" subdirectories as well unless '/' is found in the filename\n".
|
|
|
|
"-stop: stop currently playing file in buffer",
|
2016-10-02 08:24:28 +00:00
|
|
|
'', 'cmd_play', '');
|
|
|
|
|
|
|
|
my %OPTIONS = (
|
|
|
|
delay => ['Default delay between lines', 0],
|
|
|
|
dir => ['Art directory',
|
|
|
|
weechat::info_get('weechat_dir', '').'/ascii'],
|
|
|
|
);
|
|
|
|
|
|
|
|
for my $option (keys %OPTIONS) {
|
|
|
|
weechat::config_set_plugin($option, $OPTIONS{$option}[1])
|
|
|
|
unless weechat::config_is_set_plugin($option);
|
|
|
|
weechat::config_set_desc_plugin($option, $OPTIONS{$option}[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub parse {
|
|
|
|
my ($input, $delay, $pipe, $find) =
|
|
|
|
(shift, weechat::config_get_plugin('delay'), '/msg *', 0);
|
|
|
|
|
|
|
|
if ($input =~ / *-delay +([0-9]+) /) {
|
|
|
|
$delay = $1;
|
|
|
|
$input =~ s/ *-delay +[0-9]+ *//;
|
|
|
|
}
|
|
|
|
if ($input =~ / *-find /) {
|
|
|
|
$find = 1;
|
|
|
|
$input =~ s/ *-find *//;
|
|
|
|
}
|
|
|
|
# greedy match within quotes so we don't need to escape quotes.
|
|
|
|
# i don't think we will be affected negatively by this
|
|
|
|
if ($input =~ / *-pipe +(".+"|[^ ]+) /) {
|
|
|
|
$pipe = $1;
|
|
|
|
$pipe =~ s/^"(.+)"$/$1/ if $pipe =~ /^".+"$/;
|
|
|
|
$input =~ s/ *-pipe +(?:".+"|[^ ]+) *//;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ($delay, $pipe, $find, $input);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub play {
|
2016-10-02 10:44:45 +00:00
|
|
|
my $buffer = shift;
|
2016-10-02 08:24:28 +00:00
|
|
|
|
2016-10-02 10:44:45 +00:00
|
|
|
weechat::command($buffer, shift @{ $queue{$buffer} });
|
|
|
|
delete $queue{$buffer} unless @{ $queue{$buffer} };
|
2016-10-02 08:24:28 +00:00
|
|
|
|
|
|
|
return weechat::WEECHAT_RC_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub cmd_play {
|
|
|
|
my $buffer = $_[1];
|
2016-10-02 10:44:45 +00:00
|
|
|
|
|
|
|
if ($_[2] eq '-stop' and exists $timer{$buffer}) {
|
|
|
|
weechat::unhook($timer{$buffer});
|
|
|
|
delete $queue{$buffer};
|
|
|
|
return weechat::WEECHAT_RC_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
my ($delay, $pipe, $find, $file) = parse($_[2]);
|
2016-10-02 08:24:28 +00:00
|
|
|
my $server = weechat::info_get($buffer, 'localvar_server');
|
|
|
|
my ($prio_s, $prio_d) = (
|
|
|
|
weechat::config_get("irc.server.$server.anti_flood_prio_high"),
|
|
|
|
weechat::config_get("irc.server_default.anti_flood_prio_high"),
|
|
|
|
);
|
|
|
|
$delay = ($delay or 1000 * (
|
|
|
|
weechat::config_option_is_null($prio_s)
|
|
|
|
? weechat::config_integer($prio_d)
|
|
|
|
: weechat::config_integer($prio_s)
|
|
|
|
) or 10);
|
|
|
|
|
|
|
|
my $path = File::Find::Rule->file->name($file)
|
|
|
|
->start(weechat::config_get_plugin('dir'));
|
|
|
|
|
|
|
|
if ($find) {
|
|
|
|
weechat::print($buffer, " \t$_") while defined( $_ = $path->match );
|
|
|
|
return weechat::WEECHAT_RC_OK;
|
|
|
|
}
|
|
|
|
|
2016-10-02 11:49:55 +00:00
|
|
|
if ($path = $path->match and open FH, "<", (($file !~ m"/") ? $path :
|
2016-10-02 10:44:45 +00:00
|
|
|
weechat::config_get_plugin('dir')."/$file")) {
|
|
|
|
while (<FH>) {
|
|
|
|
s/[\r\n]*$//;
|
|
|
|
push @{ $queue{$buffer} }, "$pipe \x0f$_\x0f";
|
|
|
|
}
|
2016-10-02 08:24:28 +00:00
|
|
|
close FH;
|
2016-10-02 10:44:45 +00:00
|
|
|
|
|
|
|
weechat::unhook($timer{$buffer}) if exists $timer{$buffer};
|
|
|
|
$timer{$buffer} =
|
|
|
|
weechat::hook_timer($delay, 0, scalar @{ $queue{$buffer} },
|
|
|
|
'play', $buffer);
|
2016-10-02 08:24:28 +00:00
|
|
|
} else {
|
|
|
|
weechat::print($buffer, weechat::prefix('error').
|
2016-10-02 11:49:55 +00:00
|
|
|
"Cannot open '$file'".($! ? ": $!" : ""));
|
2016-10-02 08:24:28 +00:00
|
|
|
return weechat::WEECHAT_RC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
return weechat::WEECHAT_RC_OK;
|
|
|
|
}
|