1use Irssi; 2use strict; 3use vars qw($VERSION %IRSSI); 4$VERSION = "1.0"; 5%IRSSI = ( 6 authors => "David Leadbeater", 7 contact => "dgl\@dgl.cx", 8 url => "http://irssi.dgl.cx/", 9 license => "GNU GPLv2 or later", 10 name => "foreach user", 11 description => "Extends the /foreach command to have /foreach user 12 (users in a channel). 13 Syntax: /foreach user [hostmask] command.", 14); 15 16# Examples: 17# /foreach user /whois $0 18# /foreach user *!eviluser@* /k $0 evil! (consider kicks.pl ;) ) 19 20Irssi::command_bind('foreach user', sub { 21 my($command) = @_; 22 return unless length $command; 23 24 my $mask = '*!*@*'; 25 # see if it begins with a mask (kind of assumes cmdchars is /). 26 if($command !~ m!^/! && $command =~ /^\S+[!@]/) { 27 ($mask,$command) = split / /, $command, 2; 28 # make sure the mask is okay. 29 $mask .= '@*' if $mask !~ /\@/; 30 $mask = "*!$mask" if $mask !~ /!/; 31 } 32 33 my $channel = ref Irssi::active_win ? Irssi::active_win->{active} : ''; 34 return unless ref $channel; 35 36 for my $nick($channel->nicks) { 37 next unless ref $nick; 38 next unless $channel->{server}->mask_match_address($mask, $nick->{nick}, 39 $nick->{host} ? $nick->{host} : ''); 40 41 # the backtracking is only so $$0 is escaped (don't ask me why...) 42 (my $tmpcommand = $command) =~ s/(?<!\$)\$(\d)/ 43 if($1 == 0) { 44 $nick->{nick} 45 }elsif($1 == 1) { 46 $nick->{host} 47 }elsif($1 == 2) { 48 (split('@',$nick->{host}))[0]; 49 }elsif($1 == 3) { 50 (split('@',$nick->{host}))[1]; 51 }elsif($1 == 4) { 52 $nick->{realname} 53 } 54 /eg; 55 $tmpcommand =~ s/\$\$(\d)/\$$1/g; 56 $channel->command($tmpcommand); 57 } 58} ); 59 60