diff options
Diffstat (limited to 'scripts/foreach_user.pl')
-rw-r--r-- | scripts/foreach_user.pl | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/scripts/foreach_user.pl b/scripts/foreach_user.pl new file mode 100644 index 0000000..23a1591 --- /dev/null +++ b/scripts/foreach_user.pl @@ -0,0 +1,59 @@ +use Irssi; +use strict; +use vars qw($VERSION %IRSSI); +$VERSION = "1.0"; +%IRSSI = ( + authors => "David Leadbeater", + contact => "dgl\@dgl.cx", + url => "http://irssi.dgl.cx/", + license => "GNU GPLv2 or later", + name => "foreach user", + description => "Extends the /foreach command to have /foreach user + (users in a channel). + Syntax: /foreach user [hostmask] command.", +); + +# Examples: +# /foreach user /whois $0 +# /foreach user *!eviluser@* /k $0 evil! (consider kicks.pl ;) ) + +Irssi::command_bind('foreach user', sub { + my($command) = @_; + return unless length $command; + + my $mask = '*!*@*'; + # see if it begins with a mask (kind of assumes cmdchars is /). + if($command !~ m!^/! && $command =~ /^\S+[!@]/) { + ($mask,$command) = split / /, $command, 2; + # make sure the mask is okay. + $mask .= '@*' if $mask !~ /\@/; + $mask = "*!$mask" if $mask !~ /!/; + } + + my $channel = ref Irssi::active_win ? Irssi::active_win->{active} : ''; + return unless ref $channel; + + for my $nick($channel->nicks) { + next unless ref $nick; + next unless $channel->{server}->mask_match_address($mask, $nick->{nick}, + $nick->{host} ? $nick->{host} : ''); + + # the backtracking is only so $$0 is escaped (don't ask me why...) + (my $tmpcommand = $command) =~ s/(?<!\$)\$(\d)/ + if($1 == 0) { + $nick->{nick} + }elsif($1 == 1) { + $nick->{host} + }elsif($1 == 2) { + (split('@',$nick->{host}))[0]; + }elsif($1 == 3) { + (split('@',$nick->{host}))[1]; + }elsif($1 == 4) { + $nick->{realname} + } + /eg; + $tmpcommand =~ s/\$\$(\d)/\$$1/g; + $channel->command($tmpcommand); + } +} ); + |