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


   1 ###############################################################################
   2 # badword.pl
   3 # Copyright (C) 2002  Jan 'fissie' Sembera <fis@ji.cz>
   4 #
   5 # This program is free software; you can redistribute it and/or modify
   6 # it under the terms of the GNU General Public License as published by
   7 # the Free Software Foundation; either version 2 of the License, or
   8 # (at your option) any later version.
   9 #
  10 # This program is distributed in the hope that it will be useful,
  11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 # GNU General Public License for more details.
  14 #
  15 # You should have received a copy of the GNU General Public License
  16 # along with this program; if not, write to the Free Software
  17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 ###############################################################################
  19 # This is configurable badword script. It may be configured to ban immediately
  20 # when first badword is detected, or it may count badwords and if number of 
  21 # badwords of given nick exceeds limit, ban him. Badword count may also be
  22 # expired if no badword is seen for specified period of time. Optional 
  23 # verbosity (let's call it logging) may be enabled as well
  24 #
  25 # Runtime variables:
  26 #
  27 # badword_channels = list of channels where script is active, separated by space
  28 # badword_words = list of 'bad words' that trigger this, separated by space
  29 # badword_reason = reason used in kick when count exceeds permitted limit
  30 # badword_limit = if number of detected badwords reaches this number, ban'em. 
  31 #                 Set 1 to immediately kickban.
  32 # badword_clear_delay = if no badword is detected from user for time specified
  33 #                       here (in seconds), clear his counter. Set 0 to disable.
  34 # badword_verbose = turns on/off logging features
  35 # badword_ban_delay = ban after number of kicks specified here. 0 - disables
  36 #                     banning, 1 - ban immediately, ... 
  37 ###############################################################################
  38 #
  39 # Changelog:
  40 #
  41 # Jun 4 2002
  42 #    - added ban delaying feature
  43 #
  44 ###############################################################################
  45 use Irssi;
  46 use Irssi::Irc;
  47 use strict;
  48 use vars qw($VERSION %IRSSI);
  49 
  50 $VERSION = "0.0.3";
  51 
  52 %IRSSI = (
  53     authors     =>  "Jan 'fissie' Sembera",
  54     contact     =>  "fis\@ji.cz",
  55     name        =>  "badword",
  56     description =>  "Configurable badword kickbanning script",
  57     license     =>  "GPL v2 and any later",
  58     url         =>  "http://fis.bofh.cz/devel/irssi/",
  59 );
  60 
  61 my %nick_dbase;
  62 
  63 sub sig_public {
  64   my ($server, $msg, $nick, $address, $target) = @_;
  65   my $watch_channels = Irssi::settings_get_str('badword_channels');
  66   my $watch_words    = Irssi::settings_get_str('badword_words');
  67 
  68   my @chanz = split (/ /, $watch_channels); 
  69   my @wordz = split (/ /, $watch_words); 
  70   
  71   my $nickrec = $server->channel_find($target)->nick_find($nick);
  72   my $nickmode = $nickrec->{op} ? "@" : $nickrec->{voice} ? "+" : "";
  73 
  74   my $aux = 0;
  75 
  76   if (! ($nickmode eq "")) {
  77     return;
  78   }
  79 
  80   foreach my $ch (@chanz) {
  81     if ($ch eq $target) {
  82       $aux = 1;
  83     }
  84   }
  85 
  86   if ($aux == 0) { 
  87     return;
  88   } 
  89 
  90   $aux = 0; 
  91   foreach my $bw (@wordz) {
  92 #   if (($msg =~ /\ $bw/) || ($msg =~ /^$bw/)) {
  93     if ($msg =~ /$bw/) {
  94       $aux = 1;
  95     } 
  96   }
  97 
  98   if ($aux == 0) {
  99     return;
 100   }
 101 
 102   # Ok, here comes badword, check record
 103 
 104   my $luser = $nick_dbase{$nick}{$target};
 105   
 106   if (!$luser) {
 107     $nick_dbase{$nick}{$target}{'count'} = 1;
 108     $nick_dbase{$nick}{$target}{'kcount'} = 0;
 109     $nick_dbase{$nick}{$target}{'stamp'} = time();
 110   } else {
 111     if ((Irssi::settings_get_int('badword_clear_delay') != 0) && (($nick_dbase{$nick}{$target}{'stamp'})+(Irssi::settings_get_int('badword_clear_delay'))) < time()) {
 112       $nick_dbase{$nick}{$target}{'count'} = 1;
 113       if (Irssi::settings_get_bool('badword_verbose') == 1) { Irssi::print('BW: Expired for '.$nick.' with hostmask '.$address.' on channel '.$target); }
 114     } else {
 115       $nick_dbase{$nick}{$target}{'count'} = ($nick_dbase{$nick}{$target}{'count'})+1; 
 116     }
 117     $nick_dbase{$nick}{$target}{'stamp'} = time();
 118   }
 119 
 120   $luser = $nick_dbase{$nick}{$target}{'count'};
 121 
 122   if (Irssi::settings_get_bool('badword_verbose') == 1) { Irssi::print('BW: Detected badword from nick '.$nick.' with hostmask '.$address.' on channel '.$target.' - '.$nick_dbase{$nick}{$target}{'count'}.' times'); }
 123  
 124   if ($luser == Irssi::settings_get_int('badword_limit')) {
 125     $nick_dbase{$nick}{$target}{'count'} = 0;
 126     # Ban'em!
 127     my @host = split(/\@/, $address);
 128     if (($host[0] =~ /\~/) || ($host[0] =~ /\-/) || ($host[0] =~ /\=/) || ($host[0] =~ /\^/)) { $host[0] = "*"; }
 129     my $mask = '*!'.$host[0].'@'.$host[1];
 130     $nick_dbase{$nick}{$target}{'kcount'} = ($nick_dbase{$nick}{$target}{'kcount'})+1; 
 131     if ((Irssi::settings_get_int('badword_ban_delay') > 0) && (Irssi::settings_get_int('badword_ban_delay') == $nick_dbase{$nick}{$target}{'kcount'})) {
 132       $server->command('mode '.$target.' +b '.$mask);
 133       $nick_dbase{$nick}{$target}{'kcount'} = 0;
 134       if (Irssi::settings_get_bool('badword_verbose') == 1) { Irssi::print('BW: Nick '.$nick.' with mask '.$mask.' punished for badwording on channel '.$target.' - banned'); } 
 135     } else {
 136       if (Irssi::settings_get_bool('badword_verbose') == 1) { Irssi::print('BW: Nick '.$nick.' with mask '.$mask.' punished for badwording on channel '.$target.' - kicked'); }
 137     }
 138     $server->command('quote kick '.$target.' '.$nick.' :'.Irssi::settings_get_str('badword_reason'));
 139   } 
 140 }
 141 
 142 sub sig_nick {
 143   my ($server, $newnick, $nick, $address) = @_;
 144 
 145   $newnick = substr ($newnick, 1) if ($newnick =~ /^:/);
 146   my $count = $nick_dbase{$nick}; 
 147   if ($count) {
 148     $nick_dbase{$nick} = undef;
 149     $nick_dbase{$newnick} = $count; 
 150     if (Irssi::settings_get_bool('badword_verbose') == 1) { Irssi::print('BW: Tranferred badwords from '.$nick.' to '.$newnick); }
 151   }
 152 }
 153 
 154 Irssi::settings_add_str("misc", "badword_channels", "");
 155 Irssi::settings_add_str("misc", "badword_words", "");
 156 Irssi::settings_add_str("misc", "badword_reason", "BW: badword limit exceeded"); 
 157 Irssi::settings_add_int("misc", "badword_limit", 3);
 158 Irssi::settings_add_int("misc", "badword_clear_delay", 3600);
 159 Irssi::settings_add_int("misc", "badword_ban_delay", 1);
 160 Irssi::settings_add_bool("misc", "badword_verbose", 0); 
 161 
 162 Irssi::signal_add_last('message public', 'sig_public');
 163 Irssi::signal_add_last('event nick', 'sig_nick');