]>
jfr.im git - irc/quakenet/newserv.git/blob - nterface/nterfacer_control.c
2 nterfacer newserv control module
3 Copyright (C) 2004-2005 Chris Porter.
6 - added counthost, removed isaccounton (as it didn't do anything!)
12 - modified whois to take into account channels with ','
13 - made ison take multiple arguments
16 - added status/onchan/servicesonchan
18 - added multiple targets for channel/nick notice/message commands
20 - added channel message, nick message/notice commands
21 - generalised error messages
23 - whois fixed to notice BUF_OVER
28 #include "../localuser/localuserchannel.h"
29 #include "../channel/channel.h"
30 #include "../lib/strlfunc.h"
31 #include "../control/control.h"
32 #include "../core/hooks.h"
33 #include "../nick/nick.h"
34 #include "../lib/flags.h"
35 #include "../lib/irc_string.h"
36 #include "../lib/version.h"
39 #include "nterfacer_control.h"
41 MODULE_VERSION("$Id: nterfacer_control.c 663 2006-05-16 17:27:36Z newserv $")
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
);
51 int handle_counthost(struct rline
*li
, int argc
, char **argv
);
53 struct rline
*grli
; /* used inline for status */
56 n_node
= register_service("N");
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
);
68 register_handler(n_node
, "counthost", 1, handle_counthost
);
73 deregister_service(n_node
);
76 int handle_ison(struct rline
*li
, int argc
, char **argv
) {
79 if(ri_append(li
, "%d", getnickbynick(argv
[i
])?1:0) == BF_OVER
)
80 return ri_error(li
, BF_OVER
, "Buffer overflow");
85 int handle_whois(struct rline
*li
, int argc
, char **argv
) {
86 nick
*np
= getnickbynick(argv
[0]);
92 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "User not online");
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
);
99 ri_append(li
, "%s", printflags(np
->umodes
, umodeflags
));
101 channels
= np
->channels
->content
;
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");
110 int handle_message(struct rline
*li
, int argc
, char **argv
) {
111 int realargc
= abs(argc
), i
;
112 nick
*np
= getnickbynick(argv
[0]);
114 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "User not online");
116 for(i
=1;i
<realargc
;i
++) {
118 controlnotice(np
, "%s", argv
[i
]);
120 controlreply(np
, "%s", argv
[i
]);
124 ri_append(li
, "Done.");
128 int handle_notice(struct rline
*li
, int argc
, char **argv
) {
129 return handle_message(li
, -argc
, argv
);
132 int handle_channel(struct rline
*li
, int argc
, char **argv
) {
134 channel
*cp
= findchannel(argv
[0]);
136 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
139 controlchanmsg(cp
, "%s", argv
[i
]);
141 ri_append(li
, "Done.");
145 int handle_onchan(struct rline
*li
, int argc
, char **argv
) {
147 nick
*np
= getnickbynick(argv
[0]);
151 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Nickname not found");
153 cp
= findchannel(argv
[1]);
155 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
157 channels
= (channel
**)np
->channels
->content
;
158 for(i
=0;i
<np
->channels
->cursi
;i
++) {
159 if(channels
[i
]->index
->channel
== cp
) {
169 void handle_nterfacerstats(int hooknum
, void *arg
) {
170 /* hmm, not much we can do here, @ppa */
171 ri_append(grli
, "%s", (char *)arg
);
174 int handle_status(struct rline
*li
, int argc
, char **argv
) {
177 registerhook(HOOK_CORE_STATSREPLY
, &handle_nterfacerstats
);
178 triggerhook(HOOK_CORE_STATSREQUEST
, (void *)5);
179 deregisterhook(HOOK_CORE_STATSREPLY
, &handle_nterfacerstats
);
183 /* assumes services have a single char nickname and +k set */
184 int handle_servicesonchan(struct rline
*li
, int argc
, char **argv
) {
187 channel
*cp
= findchannel(argv
[0]);
189 return ri_error(li
, ERR_TARGET_NOT_FOUND
, "Channel not found");
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])
196 if(ri_append(li
, "%s", np
->nick
) == BF_OVER
)
197 return ri_error(li
, BF_OVER
, "Buffer overflow");
205 int handle_counthost(struct rline
*li
, int argc
, char **argv
) {
207 unsigned int results
[100];
210 return ri_error(li
, ERR_TOO_MANY_ARGS
, "Too many arguments");
212 memset(results
, 0, sizeof(results
));
217 for(i
=0;i
<HOSTHASHSIZE
;i
++)
218 for(hp
=hosttable
[i
];hp
;hp
=hp
->next
)
220 if(!match(argv
[j
], hp
->name
->content
))
221 results
[j
]+=hp
->clonecount
;
224 if(ri_append(li
, "%d", results
[j
]) == BF_OVER
)
225 return ri_error(li
, BF_OVER
, "Buffer overflow");