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