]> jfr.im git - irc/quakenet/newserv.git/blame - trusts/events.c
Add database flushing, rename max/maxuse both to maxusage, record max usage/lastseen.
[irc/quakenet/newserv.git] / trusts / events.c
CommitLineData
1bbe1ac3
CP
1#include "../core/hooks.h"
2#include "trusts.h"
3
1bbe1ac3
CP
4static void __newnick(int hooknum, void *arg) {
5 nick *sender = arg;
6 uint32_t host;
7 trusthost *th;
8
9 host = irc_in_addr_v4_to_int(&sender->p_ipaddr);
10 th = th_getbyhost(host);
11
12 settrusthost(sender, th);
13 if(!th) {
14 setnextbytrust(sender, NULL);
15 return;
16 }
17
18 setnextbytrust(sender, th->users);
19 th->users = sender;
20
21 triggerhook(HOOK_TRUSTS_NEWNICK, sender);
22}
23
24static void __lostnick(int hooknum, void *arg) {
25 nick *sender = arg, *np, *lp;
26 trusthost *th = gettrusthost(sender);
27
28 if(!th)
29 return;
30
31 triggerhook(HOOK_TRUSTS_LOSTNICK, sender);
32
33 /*
34 * we need to erase this nick from the trusthost list
35 * stored in the ->nextbytrust (ext) pointers in each nick
36 */
37
38 for(np=th->users,lp=NULL;np;lp=np,np=nextbytrust(np)) {
39 if(np != sender)
40 continue;
41
42 if(lp) {
43 setnextbytrust(lp, nextbytrust(np));
44 } else {
45 th->users = nextbytrust(np);
46 }
47
48 break;
49 }
50}
51
52static void __counthandler(int hooknum, void *arg) {
4be1aaf2 53 time_t t = time(NULL);
1bbe1ac3 54 trusthost *th = gettrusthost((nick *)arg);
4be1aaf2 55 trustgroup *tg = th->group;
1bbe1ac3 56
4be1aaf2 57 tg->lastseen = th->lastseen = t;
1bbe1ac3
CP
58 if(hooknum == HOOK_TRUSTS_NEWNICK) {
59 th->count++;
4be1aaf2
CP
60 if(th->count > th->maxusage)
61 th->maxusage = th->count;
62
63 tg->count++;
64 if(tg->count > tg->maxusage)
65 tg->maxusage = tg->count;
1bbe1ac3
CP
66 } else {
67 th->count--;
4be1aaf2 68 tg->count--;
1bbe1ac3
CP
69 }
70}
71
72static void __dbloaded(int hooknum, void *arg) {
73 int i;
74 nick *np;
75
1bbe1ac3
CP
76 registerhook(HOOK_NICK_NEWNICK, __newnick);
77 registerhook(HOOK_NICK_LOSTNICK, __lostnick);
78
79 registerhook(HOOK_TRUSTS_NEWNICK, __counthandler);
80 registerhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
81
82 /* we could do it by host, but hosts and ips are not bijective :( */
83 for(i=0;i<NICKHASHSIZE;i++)
84 for(np=nicktable[i];np;np=np->next)
85 __newnick(0, np);
86}
87
88void trusts_registerevents(void) {
89 registerhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
90
91 if(trustsdbloaded)
92 __dbloaded(0, NULL);
93}
94
95void trusts_deregisterevents(void) {
bf5b66e5 96 if(trustsdbloaded) {
1bbe1ac3
CP
97 deregisterhook(HOOK_NICK_NEWNICK, __newnick);
98 deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
99
100 deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
101 deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
102 }
103
104 deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
105}