]>
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_STATSDEBUG 249 /* Extension to RFC1459 */
42 #define RPL_STATSCONN 250 /* Undernet extension */
43 #define RPL_STATSDLINE 275 /* Undernet extension */
44 #define RPL_STATSRLINE 276 /* Undernet extension */
45 #define RPL_STATSSLINE 398 /* QuakeNet extension -froo */
47 #define RPL_ENDOFSTATS 219
49 const int numerics
[] = { RPL_STATSLINKINFO
, RPL_STATSCOMMANDS
, RPL_STATSCLINE
, RPL_STATSNLINE
, RPL_STATSILINE
, RPL_STATSKLINE
,
50 RPL_STATSPLINE
, RPL_STATSYLINE
, RPL_STATSJLINE
, RPL_STATSALINE
, RPL_STATSQLINE
, RPL_STATSVERBOSE
,
51 RPL_STATSENGINE
, RPL_STATSFLINE
, RPL_STATSLLINE
, RPL_STATSUPTIME
, RPL_STATSOLINE
, RPL_STATSHLINE
,
52 RPL_STATSTLINE
, RPL_STATSGLINE
, RPL_STATSULINE
, RPL_STATSDEBUG
, RPL_STATSCONN
, RPL_STATSDLINE
, RPL_STATSRLINE
,
57 registernumerichandler(RPL_ENDOFSTATS
,&handleserverstats
,4);
59 for(i
=&numerics
[0];*i
;i
++)
60 registernumerichandler(*i
,&handleserverstats
,4);
65 deregisternumerichandler(RPL_ENDOFSTATS
,&handleserverstats
);
67 for(i
=&numerics
[0];*i
;i
++)
68 deregisternumerichandler(*i
,&handleserverstats
);
71 /* stats look something like:
75 int handleserverstats(void *source
, int cargc
, char **cargv
) {
78 char outbuffer
[BUFSIZE
* 2 + 5];
79 long numeric
= (long)source
, i
;
86 if (!(target
=getnickbynumeric(numerictolong(cargv
[2],5)))) {
87 Error("localuserchannel",ERR_WARNING
,"Got stats for unknown local user %s.",cargv
[2]);
91 if (homeserver(target
->numeric
) != mylongnum
) {
92 Error("localuserchannel",ERR_WARNING
,"Got stats for non-local user %s.",target
->nick
);
96 sbinit(&buf
, outbuffer
, sizeof(outbuffer
));
98 /* bloody inefficient */
99 for(i
=3;i
<cargc
;i
++) {
101 sbaddchar(&buf
, ' ');
103 sbaddchar(&buf
, ':');
105 sbaddstr(&buf
, cargv
[i
]);
109 if(numeric
!= RPL_ENDOFSTATS
) {
110 nargs
[0]=(void *)cargv
[0];
111 nargs
[1]=(void *)numeric
;
112 nargs
[2]=(void *)outbuffer
;
114 if (umhandlers
[target
->numeric
&MAXLOCALUSER
]) {
115 (umhandlers
[target
->numeric
&MAXLOCALUSER
])(target
, LU_STATS
, nargs
);
118 if (umhandlers
[target
->numeric
&MAXLOCALUSER
]) {
119 (umhandlers
[target
->numeric
&MAXLOCALUSER
])(target
, LU_STATS_END
, (void *)outbuffer
);