]>
Commit | Line | Data |
---|---|---|
18f8bd28 CP |
1 | /* |
2 | nterfacer newserv control module | |
c86a0114 | 3 | Copyright (C) 2004-2005 Chris Porter. |
18f8bd28 | 4 | |
b55cdc29 CP |
5 | v1.08 |
6 | - added counthost, removed isaccounton (as it didn't do anything!) | |
8da2a7b1 CP |
7 | v1.07 |
8 | - added modes | |
504f62c7 CP |
9 | v1.06 |
10 | - seperated chanstats | |
18f8bd28 CP |
11 | v1.05 |
12 | - modified whois to take into account channels with ',' | |
13 | - made ison take multiple arguments | |
14 | - added isaccounton | |
15 | v1.04 | |
16 | - added status/onchan/servicesonchan | |
17 | v1.03 | |
18 | - added multiple targets for channel/nick notice/message commands | |
19 | v1.02 | |
20 | - added channel message, nick message/notice commands | |
21 | - generalised error messages | |
22 | v1.01 | |
23 | - whois fixed to notice BUF_OVER | |
24 | */ | |
25 | ||
b55cdc29 CP |
26 | #include <string.h> |
27 | ||
18f8bd28 CP |
28 | #include "../localuser/localuserchannel.h" |
29 | #include "../channel/channel.h" | |
a4560bdf | 30 | #include "../lib/strlfunc.h" |
18f8bd28 CP |
31 | #include "../control/control.h" |
32 | #include "../core/hooks.h" | |
8da2a7b1 CP |
33 | #include "../nick/nick.h" |
34 | #include "../lib/flags.h" | |
18f8bd28 CP |
35 | #include "../lib/irc_string.h" |
36 | ||
37 | #include "library.h" | |
38 | #include "nterfacer_control.h" | |
39 | ||
18f8bd28 CP |
40 | int handle_ison(struct rline *li, int argc, char **argv); |
41 | int handle_whois(struct rline *li, int argc, char **argv); | |
42 | int handle_message(struct rline *li, int argc, char **argv); | |
43 | int handle_notice(struct rline *li, int argc, char **argv); | |
44 | int handle_channel(struct rline *li, int argc, char **argv); | |
45 | int handle_onchan(struct rline *li, int argc, char **argv); | |
46 | int handle_status(struct rline *li, int argc, char **argv); | |
47 | int handle_servicesonchan(struct rline *li, int argc, char **argv); | |
b55cdc29 | 48 | int handle_counthost(struct rline *li, int argc, char **argv); |
18f8bd28 CP |
49 | |
50 | struct rline *grli; /* used inline for status */ | |
51 | ||
52 | void _init(void) { | |
504f62c7 CP |
53 | n_node = register_service("N"); |
54 | if(!n_node) | |
18f8bd28 CP |
55 | return; |
56 | ||
504f62c7 CP |
57 | register_handler(n_node, "ison", 1, handle_ison); |
58 | register_handler(n_node, "whois", 1, handle_whois); | |
59 | register_handler(n_node, "msg", 2, handle_message); | |
60 | register_handler(n_node, "notice", 2, handle_notice); | |
61 | register_handler(n_node, "chanmsg", 2, handle_channel); | |
62 | register_handler(n_node, "onchan", 2, handle_onchan); | |
63 | register_handler(n_node, "status", 0, handle_status); | |
64 | register_handler(n_node, "servicesonchan", 1, handle_servicesonchan); | |
b55cdc29 | 65 | register_handler(n_node, "counthost", 1, handle_counthost); |
18f8bd28 CP |
66 | } |
67 | ||
68 | void _fini(void) { | |
504f62c7 CP |
69 | if(n_node) |
70 | deregister_service(n_node); | |
18f8bd28 CP |
71 | } |
72 | ||
73 | int handle_ison(struct rline *li, int argc, char **argv) { | |
74 | int i; | |
75 | for(i=0;i<argc;i++) | |
b55cdc29 CP |
76 | if(ri_append(li, "%d", getnickbynick(argv[i])?1:0) == BF_OVER) |
77 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
18f8bd28 | 78 | |
18f8bd28 CP |
79 | return ri_final(li); |
80 | } | |
81 | ||
82 | int handle_whois(struct rline *li, int argc, char **argv) { | |
83 | nick *np = getnickbynick(argv[0]); | |
84 | channel **channels; | |
85 | ||
86 | int i; | |
87 | ||
88 | if(!np) | |
89 | return ri_error(li, ERR_TARGET_NOT_FOUND, "User not online"); | |
90 | ||
91 | ri_append(li, "%s", np->nick); | |
92 | ri_append(li, "%s", np->ident); | |
93 | ri_append(li, "%s", np->host->name->content); | |
94 | ri_append(li, "%s", np->realname->name->content); | |
95 | ri_append(li, "%s", np->authname); | |
8da2a7b1 | 96 | ri_append(li, "%s", printflags(np->umodes, umodeflags)); |
18f8bd28 CP |
97 | |
98 | channels = np->channels->content; | |
99 | ||
100 | for(i=0;i<np->channels->cursi;i++) | |
101 | if(ri_append(li, "%s", channels[i]->index->name->content) == BF_OVER) | |
102 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
103 | ||
104 | return ri_final(li); | |
105 | } | |
106 | ||
107 | int handle_message(struct rline *li, int argc, char **argv) { | |
108 | int realargc = abs(argc), i; | |
109 | nick *np = getnickbynick(argv[0]); | |
110 | if(!np) | |
111 | return ri_error(li, ERR_TARGET_NOT_FOUND, "User not online"); | |
112 | ||
113 | for(i=1;i<realargc;i++) { | |
114 | if(argc < 0) { | |
115 | controlnotice(np, "%s", argv[i]); | |
116 | } else { | |
117 | controlreply(np, "%s", argv[i]); | |
118 | } | |
119 | } | |
120 | ||
121 | ri_append(li, "Done."); | |
122 | return ri_final(li); | |
123 | } | |
124 | ||
125 | int handle_notice(struct rline *li, int argc, char **argv) { | |
126 | return handle_message(li, -argc, argv); | |
127 | } | |
128 | ||
129 | int handle_channel(struct rline *li, int argc, char **argv) { | |
130 | int i; | |
131 | channel *cp = findchannel(argv[0]); | |
132 | if(!cp) | |
133 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
134 | ||
135 | for(i=1;i<argc;i++) | |
136 | controlchanmsg(cp, "%s", argv[i]); | |
137 | ||
138 | ri_append(li, "Done."); | |
139 | return ri_final(li); | |
140 | } | |
141 | ||
142 | int handle_onchan(struct rline *li, int argc, char **argv) { | |
143 | int i; | |
144 | nick *np = getnickbynick(argv[0]); | |
145 | channel **channels; | |
146 | channel *cp; | |
147 | if(!np) | |
148 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Nickname not found"); | |
149 | ||
150 | cp = findchannel(argv[1]); | |
151 | if(!cp) | |
152 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
153 | ||
154 | channels = (channel **)np->channels->content; | |
155 | for(i=0;i<np->channels->cursi;i++) { | |
156 | if(channels[i]->index->channel == cp) { | |
157 | ri_append(li, "1"); | |
158 | return ri_final(li); | |
159 | } | |
160 | } | |
161 | ||
162 | ri_append(li, "0"); | |
163 | return ri_final(li); | |
164 | } | |
165 | ||
166 | void handle_nterfacerstats(int hooknum, void *arg) { | |
b55cdc29 | 167 | /* hmm, not much we can do here, @ppa */ |
18f8bd28 CP |
168 | ri_append(grli, "%s", (char *)arg); |
169 | } | |
170 | ||
171 | int handle_status(struct rline *li, int argc, char **argv) { | |
172 | grli = li; | |
173 | ||
174 | registerhook(HOOK_CORE_STATSREPLY, &handle_nterfacerstats); | |
175 | triggerhook(HOOK_CORE_STATSREQUEST, (void *)5); | |
176 | deregisterhook(HOOK_CORE_STATSREPLY, &handle_nterfacerstats); | |
177 | return ri_final(li); | |
178 | } | |
179 | ||
180 | /* assumes services have a single char nickname and +k set */ | |
181 | int handle_servicesonchan(struct rline *li, int argc, char **argv) { | |
182 | int i; | |
183 | nick *np; | |
184 | channel *cp = findchannel(argv[0]); | |
185 | if(!cp) | |
186 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
187 | ||
188 | #if NICKLEN >= 1 /* if not we have a buffer overflow */ | |
189 | for(i=0;i<=cp->users->hashsize;i++) { | |
190 | if(cp->users->content[i] != nouser) { | |
191 | np = getnickbynumeric(cp->users->content[i]); | |
192 | if(np && IsService(np) && np->nick[0] && !np->nick[1]) | |
b55cdc29 CP |
193 | if(ri_append(li, "%s", np->nick) == BF_OVER) |
194 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
18f8bd28 CP |
195 | } |
196 | } | |
197 | #endif | |
198 | ||
199 | return ri_final(li); | |
200 | } | |
b55cdc29 CP |
201 | |
202 | int handle_counthost(struct rline *li, int argc, char **argv) { | |
203 | int i, j; | |
204 | unsigned int results[100]; | |
205 | host *hp; | |
206 | if(argc > 100) | |
207 | return ri_error(li, ERR_TOO_MANY_ARGS, "Too many arguments"); | |
208 | ||
209 | memset(results, 0, sizeof(results)); | |
210 | ||
211 | for(j=0;j<argc;j++) | |
212 | collapse(argv[j]); | |
213 | ||
214 | for(i=0;i<HOSTHASHSIZE;i++) | |
215 | for(hp=hosttable[i];hp;hp=hp->next) | |
216 | for(j=0;j<argc;j++) | |
217 | if(!match(argv[j], hp->name->content)) | |
218 | results[j]+=hp->clonecount; | |
219 | ||
220 | for(j=0;j<argc;j++) | |
221 | if(ri_append(li, "%d", results[j]) == BF_OVER) | |
222 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
223 | ||
224 | ||
225 | return ri_final(li); | |
226 | } | |
227 | ||
228 |