]>
Commit | Line | Data |
---|---|---|
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 | } |