]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/trusts_policy.c
Merge.
[irc/quakenet/newserv.git] / trusts / trusts_policy.c
1 #include "../core/hooks.h"
2 #include "../control/control.h"
3 #include "trusts.h"
4
5 static int countext;
6
7 static void policycheck(int hooknum, void *arg) {
8 void **args = arg;
9 nick *np = args[0];
10 long moving = (long)args[1];
11 trusthost *th = gettrusthost(np);
12 trustgroup *tg = th->group;
13
14 if(moving)
15 return;
16
17 /*
18 * the purpose of this logic is to avoid spam like this:
19 * WARNING: tgX exceeded limit: 11 connected vs 10 max
20 * (goes back down to 10)
21 * WARNING: tgX exceeded limit: 11 connected vs 10 max
22 */
23
24 if(hooknum == HOOK_TRUSTS_NEWNICK) {
25 if(tg->count > tg->maxusage) {
26 if(tg->count > (long)tg->exts[countext]) {
27 tg->exts[countext] = (void *)(long)tg->count;
28
29 controlwall(NO_OPER, NL_TRUSTS, "Hard limit exceeded: '%s', %d connected, %d max.", tg->name->content, tg->count, tg->maxusage);
30 }
31 }
32 } else {
33 if(tg->count < tg->maxusage)
34 tg->exts[countext] = (void *)(long)tg->count;
35 }
36 }
37
38 void _init(void) {
39 countext = registertgext("count");
40 if(countext == -1)
41 return;
42
43 registerhook(HOOK_TRUSTS_NEWNICK, policycheck);
44 registerhook(HOOK_TRUSTS_LOSTNICK, policycheck);
45 }
46
47 void _fini(void) {
48 if(countext == -1)
49 return;
50
51 releasetgext(countext);
52
53 deregisterhook(HOOK_TRUSTS_NEWNICK, policycheck);
54 deregisterhook(HOOK_TRUSTS_LOSTNICK, policycheck);
55 }