]> jfr.im git - irc/quakenet/newserv.git/blame - nterface/nterfacer_control.c
Sigh
[irc/quakenet/newserv.git] / nterface / nterfacer_control.c
CommitLineData
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 41MODULE_VERSION("$Id: nterfacer_control.c 663 2006-05-16 17:27:36Z newserv $")
87698d77 42
18f8bd28
CP
43int handle_ison(struct rline *li, int argc, char **argv);
44int handle_whois(struct rline *li, int argc, char **argv);
45int handle_message(struct rline *li, int argc, char **argv);
46int handle_notice(struct rline *li, int argc, char **argv);
47int handle_channel(struct rline *li, int argc, char **argv);
48int handle_onchan(struct rline *li, int argc, char **argv);
49int handle_status(struct rline *li, int argc, char **argv);
50int handle_servicesonchan(struct rline *li, int argc, char **argv);
b55cdc29 51int handle_counthost(struct rline *li, int argc, char **argv);
18f8bd28
CP
52
53struct rline *grli; /* used inline for status */
54
55void _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
71void _fini(void) {
504f62c7
CP
72 if(n_node)
73 deregister_service(n_node);
18f8bd28
CP
74}
75
76int 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
85int 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
110int 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
128int handle_notice(struct rline *li, int argc, char **argv) {
129 return handle_message(li, -argc, argv);
130}
131
132int 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
145int 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
169void 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
174int 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 */
184int 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
205int 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