/var/www/www.irssi.org-old/scripts/html/ai.pl


   1 use Irssi;
   2 use Irssi::Irc;
   3 use strict;
   4 
   5 use vars qw($VERSION %IRSSI);
   6 
   7 $VERSION="0.3";
   8 %IRSSI = (
   9 	authors=> 'BC-bd',
  10 	contact=> 'bd@bc-bd.org',
  11 	name=> 'ai',
  12 	description=> 'Puts people on ignore if they do a public away. See source for options.',
  13 	license=> 'GPL v2',
  14 	url=> 'https://bc-bd.org/svn/repos/irssi/trunk/',
  15 );
  16 
  17 # $Id: ai.pl,v 1.4 2002/06/02 15:20:03 bd Exp $
  18 # for irssi 0.8.4 by bd@bc-bd.org
  19 #
  20 #########
  21 # USAGE
  22 ###
  23 #
  24 # Examples:
  25 #
  26 #	Ignore people saying "away"
  27 #		/set ai_words away
  28 #
  29 #	Ignore people saying "gone for good" or "back"
  30 #		/set ai_words gone for good,back
  31 #
  32 #	Ignore people for 500 seconds
  33 #		/set ai_time 500
  34 #
  35 #	Ignore people forever
  36 #		/set ai_time 0
  37 #
  38 #	Ignore people only on channels #foo,#bar
  39 #		/set ai_ignore_only_in ON
  40 #		/set ai_channels #foo,#bar
  41 #
  42 #	Ignore people on all channels BUT #foo,#bar
  43 #		/set ai_ignore_only_in OFF
  44 #		/set ai_channels #foo,#bar
  45 # 
  46 #	Ignore people on all channels
  47 #		/set ai_ignore_only_in OFF
  48 #		/set -clear ai_channels
  49 #
  50 #	Perform a command on ignore (e.g send them a message)
  51 #		/set ai_command ^msg -$C $N no "$W" in $T please
  52 #	
  53 #	would become on #foo on chatnet bar from nick dude with "dude is away"
  54 #		/msg -cbar dude no "away" in #foo please
  55 #
  56 #	look further down for details
  57 #
  58 #	Per channel command on #irssi:
  59 #		/ai #irssi ^say foobar
  60 #
  61 #	delete channel command in #irssi:
  62 #		/ai #irssi
  63 #
  64 #########
  65 # OPTIONS
  66 #########
  67 #
  68 # /set ai_words [expr[,]+]+
  69 #		* expr  : comma seperated list of expressions that should trigger an ignore
  70 #		  e.g.  : away,foo,bar baz bat,bam
  71 #
  72 # /set ai_command [command]
  73 #		* command  : to be executed on a triggered ignore.
  74 #		  /set -clear ai_command to disable. The following $'s are expanded
  75 #		  ( see the default command for an example ):
  76 #		    $C : Chatnet (e.g. IRCnet, DALNet, ...)
  77 #		    $N : Nick (some dude)
  78 #		    $W : Word (the word(s) that triggered the ignore
  79 #		    $T : Target (e.g. the channel)
  80 #
  81 # /set ai_channels [#channel[ ]]+
  82 #		* #channel  : space seperated list of channels, see ai_ignore_only_in
  83 #
  84 # /set ai_time <seconds>
  85 #		* seconds  : number of seconds to wait before removing the ignore
  86 #
  87 # /set ai_ignore_only_in <ON|OFF>
  88 #		* ON  : only trigger ignores in ai_channels
  89 #		* OFF : trigger ignores in all channels EXCEPT ai_channels
  90 #
  91 # /set ai_display <ON|OFF>
  92 #		* ON  : log whole sentence
  93 #		* OFF : only log word that matched regex
  94 #
  95 ###
  96 ################
  97 ###
  98 #
  99 # Changelog
 100 #
 101 # Version 0.4
 102 # 	- added optional sentence output
 103 #
 104 # Version 0.3
 105 #	- added per channel command support
 106 #	- the command is now executed in the channel the event occured
 107 #	- changed the expand char from % to $
 108 #
 109 # Version 0.2
 110 #  - changed MSGLVL_ALL to MSGLVL_ACTIONS to avoid problems
 111 #	  with channels with ignored Levels
 112 #
 113 # Version 0.1
 114 #  - initial release
 115 #
 116 ###
 117 ################
 118 
 119 sub expand {
 120   my ($string, %format) = @_;
 121   my ($exp, $repl);
 122   $string =~ s/\$$exp/$repl/g while (($exp, $repl) = each(%format));
 123   return $string;
 124 }
 125 
 126 sub combineSettings {
 127 	my ($setting,$string,$match) = @_;
 128 
 129 	$match =  quotemeta($match);
 130 
 131 	if ($setting) {
 132 		if ($string !~ /$match\b/i) {
 133 			return 1;
 134 		}
 135 	} else {
 136 		if ($string =~ /$match\b/i) {
 137 			return 1;
 138 		}
 139 	}
 140 
 141 	return 0;
 142 }
 143 
 144 sub sig_action() {
 145 	my ($server,$msg,$nick,$address,$target) = @_;
 146 	
 147 	my $command;
 148 
 149 	if ($server->ignore_check($nick, $address, $target, $msg, MSGLEVEL_ACTIONS)) {
 150 		return;
 151 	}
 152 
 153 	if (combineSettings(Irssi::settings_get_bool('ai_ignore_only_in'),
 154 		Irssi::settings_get_str('ai_channels'),$target)) {
 155 		return ;
 156 	}
 157 
 158 	my @words = split(',',Irssi::settings_get_str('ai_words'));
 159 
 160 	foreach (@words) {
 161 		if ($msg =~ /$_/i) {
 162 			my $word = $_;
 163 
 164 			my $sentence = $word;
 165 
 166 			my $channel = $server->channel_find($target);
 167 			my $n = $channel->nick_find($nick);
 168 
 169 			my $type = Irssi::Irc::MASK_USER | Irssi::Irc::MASK_DOMAIN;
 170 			my $mask = Irssi::Irc::get_mask($n->{nick}, $n->{host}, $type);
 171 			
 172 			my $time = Irssi::settings_get_int('ai_time');
 173 			if ($time == 0) {
 174 				$time = "";
 175 			} else {
 176 				$time = "-time ".$time;
 177 			}
 178 			Irssi::command("^ignore ".$time." $mask");
 179 
 180 			if (Irssi::settings_get_bool('ai_display')) {
 181 				$sentence = $msg
 182 			}
 183 			Irssi::print("Ignoring $nick$target\@$server->{chatnet} because of '$sentence'");
 184 
 185 			my %commands = stringToHash('`',Irssi::settings_get_str('ai_commands'));
 186 			if (defined $commands{$target}) {
 187 				$command = $commands{$target};
 188 			} else {
 189 				$command = Irssi::settings_get_str('ai_command');
 190 			}
 191 
 192 			if ($command ne "") {
 193 				$command = expand($command,"C",$server->{tag},"N",$nick,"T",$target,"W",$word);
 194 				$server->window_item_find($target)->command($command);
 195 				$server->window_item_find($target)->print($command);
 196 			}
 197 
 198 			return;
 199 		}
 200 	}
 201 }
 202 
 203 sub stringToHash {
 204 	my ($delim,$str) = @_;
 205 
 206 	return split($delim,$str);
 207 }
 208 
 209 sub hashToString {
 210 	my ($delim,%hash) = @_;
 211 
 212 	return join($delim,%hash);
 213 }
 214 
 215 sub colorCommand {
 216 	my ($com) = @_;
 217 
 218 	$com =~ s/\$(.)/%_\$$1%_/g;
 219 
 220 	return $com;
 221 }
 222 
 223 sub cmd_ai {
 224 	my ($data, $server, $channel) = @_;
 225 
 226 	my $chan = $data;
 227 	$chan =~ s/ .*//;
 228 	$data =~ s/^\Q$chan\E *//;
 229 
 230 	my %command = stringToHash('`',Irssi::settings_get_str('ai_commands'));
 231 
 232 	if ($chan eq "") {
 233 		foreach my $key (keys(%command)) {
 234 			Irssi::print("AI: %_$key%_ = ".colorCommand($command{$key}));
 235 		}
 236 	
 237 		Irssi::print("AI: placeholders: %_\$C%_)hatnet %_\$N%_)ick %_\$W%_)ord %_\$T%_)arget");
 238 		Irssi::print("AI: not enough parameters: ai <channel> [command]");
 239 
 240 		return;
 241 	}
 242 
 243 	if ($data eq "") {
 244 		delete($command{$chan});
 245 	} else {
 246 		$command{$chan} = $data;
 247 	}
 248 
 249 	Irssi::settings_set_str('ai_commands',hashToString('`',%command));
 250 
 251 	Irssi::print("AI: command on %_$chan%_ now: '".colorCommand($data)."'");
 252 }
 253 
 254 Irssi::command_bind('ai', 'cmd_ai');
 255 
 256 # "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target
 257 Irssi::signal_add_first('message irc action', 'sig_action');
 258 
 259 Irssi::settings_add_str('misc', 'ai_commands', '');
 260 Irssi::settings_add_str('misc', 'ai_words', 'away,gone,ist auf');
 261 Irssi::settings_add_str('misc', 'ai_command', '^msg -$C $N no "$W" in $T please');
 262 Irssi::settings_add_str('misc', 'ai_channels', '');
 263 Irssi::settings_add_int('misc', 'ai_time', 500);
 264 Irssi::settings_add_bool('misc', 'ai_ignore_only_in', 0);
 265 Irssi::settings_add_bool('misc', 'ai_display', 0);