]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanserv.c
Fix various warnings.
[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"
dc9548f4 7#include "authlib.h"
c86edd1d
Q
8#include "../core/hooks.h"
9#include "../core/schedule.h"
b567a875
CP
10#include "../lib/version.h"
11
12MODULE_VERSION(QVERSION);
c86edd1d 13
c86edd1d
Q
14int chanservnext;
15
16int chanserv_init_status;
17
18sstring **chantypes;
9ecce0e8 19sstring *cs_quitreason;
c86edd1d
Q
20
21const flag rcflags[] = {
22 { 'a', QCFLAG_AUTOOP },
23 { 'b', QCFLAG_BITCH },
24 { 'c', QCFLAG_AUTOLIMIT },
25 { 'e', QCFLAG_ENFORCE },
26 { 'f', QCFLAG_FORCETOPIC },
27 { 'g', QCFLAG_AUTOVOICE },
28 { 'i', QCFLAG_INFO },
29 { 'j', QCFLAG_JOINED },
30 { 'k', QCFLAG_KNOWNONLY },
31 { 'p', QCFLAG_PROTECT },
50ec21f3 32 { 's', QCFLAG_NOINFO },
c86edd1d
Q
33 { 't', QCFLAG_TOPICSAVE },
34 { 'v', QCFLAG_VOICEALL },
35 { 'w', QCFLAG_WELCOME },
36 { 'z', QCFLAG_SUSPENDED },
37 { '\0', 0 } };
38
39const flag rcuflags[] = {
40 { 'a', QCUFLAG_AUTOOP },
41 { 'b', QCUFLAG_BANNED },
42 { 'd', QCUFLAG_DENY },
43 { 'g', QCUFLAG_AUTOVOICE },
50ec21f3 44 { 'i', QCUFLAG_INFO },
c86edd1d
Q
45 { 'j', QCUFLAG_AUTOINVITE },
46 { 'k', QCUFLAG_KNOWN },
47 { 'm', QCUFLAG_MASTER },
48 { 'n', QCUFLAG_OWNER },
49 { 'o', QCUFLAG_OP },
50 { 'p', QCUFLAG_PROTECT },
51 { 'q', QCUFLAG_QUIET },
50ec21f3 52 { 's', QCUFLAG_NOINFO },
c86edd1d
Q
53 { 't', QCUFLAG_TOPIC },
54 { 'v', QCUFLAG_VOICE },
55 { 'w', QCUFLAG_HIDEWELCOME },
56 { '\0', 0 } };
57
58const flag ruflags[] = {
59 { 'a', QUFLAG_ADMIN },
60 { 'd', QUFLAG_DEV },
7e0b37b0 61 { 'D', QUFLAG_CLEANUPEXEMPT },
c86edd1d
Q
62 { 'g', QUFLAG_GLINE },
63 { 'G', QUFLAG_DELAYEDGLINE },
64 { 'h', QUFLAG_HELPER },
65 { 'i', QUFLAG_INFO },
c86edd1d
Q
66 { 'L', QUFLAG_NOAUTHLIMIT },
67 { 'n', QUFLAG_NOTICE },
68 { 'o', QUFLAG_OPER },
69 { 'p', QUFLAG_PROTECT },
347686bd 70 { 'q', QUFLAG_STAFF },
50ec21f3 71 { 's', QUFLAG_NOINFO },
e58b744c 72 { 'T', QUFLAG_TRUST },
c86edd1d
Q
73 { 'z', QUFLAG_SUSPENDED },
74 { '\0', 0 } };
75
e3805f60
P
76const flag mdflags[] = {
77 { 'l', MDFLAG_LIMIT },
78 { 'b', MDFLAG_BANNED },
79 { 'u', MDFLAG_ACTLIMIT },
80 { '\0', 0 } };
81
c86edd1d
Q
82void chanservfreestuff();
83void chanservfinishinit(int hooknum, void *arg);
84
ee8cd7d0 85DBModuleIdentifier q9dbid;
b3565978 86
c86edd1d
Q
87void chanservdumpstuff(void *arg) {
88 dumplastjoindata("lastjoin.dump");
89}
90
91void _init() {
b263aa79 92 /* Register the nick extension - the others are registered in the db module */
c86edd1d
Q
93 chanservnext=registernickext("nickserv");
94
45770ae6 95 chanservcryptoinit();
dc9548f4 96 csa_initregex();
45770ae6 97
ee8cd7d0 98 q9dbid = dbgetid();
b3565978 99
316959c1 100 if (chanservext!=-1 && chanservnext!=-1 && chanservaext!=-1) {
c86edd1d
Q
101 /* Set up the chantypes */
102 chantypes=(sstring **)malloc(CHANTYPES*sizeof(sstring *));
103 chantypes[0]=getsstring("(unspecified)",20);
104 chantypes[1]=getsstring("clan",20);
105 chantypes[2]=getsstring("league",20);
106 chantypes[3]=getsstring("private",20);
107 chantypes[4]=getsstring("special",20);
108 chantypes[5]=getsstring("gamesite",20);
109 chantypes[6]=getsstring("game",20);
af862bd5 110 chantypes[7]=getsstring("upgrade",20);
c86edd1d 111
c86edd1d
Q
112 /* And the log system */
113 cs_initlog();
114
c86edd1d
Q
115 /* Set up the command handler, and built in commands */
116 chanservcommandinit();
dd258305 117 chanservaddcommand("showcommands", 0, 1, cs_doshowcommands, "Lists available commands.","Usage: SHOWCOMMANDS [<mask>]\nPrints a list of commands currently available to you, where:\nmask - Mask of commands to list (* or ? are wildcards). If no mask is specified,\n all available commands are displayed.");
1f0d7c8b 118 chanservaddcommand("quit", QCMD_DEV, 1, cs_doquit, "Makes the bot QUIT and \"reconnect\".","");
f22ae726 119 chanservaddcommand("setquitreason", QCMD_DEV, 1, cs_dosetquitreason, "Sets the reason to be sent when quitting due to an unload.","");
1f0d7c8b 120 chanservaddcommand("rename", QCMD_DEV, 1, cs_dorename, "Changes the bot's name.","");
121 chanservaddcommand("rehash", QCMD_DEV, 0, cs_dorehash, "Reloads all text from database.","");
96249709 122 /* Make "HELP" take 2 arguments so things like "HELP chanflags #channel" work. Any junk after the command will go into arg 2 and be ignored. */
123 chanservaddcommand("help", 0, 2, cs_dohelp, "Displays help on a specific command.","Usage: HELP <command>\nShows help for a command, where:\ncommand - the command to show help for.\nFor a list of available commands, see SHOWCOMMANDS.\n");
634a5bfa 124 chanservaddcommand("version", 0, 1, cs_doversion, "Show Version.","Usage: VERSION\nShows the version number of the running bot.");
64f17f02 125
c86edd1d
Q
126 chanservaddctcpcommand("ping",cs_doctcpping);
127 chanservaddctcpcommand("version",cs_doctcpversion);
128 chanservaddctcpcommand("gender",cs_doctcpgender);
129
130 registerhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
b263aa79 131
132 /* Now that the database is in a separate module it might be loaded already. */
133 if (chanservdb_ready)
134 chanservfinishinit(HOOK_CHANSERV_DBLOADED, NULL);
c86edd1d
Q
135 }
136}
137
138void chanservfinishinit(int hooknum, void *arg) {
139 Error("chanserv",ERR_INFO,"Database loaded, finishing initialisation.");
140
141 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
142
143 readlastjoindata("lastjoin.dump");
144
145 /* Schedule the dumps */
146 schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL);
147
148 chanserv_init_status = CS_INIT_NOUSER;
149
150 /* Register the user */
151 scheduleoneshot(time(NULL)+1,&chanservreguser,NULL);
152}
153
154void chanserv_finalinit() {
155 int i;
fdba86cb 156 nick *np, *nnp;
c86edd1d
Q
157
158 /* Scan for users */
159 for (i=0;i<NICKHASHSIZE;i++)
fdba86cb 160 for (np=nicktable[i];np;np=nnp) {
161 nnp=np->next;
c86edd1d 162 cs_checknick(np);
fdba86cb 163 }
c86edd1d
Q
164
165 /* Register core hooks */
166 registerhook(HOOK_NICK_NEWNICK, cs_handlenick);
167 registerhook(HOOK_NICK_ACCOUNT, cs_handlenick);
168 registerhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
169 registerhook(HOOK_NICK_SETHOST, cs_handlesethost);
170 registerhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
171 registerhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
172 registerhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
173 registerhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
174 registerhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
175 registerhook(HOOK_CHANNEL_BURST, cs_handleburst);
176 registerhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
177 registerhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
32562540 178
179 chanserv_init_status = CS_INIT_READY;
180 triggerhook(HOOK_CHANSERV_RUNNING, NULL);
316959c1 181 Error("chanserv",ERR_INFO,"Ready to roll.");
c86edd1d
Q
182}
183
184void _fini() {
ee8cd7d0 185 dbfreeid(q9dbid);
b3565978 186
c86edd1d
Q
187 deleteallschedules(cs_timerfunc);
188 deleteallschedules(chanservreguser);
189 deleteallschedules(chanservdumpstuff);
190 deleteallschedules(chanservdgline);
191
b263aa79 192 if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) {
c86edd1d
Q
193 int i;
194 for (i=0;i<CHANTYPES;i++)
195 freesstring(chantypes[i]);
196
197 free(chantypes);
198 }
199
c86edd1d 200 /* Free everything */
c86edd1d
Q
201 if (chanservnext!=-1) {
202 releasenickext(chanservnext);
203 }
204
205 if (chanservnick)
9ecce0e8 206 deregisterlocaluser(chanservnick, cs_quitreason?cs_quitreason->content:"Leaving");
207
208 freesstring(cs_quitreason);
c86edd1d
Q
209
210 deregisterhook(HOOK_NICK_NEWNICK, cs_handlenick);
211 deregisterhook(HOOK_NICK_ACCOUNT, cs_handlenick);
212 deregisterhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
213 deregisterhook(HOOK_NICK_SETHOST, cs_handlesethost);
214 deregisterhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
215 deregisterhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
216 deregisterhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
217 deregisterhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
218 deregisterhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
219 deregisterhook(HOOK_CHANNEL_BURST, cs_handleburst);
220 deregisterhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
221 deregisterhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
222 /* deregisterhook(HOOK_CHANNEL_OPPED, cs_handleopchange);
223 deregisterhook(HOOK_CHANNEL_DEOPPED, cs_handleopchange);
224 deregisterhook(HOOK_CHANNEL_DEVOICED, cs_handleopchange);
225 deregisterhook(HOOK_CHANNEL_BANSET, cs_handlenewban); */
65f2c6a3 226 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit); /* for safety */
c86edd1d
Q
227
228 chanservremovecommand("showcommands", cs_doshowcommands);
229 chanservremovecommand("quit", cs_doquit);
f22ae726 230 chanservremovecommand("setquitreason", cs_dosetquitreason);
c86edd1d
Q
231 chanservremovecommand("rename", cs_dorename);
232 chanservremovecommand("rehash", cs_dorehash);
233 chanservremovecommand("help", cs_dohelp);
64f17f02 234 chanservremovecommand("version", cs_doversion);
c86edd1d
Q
235 chanservremovectcpcommand("ping",cs_doctcpping);
236 chanservremovectcpcommand("version",cs_doctcpversion);
237 chanservremovectcpcommand("gender",cs_doctcpgender);
238 chanservcommandclose();
239
dc9548f4 240 csa_freeregex();
30a66d6c 241 chanservcryptofree();
dc9548f4 242
c86edd1d 243 cs_closelog();
c86edd1d 244}