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