]> jfr.im git - irc/quakenet/newserv.git/blame - graphing/nterfacer_graphing.c
merge
[irc/quakenet/newserv.git] / graphing / nterfacer_graphing.c
CommitLineData
8186335d
CP
1#include "../nterfacer/library.h"
2#include "../nterfacer/nterfacer.h"
3
4#include "graphing.h"
5
6#include <time.h>
7
8#define ERR_SERVER_NOT_MONITORED 0x01
9#define ERR_BAD_PARAMETERS 0x02
10#define ERR_BAD_ENTRY 0x03
11
12int handle_servernames(struct rline *li, int argc, char **argv);
13int handle_serverdata(struct rline *li, int argc, char **argv);
14
15static struct service_node *g_node;
16
17void _init(void) {
18 g_node = register_service("graphing");
19 if(!g_node)
20 return;
21
22 register_handler(g_node, "servernames", 0, handle_servernames);
23 register_handler(g_node, "serverdata", 3, handle_serverdata);
24}
25
26void _fini(void) {
27 if(g_node)
28 deregister_service(g_node);
29}
30
31int handle_servernames(struct rline *li, int argc, char **argv) {
32 int i;
33
34 for(i=0;i<MAXSERVERS;i++) {
35 if((serverlist[i].linkstate != LS_INVALID) && servermonitored(i)) {
36 if(ri_append(li, "%d:%s", i, serverlist[i].name->content) == BF_OVER)
37 return ri_error(li, BF_OVER, "Buffer overflow");
38 }
39 }
40
41 return ri_final(li);
42}
43
44int handle_serverdata(struct rline *li, int argc, char **argv) {
45 int servernum = atoi(argv[0]);
46 unsigned int entry = atoi(argv[1]);
47 fsample_t count = atoi(argv[2]);
48 time_t t = time(NULL) / GRAPHING_RESOLUTION;
b88719fa 49 int i, ret;
8186335d
CP
50 fsample_m *m;
51
52 if(!servermonitored(servernum))
53 return ri_error(li, ERR_SERVER_NOT_MONITORED, "Server not monitored");
54
55 m = servergraphs[servernum];
56
57 if(entry > m->pos) /* not inclusive as 0 is used for for the base index */
58 return ri_error(li, ERR_BAD_PARAMETERS, "Bad parameters");
59
60 for(i=0;i<count;i++) {
61 fsample_t v;
62 if(fsget_m(m, entry, t - m->entry[entry].freq * i, &v)) {
b88719fa 63 ret = ri_append(li, "%d", v);
8186335d 64 } else {
b88719fa 65 ret = ri_append(li, "-1", v);
8186335d 66 }
b88719fa
CP
67 if(ret == BF_OVER)
68 return ri_error(li, BF_OVER, "Buffer overflow");
8186335d
CP
69 }
70
71 return ri_final(li);
72}
73