]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanserv.c
free sstrings in trojanscan (left behind if db connect fails)
[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 sstring *cs_quitreason;
20
21 void chanservfreestuff();
22 void chanservfinishinit(int hooknum, void *arg);
23
24 DBModuleIdentifier q9dbid;
25
26 void chanservdumpstuff(void *arg) {
27 dumplastjoindata("lastjoin.dump");
28 }
29
30 void _init() {
31 /* Register the nick extension - the others are registered in the db module */
32 chanservnext=registernickext("nickserv");
33
34 chanservcryptoinit();
35 csa_initregex();
36
37 q9dbid = dbgetid();
38
39 if (chanservext!=-1 && chanservnext!=-1 && chanservaext!=-1) {
40 /* Set up the chantypes */
41 chantypes=(sstring **)malloc(CHANTYPES*sizeof(sstring *));
42 chantypes[0]=getsstring("(unspecified)",20);
43 chantypes[1]=getsstring("clan",20);
44 chantypes[2]=getsstring("league",20);
45 chantypes[3]=getsstring("private",20);
46 chantypes[4]=getsstring("special",20);
47 chantypes[5]=getsstring("gamesite",20);
48 chantypes[6]=getsstring("game",20);
49 chantypes[7]=getsstring("upgrade",20);
50
51 /* And the log system */
52 cs_initlog();
53
54 /* Set up the command handler, and built in commands */
55 chanservcommandinit();
56 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.");
57 chanservaddcommand("quit", QCMD_DEV, 1, cs_doquit, "Makes the bot QUIT and \"reconnect\".","");
58 chanservaddcommand("setquitreason", QCMD_DEV, 1, cs_dosetquitreason, "Sets the reason to be sent when quitting due to an unload.","");
59 chanservaddcommand("rename", QCMD_DEV, 1, cs_dorename, "Changes the bot's name.","");
60 chanservaddcommand("rehash", QCMD_DEV, 0, cs_dorehash, "Reloads all text from database.","");
61 /* 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. */
62 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");
63 chanservaddcommand("version", 0, 1, cs_doversion, "Show Version.","Usage: VERSION\nShows the version number of the running bot.");
64
65 chanservaddctcpcommand("ping",cs_doctcpping);
66 chanservaddctcpcommand("version",cs_doctcpversion);
67 chanservaddctcpcommand("gender",cs_doctcpgender);
68
69 registerhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
70
71 /* Now that the database is in a separate module it might be loaded already. */
72 if (chanservdb_ready)
73 chanservfinishinit(HOOK_CHANSERV_DBLOADED, NULL);
74 }
75 }
76
77 void chanservfinishinit(int hooknum, void *arg) {
78 Error("chanserv",ERR_INFO,"Database loaded, finishing initialisation.");
79
80 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit);
81
82 readlastjoindata("lastjoin.dump");
83
84 /* Schedule the dumps */
85 schedulerecurring(time(NULL)+DUMPINTERVAL,0,DUMPINTERVAL,chanservdumpstuff,NULL);
86
87 chanserv_init_status = CS_INIT_NOUSER;
88
89 /* Register the user */
90 scheduleoneshot(time(NULL)+1,&chanservreguser,NULL);
91 }
92
93 void chanserv_finalinit() {
94 int i;
95 nick *np, *nnp;
96
97 /* Scan for users */
98 for (i=0;i<NICKHASHSIZE;i++)
99 for (np=nicktable[i];np;np=nnp) {
100 nnp=np->next;
101 cs_checknick(np);
102 }
103
104 /* Register core hooks */
105 registerhook(HOOK_NICK_NEWNICK, cs_handlenick);
106 registerhook(HOOK_NICK_ACCOUNT, cs_handlenick);
107 registerhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
108 registerhook(HOOK_NICK_SETHOST, cs_handlesethost);
109 registerhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
110 registerhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
111 registerhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
112 registerhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
113 registerhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
114 registerhook(HOOK_CHANNEL_BURST, cs_handleburst);
115 registerhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
116 registerhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
117
118 chanserv_init_status = CS_INIT_READY;
119 triggerhook(HOOK_CHANSERV_RUNNING, NULL);
120 Error("chanserv",ERR_INFO,"Ready to roll.");
121 }
122
123 void _fini() {
124 dbfreeid(q9dbid);
125
126 deleteallschedules(cs_timerfunc);
127 deleteallschedules(chanservreguser);
128 deleteallschedules(chanservdumpstuff);
129 deleteallschedules(chanservdgline);
130
131 if (chanservext>-1 && chanservnext>-1 && chanservaext>-1) {
132 int i;
133 for (i=0;i<CHANTYPES;i++)
134 freesstring(chantypes[i]);
135
136 free(chantypes);
137 }
138
139 /* Free everything */
140 if (chanservnext!=-1) {
141 releasenickext(chanservnext);
142 }
143
144 if (chanservnick)
145 deregisterlocaluser(chanservnick, cs_quitreason?cs_quitreason->content:"Leaving");
146
147 freesstring(cs_quitreason);
148
149 deregisterhook(HOOK_NICK_NEWNICK, cs_handlenick);
150 deregisterhook(HOOK_NICK_ACCOUNT, cs_handlenick);
151 deregisterhook(HOOK_NICK_LOSTNICK, cs_handlelostnick);
152 deregisterhook(HOOK_NICK_SETHOST, cs_handlesethost);
153 deregisterhook(HOOK_CHANNEL_NEWCHANNEL, cs_handlenewchannel);
154 deregisterhook(HOOK_CHANNEL_LOSTCHANNEL, cs_handlelostchannel);
155 deregisterhook(HOOK_CHANNEL_JOIN, cs_handlejoin);
156 deregisterhook(HOOK_CHANNEL_CREATE, cs_handlejoin);
157 deregisterhook(HOOK_CHANNEL_MODECHANGE, cs_handlemodechange);
158 deregisterhook(HOOK_CHANNEL_BURST, cs_handleburst);
159 deregisterhook(HOOK_CHANNEL_TOPIC, cs_handletopicchange);
160 deregisterhook(HOOK_CHANNEL_LOSTNICK, cs_handlechanlostuser);
161 /* deregisterhook(HOOK_CHANNEL_OPPED, cs_handleopchange);
162 deregisterhook(HOOK_CHANNEL_DEOPPED, cs_handleopchange);
163 deregisterhook(HOOK_CHANNEL_DEVOICED, cs_handleopchange);
164 deregisterhook(HOOK_CHANNEL_BANSET, cs_handlenewban); */
165 deregisterhook(HOOK_CHANSERV_DBLOADED, chanservfinishinit); /* for safety */
166
167 chanservremovecommand("showcommands", cs_doshowcommands);
168 chanservremovecommand("quit", cs_doquit);
169 chanservremovecommand("setquitreason", cs_dosetquitreason);
170 chanservremovecommand("rename", cs_dorename);
171 chanservremovecommand("rehash", cs_dorehash);
172 chanservremovecommand("help", cs_dohelp);
173 chanservremovecommand("version", cs_doversion);
174 chanservremovectcpcommand("ping",cs_doctcpping);
175 chanservremovectcpcommand("version",cs_doctcpversion);
176 chanservremovectcpcommand("gender",cs_doctcpgender);
177 chanservcommandclose();
178
179 csa_freeregex();
180 chanservcryptofree();
181
182 cs_closelog();
183 }