]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/trusts.c
Add trust group extensions and example.
[irc/quakenet/newserv.git] / trusts / trusts.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "../core/hooks.h"
4 #include "../core/error.h"
5 #include "trusts.h"
6
7 int trusts_loaddb(void);
8 void trusts_closedb(void);
9 void trusts_registerevents(void);
10 void trusts_deregisterevents(void);
11
12 static void statusfn(int, void *);
13
14 static int loaded, unloaded;
15 static sstring *tgextnames[MAXTGEXTS];
16
17 int trusts_thext, trusts_nextuserext;
18
19 void _init(void) {
20 trusts_thext = registernickext("trustth");
21 if(trusts_thext == -1) {
22 Error("trusts", ERR_ERROR, "Unable to register first nick extension.");
23 return;
24 }
25
26 trusts_nextuserext = registernickext("trustnext");
27 if(trusts_thext == -1) {
28 releasenickext(trusts_thext);
29 Error("trusts", ERR_ERROR, "Unable to register second nick extension.");
30 return;
31 }
32
33 if(!trusts_loaddb())
34 return;
35 loaded = 1;
36
37 registerhook(HOOK_CORE_STATSREQUEST, statusfn);
38 trusts_registerevents();
39 }
40
41 void trusts_unload(void) {
42 if(unloaded)
43 return;
44
45 unloaded = 1;
46
47 if(trusts_thext != -1) {
48 releasenickext(trusts_thext);
49 releasenickext(trusts_nextuserext);
50 }
51
52 if(loaded) {
53 deregisterhook(HOOK_CORE_STATSREQUEST, statusfn);
54 trusts_deregisterevents();
55 }
56
57 trusts_closedb();
58 }
59
60 void _fini(void) {
61 trusts_unload();
62 }
63
64 static void statusfn(int hooknum, void *arg) {
65 if((long)arg > 10) {
66 char message[100];
67 int groupcount = 0, hostcount = 0, usercount = 0;
68 trustgroup *tg;
69 trusthost *th;
70
71 for(tg=tglist;tg;tg=tg->next) {
72 usercount+=tg->count;
73 groupcount++;
74 for(th=tg->hosts;th;th=th->next)
75 hostcount++;
76 }
77
78 snprintf(message, sizeof(message), "Trusts :%7d groups, %7d hosts, %7d users", groupcount, hostcount, usercount);
79 triggerhook(HOOK_CORE_STATSREPLY, message);
80 }
81 }
82
83 int findtgext(const char *name) {
84 int i;
85
86 for(i=0;i<MAXTGEXTS;i++)
87 if(tgextnames[i] && !strcmp(name, tgextnames[i]->content))
88 return i;
89
90 return -1;
91 }
92
93 int registertgext(const char *name) {
94 int i;
95
96 if(findtgext(name) != -1) {
97 Error("trusts", ERR_WARNING, "Tried to register duplicate trust group extension: %s.", name);
98 return -1;
99 }
100
101 for(i=0;i<MAXNICKEXTS;i++) {
102 if(!tgextnames[i]) {
103 tgextnames[i] = getsstring(name, 100);
104 return i;
105 }
106 }
107
108 Error("trusts", ERR_WARNING, "Tried to register too many trust group extensions: %s.", name);
109 return -1;
110 }
111
112 void releasetgext(int index) {
113 trustgroup *tg;
114
115 freesstring(tgextnames[index]);
116 tgextnames[index] = NULL;
117
118 for(tg=tglist;tg;tg=tg->next)
119 tg->exts[index] = NULL;
120 }