]>
jfr.im git - irc/quakenet/newserv.git/blob - localuser/localuserstats.c
1 /* Functions for retrieving stats from the network to local users */
4 #include "../nick/nick.h"
5 #include "../irc/irc.h"
6 #include "../core/error.h"
7 #include "../lib/version.h"
8 #include "../lib/stringbuf.h"
17 int handleserverstats(void *source
, int cargc
, char **cargv
);
18 int handleserverstatsend(void *source
, int cargc
, char **cargv
);
20 #define RPL_STATSLINKINFO 211
21 #define RPL_STATSCOMMANDS 212
22 #define RPL_STATSCLINE 213
23 #define RPL_STATSNLINE 214 /* unused */
24 #define RPL_STATSILINE 215
25 #define RPL_STATSKLINE 216
26 #define RPL_STATSPLINE 217 /* Undernet extension */
27 #define RPL_STATSYLINE 218
28 #define RPL_STATSJLINE 222 /* Undernet extension */
29 #define RPL_STATSALINE 226 /* Hybrid, Undernet */
30 #define RPL_STATSQLINE 228 /* Undernet extension */
31 #define RPL_STATSVERBOSE 236 /* Undernet verbose server list */
32 #define RPL_STATSENGINE 237 /* Undernet engine name */
33 #define RPL_STATSFLINE 238 /* Undernet feature lines */
34 #define RPL_STATSLLINE 241 /* Undernet dynamicly loaded modules */
35 #define RPL_STATSUPTIME 242
36 #define RPL_STATSOLINE 243
37 #define RPL_STATSHLINE 244
38 #define RPL_STATSTLINE 246 /* Undernet extension */
39 #define RPL_STATSGLINE 247 /* Undernet extension */
40 #define RPL_STATSULINE 248 /* Undernet extension */
41 #define RPL_STATSCONN 250 /* Undernet extension */
42 #define RPL_STATSDLINE 275 /* Undernet extension */
43 #define RPL_STATSRLINE 276 /* Undernet extension */
44 #define RPL_STATSSLINE 398 /* QuakeNet extension -froo */
46 #define RPL_ENDOFSTATS 219
48 const int numerics
[] = { RPL_STATSLINKINFO
, RPL_STATSCOMMANDS
, RPL_STATSCLINE
, RPL_STATSNLINE
, RPL_STATSILINE
, RPL_STATSKLINE
,
49 RPL_STATSPLINE
, RPL_STATSYLINE
, RPL_STATSJLINE
, RPL_STATSALINE
, RPL_STATSQLINE
, RPL_STATSVERBOSE
,
50 RPL_STATSENGINE
, RPL_STATSFLINE
, RPL_STATSLLINE
, RPL_STATSUPTIME
, RPL_STATSOLINE
, RPL_STATSHLINE
,
51 RPL_STATSTLINE
, RPL_STATSGLINE
,RPL_STATSULINE
, RPL_STATSCONN
, RPL_STATSDLINE
, RPL_STATSRLINE
,
56 registernumerichandler(RPL_ENDOFSTATS
,&handleserverstats
,4);
58 for(i
=&numerics
[0];*i
;i
++)
59 registernumerichandler(*i
,&handleserverstats
,4);
64 deregisternumerichandler(RPL_ENDOFSTATS
,&handleserverstats
);
66 for(i
=&numerics
[0];*i
;i
++)
67 deregisternumerichandler(*i
,&handleserverstats
);
70 /* stats look something like:
74 int handleserverstats(void *source
, int cargc
, char **cargv
) {
77 char outbuffer
[BUFSIZE
* 2 + 5];
78 long numeric
= (long)source
, i
;
85 if (!(target
=getnickbynumeric(numerictolong(cargv
[2],5)))) {
86 Error("localuserchannel",ERR_WARNING
,"Got stats for unknown local user %s.",cargv
[2]);
90 if (homeserver(target
->numeric
) != mylongnum
) {
91 Error("localuserchannel",ERR_WARNING
,"Got stats for non-local user %s.",target
->nick
);
95 sbinit(&buf
, outbuffer
, sizeof(outbuffer
));
97 /* bloody inefficient */
98 for(i
=3;i
<cargc
;i
++) {
100 sbaddchar(&buf
, ' ');
102 sbaddchar(&buf
, ':');
104 sbaddstr(&buf
, cargv
[i
]);
108 if(numeric
!= RPL_ENDOFSTATS
) {
109 nargs
[0]=(void *)cargv
[0];
110 nargs
[1]=(void *)numeric
;
111 nargs
[2]=(void *)outbuffer
;
113 if (umhandlers
[target
->numeric
&MAXLOCALUSER
]) {
114 (umhandlers
[target
->numeric
&MAXLOCALUSER
])(target
, LU_STATS
, nargs
);
117 if (umhandlers
[target
->numeric
&MAXLOCALUSER
]) {
118 (umhandlers
[target
->numeric
&MAXLOCALUSER
])(target
, LU_STATS_END
, (void *)outbuffer
);