summaryrefslogtreecommitdiffstats
path: root/scripts/ai.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ai.pl')
-rw-r--r--scripts/ai.pl265
1 files changed, 265 insertions, 0 deletions
diff --git a/scripts/ai.pl b/scripts/ai.pl
new file mode 100644
index 0000000..af3e5c1
--- /dev/null
+++ b/scripts/ai.pl
@@ -0,0 +1,265 @@
+use strict;
+use Irssi;
+use Irssi::Irc;
+
+use vars qw($VERSION %IRSSI);
+
+$VERSION="0.3";
+%IRSSI = (
+ authors=> 'BC-bd',
+ contact=> 'bd@bc-bd.org',
+ name=> 'ai',
+ description=> 'Puts people on ignore if they do a public away. See source for options.',
+ license=> 'GPL v2',
+ url=> 'https://bc-bd.org/svn/repos/irssi/trunk/',
+);
+
+# $Id: ai.pl,v 1.4 2002/06/02 15:20:03 bd Exp $
+# for irssi 0.8.4 by bd@bc-bd.org
+#
+#########
+# USAGE
+###
+#
+# Examples:
+#
+# Ignore people saying "away"
+# /set ai_words away
+#
+# Ignore people saying "gone for good" or "back"
+# /set ai_words gone for good,back
+#
+# Ignore people for 500 seconds
+# /set ai_time 500
+#
+# Ignore people forever
+# /set ai_time 0
+#
+# Ignore people only on channels #foo,#bar
+# /set ai_ignore_only_in ON
+# /set ai_channels #foo,#bar
+#
+# Ignore people on all channels BUT #foo,#bar
+# /set ai_ignore_only_in OFF
+# /set ai_channels #foo,#bar
+#
+# Ignore people on all channels
+# /set ai_ignore_only_in OFF
+# /set -clear ai_channels
+#
+# Perform a command on ignore (e.g send them a message)
+# /set ai_command ^msg -$C $N no "$W" in $T please
+#
+# would become on #foo on chatnet bar from nick dude with "dude is away"
+# /msg -cbar dude no "away" in #foo please
+#
+# look further down for details
+#
+# Per channel command on #irssi:
+# /ai #irssi ^say foobar
+#
+# delete channel command in #irssi:
+# /ai #irssi
+#
+#########
+# OPTIONS
+#########
+#
+# /set ai_words [expr[,]+]+
+# * expr : comma seperated list of expressions that should trigger an ignore
+# e.g. : away,foo,bar baz bat,bam
+#
+# /set ai_command [command]
+# * command : to be executed on a triggered ignore.
+# /set -clear ai_command to disable. The following $'s are expanded
+# ( see the default command for an example ):
+# $C : Chatnet (e.g. IRCnet, DALNet, ...)
+# $N : Nick (some dude)
+# $W : Word (the word(s) that triggered the ignore
+# $T : Target (e.g. the channel)
+#
+# /set ai_channels [#channel[ ]]+
+# * #channel : space seperated list of channels, see ai_ignore_only_in
+#
+# /set ai_time <seconds>
+# * seconds : number of seconds to wait before removing the ignore
+#
+# /set ai_ignore_only_in <ON|OFF>
+# * ON : only trigger ignores in ai_channels
+# * OFF : trigger ignores in all channels EXCEPT ai_channels
+#
+# /set ai_display <ON|OFF>
+# * ON : log whole sentence
+# * OFF : only log word that matched regex
+#
+###
+################
+###
+#
+# Changelog
+#
+# Version 0.4
+# - added optional sentence output
+#
+# Version 0.3
+# - added per channel command support
+# - the command is now executed in the channel the event occured
+# - changed the expand char from % to $
+#
+# Version 0.2
+# - changed MSGLVL_ALL to MSGLVL_ACTIONS to avoid problems
+# with channels with ignored Levels
+#
+# Version 0.1
+# - initial release
+#
+###
+################
+
+sub expand {
+ my ($string, %format) = @_;
+ my ($exp, $repl);
+ $string =~ s/\$$exp/$repl/g while (($exp, $repl) = each(%format));
+ return $string;
+}
+
+sub combineSettings {
+ my ($setting,$string,$match) = @_;
+
+ $match = quotemeta($match);
+
+ if ($setting) {
+ if ($string !~ /$match\b/i) {
+ return 1;
+ }
+ } else {
+ if ($string =~ /$match\b/i) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+sub sig_action {
+ my ($server,$msg,$nick,$address,$target) = @_;
+
+ my $command;
+
+ if ($server->ignore_check($nick, $address, $target, $msg, MSGLEVEL_ACTIONS)) {
+ return;
+ }
+
+ if (combineSettings(Irssi::settings_get_bool('ai_ignore_only_in'),
+ Irssi::settings_get_str('ai_channels'),$target)) {
+ return ;
+ }
+
+ my @words = split(',',Irssi::settings_get_str('ai_words'));
+
+ foreach (@words) {
+ if ($msg =~ /$_/i) {
+ my $word = $_;
+
+ my $sentence = $word;
+
+ my $channel = $server->channel_find($target);
+ my $n = $channel->nick_find($nick);
+
+ my $type = Irssi::Irc::MASK_USER | Irssi::Irc::MASK_DOMAIN;
+ my $mask = Irssi::Irc::get_mask($n->{nick}, $n->{host}, $type);
+
+ my $time = Irssi::settings_get_int('ai_time');
+ if ($time == 0) {
+ $time = "";
+ } else {
+ $time = "-time ".$time;
+ }
+ Irssi::command("^ignore ".$time." $mask");
+
+ if (Irssi::settings_get_bool('ai_display')) {
+ $sentence = $msg
+ }
+ Irssi::print("Ignoring $nick$target\@$server->{chatnet} because of '$sentence'");
+
+ my %commands = stringToHash('`',Irssi::settings_get_str('ai_commands'));
+ if (defined $commands{$target}) {
+ $command = $commands{$target};
+ } else {
+ $command = Irssi::settings_get_str('ai_command');
+ }
+
+ if ($command ne "") {
+ $command = expand($command,"C",$server->{tag},"N",$nick,"T",$target,"W",$word);
+ $server->window_item_find($target)->command($command);
+ $server->window_item_find($target)->print($command);
+ }
+
+ return;
+ }
+ }
+}
+
+sub stringToHash {
+ my ($delim,$str) = @_;
+
+ return split($delim,$str);
+}
+
+sub hashToString {
+ my ($delim,%hash) = @_;
+
+ return join($delim,%hash);
+}
+
+sub colorCommand {
+ my ($com) = @_;
+
+ $com =~ s/\$(.)/%_\$$1%_/g;
+
+ return $com;
+}
+
+sub cmd_ai {
+ my ($data, $server, $channel) = @_;
+
+ my $chan = $data;
+ $chan =~ s/ .*//;
+ $data =~ s/^\Q$chan\E *//;
+
+ my %command = stringToHash('`',Irssi::settings_get_str('ai_commands'));
+
+ if ($chan eq "") {
+ foreach my $key (keys(%command)) {
+ Irssi::print("AI: %_$key%_ = ".colorCommand($command{$key}));
+ }
+
+ Irssi::print("AI: placeholders: %_\$C%_)hatnet %_\$N%_)ick %_\$W%_)ord %_\$T%_)arget");
+ Irssi::print("AI: not enough parameters: ai <channel> [command]");
+
+ return;
+ }
+
+ if ($data eq "") {
+ delete($command{$chan});
+ } else {
+ $command{$chan} = $data;
+ }
+
+ Irssi::settings_set_str('ai_commands',hashToString('`',%command));
+
+ Irssi::print("AI: command on %_$chan%_ now: '".colorCommand($data)."'");
+}
+
+Irssi::command_bind('ai', 'cmd_ai');
+
+# "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target
+Irssi::signal_add_first('message irc action', 'sig_action');
+
+Irssi::settings_add_str('misc', 'ai_commands', '');
+Irssi::settings_add_str('misc', 'ai_words', 'away,gone,ist auf');
+Irssi::settings_add_str('misc', 'ai_command', '^msg -$C $N no "$W" in $T please');
+Irssi::settings_add_str('misc', 'ai_channels', '');
+Irssi::settings_add_int('misc', 'ai_time', 500);
+Irssi::settings_add_bool('misc', 'ai_ignore_only_in', 0);
+Irssi::settings_add_bool('misc', 'ai_display', 0);