summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authordx2015-11-23 21:59:31 -0300
committerdx2015-11-23 21:59:31 -0300
commit1ac9ddc547a033156dfc046edb02ef8bac6eaf00 (patch)
tree3dfb51d194e1361f977f1c2044035f03035c5a89 /scripts
parenta500de66139d247ab2fb586c67d5c24057339653 (diff)
parent1c17407c1de76644526f0826c56fde9add681508 (diff)
downloadscripts.irssi.org-1ac9ddc547a033156dfc046edb02ef8bac6eaf00.tar.bz2
Merge pull request #180 from ailin-nemui/execcmd
Add execcmd 0.1
Diffstat (limited to 'scripts')
-rw-r--r--scripts/execcmd.pl96
1 files changed, 96 insertions, 0 deletions
diff --git a/scripts/execcmd.pl b/scripts/execcmd.pl
new file mode 100644
index 0000000..67699aa
--- /dev/null
+++ b/scripts/execcmd.pl
@@ -0,0 +1,96 @@
+use strict;
+use warnings;
+use Text::ParseWords;
+use Irssi;
+
+our $VERSION = '0.1'; # 4d6028fb2f92d73
+our %IRSSI = (
+ authors => 'unknown, Nei',
+ contact => 'Nei @ anti@conference.jabber.teamidiot.de',
+ url => "http://anti.teamidiot.de/",
+ name => 'execcmd',
+ description => 'Permit to use /EXEC with arbitrary irssi commands.',
+ );
+
+sub cmd_help {
+ my ($args) = @_;
+ if ($args =~ /^exec\s*$/i) {
+ print CLIENTCRAP <<HELP
+(Script: Execute arbitrary client commands with exec.)
+
+EXEC [-] [-nosh] -cmd <irssi command> [-name <name>] <cmd line>
+
+ -cmd: The client command to run.
+
+Example: /EXEC -cmd "me is running:" lsb_release -ds
+
+HELP
+
+ }
+}
+
+my %cmd_processes;
+sub cmd_execcmd {
+ my @args = parse_line(qr/\s+/, 'delimiters', $_[0]);
+ my $newargs = '';
+ my $execcmd;
+ return unless grep /^-cmd$/i, @args;
+ while (@args) {
+ for ($args[0]) {
+ if (/^-(?:na|m|no|in|l)/i) {
+ for (0..3) { $newargs .= $args[0]//''; shift @args; }
+ }
+ elsif (/^-cmd$/i) {
+ $execcmd = $args[2];
+ for (0..3) { shift @args; }
+ }
+ else { $newargs .= $_; shift @args; }
+ }
+ }
+ if (defined $execcmd) {
+ my @args = parse_line(qr/\s+/, '', $execcmd);
+ local our $EXECCMD = "@args";
+ Irssi::signal_continue($newargs, @_[1..$#_]);
+ }
+}
+
+sub exec_new_ {
+ if (defined our $EXECCMD) {
+ $cmd_processes{ $_[0]->{_irssi} } = $EXECCMD;
+ }
+}
+
+sub exec_remove_ {
+ delete $cmd_processes{ $_[0]->{_irssi} };
+}
+
+sub ir_ps {
+ my $w = shift;
+ if (ref $w && ref $w->{active}) { $w->{active}->parse_special(@_) }
+ elsif (ref $w && ref $w->{active_server}) { $w->{active_server}->parse_special(@_) }
+ else { &Irssi::parse_special(@_) }
+}
+
+sub exec_input_ {
+ if (exists $cmd_processes{ $_[0]->{_irssi} }) {
+ my $cmd = $cmd_processes{ $_[0]->{_irssi} };
+ if ($cmd =~ /\$/) { $cmd = ir_ps($_[0]{target_win}, $cmd, $_[1]) }
+ else { $cmd .= ' '.$_[1] }
+ if ($_[0]{target_win}) {
+ $_[0]{target_win}->command($cmd);
+ }
+ else {
+ Irssi::command($cmd);
+ }
+ Irssi::signal_stop;
+ }
+}
+
+Irssi::signal_add_first('command exec' => 'cmd_execcmd');
+Irssi::signal_add({
+ 'exec new' => 'exec_new_',
+ 'exec remove' => 'exec_remove_',
+ 'exec input' => 'exec_input_'
+ });
+Irssi::command_bind_last 'help' => 'cmd_help';
+