3 * The main chanserv core file.
8 #include "../core/hooks.h"
9 #include "../core/schedule.h"
10 #include "../lib/version.h"
12 MODULE_VERSION(QVERSION
);
16 int chanserv_init_status
;
20 const flag rcflags
[] = {
21 { 'a', QCFLAG_AUTOOP
},
22 { 'b', QCFLAG_BITCH
},
23 { 'c', QCFLAG_AUTOLIMIT
},
24 { 'e', QCFLAG_ENFORCE
},
25 { 'f', QCFLAG_FORCETOPIC
},
26 { 'g', QCFLAG_AUTOVOICE
},
28 { 'j', QCFLAG_JOINED
},
29 { 'k', QCFLAG_KNOWNONLY
},
30 { 'p', QCFLAG_PROTECT
},
31 { 's', QCFLAG_NOINFO
},
32 { 't', QCFLAG_TOPICSAVE
},
33 { 'v', QCFLAG_VOICEALL
},
34 { 'w', QCFLAG_WELCOME
},
35 { 'z', QCFLAG_SUSPENDED
},
38 const flag rcuflags
[] = {
39 { 'a', QCUFLAG_AUTOOP
},
40 { 'b', QCUFLAG_BANNED
},
41 { 'd', QCUFLAG_DENY
},
42 { 'g', QCUFLAG_AUTOVOICE
},
43 { 'i', QCUFLAG_INFO
},
44 { 'j', QCUFLAG_AUTOINVITE
},
45 { 'k', QCUFLAG_KNOWN
},
46 { 'm', QCUFLAG_MASTER
},
47 { 'n', QCUFLAG_OWNER
},
49 { 'p', QCUFLAG_PROTECT
},
50 { 'q', QCUFLAG_QUIET
},
51 { 's', QCUFLAG_NOINFO
},
52 { 't', QCUFLAG_TOPIC
},
53 { 'v', QCUFLAG_VOICE
},
54 { 'w', QCUFLAG_HIDEWELCOME
},
57 const flag ruflags
[] = {
58 { 'a', QUFLAG_ADMIN
},
60 { 'D', QUFLAG_CLEANUPEXEMPT
},
61 { 'g', QUFLAG_GLINE
},
62 { 'G', QUFLAG_DELAYEDGLINE
},
63 { 'h', QUFLAG_HELPER
},
65 { 'L', QUFLAG_NOAUTHLIMIT
},
66 { 'n', QUFLAG_NOTICE
},
68 { 'p', QUFLAG_PROTECT
},
69 { 'q', QUFLAG_STAFF
},
70 { 's', QUFLAG_NOINFO
},
71 { 'T', QUFLAG_TRUST
},
72 { 'z', QUFLAG_SUSPENDED
},
75 const flag mdflags
[] = {
76 { 'l', MDFLAG_LIMIT
},
77 { 'b', MDFLAG_BANNED
},
78 { 'u', MDFLAG_ACTLIMIT
},
81 void chanservfreestuff();
82 void chanservfinishinit(int hooknum
, void *arg
);
84 DBModuleIdentifier q9dbid
;
86 void chanservdumpstuff(void *arg
) {
87 dumplastjoindata("lastjoin.dump");
91 /* Register the nick extension - the others are registered in the db module */
92 chanservnext
=registernickext("nickserv");
99 if (chanservext
!=-1 && chanservnext
!=-1 && chanservaext
!=-1) {
100 /* Set up the chantypes */
101 chantypes
=(sstring
**)malloc(CHANTYPES
*sizeof(sstring
*));
102 chantypes
[0]=getsstring("(unspecified)",20);
103 chantypes
[1]=getsstring("clan",20);
104 chantypes
[2]=getsstring("league",20);
105 chantypes
[3]=getsstring("private",20);
106 chantypes
[4]=getsstring("special",20);
107 chantypes
[5]=getsstring("gamesite",20);
108 chantypes
[6]=getsstring("game",20);
109 chantypes
[7]=getsstring("upgrade",20);
111 /* And the log system */
114 /* Set up the command handler, and built in commands */
115 chanservcommandinit();
116 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.");
117 chanservaddcommand("quit", QCMD_DEV
, 1, cs_doquit
, "Makes the bot QUIT and \"reconnect\".","");
118 chanservaddcommand("rename", QCMD_DEV
, 1, cs_dorename
, "Changes the bot's name.","");
119 chanservaddcommand("rehash", QCMD_DEV
, 0, cs_dorehash
, "Reloads all text from database.","");
120 /* 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. */
121 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");
122 chanservaddcommand("version", 0, 1, cs_doversion
, "Show Version.","Usage: VERSION\nShows the version number of the running bot.");
124 chanservaddctcpcommand("ping",cs_doctcpping
);
125 chanservaddctcpcommand("version",cs_doctcpversion
);
126 chanservaddctcpcommand("gender",cs_doctcpgender
);
128 registerhook(HOOK_CHANSERV_DBLOADED
, chanservfinishinit
);
130 /* Now that the database is in a separate module it might be loaded already. */
131 if (chanservdb_ready
)
132 chanservfinishinit(HOOK_CHANSERV_DBLOADED
, NULL
);
136 void chanservfinishinit(int hooknum
, void *arg
) {
137 Error("chanserv",ERR_INFO
,"Database loaded, finishing initialisation.");
139 deregisterhook(HOOK_CHANSERV_DBLOADED
, chanservfinishinit
);
141 readlastjoindata("lastjoin.dump");
143 /* Schedule the dumps */
144 schedulerecurring(time(NULL
)+DUMPINTERVAL
,0,DUMPINTERVAL
,chanservdumpstuff
,NULL
);
146 chanserv_init_status
= CS_INIT_NOUSER
;
148 /* Register the user */
149 scheduleoneshot(time(NULL
)+1,&chanservreguser
,NULL
);
152 void chanserv_finalinit() {
157 for (i
=0;i
<NICKHASHSIZE
;i
++)
158 for (np
=nicktable
[i
];np
;np
=nnp
) {
163 /* Register core hooks */
164 registerhook(HOOK_NICK_NEWNICK
, cs_handlenick
);
165 registerhook(HOOK_NICK_ACCOUNT
, cs_handlenick
);
166 registerhook(HOOK_NICK_LOSTNICK
, cs_handlelostnick
);
167 registerhook(HOOK_NICK_SETHOST
, cs_handlesethost
);
168 registerhook(HOOK_CHANNEL_NEWCHANNEL
, cs_handlenewchannel
);
169 registerhook(HOOK_CHANNEL_LOSTCHANNEL
, cs_handlelostchannel
);
170 registerhook(HOOK_CHANNEL_JOIN
, cs_handlejoin
);
171 registerhook(HOOK_CHANNEL_CREATE
, cs_handlejoin
);
172 registerhook(HOOK_CHANNEL_MODECHANGE
, cs_handlemodechange
);
173 registerhook(HOOK_CHANNEL_BURST
, cs_handleburst
);
174 registerhook(HOOK_CHANNEL_TOPIC
, cs_handletopicchange
);
175 registerhook(HOOK_CHANNEL_LOSTNICK
, cs_handlechanlostuser
);
177 chanserv_init_status
= CS_INIT_READY
;
178 triggerhook(HOOK_CHANSERV_RUNNING
, NULL
);
179 Error("chanserv",ERR_INFO
,"Ready to roll.");
185 deleteallschedules(cs_timerfunc
);
186 deleteallschedules(chanservreguser
);
187 deleteallschedules(chanservdumpstuff
);
188 deleteallschedules(chanservdgline
);
190 if (chanservext
>-1 && chanservnext
>-1 && chanservaext
>-1) {
192 for (i
=0;i
<CHANTYPES
;i
++)
193 freesstring(chantypes
[i
]);
198 /* Free everything */
199 if (chanservnext
!=-1) {
200 releasenickext(chanservnext
);
204 deregisterlocaluser(chanservnick
, "Leaving");
206 deregisterhook(HOOK_NICK_NEWNICK
, cs_handlenick
);
207 deregisterhook(HOOK_NICK_ACCOUNT
, cs_handlenick
);
208 deregisterhook(HOOK_NICK_LOSTNICK
, cs_handlelostnick
);
209 deregisterhook(HOOK_NICK_SETHOST
, cs_handlesethost
);
210 deregisterhook(HOOK_CHANNEL_NEWCHANNEL
, cs_handlenewchannel
);
211 deregisterhook(HOOK_CHANNEL_LOSTCHANNEL
, cs_handlelostchannel
);
212 deregisterhook(HOOK_CHANNEL_JOIN
, cs_handlejoin
);
213 deregisterhook(HOOK_CHANNEL_CREATE
, cs_handlejoin
);
214 deregisterhook(HOOK_CHANNEL_MODECHANGE
, cs_handlemodechange
);
215 deregisterhook(HOOK_CHANNEL_BURST
, cs_handleburst
);
216 deregisterhook(HOOK_CHANNEL_TOPIC
, cs_handletopicchange
);
217 deregisterhook(HOOK_CHANNEL_LOSTNICK
, cs_handlechanlostuser
);
218 /* deregisterhook(HOOK_CHANNEL_OPPED, cs_handleopchange);
219 deregisterhook(HOOK_CHANNEL_DEOPPED, cs_handleopchange);
220 deregisterhook(HOOK_CHANNEL_DEVOICED, cs_handleopchange);
221 deregisterhook(HOOK_CHANNEL_BANSET, cs_handlenewban); */
222 deregisterhook(HOOK_CHANSERV_DBLOADED
, chanservfinishinit
); /* for safety */
224 chanservremovecommand("showcommands", cs_doshowcommands
);
225 chanservremovecommand("quit", cs_doquit
);
226 chanservremovecommand("rename", cs_dorename
);
227 chanservremovecommand("rehash", cs_dorehash
);
228 chanservremovecommand("help", cs_dohelp
);
229 chanservremovecommand("version", cs_doversion
);
230 chanservremovectcpcommand("ping",cs_doctcpping
);
231 chanservremovectcpcommand("version",cs_doctcpversion
);
232 chanservremovectcpcommand("gender",cs_doctcpgender
);
233 chanservcommandclose();
236 chanservcryptofree();