]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanserv.c
Don't allow users to view other users auth attempt information in WHOIS.
[irc/quakenet/newserv.git] / chanserv / chanserv.c
CommitLineData
c86edd1d
Q
1/*
2 * chanserv.c:
3 * The main chanserv core file.
4 */
5
6#include "chanserv.h"
7#include "../core/hooks.h"
8#include "../core/schedule.h"
9
c86edd1d
Q
10int chanservnext;
11
12int chanserv_init_status;
13
14sstring **chantypes;
15
16const flag rcflags[] = {
17 { 'a', QCFLAG_AUTOOP },
18 { 'b', QCFLAG_BITCH },
19 { 'c', QCFLAG_AUTOLIMIT },
20 { 'e', QCFLAG_ENFORCE },
21 { 'f', QCFLAG_FORCETOPIC },
22 { 'g', QCFLAG_AUTOVOICE },
23 { 'i', QCFLAG_INFO },
24 { 'j', QCFLAG_JOINED },
25 { 'k', QCFLAG_KNOWNONLY },
26 { 'p', QCFLAG_PROTECT },
c86edd1d
Q
27 { 't', QCFLAG_TOPICSAVE },
28 { 'v', QCFLAG_VOICEALL },
29 { 'w', QCFLAG_WELCOME },
30 { 'z', QCFLAG_SUSPENDED },
31 { '\0', 0 } };
32
33const flag rcuflags[] = {
34 { 'a', QCUFLAG_AUTOOP },
35 { 'b', QCUFLAG_BANNED },
36 { 'd', QCUFLAG_DENY },
37 { 'g', QCUFLAG_AUTOVOICE },
38 { 'i', QCUFLAG_HIDEINFO },
39 { 'j', QCUFLAG_AUTOINVITE },
40 { 'k', QCUFLAG_KNOWN },
41 { 'm', QCUFLAG_MASTER },
42 { 'n', QCUFLAG_OWNER },
43 { 'o', QCUFLAG_OP },
44 { 'p', QCUFLAG_PROTECT },
45 { 'q', QCUFLAG_QUIET },
c86edd1d
Q
46 { 't', QCUFLAG_TOPIC },
47 { 'v', QCUFLAG_VOICE },
48 { 'w', QCUFLAG_HIDEWELCOME },
49 { '\0', 0 } };
50
51const flag ruflags[] = {
52 { 'a', QUFLAG_ADMIN },
53 { 'd', QUFLAG_DEV },
7e0b37b0 54 { 'D', QUFLAG_CLEANUPEXEMPT },
c86edd1d
Q
55 { 'g', QUFLAG_GLINE },
56 { 'G', QUFLAG_DELAYEDGLINE },
57 { 'h', QUFLAG_HELPER },
58 { 'i', QUFLAG_INFO },
59 { 'l', QUFLAG_NEEDAUTH },
60 { 'L', QUFLAG_NOAUTHLIMIT },
61 { 'n', QUFLAG_NOTICE },
62 { 'o', QUFLAG_OPER },
63 { 'p', QUFLAG_PROTECT },
64 { 'r', QUFLAG_RESTRICTED },
65 { 'z', QUFLAG_SUSPENDED },
66 { '\0', 0 } };
67
e3805f60
P
68const flag mdflags[] = {
69 { 'l', MDFLAG_LIMIT },
70 { 'b', MDFLAG_BANNED },
71 { 'u', MDFLAG_ACTLIMIT },
72 { '\0', 0 } };
73
c86edd1d
Q
74void chanservfreestuff();
75void chanservfinishinit(int hooknum, void *arg);
76
77void chanservdumpstuff(void *arg) {
78 dumplastjoindata("lastjoin.dump");
79}
80
81void _init() {
b263aa79 82 /* Register the nick extension - the others are registered in the db module */
c86edd1d
Q
83 chanservnext=registernickext("nickserv");
84
45770ae6
CP
85 chanservcryptoinit();
86
316959c1 87 if (chanservext!=-1 && chanservnext!=-1 && chanservaext!=-1) {
c86edd1d
Q
88 /* Set up the chantypes */
89 chantypes=(sstring **)malloc(CHANTYPES*sizeof(sstring *));
90 chantypes[0]=getsstring("(unspecified)",20);
91 chantypes[1]=getsstring("clan",20);
92 chantypes[2]=getsstring("league",20);
93 chantypes[3]=getsstring("private",20);
94 chantypes[4]=getsstring("special",20);
95 chantypes[5]=getsstring("gamesite",20);
96 chantypes[6]=getsstring("game",20);
97
c86edd1d
Q
98 /* And the log system */
99 cs_initlog();
100
c86edd1d
Q
101 /* Set up the command handler, and built in commands */
102 chanservcommandinit();
103 chanservaddcommand("showcommands", 0, 1, cs_doshowcommands, "Lists available commands.");
104 chanservaddcommand("quit", QCMD_DEV, 1, cs_doquit, "Makes the bot QUIT and \"reconnect\".");
105 chanservaddcommand("rename", QCMD_DEV, 1, cs_dorename, "Changes the bot's name.");
106 chanservaddcommand("rehash", QCMD_DEV, 0, cs_dorehash, "Reloads all text from database.");
107 chanservaddcommand("help", 0, 1, cs_dohelp, "Displays help on a specific command.");
64f17f02
P
108 chanservaddcommand("version", 0, 1, cs_doversion, "Show Version.");
109
c86edd1d
Q
110 chanservaddctcpcommand("ping",cs_doctcpping);
111 chanservaddctcpcommand("version",cs_doctcpversion);
112 chanservaddctcpcommand("gender",cs_doctcpgender);
113
114 registerhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
b263aa79 115
116 /* Now that the database is in a separate module it might be loaded already. */
117 if (chanservdb_ready)
118 chanservfinishinit(HOOK_CHANSERV_DBLOADED, NULL);
c86edd1d
Q
119 }
120}
121
122void chanservfinishinit(int hooknum, void *arg) {
123 Error("chanserv",ERR_INFO,"Database loaded, finishing initialisation.");
124
125 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
126
127 readlastjoindata("lastjoin.dump");
128
129 /* Schedule the dumps */
130 schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL);
131
132 chanserv_init_status = CS_INIT_NOUSER;
133
134 /* Register the user */
135 scheduleoneshot(time(NULL)+1,&chanservreguser,NULL);
136}
137
138void chanserv_finalinit() {
139 int i;
140 nick *np;
141
142 /* Scan for users */
143 for (i=0;i<NICKHASHSIZE;i++)
144 for (np=nicktable[i];np;np=np->next)
145 cs_checknick(np);
146
147 /* Register core hooks */
148 registerhook(HOOK_NICK_NEWNICK, cs_handlenick);
149 registerhook(HOOK_NICK_ACCOUNT, cs_handlenick);
150 registerhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
151 registerhook(HOOK_NICK_SETHOST, cs_handlesethost);
152 registerhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
153 registerhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
154 registerhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
155 registerhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
156 registerhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
157 registerhook(HOOK_CHANNEL_BURST, cs_handleburst);
158 registerhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
159 registerhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
32562540 160
161 chanserv_init_status = CS_INIT_READY;
162 triggerhook(HOOK_CHANSERV_RUNNING, NULL);
316959c1 163 Error("chanserv",ERR_INFO,"Ready to roll.");
c86edd1d
Q
164}
165
166void _fini() {
167 deleteallschedules(cs_timerfunc);
168 deleteallschedules(chanservreguser);
169 deleteallschedules(chanservdumpstuff);
170 deleteallschedules(chanservdgline);
171
b263aa79 172 if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) {
c86edd1d
Q
173 int i;
174 for (i=0;i<CHANTYPES;i++)
175 freesstring(chantypes[i]);
176
177 free(chantypes);
178 }
179
c86edd1d 180 /* Free everything */
c86edd1d
Q
181 if (chanservnext!=-1) {
182 releasenickext(chanservnext);
183 }
184
185 if (chanservnick)
186 deregisterlocaluser(chanservnick, "Leaving");
187
188 deregisterhook(HOOK_NICK_NEWNICK, cs_handlenick);
189 deregisterhook(HOOK_NICK_ACCOUNT, cs_handlenick);
190 deregisterhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
191 deregisterhook(HOOK_NICK_SETHOST, cs_handlesethost);
192 deregisterhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
193 deregisterhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
194 deregisterhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
195 deregisterhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
196 deregisterhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
197 deregisterhook(HOOK_CHANNEL_BURST, cs_handleburst);
198 deregisterhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
199 deregisterhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
200 /* deregisterhook(HOOK_CHANNEL_OPPED, cs_handleopchange);
201 deregisterhook(HOOK_CHANNEL_DEOPPED, cs_handleopchange);
202 deregisterhook(HOOK_CHANNEL_DEVOICED, cs_handleopchange);
203 deregisterhook(HOOK_CHANNEL_BANSET, cs_handlenewban); */
65f2c6a3 204 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit); /* for safety */
c86edd1d
Q
205
206 chanservremovecommand("showcommands", cs_doshowcommands);
207 chanservremovecommand("quit", cs_doquit);
208 chanservremovecommand("rename", cs_dorename);
209 chanservremovecommand("rehash", cs_dorehash);
210 chanservremovecommand("help", cs_dohelp);
64f17f02 211 chanservremovecommand("version", cs_doversion);
c86edd1d
Q
212 chanservremovectcpcommand("ping",cs_doctcpping);
213 chanservremovectcpcommand("version",cs_doctcpversion);
214 chanservremovectcpcommand("gender",cs_doctcpgender);
215 chanservcommandclose();
216
217 cs_closelog();
c86edd1d 218}