1 /*
2 * channel grep feature
3 *
4 * written by Kraig Amador
5 */
6
7 #include "irc.h"
8 #include "ircaux.h"
9 #include "grep.h"
10 #include "output.h"
11 #include "list.h"
12 #include "dma.h"
13
14 #include "channels.h"
15 #include "ninja.h"
16
17 ChanGrep *grep_list = (ChanGrep *) NULL;
18
19 /*
20 * add/remove channel greps..
21 *
22 * this is intended to be called from edit.c
23 */
24 void
grep(u_char * command,u_char * args,u_char * subargs)25 grep(u_char *command, u_char *args, u_char *subargs)
26 {
27 ChanGrep *channel;
28 u_char *chan;
29
30 if (!(args && *args) && grep_list)
31 {
32 put_info("Channel grep list:");
33 for (channel = grep_list; channel; channel = channel->next)
34 put_info("%s: %s",
35 channel->channel, channel->words);
36 return;
37 }
38 else if (!(args && *args) && !grep_list)
39 {
40 usage("grep", "[-]<channel> <mask1> ... <maskn>");
41 return;
42 }
43 chan = next_arg(args, &args);
44 if (chan && *chan == '-')
45 {
46 chan++;
47 if (*chan)
48 {
49 channel = (ChanGrep *) find_in_list((List **)&grep_list, make_chan(chan), 0);
50 if (!channel)
51 {
52 put_info("%s is not in your channel grep list.", make_chan(chan));
53 return;
54 }
55 if ((channel = (ChanGrep *) remove_from_list((List **) & grep_list, make_chan(chan))) != NULL)
56 {
57 dma_Free(&channel->words);
58 dma_Free(&channel->channel);
59 dma_Free(&channel);
60 }
61 put_info("%s removed from your channel grep list.",
62 make_chan(chan));
63 return;
64 }
65 else
66 {
67 usage("grep", "[-]<channel> <masks1> .. <maskn>");
68 return;
69 }
70 }
71 else
72 {
73 channel = (ChanGrep *) find_in_list((List **)&grep_list, make_chan(chan), 0);
74 if (!channel && args && *args)
75 {
76 channel = (ChanGrep *) dma_Malloc(sizeof(ChanGrep));
77 channel->channel = NULL;
78 channel->words = NULL;
79 dma_strcpy(&channel->channel, make_chan(chan));
80 dma_strcpy(&channel->words, args);
81 add_to_list((List **) & (grep_list), (List *) channel);
82 put_info("Grep list for %s is: %s", channel->channel, args);
83 }
84 else if (!channel && !(args && *args))
85 {
86 put_info("%s is not in your channel grep list.", make_chan(chan));
87 return;
88 }
89 else if (channel && args && *args)
90 {
91 dma_strcpy(&channel->words, args);
92 put_info("Grep list for %s is: %s",
93 channel->channel, args);
94 }
95 else if (channel && !(args && *args))
96 {
97 put_info("Channel grep list:");
98 put_info("%s: %s",
99 channel->channel, channel->words);
100 }
101 }
102 }
103
104 /*
105 * see if we are grep'n this channel and if so, see if it matches the grep(s)
106 * returns: 1 (print it)
107 * 0 (don't print it)
108 */
109 int
checkgrep(u_char * chan,u_char * line)110 checkgrep(u_char *chan, u_char *line)
111 {
112 ChanGrep *channel;
113 u_char *ptr, *ptr2 = NULL, *ptr2_free, tmpbuf[1024], tmp2buf[1024];
114
115 channel = (ChanGrep *) find_in_list((List **)&grep_list, chan, 0);
116 if (channel && !line)
117 return 0;
118 if (!channel)
119 return 1;
120 strncpy(tmpbuf, line, sizeof(tmpbuf)-1);
121 dma_strcpy(&ptr2, channel->words);
122 ptr2_free = ptr2;
123 while ((ptr = my_strsep(&ptr2, " ")))
124 {
125 if (*ptr)
126 {
127 snprintf(tmp2buf, sizeof(tmp2buf)-1, "*%s*", ptr);
128 if (match(tmp2buf, tmpbuf))
129 {
130 dma_Free(&ptr2_free);
131 return 1;
132 }
133 }
134 }
135 dma_Free(&ptr2_free);
136 return 0;
137 }
138
139