4 #include "../core/hooks.h"
5 #include "../lib/splitline.h"
6 #include "../core/config.h"
7 #include "../irc/irc.h"
8 #include "../lib/array.h"
9 #include "../lib/base64.h"
10 #include "../core/error.h"
11 #include "../server/server.h"
12 #include "../control/control.h"
15 static const char *DEFAULT_SERVICE_MASKS
[] = { "services*.*.quakenet.org", (char *)0 };
16 static array defaultservicemasks_a
;
17 static sstring
**defaultservicemasks
;
19 static void handlemaskprivmsg(int, void *);
20 static CommandTree
*cmds
;
28 cmds
= newcommandtree();
30 registerhook(HOOK_NICK_MASKPRIVMSG
, &handlemaskprivmsg
);
32 array_init(&defaultservicemasks_a
, sizeof(sstring
*));
34 for(p
=DEFAULT_SERVICE_MASKS
;*p
;p
++) {
35 int i
= array_getfreeslot(&defaultservicemasks_a
);
36 defaultservicemasks
= (sstring
**)defaultservicemasks_a
.content
;
38 defaultservicemasks
[i
] = getsstring(*p
, strlen(*p
));
41 servicemasks
= getconfigitems("xsb", "servicemask");
42 if(!servicemasks
|| !servicemasks
->cursi
)
43 Error("xsb", ERR_WARNING
, "No service masks in config file (xsb/servicemask), using defaults");
49 for(i
=0;i
<defaultservicemasks_a
.cursi
;i
++)
50 freesstring(defaultservicemasks
[i
]);
51 array_free(&defaultservicemasks_a
);
56 deregisterhook(HOOK_NICK_MASKPRIVMSG
, &handlemaskprivmsg
);
58 destroycommandtree(cmds
);
61 static void handlemaskprivmsg(int hooknum
, void *args
) {
62 void **hargs
= (void **)args
;
63 nick
*source
= hargs
[0];
64 char *message
= hargs
[2];
73 if(!IsOper(source
) || !IsService(source
))
76 cargc
= splitline(message
, cargv
, 50, 0);
80 if(strcmp(cargv
[0], "XSB1"))
83 s
= &serverlist
[homeserver(source
->numeric
)];
84 if(s
->linkstate
!= LS_LINKED
) {
85 Error("xsb", ERR_WARNING
, "Got XSB message from unlinked server (%s): %s", s
->name
->content
, source
->nick
);
90 if(!(s
->flags
& SMODE_SERVICE
)) {
91 Error("xsb", ERR_WARNING
, "Got XSB message from non-service server (%s): %s", s
->name
->content
, source
->nick
);
96 cmd
= findcommandintree(cmds
, cargv
[1], 1);
100 if(cmd
->maxparams
< (cargc
- 2)) {
101 rejoinline(cargv
[cmd
->maxparams
], cargc
- (cmd
->maxparams
));
102 cargc
= (cmd
->maxparams
) + 2;
105 (cmd
->handler
)(source
, cargc
- 2, &cargv
[2]);
108 void xsb_addcommand(const char *name
, const int maxparams
, CommandHandler handler
) {
109 addcommandtotree(cmds
, name
, 0, maxparams
, handler
);
112 void xsb_delcommand(const char *name
, CommandHandler handler
) {
113 deletecommandfromtree(cmds
, name
, handler
);
116 void xsb_command(const char *command
, const char *format
, ...) {
119 sstring
**servicemasks
;
120 array
*aservicemasks
;
124 va_start(va
, format
);
125 vsnprintf(buf
, sizeof(buf
), format
, va
);
128 aservicemasks
= getconfigitems("xsb", "servicemask");
129 if(!aservicemasks
|| !aservicemasks
->cursi
)
130 aservicemasks
= &defaultservicemasks_a
;
132 servicemasks
= (sstring
**)aservicemasks
->content
;
134 controlnum
= longtonumeric(mynick
->numeric
, 5);
136 for(i
=0;i
<aservicemasks
->cursi
;i
++)
137 irc_send("%s P $%s :XSB1 %s %s", controlnum
, servicemasks
[i
]->content
, command
, buf
);