1 /* TODO: catch control messages */
6 #include "../core/hooks.h"
7 #include "../lib/splitline.h"
8 #include "../core/config.h"
9 #include "../irc/irc.h"
10 #include "../lib/array.h"
11 #include "../lib/base64.h"
12 #include "../lib/irc_string.h"
13 #include "../core/error.h"
14 #include "../localuser/localuser.h"
15 #include "../lib/strlfunc.h"
16 #include "../lib/version.h"
21 static const char *DEFAULT_SERVICE_MASKS
[] = { "services*.*.quakenet.org", (char *)0 };
23 static array defaultservicemasks_a
;
24 static sstring
**defaultservicemasks
;
26 static void handlemaskprivmsg(int, void *);
27 static void handlecontrolregistered(int, void *);
28 static CommandTree
*cmds
;
30 static char controlnum
[6];
33 struct messagequeue
*next
;
37 struct messagequeue
*head
, *tail
;
45 cmds
= newcommandtree();
49 registerhook(HOOK_NICK_MASKPRIVMSG
, &handlemaskprivmsg
);
50 registerhook(HOOK_CONTROL_REGISTERED
, &handlecontrolregistered
);
52 array_init(&defaultservicemasks_a
, sizeof(sstring
*));
54 for(p
=DEFAULT_SERVICE_MASKS
;*p
;p
++) {
55 int i
= array_getfreeslot(&defaultservicemasks_a
);
56 defaultservicemasks
= (sstring
**)defaultservicemasks_a
.content
;
58 defaultservicemasks
[i
] = getsstring(*p
, strlen(*p
));
61 servicemasks
= getconfigitems("xsb", "servicemask");
62 if(!servicemasks
|| !servicemasks
->cursi
)
63 Error("xsb", ERR_WARNING
, "No service masks in config file (xsb/servicemask), using defaults.");
68 struct messagequeue
*q
, *nq
;
73 destroycommandtree(cmds
);
75 deregisterhook(HOOK_NICK_MASKPRIVMSG
, &handlemaskprivmsg
);
76 deregisterhook(HOOK_CONTROL_REGISTERED
, &handlecontrolregistered
);
78 for(i
=0;i
<defaultservicemasks_a
.cursi
;i
++)
79 freesstring(defaultservicemasks
[i
]);
80 array_free(&defaultservicemasks_a
);
91 void xsb_addcommand(const char *name
, const int maxparams
, CommandHandler handler
) {
92 addcommandtotree(cmds
, name
, 0, maxparams
, handler
);
95 void xsb_delcommand(const char *name
, CommandHandler handler
) {
96 deletecommandfromtree(cmds
, name
, handler
);
99 static void handlemaskprivmsg(int hooknum
, void *args
) {
100 void **hargs
= (void **)args
;
101 nick
*source
= hargs
[0];
102 char *message
= hargs
[2];
111 if(!IsOper(source
) || !IsService(source
))
114 cargc
= splitline(message
, cargv
, 50, 0);
118 if(strcmp(cargv
[0], "XSB1"))
121 s
= &serverlist
[homeserver(source
->numeric
)];
122 if(s
->linkstate
!= LS_LINKED
) {
123 Error("xsb", ERR_WARNING
, "Got XSB message from unlinked server (%s): %s", s
->name
->content
, source
->nick
);
128 if(!(s
->flags
& SMODE_SERVICE
)) {
129 Error("xsb", ERR_WARNING
, "Got XSB message from non-service server (%s): %s", s
->name
->content
, source
->nick
);
134 cmd
= findcommandintree(cmds
, cargv
[1], 1);
138 if(cmd
->maxparams
< (cargc
- 2)) {
139 rejoinline(cargv
[cmd
->maxparams
], cargc
- (cmd
->maxparams
));
140 cargc
= (cmd
->maxparams
) + 2;
143 (cmd
->handler
)(source
, cargc
- 2, &cargv
[2]);
146 static void directsend(char *buf
) {
147 irc_send("%s P %s", controlnum
, buf
);
150 static void handlecontrolregistered(int hooknum
, void *args
) {
151 nick
*np
= (nick
*)args
;
154 struct messagequeue
*q
, *nq
;
156 longtonumeric2(np
->numeric
, 5, controlnum
);
167 controlnum
[0] = '\0';
171 static int getservicemasks(sstring
***masks
) {
172 array
*aservicemasks
= getconfigitems("xsb", "servicemask");
173 if(!aservicemasks
|| !aservicemasks
->cursi
)
174 aservicemasks
= &defaultservicemasks_a
;
176 *masks
= (sstring
**)aservicemasks
->content
;
178 return aservicemasks
->cursi
;
181 static void xsb_send(const char *format
, ...) {
186 va_start(va
, format
);
187 len
= vsnprintf(buf
, sizeof(buf
), format
, va
);
189 if(len
>= sizeof(buf
))
195 struct messagequeue
*q
= (struct messagequeue
*)malloc(sizeof(struct messagequeue
) + len
+ 5);
197 strlcpy(q
->buf
, buf
, len
+ 2);
208 void xsb_broadcast(const char *command
, server
*service
, const char *format
, ...) {
211 sstring
**servicemasks
;
214 va_start(va
, format
);
215 vsnprintf(buf
, sizeof(buf
), format
, va
);
219 xsb_send("$%s :XSB1 %s %s", service
->name
->content
, command
, buf
);
223 for(i
=getservicemasks(&servicemasks
)-1;i
>=0;i
--)
224 xsb_send("$%s :XSB1 %s %s", servicemasks
[i
]->content
, command
, buf
);
227 void xsb_unicast(const char *command
, nick
*np
, const char *format
, ...) {
231 va_start(va
, format
);
232 vsnprintf(buf
, sizeof(buf
), format
, va
);
236 xsb_send("$%s :XSB1 %s %s", serverlist
[homeserver(np
->numeric
)].name
, command
, buf
);
237 /* xsb_send("%s :XSB1 %s %s", longtonumeric(np->numeric, 5), command, buf);*/
241 int xsb_isservice(server
*service
) {
243 sstring
**servicemasks
;
244 char *name
= service
->name
->content
;
246 if(!(service
->flags
& SMODE_SERVICE
))
249 for(i
=getservicemasks(&servicemasks
)-1;i
>=0;i
--)
250 if(match2strings(servicemasks
[i
]->content
, name
))