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