]>
jfr.im git - irc/quakenet/newserv.git/blob - nterfacer/nterfacer_control.c
2 nterfacer newserv control module
3 Copyright (C) 2004-2007 Chris Porter.
8 #include "../localuser/localuserchannel.h"
9 #include "../channel/channel.h"
10 #include "../lib/strlfunc.h"
11 #include "../control/control.h"
12 #include "../core/hooks.h"
13 #include "../nick/nick.h"
14 #include "../lib/flags.h"
15 #include "../lib/irc_string.h"
16 #include "../lib/version.h"
17 #include "../authext/authext.h"
20 #include "nterfacer_control.h"
24 int handle_ison(struct rline
*li
, int argc
, char **argv
);
25 int handle_isaccounton(struct rline
*li
, int argc
, char **argv
);
26 int handle_whois(struct rline
*li
, int argc
, char **argv
);
27 int handle_message(struct rline
*li
, int argc
, char **argv
);
28 int handle_notice(struct rline
*li
, int argc
, char **argv
);
29 int handle_channel(struct rline
*li
, int argc
, char **argv
);
30 int handle_onchan(struct rline
*li
, int argc
, char **argv
);
31 int handle_status(struct rline
*li
, int argc
, char **argv
);
32 int handle_servicesonchan(struct rline
*li
, int argc
, char **argv
);
33 int handle_counthost(struct rline
*li
, int argc
, char **argv
);
35 struct rline
*grli
; /* used inline for status */
36 struct service_node
*n_node
;
39 n_node
= register_service("N");
43 register_handler(n_node
, "ison", 1, handle_ison
);
44 register_handler(n_node
, "isaccounton", 1, handle_isaccounton
);
45 register_handler(n_node
, "whois", 1, handle_whois
);
46 register_handler(n_node
, "msg", 2, handle_message
);
47 register_handler(n_node
, "notice", 2, handle_notice
);
48 register_handler(n_node
, "chanmsg", 2, handle_channel
);
49 register_handler(n_node
, "onchan", 2, handle_onchan
);
50 register_handler(n_node
, "status", 0, handle_status
);
51 register_handler(n_node
, "servicesonchan", 1, handle_servicesonchan
);
52 register_handler(n_node
, "counthost", 1, handle_counthost
);
57 deregister_service(n_node
);
60 int handle_ison(struct rline
*li
, int argc
, char **argv
) {
63 if(ri_append(li
, "%d", getnickbynick(argv
[i
])?1:0) == BF_OVER
)
64 return ri_error(li
, BF_OVER
, "Buffer overflow");
69 int handle_isaccounton(struct rline
*li
, int argc
, char **argv
) {
72 if(ri_append(li
, "%d", getauthbyname(argv
[i
])?1:0) == BF_OVER
)
73 return ri_error(li
, BF_OVER
, "Buffer overflow");
78 int handle_whois(struct rline
*li
, int argc
, char **argv
) {
79 nick
*np
= getnickbynick(argv
[0]);
85 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "User not online");
87 ri_append(li
, "%s", np
->nick
);
88 ri_append(li
, "%s", np
->ident
);
89 ri_append(li
, "%s", np
->host
->name
->content
);
90 ri_append(li
, "%s", np
->realname
->name
->content
);
91 ri_append(li
, "%s", np
->authname
);
92 ri_append(li
, "%s", printflags(np
->umodes
, umodeflags
));
94 channels
= np
->channels
->content
;
96 for(i
=0;i
<np
->channels
->cursi
;i
++)
97 if(ri_append(li
, "%s", channels
[i
]->index
->name
->content
) == BF_OVER
)
98 return ri_error(li
, BF_OVER
, "Buffer overflow");
103 int handle_message(struct rline
*li
, int argc
, char **argv
) {
104 int realargc
= abs(argc
), i
;
105 nick
*np
= getnickbynick(argv
[0]);
107 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "User not online");
109 for(i
=1;i
<realargc
;i
++) {
111 controlnotice(np
, "%s", argv
[i
]);
113 controlreply(np
, "%s", argv
[i
]);
117 ri_append(li
, "Done.");
121 int handle_notice(struct rline
*li
, int argc
, char **argv
) {
122 return handle_message(li
, -argc
, argv
);
125 int handle_channel(struct rline
*li
, int argc
, char **argv
) {
127 channel
*cp
= findchannel(argv
[0]);
129 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
132 controlchanmsg(cp
, "%s", argv
[i
]);
134 ri_append(li
, "Done.");
138 int handle_onchan(struct rline
*li
, int argc
, char **argv
) {
140 nick
*np
= getnickbynick(argv
[0]);
144 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Nickname not found");
146 cp
= findchannel(argv
[1]);
148 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
150 channels
= (channel
**)np
->channels
->content
;
151 for(i
=0;i
<np
->channels
->cursi
;i
++) {
152 if(channels
[i
]->index
->channel
== cp
) {
162 void handle_nterfacerstats(int hooknum
, void *arg
) {
163 /* hmm, not much we can do here, @ppa */
164 ri_append(grli
, "%s", (char *)arg
);
167 int handle_status(struct rline
*li
, int argc
, char **argv
) {
170 registerhook(HOOK_CORE_STATSREPLY
, &handle_nterfacerstats
);
171 triggerhook(HOOK_CORE_STATSREQUEST
, (void *)5);
172 deregisterhook(HOOK_CORE_STATSREPLY
, &handle_nterfacerstats
);
176 /* assumes services have a single char nickname and +k set */
177 int handle_servicesonchan(struct rline
*li
, int argc
, char **argv
) {
180 channel
*cp
= findchannel(argv
[0]);
182 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
184 #if NICKLEN >= 1 /* if not we have a buffer overflow */
185 for(i
=0;i
<=cp
->users
->hashsize
;i
++) {
186 if(cp
->users
->content
[i
] != nouser
) {
187 np
= getnickbynumeric(cp
->users
->content
[i
]);
188 if(np
&& IsService(np
) && np
->nick
[0] && !np
->nick
[1])
189 if(ri_append(li
, "%s", np
->nick
) == BF_OVER
)
190 return ri_error(li
, BF_OVER
, "Buffer overflow");
198 int handle_counthost(struct rline
*li
, int argc
, char **argv
) {
200 unsigned int results
[100];
203 return ri_error(li
, ERR_TOO_MANY_ARGS
, "Too many arguments");
205 memset(results
, 0, sizeof(results
));
210 for(i
=0;i
<HOSTHASHSIZE
;i
++)
211 for(hp
=hosttable
[i
];hp
;hp
=hp
->next
)
213 if(!match(argv
[j
], hp
->name
->content
))
214 results
[j
]+=hp
->clonecount
;
217 if(ri_append(li
, "%d", results
[j
]) == BF_OVER
)
218 return ri_error(li
, BF_OVER
, "Buffer overflow");