html/dnsspam.pl


   1 use Irssi;
   2 use strict;
   3 use vars qw($VERSION %IRSSI);
   4 use integer;
   5 
   6 ### REQUIREMENTS
   7 #
   8 # You need spamcalc from http://spamcalc.net/ installed on your system in
   9 # the perl path or in ~/.irssi/scripts/spamcalc
  10 #
  11 # The data directory (below) should be set to the spamcalc dir
  12 #
  13 # It should work afterwards
  14 #
  15 
  16 require spamcalc::SpamCalc;
  17 
  18 my $irssidir = Irssi::get_irssi_dir();
  19 my $datafilesdir = $irssidir . "/scripts/spamcalc/data";
  20 
  21 my($debug) = 0;
  22 my $calc;
  23 
  24 ################################################################################
  25 
  26 $VERSION = "1.0.0";
  27 %IRSSI = (
  28     authors => "Pieter-Bas IJdens",
  29     contact => "irssi-scripts\@nospam.mi4.org.uk",
  30     name    => "dnsspam",
  31     description => "Checks for DNS Spam on JOIN",
  32     license => "GPLv2 or later",
  33     url     => "http://pieter-bas.ijdens.com/irssi/",
  34     changed => "2005-03-10"
  35 );
  36 
  37 ################################################################################
  38 
  39 sub register_messages
  40 {
  41     Irssi::theme_register([
  42         'sc_spam_certain',
  43             '%RSPAMCALC:%n {channick_hilight $0} from {hilight $1}'.
  44             ' spam level: {hilight $2} on {channel $3}',
  45         'sc_spam_probable',
  46             '%YSPAMCALC:%n {channick_hilight $0} from {hilight $1}'.
  47             ' spam level: {hilight $2} on {channel $3}',
  48         'sc_spam_clean',
  49             '%GSPAMCALC:%n {channick_hilight $0} from {hilight $1}'.
  50             ' spam level: {hilight $2} on {channel $3}'
  51     ]);
  52 }
  53 
  54 ################################################################################
  55 
  56 sub run_spamcalc
  57 {
  58     my($host) = @_;
  59 
  60     # Don't do anything for unresolved ipv6 ips
  61     if ($host =~ /:/) {
  62             return 0;
  63     }
  64 
  65     # Don't do anything for unresolved ipv4 ips
  66     if ($host =~ /[0-9]$/) {
  67             return 0;
  68     }
  69 
  70     my $score = $calc->get_host_score($host);
  71 
  72     return $score;
  73 }
  74 
  75 ################################################################################
  76 
  77 sub event_join
  78 {
  79     my ($server, $channame, $nick, $host) = @_;
  80 
  81     return if $server->{chat_type} ne "IRC";
  82 
  83     my $chanrec = $server->channel_find($channame);
  84 
  85     if ($chanrec)
  86     {
  87     	my($username, $hostname) = split('@', $host);
  88 
  89         my ($level) = run_spamcalc($hostname);
  90 
  91         if ($level > 100)
  92         {
  93             $chanrec->printformat(
  94                 MSGLEVEL_JOINS,
  95                 'sc_spam_certain',
  96                 $nick,
  97                 "*!*@". $hostname,
  98                 $level,
  99                 $channame
 100                 );
 101         }
 102         elsif ($level > 50)
 103         {
 104             $chanrec->printformat(
 105                 MSGLEVEL_JOINS,
 106                 'sc_spam_probable',
 107                 $nick,
 108                 "*!*@". $hostname,
 109                 $level,
 110                 $channame
 111                 );
 112         }
 113         elsif ($debug > 0)
 114         {
 115             $chanrec->printformat(
 116                 MSGLEVEL_JOINS,
 117                 'sc_spam_clean',
 118                 $nick,
 119                 "*!*@". $hostname,
 120                 $level,
 121                 $channame
 122                 );
 123         }
 124     }
 125     else
 126     {
 127         Irssi::print("%RDNSSPAM:%n Chanrec not found for $channame%N");
 128     }
 129 
 130     return;
 131 }
 132 
 133 ################################################################################
 134 
 135 sub event_load_settings
 136 {
 137     return;
 138 }
 139 
 140 ################################################################################
 141 
 142 sub cmd_spamcalc
 143 {
 144     my ($data, $server, $item) = @_;
 145     my ($level);
 146 
 147     $level = run_spamcalc($data);
 148 
 149     Irssi::print("SPAMCALC: $level ($data)");
 150 }
 151 
 152 ################################################################################
 153 
 154 $calc = SpamCalc->new();
 155 $calc->load_datafiles($datafilesdir);
 156 
 157 ################################################################################
 158  
 159 register_messages();
 160 
 161 ################################################################################
 162 
 163 Irssi::signal_add({
 164     'message join'                  => \&event_join,
 165     'setup changed'                 => \&event_load_settings
 166 });
 167 
 168 ################################################################################
 169 
 170 Irssi::command_bind("sc", \&cmd_spamcalc);