]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/events.c
Connect nick pointers and trusthosts.
[irc/quakenet/newserv.git] / trusts / events.c
1 #include "../core/hooks.h"
2 #include "trusts.h"
3
4 static int eventsregistered;
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 triggerhook(HOOK_TRUSTS_NEWNICK, sender);
24 }
25
26 static void __lostnick(int hooknum, void *arg) {
27 nick *sender = arg, *np, *lp;
28 trusthost *th = gettrusthost(sender);
29
30 if(!th)
31 return;
32
33 triggerhook(HOOK_TRUSTS_LOSTNICK, sender);
34
35 /*
36 * we need to erase this nick from the trusthost list
37 * stored in the ->nextbytrust (ext) pointers in each nick
38 */
39
40 for(np=th->users,lp=NULL;np;lp=np,np=nextbytrust(np)) {
41 if(np != sender)
42 continue;
43
44 if(lp) {
45 setnextbytrust(lp, nextbytrust(np));
46 } else {
47 th->users = nextbytrust(np);
48 }
49
50 break;
51 }
52 }
53
54 static void __counthandler(int hooknum, void *arg) {
55 trusthost *th = gettrusthost((nick *)arg);
56
57 if(hooknum == HOOK_TRUSTS_NEWNICK) {
58 th->count++;
59 th->group->count++;
60 } else {
61 th->count--;
62 th->group->count--;
63 }
64 }
65
66 static void __dbloaded(int hooknum, void *arg) {
67 int i;
68 nick *np;
69
70 eventsregistered = 1;
71
72 registerhook(HOOK_NICK_NEWNICK, __newnick);
73 registerhook(HOOK_NICK_LOSTNICK, __lostnick);
74
75 registerhook(HOOK_TRUSTS_NEWNICK, __counthandler);
76 registerhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
77
78 /* we could do it by host, but hosts and ips are not bijective :( */
79 for(i=0;i<NICKHASHSIZE;i++)
80 for(np=nicktable[i];np;np=np->next)
81 __newnick(0, np);
82 }
83
84 void trusts_registerevents(void) {
85 registerhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
86
87 if(trustsdbloaded)
88 __dbloaded(0, NULL);
89 }
90
91 void trusts_deregisterevents(void) {
92 if(eventsregistered) {
93 deregisterhook(HOOK_NICK_NEWNICK, __newnick);
94 deregisterhook(HOOK_NICK_LOSTNICK, __lostnick);
95
96 deregisterhook(HOOK_TRUSTS_NEWNICK, __counthandler);
97 deregisterhook(HOOK_TRUSTS_LOSTNICK, __counthandler);
98 }
99
100 deregisterhook(HOOK_TRUSTS_DB_LOADED, __dbloaded);
101 }