summaryrefslogtreecommitdiffstats
path: root/scripts/foreach_user.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/foreach_user.pl')
-rw-r--r--scripts/foreach_user.pl59
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);
+ }
+} );
+