]> jfr.im git - irc/quakenet/newserv.git/blame - nterface/nterfacer_control.c
Iniital commit of chanfix module on Z
[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
CP
35#include "../lib/irc_string.h"
36
37#include "library.h"
38#include "nterfacer_control.h"
39
18f8bd28
CP
40int handle_ison(struct rline *li, int argc, char **argv);
41int handle_whois(struct rline *li, int argc, char **argv);
42int handle_message(struct rline *li, int argc, char **argv);
43int handle_notice(struct rline *li, int argc, char **argv);
44int handle_channel(struct rline *li, int argc, char **argv);
45int handle_onchan(struct rline *li, int argc, char **argv);
46int handle_status(struct rline *li, int argc, char **argv);
47int handle_servicesonchan(struct rline *li, int argc, char **argv);
b55cdc29 48int handle_counthost(struct rline *li, int argc, char **argv);
18f8bd28
CP
49
50struct rline *grli; /* used inline for status */
51
52void _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
68void _fini(void) {
504f62c7
CP
69 if(n_node)
70 deregister_service(n_node);
18f8bd28
CP
71}
72
73int 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
82int 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
107int 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
125int handle_notice(struct rline *li, int argc, char **argv) {
126 return handle_message(li, -argc, argv);
127}
128
129int 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
142int 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
166void 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
171int 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 */
181int 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
202int 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