]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanserv.c
Fixed help for USERS command.
[irc/quakenet/newserv.git] / chanserv / chanserv.c
1 /*
2 * chanserv.c:
3 * The main chanserv core file.
4 */
5
6 #include "chanserv.h"
7 #include "authlib.h"
8 #include "../core/hooks.h"
9 #include "../core/schedule.h"
10 #include "../lib/version.h"
11
12 MODULE_VERSION(QVERSION);
13
14 int chanservnext;
15
16 int chanserv_init_status;
17
18 sstring **chantypes;
19
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 },
27 { 'i', QCFLAG_INFO },
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 },
36 { '\0', 0 } };
37
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 },
48 { 'o', QCUFLAG_OP },
49 { 'p', QCUFLAG_PROTECT },
50 { 'q', QCUFLAG_QUIET },
51 { 's', QCUFLAG_NOINFO },
52 { 't', QCUFLAG_TOPIC },
53 { 'v', QCUFLAG_VOICE },
54 { 'w', QCUFLAG_HIDEWELCOME },
55 { '\0', 0 } };
56
57 const flag ruflags[] = {
58 { 'a', QUFLAG_ADMIN },
59 { 'd', QUFLAG_DEV },
60 { 'D', QUFLAG_CLEANUPEXEMPT },
61 { 'g', QUFLAG_GLINE },
62 { 'G', QUFLAG_DELAYEDGLINE },
63 { 'h', QUFLAG_HELPER },
64 { 'i', QUFLAG_INFO },
65 { 'L', QUFLAG_NOAUTHLIMIT },
66 { 'n', QUFLAG_NOTICE },
67 { 'o', QUFLAG_OPER },
68 { 'p', QUFLAG_PROTECT },
69 { 'q', QUFLAG_STAFF },
70 { 's', QUFLAG_NOINFO },
71 { 'T', QUFLAG_TRUST },
72 { 'z', QUFLAG_SUSPENDED },
73 { '\0', 0 } };
74
75 const flag mdflags[] = {
76 { 'l', MDFLAG_LIMIT },
77 { 'b', MDFLAG_BANNED },
78 { 'u', MDFLAG_ACTLIMIT },
79 { '\0', 0 } };
80
81 void chanservfreestuff();
82 void chanservfinishinit(int hooknum, void *arg);
83
84 DBModuleIdentifier q9dbid;
85
86 void chanservdumpstuff(void *arg) {
87 dumplastjoindata("lastjoin.dump");
88 }
89
90 void _init() {
91 /* Register the nick extension - the others are registered in the db module */
92 chanservnext=registernickext("nickserv");
93
94 chanservcryptoinit();
95 csa_initregex();
96
97 q9dbid = dbgetid();
98
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);
110
111 /* And the log system */
112 cs_initlog();
113
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.");
123
124 chanservaddctcpcommand("ping",cs_doctcpping);
125 chanservaddctcpcommand("version",cs_doctcpversion);
126 chanservaddctcpcommand("gender",cs_doctcpgender);
127
128 registerhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
129
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);
133 }
134 }
135
136 void chanservfinishinit(int hooknum, void *arg) {
137 Error("chanserv",ERR_INFO,"Database loaded, finishing initialisation.");
138
139 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
140
141 readlastjoindata("lastjoin.dump");
142
143 /* Schedule the dumps */
144 schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL);
145
146 chanserv_init_status = CS_INIT_NOUSER;
147
148 /* Register the user */
149 scheduleoneshot(time(NULL)+1,&chanservreguser,NULL);
150 }
151
152 void chanserv_finalinit() {
153 int i;
154 nick *np, *nnp;
155
156 /* Scan for users */
157 for (i=0;i<NICKHASHSIZE;i++)
158 for (np=nicktable[i];np;np=nnp) {
159 nnp=np->next;
160 cs_checknick(np);
161 }
162
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);
176
177 chanserv_init_status = CS_INIT_READY;
178 triggerhook(HOOK_CHANSERV_RUNNING, NULL);
179 Error("chanserv",ERR_INFO,"Ready to roll.");
180 }
181
182 void _fini() {
183 dbfreeid(q9dbid);
184
185 deleteallschedules(cs_timerfunc);
186 deleteallschedules(chanservreguser);
187 deleteallschedules(chanservdumpstuff);
188 deleteallschedules(chanservdgline);
189
190 if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) {
191 int i;
192 for (i=0;i<CHANTYPES;i++)
193 freesstring(chantypes[i]);
194
195 free(chantypes);
196 }
197
198 /* Free everything */
199 if (chanservnext!=-1) {
200 releasenickext(chanservnext);
201 }
202
203 if (chanservnick)
204 deregisterlocaluser(chanservnick, "Leaving");
205
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 */
223
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();
234
235 csa_freeregex();
236 chanservcryptofree();
237
238 cs_closelog();
239 }