1 /*
2 * Copyright (C) 2000,2001 Florian Sander
3 *
4 * $Id: gseencmds.c (1.1.0) for AversE-XP v1.0+ 2003/12/06 [Xp-AvR] Exp $
5 */
6
7 #define PREFIX_LENGTH 20
8
9 static char reply_prefix[PREFIX_LENGTH + 1];
10 #define set_prefix(x) strncpy(reply_prefix, x, PREFIX_LENGTH); \
11 reply_prefix[PREFIX_LENGTH] = 0;
12
seenflood()13 static int seenflood()
14 {
15 if (!maxseen_thr || !maxseen_time)
16 return 0;
17 if ((now - seenflood_time) > maxseen_time) {
18 seenflood_time = now;
19 seenflood_thr = 0;
20 }
21 seenflood_thr++;
22 if (seenflood_thr > maxseen_thr)
23 return 1;
24 else
25 return 0;
26 }
27
nopub(char * chan)28 static int nopub(char *chan)
29 {
30 char buf[121], *b;
31
32 Context;
33 strncpy(buf, no_pub, 120);
34 buf[120] = 0;
35 b = buf;
36 while (b[0])
37 if (!strcasecmp(chan, newsplit(&b)))
38 return 1;
39 if (ngetudef("nopubseens", chan))
40 return 1;
41 return 0;
42 }
43
quietseen(char * chan)44 static int quietseen(char *chan)
45 {
46 char buf[121], *b;
47
48 Context;
49 strncpy(buf, quiet_seen, 120);
50 buf[120] = 0;
51 b = buf;
52 while (b[0])
53 if (!strcasecmp(chan, newsplit(&b)))
54 return 1;
55 if (ngetudef("quietseens", chan))
56 return 1;
57 return 0;
58 }
59
cmd_seen(struct userrec * u,int idx,char * par)60 static int cmd_seen(struct userrec *u, int idx, char *par)
61 {
62 char *query;
63
64 Context;
65 if (seenflood())
66 return 0;
67 reset_global_vars();
68 glob_slang = slang_find(coreslangs, default_slang);
69 glob_nick = dcc[idx].nick;
70 query = newsplit(&par);
71 glob_query = query;
72 set_prefix(SLDCCPREFIX);
73 putlog(LOG_CMDS, "*", "#%s# seen %s", dcc[idx].nick, par);
74 dprintf(idx, "%s%s\n", reply_prefix, do_seen(query, dcc[idx].nick,
75 dcc[idx].host, "[partyline]", botnet_seen));
76 return 0;
77 }
78
cmd_seenstats(struct userrec * u,int idx,char * par)79 static int cmd_seenstats(struct userrec *u, int idx, char *par)
80 {
81 Context;
82 if (seenflood())
83 return 0;
84 reset_global_vars();
85 glob_slang = slang_find(coreslangs, default_slang);
86 glob_nick = dcc[idx].nick;
87 set_prefix(SLDCCPREFIX);
88 putlog(LOG_CMDS, "*", "#%s# seenstats", dcc[idx].nick);
89 dprintf(idx, "%s%s\n", reply_prefix, do_seenstats());
90 return 0;
91 }
92
cmd_purgeseens(struct userrec * u,int idx,char * par)93 static int cmd_purgeseens(struct userrec *u, int idx, char *par)
94 {
95 Context;
96 purge_seens();
97 putlog(LOG_CMDS, "*", "#%s# purgeseens", dcc[idx].nick);
98 return 0;
99 }
100
pub_seen(char * nick,char * host,char * hand,char * channel,char * text)101 static int pub_seen(char *nick, char *host, char *hand,
102 char *channel, char *text)
103 {
104 char *dest;
105 struct chanset_t *chan;
106
107 Context;
108 if (seenflood() || nopub(channel))
109 return 0;
110 reset_global_vars();
111 glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
112 glob_nick = nick;
113 putlog(LOG_CMDS, "*", "<<%s>> !%s! seen %s", nick, hand, text);
114 if (quietseen(channel)) {
115 set_prefix(SLNOTPREFIX);
116 dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix,
117 do_seen(newsplit(&text), nick, host, channel, botnet_seen));
118 return 0;
119 }
120 chan = findchan_by_dname(channel);
121 if (chan)
122 dest = chan->name;
123 else
124 dest = channel;
125 set_prefix(SLPUBPREFIX);
126 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix,
127 do_seen(newsplit(&text), nick, host, channel, botnet_seen));
128 return 0;
129 }
130
pub_seenstats(char * nick,char * host,char * hand,char * channel,char * text)131 static int pub_seenstats(char *nick, char *host, char *hand,
132 char *channel, char *text)
133 {
134 char *dest;
135 struct chanset_t *chan;
136
137 Context;
138 if (seenflood())
139 return 0;
140 if (nopub(channel))
141 return 0;
142 reset_global_vars();
143 glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
144 glob_nick = nick;
145 putlog(LOG_CMDS, "*", "<<%s>> !%s! seenstats", nick, hand);
146 if (quietseen(channel)) {
147 set_prefix(SLNOTPREFIX);
148 dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seenstats());
149 return 0;
150 }
151 chan = findchan_by_dname(channel);
152 if (chan)
153 dest = chan->name;
154 else
155 dest = channel;
156 set_prefix(SLPUBPREFIX);
157 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seenstats());
158 return 1;
159 }
160
msg_seen(char * nick,char * uhost,struct userrec * u,char * text)161 static int msg_seen(char *nick, char *uhost, struct userrec *u, char *text)
162 {
163 Context;
164 if (seenflood())
165 return 0;
166 reset_global_vars();
167 glob_slang = slang_getbynick(coreslangs, nick);
168 glob_nick = nick;
169 putlog(LOG_CMDS, "*", "(%s!%s) !%s! seen %s", nick, uhost, u ? u->handle : "*", text);
170 set_prefix(SLMSGPREFIX);
171 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix,
172 do_seen(newsplit(&text), nick, uhost, "[/msg]", botnet_seen));
173 return 1;
174 }
175
pub_seennick(char * nick,char * host,char * hand,char * channel,char * text)176 static int pub_seennick(char *nick, char *host, char *hand,
177 char *channel, char *text)
178 {
179 seendat *l;
180 char *dest;
181 struct chanset_t *chan;
182
183 Context;
184 if (seenflood())
185 return 0;
186 if (nopub(channel))
187 return 0;
188 putlog(LOG_CMDS, "*", "<<%s>> !%s! seennick %s", nick, hand, text);
189 reset_global_vars();
190 glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
191 glob_nick = nick;
192 chan = findchan_by_dname(channel);
193 if (chan)
194 dest = chan->name;
195 else
196 dest = channel;
197 text = newsplit(&text);
198 l = findseen(text);
199 if (!l) {
200 glob_query = text;
201 if (quietseen(channel)) {
202 set_prefix(SLNOTPREFIX);
203 dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
204 } else {
205 set_prefix(SLPUBPREFIX);
206 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, SLNOTSEEN);
207 }
208 return 0;
209 }
210 if (quietseen(channel)) {
211 set_prefix(SLNOTPREFIX);
212 dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seennick(l));
213 } else {
214 set_prefix(SLPUBPREFIX);
215 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seennick(l));
216 }
217 return 0;
218 }
219
msg_seennick(char * nick,char * uhost,struct userrec * u,char * text)220 static int msg_seennick(char *nick, char *uhost, struct userrec *u, char *text)
221 {
222 seendat *l;
223
224 Context;
225 if (seenflood())
226 return 0;
227 putlog(LOG_CMDS, "*", "(%s!%s) !%s! seennick %s", nick, uhost, u ? u->handle : "*", text);
228 reset_global_vars();
229 glob_slang = slang_getbynick(coreslangs, nick);
230 glob_nick = nick;
231 set_prefix(SLMSGPREFIX);
232 text = newsplit(&text);
233 l = findseen(text);
234 if (!l) {
235 glob_query = text;
236 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
237 return 0;
238 }
239 dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, do_seennick(l));
240 return 0;
241 }
242
cmd_seennick(struct userrec * u,int idx,char * text)243 static int cmd_seennick(struct userrec *u, int idx, char *text)
244 {
245 seendat *l;
246
247 Context;
248 if (seenflood())
249 return 0;
250 putlog(LOG_CMDS, "*", "#%s# seennick %s", dcc[idx].nick, text);
251 reset_global_vars();
252 glob_slang = slang_find(coreslangs, default_slang);
253 glob_nick = dcc[idx].nick;
254 set_prefix(SLMSGPREFIX);
255 text = newsplit(&text);
256 l = findseen(text);
257 if (!l) {
258 glob_query = text;
259 dprintf(idx, "%s%s\n", reply_prefix, SLNOTSEEN);
260 return 0;
261 }
262 dprintf(idx, "%s%s\n", reply_prefix, do_seennick(l));
263 return 0;
264 }
265
bot_gseen_req(char * bot,char * code,char * par)266 static int bot_gseen_req(char *bot, char *code, char *par)
267 {
268 char *mask, *nick, *uhost, *chan, *reply;
269 char tosend[256];
270 int i;
271
272 Context;
273 if (seenflood())
274 return 0;
275 i = nextbot(bot);
276 if (i < 0) {
277 debug1("Couldn't answer botnet-seen-request from %s: no such bot", bot);
278 return 0;
279 }
280 mask = newsplit(&par);
281 nick = newsplit(&par);
282 uhost = newsplit(&par);
283 chan = newsplit(&par);
284 reset_global_vars();
285 glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
286 glob_nick = nick;
287 reply = do_seen(mask, nick, uhost, chan, -1);
288 if (!reply)
289 return 0;
290 if ((strlen(nick) + strlen(chan) + strlen(reply)) < 255) {
291 sprintf(tosend, "gseen_rep %s %s %s", nick, chan, reply);
292 botnet_send_zapf(i, botnetnick, bot, tosend);
293 }
294 return 0;
295 }
296
bot_gseen_rep(char * bot,char * code,char * par)297 static int bot_gseen_rep(char *bot, char *code, char *par)
298 {
299 char *nick, *chan, *reply;
300 int i;
301
302 Context;
303 if (seenflood())
304 return 0;
305 glob_remotebot = bot;
306 if (!bnsnick || !bnschan) {
307 if (bnsnick)
308 nfree(bnsnick);
309 if (bnschan)
310 nfree(bnschan);
311 bnsnick = bnschan = NULL;
312 return 0;
313 }
314 nick = newsplit(&par);
315 chan = newsplit(&par);
316 reset_global_vars();
317 glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
318 glob_nick = nick;
319 reply = par;
320 if (strcmp(nick, bnsnick) || strcmp(chan, bnschan))
321 return 0;
322 if (findchan(chan)) {
323 if (nopub(chan)) {
324 nfree(bnsnick);
325 nfree(bnschan);
326 bnsnick = bnschan = NULL;
327 debug1("%s is nopub, bns-reply dropped", chan);
328 return 0;
329 }
330 if (quietseen(chan)) {
331 set_prefix(SLNOTPREFIX);
332 dprintf(DP_HELP, "NOTICE %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
333 } else {
334 set_prefix(SLPUBPREFIX);
335 dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", chan, reply_prefix, SLRBOTSAYS, reply);
336 }
337 } else if (!strcmp(chan, "[/msg]")) {
338 set_prefix(SLMSGPREFIX);
339 dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
340 } else if (!strcmp(chan, "[partyline]")) {
341 for (i = 0; i < dcc_total; i++) {
342 if ((!strcasecmp(nick, dcc[i].nick)) &&
343 (dcc[i].type->flags & DCT_SIMUL)) {
344 set_prefix(SLDCCPREFIX);
345 dprintf(i, "%s%s%s\n", reply_prefix, SLRBOTSAYS, reply);
346 break;
347 }
348 }
349 } else
350 debug1("Couldn't send received bns answer, no such chan %s", chan);
351 nfree(bnsnick);
352 nfree(bnschan);
353 bnsnick = bnschan = NULL;
354 return 0;
355 }
356
357 static cmd_t mydcc[] =
358 {
359 {"seen", "-|-", cmd_seen, NULL},
360 {"seenstats", "-|-", cmd_seenstats, NULL},
361 {"purgeseens", "m", cmd_purgeseens, NULL},
362 {"seennick", "-|-", cmd_seennick, NULL},
363 {0, 0, 0, 0}
364 };
365
366 static cmd_t seen_pub[] =
367 {
368 {"!seen", "", pub_seen, 0},
369 {"!seenstats", "", pub_seenstats, 0},
370 {"!seennick", "", pub_seennick, 0},
371 {0, 0, 0, 0}
372 };
373
374 static cmd_t seen_msg[] =
375 {
376 {"seen", "", msg_seen, 0},
377 {"seennick", "", msg_seennick, 0},
378 {0, 0, 0, 0}
379 };
380
381 static cmd_t seen_bot[] =
382 {
383 {"gseen_req", "", bot_gseen_req, 0},
384 {"gseen_rep", "", bot_gseen_rep, 0},
385 {0, 0, 0, 0}
386 };
387