]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/events.c
Redundant merge.
[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 int hooksregistered;
78
79 static void __dbloaded(int hooknum, void *arg) {
80 int i;
81 nick *np;
82
83 if(hooksregistered)
84 return;
85 hooksregistered = 1;
86
87 registerhook(HOOK_NICK_NEWNICK, __newnick);
88 registerhook(HOOK_NICK_LOSTNICK, __lostnick);
89
90 /* registerhook(HOOK_TRUSTS_NEWNICK, __counthandler);
91 registerhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
92 */
93
94 /* we could do it by host, but hosts and ips are not bijective :( */
95 for(i=0;i<NICKHASHSIZE;i++)
96 for(np=nicktable[i];np;np=np->next)
97 __newnick(0, np);
98 }
99
100 static void __dbclosed(int hooknum, void *arg) {
101 if(!hooksregistered)
102 return;
103 hooksregistered = 0;
104
105 deregisterhook(HOOK_NICK_NEWNICK, __newnick);
106 deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
107
108 /*
109 deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
110 deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
111 */
112 }
113
114 void trusts_deregisterevents(void) {
115 deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
116 deregisterhook(HOOK_TRUSTS_DB_CLOSED, __dbclosed);
117
118 __dbclosed(0, NULL);
119 }
120
121 void trusts_registerevents(void) {
122 registerhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
123 registerhook(HOOK_TRUSTS_DB_CLOSED, __dbclosed);
124
125 if(trustsdbloaded)
126 __dbloaded(0, NULL);
127 }