aboutsummaryrefslogtreecommitdiffstats
path: root/masshilight/masshilight.pl
blob: cbd2bdaa4a60fa1ba0d7ad7138fdae47a50a60c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# disable hilighting of mass-hilights
# (messages which contain a lot of nicknames)
#
# DESCRIPTION
# sometimes a jester annoys a channel with a message
# containing a lot of nicks that are in that channel.
# this script prevents hilighting of a window in this
# case. number of nicks in the message is user
# configurable in the variable mass_highlight_threshold.
#
# CHANGELOG
# * 01.05.2004
# fixed problems with nicks containing brackets
# added comments, description and this changelog :)
# * 30.05.2004
# first version of the script
# * 21.08.2010
# modified it a lot to work with pubmessages so it has access to
# the sender and channel more easily. Also added configurable actions
# to take when flooding is detected.

use Irssi;
use strict;
use warnings;

use vars qw($VERSION %IRSSI);

$VERSION = "0.2";
%IRSSI = (
    authors         => "Uli Baumann, Tom Feist",
    contact         => 'f-zappa@irc-muenster.de, shabble+irssi@metavore.org',
    name            => "mass_hilight_action",
    description     => "Customisable command on messages containing a lot of nicknames",
    license         => "GPL",
    changed         => "Sat 21 Aug 2010 22:29:22 BST",
);

sub sig_msg_pub {
    my ($server, $msg, $nick, $address, $target) = @_;

    my $num_nicks= -1;                    # don't count target's nick
    my $max_num_nicks
      = Irssi::settings_get_int('mass_hilight_threshold');

    my $channel =  $server->channel_find($target);

    foreach my $nick ($channel->nicks()) {
        $nick = $nick->{nick};
        $nick =~ s/([\]\[])/\\$1/g;   # ']' and '[' need masking

        $num_nicks++ if ($msg =~ /\Q$nick\E/);
    }

    if ($num_nicks >= $max_num_nicks) {
        my $action_val = Irssi::settings_get_str('mass_hilight_action');
        my @actions = split /\s*;\s*/, $action_val;
        foreach my $action (@actions) {
            if ($action =~ m/suppress/i) {
                Irssi::signal_stop(); # don't display it at all.
            } elsif ($action =~ m/kick/) {
                $server->command("/KICK $target $nick");
            } else {
                $action =~ s/\$nick/$nick/;
                $action =~ s/\$chan/$target/;
                $action =~ s/\$host/$address/;

                $server->command($action);
            }
        }
    }
}

# tell irssi to use this and initialize variable if necessary

Irssi::signal_add_first('message public', \&sig_msg_pub);
Irssi::settings_add_int('misc','mass_hilight_threshold', 3);
Irssi::settings_add_str('misc', 'mass_hilight_action', 'suppress');

# Irssi::command_bind('testmasshilight', sub { my $args = shift;
#                                              sig_msg_pub(Irssi::active_server(),
#                                                          $args,
#                                                          "bob",
#                                                          "bob!bob\@bob.bob",
#                                                          "#jfkdalfad");
#                                              });


__END__

Usage:

use /set mass_hilight_threshold to set how many matching nicks from the current
 are required to trigger the hilight flood detection.

use /set mass_hilight_action to configure what happens when they do.  You can specify
multiple actions, separated by ; (semicolons)

Two special actions exist: 'suppress', which prevents the message from being
displayed to you at all, and 'kick', which expands to the action '/kick #channel
$nick'.

Any other actions you wish to take are processed as regular Irssi commands, but
the following variables are replaced:

$nick - becomes the nick of the person who triggered this script
$chan - the channel in which it happened
$host - the hostmask of the offender

For example:

/set mass_hilight_action /echo hilight flooding by: $nick ; /kickban $chan $nick "Hilight flooding is not permitted here."