/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);