added some code for shitlist
[srvx.git] / src / spamserv.h
1 /* spamserv.h - anti spam service\r
2  * Copyright 2004 feigling\r
3  *\r
4  * This program is free software; you can redistribute it and/or modify\r
5  * it under the terms of the GNU General Public License as published by\r
6  * the Free Software Foundation; either version 2 of the License, or\r
7  * (at your option) any later version.  Important limitations are\r
8  * listed in the COPYING file that accompanies this software.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, email srvx-maintainers@srvx.net.\r
17  *\r
18  * $Id: spamserv.h,v 1.3 2004/06/27 22:20:00 feigling Exp $\r
19  */\r
20 \r
21 #ifndef _spamserv_h\r
22 #define _spamserv_h\r
23 \r
24 #ifdef HAVE_ARPA_INET_H\r
25 #include <arpa/inet.h>\r
26 #endif\r
27 \r
28 /***********************************************/\r
29 /*                   Channel                   */\r
30 /***********************************************/\r
31 \r
32 enum channelinfo\r
33 {\r
34     ci_SpamLimit = 0,\r
35     ci_AdvReaction,\r
36     ci_WarnReaction,\r
37     ci_Max\r
38 };\r
39 \r
40 #define CHAN_INFO_SIZE          (ci_Max + 1)\r
41 #define CHAN_INFO_DEFAULT       "bls"\r
42 \r
43 #define CHAN_SPAMSCAN           0x00000001\r
44 #define CHAN_FLOODSCAN          0x00000002\r
45 #define CHAN_JOINFLOOD          0x00000004\r
46 #define CHAN_ADV_SCAN           0x00000008\r
47 #define CHAN_SCAN_CHANOPS       0x00000010\r
48 #define CHAN_SCAN_VOICED        0x00000020\r
49 #define CHAN_SUSPENDED          0x00000040\r
50 \r
51 #define CHAN_FLAGS_DEFAULT      (CHAN_SPAMSCAN | CHAN_FLOODSCAN | CHAN_JOINFLOOD)\r
52 \r
53 #define CHECK_SPAM(x)           ((x)->flags & CHAN_SPAMSCAN)\r
54 #define CHECK_FLOOD(x)          ((x)->flags & CHAN_FLOODSCAN)\r
55 #define CHECK_JOINFLOOD(x)      ((x)->flags & CHAN_JOINFLOOD)\r
56 #define CHECK_ADV(x)            ((x)->flags & CHAN_ADV_SCAN)\r
57 #define CHECK_CHANOPS(x)        ((x)->flags & CHAN_SCAN_CHANOPS)\r
58 #define CHECK_VOICED(x)         ((x)->flags & CHAN_SCAN_VOICED)\r
59 #define CHECK_SUSPENDED(x)      ((x)->flags & CHAN_SUSPENDED)\r
60 \r
61 #define BADACTION_KICK   0\r
62 #define BADACTION_BAN    1\r
63 #define BADACTION_KILL   2\r
64 #define BADACTION_GLINE  3\r
65 \r
66 struct chanInfo\r
67 {\r
68     struct chanNode        *channel;\r
69     struct string_list     *exceptions;\r
70     dict_t                         badwords;\r
71     unsigned int           flags : 30;\r
72     unsigned int           exceptlevel;\r
73     char                   info[CHAN_INFO_SIZE];\r
74     unsigned long          suspend_expiry;\r
75     unsigned int                   last_badword_id;\r
76 };\r
77 \r
78 /***********************************************/\r
79 /*                    User                     */\r
80 /***********************************************/\r
81 \r
82 #define USER_KICK           0x00000001\r
83 #define USER_KICKBAN        0x00000002\r
84 #define USER_SHORT_TBAN     0x00000004\r
85 #define USER_LONG_TBAN      0x00000008\r
86 #define USER_KILL           0x00000010\r
87 #define USER_GLINE          0x00000020\r
88 #define USER_WARNED         0x00000040\r
89 #define USER_KILLED         0x00000080\r
90 #define USER_ADV_WARNED     0x00000100\r
91 \r
92 #define CHECK_KICK(x)           ((x)->flags & USER_KICK)\r
93 #define CHECK_KICKBAN(x)        ((x)->flags & USER_KICKBAN)\r
94 #define CHECK_SHORT_TBAN(x)     ((x)->flags & USER_SHORT_TBAN)\r
95 #define CHECK_LONG_TBAN(x)      ((x)->flags & USER_LONG_TBAN)\r
96 #define CHECK_KILL(x)           ((x)->flags & USER_KILL)\r
97 #define CHECK_GLINE(x)          ((x)->flags & USER_GLINE)\r
98 #define CHECK_WARNED(x)         ((x)->flags & USER_WARNED)\r
99 #define CHECK_KILLED(x)         ((x)->flags & USER_KILLED)\r
100 #define CHECK_ADV_WARNED(x)     ((x)->flags & USER_ADV_WARNED)\r
101 \r
102 #define SPAM_WARNLEVEL          1\r
103 \r
104 #define FLOOD_TIMEQ_FREQ        5\r
105 #define FLOOD_EXPIRE            5\r
106 #define FLOOD_WARNLEVEL         1\r
107 #define FLOOD_MAX_LINES         8\r
108 \r
109 #define JOINFLOOD_TIMEQ_FREQ    225\r
110 #define JOINFLOOD_EXPIRE        450\r
111 #define JOINFLOOD_MAX           3\r
112 #define JOINFLOOD_B_DURATION    900\r
113 \r
114 #define ADV_TIMEQ_FREQ          300\r
115 #define ADV_EXPIRE              900\r
116 #define ADV_WARNLEVEL           2\r
117 \r
118 #define WARNLEVEL_TIMEQ_FREQ    1800\r
119 #define MAX_WARNLEVEL           6\r
120 \r
121 #define KILL_TIMEQ_FREQ         450\r
122 #define KILL_EXPIRE             1800\r
123 #define KILL_WARNLEVEL          3\r
124 \r
125 struct spamNode\r
126 {\r
127         struct chanNode         *channel;\r
128         unsigned long           crc32;\r
129         unsigned int            count;\r
130         struct spamNode         *prev;\r
131         struct spamNode         *next;\r
132 };\r
133 \r
134 struct floodNode\r
135 {\r
136         struct chanNode         *channel;\r
137         struct userNode         *owner;\r
138         unsigned int            count;\r
139         time_t                  time;\r
140         struct floodNode        *prev;\r
141         struct floodNode        *next;\r
142 };\r
143 \r
144 struct killNode\r
145 {\r
146         unsigned int            warnlevel;\r
147         time_t                  time;\r
148 };\r
149 \r
150 struct userInfo\r
151 {\r
152     struct userNode             *user;\r
153         struct spamNode         *spam;\r
154         struct floodNode        *flood;\r
155         struct floodNode        *joinflood;\r
156         unsigned int            flags : 30;\r
157         unsigned int            warnlevel;\r
158         time_t                  lastadv;\r
159 };\r
160 \r
161 struct badword {\r
162     char *id;\r
163     char *badword_mask;\r
164     unsigned int triggered : 29;\r
165     unsigned int action : 3;\r
166 };\r
167 \r
168 /***********************************************/\r
169 /*                 Other Stuff                 */\r
170 /***********************************************/\r
171 \r
172 enum cs_unreg\r
173 {\r
174     manually,\r
175     expire,\r
176     lost_all_users\r
177 };\r
178 \r
179 void init_spamserv(const char *nick);\r
180 struct chanInfo *get_chanInfo(const char *channelname);\r
181 void spamserv_channel_message(struct chanNode *channel, struct userNode *user, char *text);\r
182 void spamserv_cs_suspend(struct chanNode *channel, time_t expiry, int suspend, char *reason);\r
183 int  spamserv_cs_move_merge(struct userNode *user, struct chanNode *channel, struct chanNode *target, int move);\r
184 void spamserv_cs_unregister(struct userNode *user, struct chanNode *channel, enum cs_unreg type, char *reason);\r
185 static struct badword *add_badword(struct chanInfo *cInfo, const char *badword_mask, unsigned int triggered, unsigned int action, const char *id);\r
186 \r
187 #endif\r