]> jfr.im git - irc/gameservirc.git/blame - gameserv/config.cpp
Implemented refresh period... now works and added to changelog
[irc/gameservirc.git] / gameserv / config.cpp
CommitLineData
fb37ecc7 1#include <fstream>
85ce9d3e 2#include <string.h>
20d5d721 3#include <stdlib.h>
85ce9d3e 4#include <stdio.h>
5#include "extern.h"
9bafc40d 6#include "flags.h"
85ce9d3e 7
fb37ecc7 8using std::ifstream;
33ac4371 9using std::cerr;
10using std::endl;
fb37ecc7 11
624c0352 12int load_config_file(char *config);
85ce9d3e 13void unload_config_file();
85ce9d3e 14
15/* Random Configuration Stuff Goes Here until I code it to load from a .conf file :)*/
16
17char *s_GameServ; // GameServ's nickname
18char *gshost; // GameServ's Hostname
19char *gsident; // GameServ's ident/username
20char *servername; // GameServ's Server
21char *c_Forest; // Forest channel
22char *c_ForestTopic; // Forest Channel Topic
45a84400 23char *adminpass; // Administrator password
bf2cabcd 24char *welcomemsg; // Welcome Message
448a1531 25char *ignoreserverslist; // Servernames to ignore
922daad7 26int welcomedelay; // Welcome Message Delay
27int updateperiod; // Seconds until another player database update
20d5d721 28int forestfights; // Forest fights per day
8450c018 29int maxafightdistance; // Max levels above a player they can fight player->player
30int maxbfightdistance; // Max levels below a player they can fight player->player
40251952 31int maxidletime; // Max time (in seconds) a player can be idle for
32int idlecheckperiod; // Period for checking every player's idle time
4bcfa863 33long refreshperiod; // Period for refreshing players
9bafc40d 34long configflags; // Holds the bit representation of some boolean values
85ce9d3e 35
36// Remote server stuff. This is used for the outgoing connection gameserv needs to make
37// to a real ircd.
38char *remoteserver; // Server to connect to
39char *remoteport; // Port to connect to on remoteserver
40char *remotepass; // Password for the server link
41
42char *playerdata; // File to store player data in
4dde2ed9 43char *monsterdata; // File to load monster data from
c260a8d7 44char *newsdata; // File to store news data in
69ae096c 45char *pidfile; // Process ID file
85ce9d3e 46
e1c41a84 47#if defined(P10)
48 char *gsnum = "[]AAA"; // GameServ Numeric
49#endif
50
85ce9d3e 51void unload_config_file()
52{
53 if (s_GameServ)
1cf88153 54 delete [] s_GameServ;
85ce9d3e 55 if (gshost)
1cf88153 56 delete [] gshost;
85ce9d3e 57 if (gsident)
1cf88153 58 delete [] gsident;
85ce9d3e 59 if (servername)
1cf88153 60 delete [] servername;
85ce9d3e 61 if (c_Forest)
1cf88153 62 delete [] c_Forest;
85ce9d3e 63 if (c_ForestTopic)
1cf88153 64 delete [] c_ForestTopic;
85ce9d3e 65 if (remoteserver)
1cf88153 66 delete [] remoteserver;
85ce9d3e 67 if (remoteport)
1cf88153 68 delete [] remoteport;
85ce9d3e 69 if (remotepass)
1cf88153 70 delete [] remotepass;
85ce9d3e 71 if (playerdata)
1cf88153 72 delete [] playerdata;
4dde2ed9 73 if (monsterdata)
74 delete [] monsterdata;
45a84400 75 if (adminpass)
76 delete [] adminpass;
bf2cabcd 77 if (welcomemsg)
78 delete [] welcomemsg;
69ae096c 79 if (pidfile)
80 delete [] pidfile;
448a1531 81 if (ignoreserverslist)
82 delete [] ignoreserverslist;
c260a8d7 83 if (newsdata)
84 delete [] newsdata;
9bafc40d 85
86 configflags = 0;
85ce9d3e 87}
bf2cabcd 88
624c0352 89int load_config_file(char *config)
85ce9d3e 90{
91 char *buf, *directive, *value;
69ae096c 92
4bcfa863 93 #define numdirectives 23
85ce9d3e 94
95 unload_config_file();
96
1e1b5312 97 struct DIRECTIVE {
98 bool done;
99 char *desc;
100 };
101
102 DIRECTIVE directives[numdirectives];
103
104 directives[0].desc = "s_GameServ - GameServ Nickname";
105 directives[1].desc = "GSHOST - GameServ Hostname";
106 directives[2].desc = "GSIDENT - GameServ Ident";
107 directives[3].desc = "SERVERNAME - Pseudo Server's Name";
108 directives[4].desc = "C_FOREST - Forest Channel";
109 directives[5].desc = "C_FORESTTOPIC - Topic for the Forest Channel";
110 directives[6].desc = "REMOTESERVER - Server for gameserv to connect to (ip or hostname)";
111 directives[7].desc = "REMOTEPORT - Port on the remote server to connect to";
112 directives[8].desc = "REMOTEPASS - Password on the remote server";
113 directives[9].desc = "PLAYERDATA - File to store the player saves in";
114 directives[10].desc = "MONSTERDATA - File to load the monsters from";
115 directives[11].desc = "ADMINPASS - Password to identify as an admin with";
116 directives[12].desc = "WELCOMEDELAY - Delay (in seconds) to wait before welcoming new users to the network";
117 directives[13].desc = "FORESTFIGHTS - Number of forest fights players get every day";
118 directives[14].desc = "UPDATEPERIOD - Number of seconds between every player data save";
18b84d11 119 directives[15].desc = "PIDFILE - Filename to store the gameserv process ID in";
120 directives[16].desc = "MAXAFIGHTDISTANCE - The maximum number of levels above you "\
8450c018 121 "that you can fight player->player";
18b84d11 122 directives[17].desc = "MAXBFIGHTDISTANCE - The maximum number of levels below you "\
8450c018 123 "that you can fight player->player";
18b84d11 124 directives[18].desc = "MAXIDLETIME - The maximum amount of time (in seconds) "\
40251952 125 "that a player can be idle before something happens";
18b84d11 126 directives[19].desc = "IDLECHECKPERIOD - The period (in seconds) in which the entire "\
40251952 127 "players list will be checked for idlers. See also: "\
128 "MAXIDLETIME";
18b84d11 129 directives[20].desc = "LISTENONC_FOREST - True/False as to "\
448a1531 130 "whether or not to listen for forest "\
131 "commands on the forest channel";
c260a8d7 132 directives[21].desc = "NEWSDATA - File to store daily news in";
4bcfa863 133 directives[22].desc = "REFRESHPERIOD - Period (in seconds) to "\
134 "refresh players";
1e1b5312 135
9bafc40d 136 configflags = 0;
137
1e1b5312 138 for (int count = 0; count < numdirectives; count++)
139 {
140 directives[count].done = false;
141 }
142
85ce9d3e 143 ifstream infile;
144 infile.open(config);
145 if (infile.fail())
146 {
fb37ecc7 147 log("Error opening %s", config);
33ac4371 148 cerr << "Error opening " << config << endl;
624c0352 149 return 0;
85ce9d3e 150 }
151
1e1b5312 152 buf = new char[1024];
153
85ce9d3e 154 while (infile.getline(buf, 1024, '\n'))
155 {
9f8c2acc 156 #ifdef DEBUGMODE
33ac4371 157 log("Config file entry buf: %s", buf);
9f8c2acc 158 #endif
85ce9d3e 159
9cc5ab57 160 if (buf[0] == '#' || buf[0] == ' ' || buf[0] == '\0' || buf[0] == '\n' || buf[0] == '\r')
85ce9d3e 161 continue;
162
163 directive = strtok(buf, " ");
164
20d5d721 165 if (stricmp(directive, "DIE") == 0)
166 {
167 value = strtok(NULL, "");
fb37ecc7 168 log("You should read the entire %s file!", config);
33ac4371 169 cerr << "You should read the entire " << config << " file!"
170 << endl;
1e1b5312 171 delete []buf;
20d5d721 172 exit(0);
173 }
85ce9d3e 174 if (stricmp(directive, "S_GAMESERV") == 0)
175 {
176 value = strtok(NULL, " ");
177 s_GameServ = new char[strlen(value) + 1];
178 strcpy(s_GameServ, value);
1e1b5312 179 directives[0].done = true;
85ce9d3e 180 }
181 else if (stricmp(directive, "GSHOST") == 0)
182 {
183 value = strtok(NULL, " ");
184 gshost = new char[strlen(value) + 1];
185 strcpy(gshost, value);
1e1b5312 186 directives[1].done = true;
85ce9d3e 187 }
188 else if (stricmp(directive, "GSIDENT") == 0)
189 {
190 value = strtok(NULL, " ");
191 gsident = new char[strlen(value) + 1];
192 strcpy(gsident, value);
1e1b5312 193 directives[2].done = true;
85ce9d3e 194 }
195 else if (stricmp(directive, "SERVERNAME") == 0)
196 {
197 value = strtok(NULL, " ");
198 servername = new char[strlen(value) + 1];
199 strcpy(servername, value);
1e1b5312 200 directives[3].done = true;
85ce9d3e 201 }
202 else if (stricmp(directive, "C_FOREST") == 0)
203 {
204 value = strtok(NULL, " ");
205 c_Forest = new char[strlen(value) + 1];
206 strcpy(c_Forest, value);
1e1b5312 207 directives[4].done = true;
85ce9d3e 208 }
209 else if (stricmp(directive, "C_FORESTTOPIC") == 0)
210 {
211 value = strtok(NULL, "");
212 c_ForestTopic = new char[strlen(value) + 1];
213 strcpy(c_ForestTopic, value);
1e1b5312 214 directives[5].done = true;
85ce9d3e 215 }
216 else if (stricmp(directive, "REMOTESERVER") == 0)
217 {
218 value = strtok(NULL, " ");
219 remoteserver = new char[strlen(value) + 1];
220 strcpy(remoteserver, value);
1e1b5312 221 directives[6].done = true;
85ce9d3e 222 }
223 else if (stricmp(directive, "REMOTEPORT") == 0)
224 {
225 value = strtok(NULL, " ");
226 remoteport = new char[strlen(value) + 1];
227 strcpy(remoteport, value);
1e1b5312 228 directives[7].done = true;
85ce9d3e 229 }
230 else if (stricmp(directive, "REMOTEPASS") == 0)
231 {
232 value = strtok(NULL, "");
233 remotepass = new char[strlen(value) + 1];
234 strcpy(remotepass, value);
1e1b5312 235 directives[8].done = true;
85ce9d3e 236 }
237 else if (stricmp(directive, "PLAYERDATA") == 0)
238 {
239 value = strtok(NULL, "");
240 playerdata = new char[strlen(value) + 1];
241 strcpy(playerdata, value);
1e1b5312 242 directives[9].done = true;
85ce9d3e 243 }
4dde2ed9 244 else if (stricmp(directive, "MONSTERDATA") == 0)
245 {
246 value = strtok(NULL, "");
247 monsterdata = new char[strlen(value) + 1];
248 strcpy(monsterdata, value);
1e1b5312 249 directives[10].done = true;
4dde2ed9 250 }
45a84400 251 else if (stricmp(directive, "ADMINPASS") == 0)
252 {
253 value = strtok(NULL, "");
254 adminpass = new char[strlen(value) + 1];
255 strcpy(adminpass, value);
1e1b5312 256 directives[11].done = true;
45a84400 257 }
922daad7 258 else if (stricmp(directive, "WELCOMEDELAY") == 0)
bf2cabcd 259 {
260 value = strtok(NULL, " ");
922daad7 261 welcomedelay = stringtoint(value);
1e1b5312 262 directives[12].done = true;
922daad7 263 }
20d5d721 264 else if (stricmp(directive, "FORESTFIGHTS") == 0)
265 {
266 value = strtok(NULL, " ");
267 forestfights = stringtoint(value);
1e1b5312 268 directives[13].done = true;
20d5d721 269 }
922daad7 270 else if (stricmp(directive, "UPDATEPERIOD") == 0)
271 {
272 value = strtok(NULL, " ");
273 updateperiod = stringtoint(value);
1e1b5312 274 directives[14].done = true;
bf2cabcd 275 }
69ae096c 276 else if (stricmp(directive, "PIDFILE") == 0)
277 {
278 value = strtok(NULL, " ");
279 pidfile = new char[strlen(value) + 1];
280 strcpy(pidfile, value);
18b84d11 281 directives[15].done = true;
69ae096c 282 }
8450c018 283 else if (stricmp(directive, "MAXAFIGHTDISTANCE") == 0)
284 {
285 value = strtok(NULL, " ");
286 maxafightdistance = stringtoint(value);
18b84d11 287 directives[16].done = true;;
8450c018 288 }
289 else if (stricmp(directive, "MAXBFIGHTDISTANCE") == 0)
290 {
291 value = strtok(NULL, " ");
292 maxbfightdistance = stringtoint(value);
18b84d11 293 directives[17].done = true;
8450c018 294 }
40251952 295 else if (stricmp(directive, "MAXIDLETIME") == 0)
296 {
297 value = strtok(NULL, " ");
298 maxidletime = stringtoint(value);
18b84d11 299 directives[18].done = true;
40251952 300 }
301 else if (stricmp(directive, "IDLECHECKPERIOD") == 0)
302 {
303 value = strtok(NULL, " ");
304 idlecheckperiod = stringtoint(value);
18b84d11 305 directives[19].done = true;
40251952 306 }
ff7d02f3 307 else if (stricmp(directive, "LISTENONC_FOREST") == 0)
308 {
309 value = strtok(NULL, " ");
310 if (stricmp(value, "TRUE") == 0)
6f727d4c 311 setListenOnCF();
ff7d02f3 312
18b84d11 313 directives[20].done = true;
314 }
c260a8d7 315 else if (stricmp(directive, "NEWSDATA") == 0)
316 {
317 value = strtok(NULL, " ");
318 newsdata = new char [strlen(value) + 1];
319 strcpy(newsdata, value);
320 directives[21].done = true;
321 }
4bcfa863 322 else if (stricmp(directive, "REFRESHPERIOD") == 0)
323 {
324 value = strtok(NULL, " ");
325 refreshperiod = stringtoint(value);
326 directives[22].done = true;
327 }
18b84d11 328 else if (stricmp(directive, "WELCOMEMSG") == 0)
329 {
330 // This directive is optional
331 value = strtok(NULL, "");
332 welcomemsg = new char[strlen(value) + 1];
333 strcpy(welcomemsg, value);
334 setWelcome();
ff7d02f3 335 }
9bafc40d 336 else if (stricmp(directive, "USEPRIVMSG") == 0)
337 {
338 // This directive is optional
6f727d4c 339 setUsePrivmsg();
340 }
341 else if (stricmp(directive, "BOPER") == 0)
342 {
343 // This directive is optional
344 setBOper();
9bafc40d 345 }
448a1531 346 else if (stricmp(directive, "IGNORESERVERS") == 0)
347 {
348 // This directive is optional
349 value = strtok(NULL, "");
350 ignoreserverslist = new char[strlen(value) + 1];
351 strcpy(ignoreserverslist, value);
352 }
85ce9d3e 353 else
354 {
9f8c2acc 355 #ifdef DEBUGMODE
356 log("Unknown Directive. Buffer: %s", buf);
33ac4371 357 cerr << "Unknown " << config << " directive. Buffer: "
358 << buf << endl;
9f8c2acc 359 #endif
85ce9d3e 360 continue;
361 }
85ce9d3e 362 }
1cf88153 363delete [] buf;
85ce9d3e 364infile.close();
1e1b5312 365
366 int nonemissing = 1;
367 for (int count2 = 0; count2 < numdirectives; count2++)
368 {
369 if (!directives[count2].done)
370 {
371 cerr << "Missing config directive: " << directives[count2].desc << endl;
372 nonemissing = 0;
373 }
374 }
375
376 return nonemissing;
85ce9d3e 377}