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