]>
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 | 35 | #include "../lib/irc_string.h" |
87698d77 | 36 | #include "../lib/version.h" |
18f8bd28 CP |
37 | |
38 | #include "library.h" | |
39 | #include "nterfacer_control.h" | |
40 | ||
0a55e401 | 41 | MODULE_VERSION("$Id: nterfacer_control.c 663 2006-05-16 17:27:36Z newserv $") |
87698d77 | 42 | |
18f8bd28 CP |
43 | int handle_ison(struct rline *li, int argc, char **argv); |
44 | int handle_whois(struct rline *li, int argc, char **argv); | |
45 | int handle_message(struct rline *li, int argc, char **argv); | |
46 | int handle_notice(struct rline *li, int argc, char **argv); | |
47 | int handle_channel(struct rline *li, int argc, char **argv); | |
48 | int handle_onchan(struct rline *li, int argc, char **argv); | |
49 | int handle_status(struct rline *li, int argc, char **argv); | |
50 | int handle_servicesonchan(struct rline *li, int argc, char **argv); | |
b55cdc29 | 51 | int handle_counthost(struct rline *li, int argc, char **argv); |
18f8bd28 CP |
52 | |
53 | struct rline *grli; /* used inline for status */ | |
54 | ||
55 | void _init(void) { | |
504f62c7 CP |
56 | n_node = register_service("N"); |
57 | if(!n_node) | |
18f8bd28 CP |
58 | return; |
59 | ||
504f62c7 CP |
60 | register_handler(n_node, "ison", 1, handle_ison); |
61 | register_handler(n_node, "whois", 1, handle_whois); | |
62 | register_handler(n_node, "msg", 2, handle_message); | |
63 | register_handler(n_node, "notice", 2, handle_notice); | |
64 | register_handler(n_node, "chanmsg", 2, handle_channel); | |
65 | register_handler(n_node, "onchan", 2, handle_onchan); | |
66 | register_handler(n_node, "status", 0, handle_status); | |
67 | register_handler(n_node, "servicesonchan", 1, handle_servicesonchan); | |
b55cdc29 | 68 | register_handler(n_node, "counthost", 1, handle_counthost); |
18f8bd28 CP |
69 | } |
70 | ||
71 | void _fini(void) { | |
504f62c7 CP |
72 | if(n_node) |
73 | deregister_service(n_node); | |
18f8bd28 CP |
74 | } |
75 | ||
76 | int handle_ison(struct rline *li, int argc, char **argv) { | |
77 | int i; | |
78 | for(i=0;i<argc;i++) | |
b55cdc29 CP |
79 | if(ri_append(li, "%d", getnickbynick(argv[i])?1:0) == BF_OVER) |
80 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
18f8bd28 | 81 | |
18f8bd28 CP |
82 | return ri_final(li); |
83 | } | |
84 | ||
85 | int handle_whois(struct rline *li, int argc, char **argv) { | |
86 | nick *np = getnickbynick(argv[0]); | |
87 | channel **channels; | |
88 | ||
89 | int i; | |
90 | ||
91 | if(!np) | |
92 | return ri_error(li, ERR_TARGET_NOT_FOUND, "User not online"); | |
93 | ||
94 | ri_append(li, "%s", np->nick); | |
95 | ri_append(li, "%s", np->ident); | |
96 | ri_append(li, "%s", np->host->name->content); | |
97 | ri_append(li, "%s", np->realname->name->content); | |
98 | ri_append(li, "%s", np->authname); | |
8da2a7b1 | 99 | ri_append(li, "%s", printflags(np->umodes, umodeflags)); |
18f8bd28 CP |
100 | |
101 | channels = np->channels->content; | |
102 | ||
103 | for(i=0;i<np->channels->cursi;i++) | |
104 | if(ri_append(li, "%s", channels[i]->index->name->content) == BF_OVER) | |
105 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
106 | ||
107 | return ri_final(li); | |
108 | } | |
109 | ||
110 | int handle_message(struct rline *li, int argc, char **argv) { | |
111 | int realargc = abs(argc), i; | |
112 | nick *np = getnickbynick(argv[0]); | |
113 | if(!np) | |
114 | return ri_error(li, ERR_TARGET_NOT_FOUND, "User not online"); | |
115 | ||
116 | for(i=1;i<realargc;i++) { | |
117 | if(argc < 0) { | |
118 | controlnotice(np, "%s", argv[i]); | |
119 | } else { | |
120 | controlreply(np, "%s", argv[i]); | |
121 | } | |
122 | } | |
123 | ||
124 | ri_append(li, "Done."); | |
125 | return ri_final(li); | |
126 | } | |
127 | ||
128 | int handle_notice(struct rline *li, int argc, char **argv) { | |
129 | return handle_message(li, -argc, argv); | |
130 | } | |
131 | ||
132 | int handle_channel(struct rline *li, int argc, char **argv) { | |
133 | int i; | |
134 | channel *cp = findchannel(argv[0]); | |
135 | if(!cp) | |
136 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
137 | ||
138 | for(i=1;i<argc;i++) | |
139 | controlchanmsg(cp, "%s", argv[i]); | |
140 | ||
141 | ri_append(li, "Done."); | |
142 | return ri_final(li); | |
143 | } | |
144 | ||
145 | int handle_onchan(struct rline *li, int argc, char **argv) { | |
146 | int i; | |
147 | nick *np = getnickbynick(argv[0]); | |
148 | channel **channels; | |
149 | channel *cp; | |
150 | if(!np) | |
151 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Nickname not found"); | |
152 | ||
153 | cp = findchannel(argv[1]); | |
154 | if(!cp) | |
155 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
156 | ||
157 | channels = (channel **)np->channels->content; | |
158 | for(i=0;i<np->channels->cursi;i++) { | |
159 | if(channels[i]->index->channel == cp) { | |
160 | ri_append(li, "1"); | |
161 | return ri_final(li); | |
162 | } | |
163 | } | |
164 | ||
165 | ri_append(li, "0"); | |
166 | return ri_final(li); | |
167 | } | |
168 | ||
169 | void handle_nterfacerstats(int hooknum, void *arg) { | |
b55cdc29 | 170 | /* hmm, not much we can do here, @ppa */ |
18f8bd28 CP |
171 | ri_append(grli, "%s", (char *)arg); |
172 | } | |
173 | ||
174 | int handle_status(struct rline *li, int argc, char **argv) { | |
175 | grli = li; | |
176 | ||
177 | registerhook(HOOK_CORE_STATSREPLY, &handle_nterfacerstats); | |
178 | triggerhook(HOOK_CORE_STATSREQUEST, (void *)5); | |
179 | deregisterhook(HOOK_CORE_STATSREPLY, &handle_nterfacerstats); | |
180 | return ri_final(li); | |
181 | } | |
182 | ||
183 | /* assumes services have a single char nickname and +k set */ | |
184 | int handle_servicesonchan(struct rline *li, int argc, char **argv) { | |
185 | int i; | |
186 | nick *np; | |
187 | channel *cp = findchannel(argv[0]); | |
188 | if(!cp) | |
189 | return ri_error(li, ERR_TARGET_NOT_FOUND, "Channel not found"); | |
190 | ||
191 | #if NICKLEN >= 1 /* if not we have a buffer overflow */ | |
192 | for(i=0;i<=cp->users->hashsize;i++) { | |
193 | if(cp->users->content[i] != nouser) { | |
194 | np = getnickbynumeric(cp->users->content[i]); | |
195 | if(np && IsService(np) && np->nick[0] && !np->nick[1]) | |
b55cdc29 CP |
196 | if(ri_append(li, "%s", np->nick) == BF_OVER) |
197 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
18f8bd28 CP |
198 | } |
199 | } | |
200 | #endif | |
201 | ||
202 | return ri_final(li); | |
203 | } | |
b55cdc29 CP |
204 | |
205 | int handle_counthost(struct rline *li, int argc, char **argv) { | |
206 | int i, j; | |
207 | unsigned int results[100]; | |
208 | host *hp; | |
209 | if(argc > 100) | |
210 | return ri_error(li, ERR_TOO_MANY_ARGS, "Too many arguments"); | |
211 | ||
212 | memset(results, 0, sizeof(results)); | |
213 | ||
214 | for(j=0;j<argc;j++) | |
215 | collapse(argv[j]); | |
216 | ||
217 | for(i=0;i<HOSTHASHSIZE;i++) | |
218 | for(hp=hosttable[i];hp;hp=hp->next) | |
219 | for(j=0;j<argc;j++) | |
220 | if(!match(argv[j], hp->name->content)) | |
221 | results[j]+=hp->clonecount; | |
222 | ||
223 | for(j=0;j<argc;j++) | |
224 | if(ri_append(li, "%d", results[j]) == BF_OVER) | |
225 | return ri_error(li, BF_OVER, "Buffer overflow"); | |
226 | ||
227 | ||
228 | return ri_final(li); | |
229 | } | |
230 | ||
231 |