-#include <fstream.h>
+#include <fstream>
#include <string.h>
+#include <stdlib.h>
#include <stdio.h>
#include "extern.h"
+#include "flags.h"
-void load_config_file(char *config);
+using std::ifstream;
+using std::cerr;
+using std::endl;
+
+int load_config_file(char *config);
void unload_config_file();
/* Random Configuration Stuff Goes Here until I code it to load from a .conf file :)*/
char *c_Forest; // Forest channel
char *c_ForestTopic; // Forest Channel Topic
char *adminpass; // Administrator password
-
+char *welcomemsg; // Welcome Message
+char *ignoreserverslist; // Servernames to ignore
+int welcomedelay; // Welcome Message Delay
+int updateperiod; // Seconds until another player database update
+int forestfights; // Forest fights per day
+int maxafightdistance; // Max levels above a player they can fight player->player
+int maxbfightdistance; // Max levels below a player they can fight player->player
+int maxidletime; // Max time (in seconds) a player can be idle for
+int idlecheckperiod; // Period for checking every player's idle time
+long refreshperiod; // Period for refreshing players
+long configflags; // Holds the bit representation of some boolean values
// Remote server stuff. This is used for the outgoing connection gameserv needs to make
// to a real ircd.
char *remotepass; // Password for the server link
char *playerdata; // File to store player data in
+char *monsterdata; // File to load monster data from
+char *newsdata; // File to store news data in
+char *pidfile; // Process ID file
+
+#if defined(P10)
+ char *gsnum = "[]AAA"; // GameServ Numeric
+#endif
void unload_config_file()
{
delete [] remotepass;
if (playerdata)
delete [] playerdata;
+ if (monsterdata)
+ delete [] monsterdata;
if (adminpass)
delete [] adminpass;
+ if (welcomemsg)
+ delete [] welcomemsg;
+ if (pidfile)
+ delete [] pidfile;
+ if (ignoreserverslist)
+ delete [] ignoreserverslist;
+ if (newsdata)
+ delete [] newsdata;
+
+ configflags = 0;
}
-void load_config_file(char *config)
+
+int load_config_file(char *config)
{
char *buf, *directive, *value;
- buf = new char[1024];
+
+ #define numdirectives 23
unload_config_file();
+ struct DIRECTIVE {
+ bool done;
+ char *desc;
+ };
+
+ DIRECTIVE directives[numdirectives];
+
+ directives[0].desc = "s_GameServ - GameServ Nickname";
+ directives[1].desc = "GSHOST - GameServ Hostname";
+ directives[2].desc = "GSIDENT - GameServ Ident";
+ directives[3].desc = "SERVERNAME - Pseudo Server's Name";
+ directives[4].desc = "C_FOREST - Forest Channel";
+ directives[5].desc = "C_FORESTTOPIC - Topic for the Forest Channel";
+ directives[6].desc = "REMOTESERVER - Server for gameserv to connect to (ip or hostname)";
+ directives[7].desc = "REMOTEPORT - Port on the remote server to connect to";
+ directives[8].desc = "REMOTEPASS - Password on the remote server";
+ directives[9].desc = "PLAYERDATA - File to store the player saves in";
+ directives[10].desc = "MONSTERDATA - File to load the monsters from";
+ directives[11].desc = "ADMINPASS - Password to identify as an admin with";
+ directives[12].desc = "WELCOMEDELAY - Delay (in seconds) to wait before welcoming new users to the network";
+ directives[13].desc = "FORESTFIGHTS - Number of forest fights players get every day";
+ directives[14].desc = "UPDATEPERIOD - Number of seconds between every player data save";
+ directives[15].desc = "PIDFILE - Filename to store the gameserv process ID in";
+ directives[16].desc = "MAXAFIGHTDISTANCE - The maximum number of levels above you "\
+ "that you can fight player->player";
+ directives[17].desc = "MAXBFIGHTDISTANCE - The maximum number of levels below you "\
+ "that you can fight player->player";
+ directives[18].desc = "MAXIDLETIME - The maximum amount of time (in seconds) "\
+ "that a player can be idle before something happens";
+ directives[19].desc = "IDLECHECKPERIOD - The period (in seconds) in which the entire "\
+ "players list will be checked for idlers. See also: "\
+ "MAXIDLETIME";
+ directives[20].desc = "LISTENONC_FOREST - True/False as to "\
+ "whether or not to listen for forest "\
+ "commands on the forest channel";
+ directives[21].desc = "NEWSDATA - File to store daily news in";
+ directives[22].desc = "REFRESHPERIOD - Period (in seconds) to "\
+ "refresh players";
+
+ configflags = 0;
+
+ for (int count = 0; count < numdirectives; count++)
+ {
+ directives[count].done = false;
+ }
+
ifstream infile;
infile.open(config);
if (infile.fail())
{
- cout << "Error opening " << config << endl;
- return;
+ log("Error opening %s", config);
+ cerr << "Error opening " << config << endl;
+ return 0;
}
+ buf = new char[1024];
+
while (infile.getline(buf, 1024, '\n'))
{
- cout << "Buf: " << buf << endl;
+ #ifdef DEBUGMODE
+ log("Config file entry buf: %s", buf);
+ #endif
if (buf[0] == '#' || buf[0] == ' ' || buf[0] == '\0' || buf[0] == '\n' || buf[0] == '\r')
continue;
directive = strtok(buf, " ");
+ if (stricmp(directive, "DIE") == 0)
+ {
+ value = strtok(NULL, "");
+ log("You should read the entire %s file!", config);
+ cerr << "You should read the entire " << config << " file!"
+ << endl;
+ delete []buf;
+ exit(0);
+ }
if (stricmp(directive, "S_GAMESERV") == 0)
{
value = strtok(NULL, " ");
s_GameServ = new char[strlen(value) + 1];
strcpy(s_GameServ, value);
+ directives[0].done = true;
}
else if (stricmp(directive, "GSHOST") == 0)
{
value = strtok(NULL, " ");
gshost = new char[strlen(value) + 1];
strcpy(gshost, value);
+ directives[1].done = true;
}
else if (stricmp(directive, "GSIDENT") == 0)
{
value = strtok(NULL, " ");
gsident = new char[strlen(value) + 1];
strcpy(gsident, value);
+ directives[2].done = true;
}
else if (stricmp(directive, "SERVERNAME") == 0)
{
value = strtok(NULL, " ");
servername = new char[strlen(value) + 1];
strcpy(servername, value);
+ directives[3].done = true;
}
else if (stricmp(directive, "C_FOREST") == 0)
{
value = strtok(NULL, " ");
c_Forest = new char[strlen(value) + 1];
strcpy(c_Forest, value);
+ directives[4].done = true;
}
else if (stricmp(directive, "C_FORESTTOPIC") == 0)
{
value = strtok(NULL, "");
c_ForestTopic = new char[strlen(value) + 1];
strcpy(c_ForestTopic, value);
+ directives[5].done = true;
}
else if (stricmp(directive, "REMOTESERVER") == 0)
{
value = strtok(NULL, " ");
remoteserver = new char[strlen(value) + 1];
strcpy(remoteserver, value);
+ directives[6].done = true;
}
else if (stricmp(directive, "REMOTEPORT") == 0)
{
value = strtok(NULL, " ");
remoteport = new char[strlen(value) + 1];
strcpy(remoteport, value);
+ directives[7].done = true;
}
else if (stricmp(directive, "REMOTEPASS") == 0)
{
value = strtok(NULL, "");
remotepass = new char[strlen(value) + 1];
strcpy(remotepass, value);
+ directives[8].done = true;
}
else if (stricmp(directive, "PLAYERDATA") == 0)
{
value = strtok(NULL, "");
playerdata = new char[strlen(value) + 1];
strcpy(playerdata, value);
+ directives[9].done = true;
+ }
+ else if (stricmp(directive, "MONSTERDATA") == 0)
+ {
+ value = strtok(NULL, "");
+ monsterdata = new char[strlen(value) + 1];
+ strcpy(monsterdata, value);
+ directives[10].done = true;
}
else if (stricmp(directive, "ADMINPASS") == 0)
{
value = strtok(NULL, "");
adminpass = new char[strlen(value) + 1];
strcpy(adminpass, value);
+ directives[11].done = true;
+ }
+ else if (stricmp(directive, "WELCOMEDELAY") == 0)
+ {
+ value = strtok(NULL, " ");
+ welcomedelay = stringtoint(value);
+ directives[12].done = true;
+ }
+ else if (stricmp(directive, "FORESTFIGHTS") == 0)
+ {
+ value = strtok(NULL, " ");
+ forestfights = stringtoint(value);
+ directives[13].done = true;
+ }
+ else if (stricmp(directive, "UPDATEPERIOD") == 0)
+ {
+ value = strtok(NULL, " ");
+ updateperiod = stringtoint(value);
+ directives[14].done = true;
+ }
+ else if (stricmp(directive, "PIDFILE") == 0)
+ {
+ value = strtok(NULL, " ");
+ pidfile = new char[strlen(value) + 1];
+ strcpy(pidfile, value);
+ directives[15].done = true;
+ }
+ else if (stricmp(directive, "MAXAFIGHTDISTANCE") == 0)
+ {
+ value = strtok(NULL, " ");
+ maxafightdistance = stringtoint(value);
+ directives[16].done = true;;
+ }
+ else if (stricmp(directive, "MAXBFIGHTDISTANCE") == 0)
+ {
+ value = strtok(NULL, " ");
+ maxbfightdistance = stringtoint(value);
+ directives[17].done = true;
+ }
+ else if (stricmp(directive, "MAXIDLETIME") == 0)
+ {
+ value = strtok(NULL, " ");
+ maxidletime = stringtoint(value);
+ directives[18].done = true;
+ }
+ else if (stricmp(directive, "IDLECHECKPERIOD") == 0)
+ {
+ value = strtok(NULL, " ");
+ idlecheckperiod = stringtoint(value);
+ directives[19].done = true;
+ }
+ else if (stricmp(directive, "LISTENONC_FOREST") == 0)
+ {
+ value = strtok(NULL, " ");
+ if (stricmp(value, "TRUE") == 0)
+ setListenOnCF();
+
+ directives[20].done = true;
+ }
+ else if (stricmp(directive, "NEWSDATA") == 0)
+ {
+ value = strtok(NULL, " ");
+ newsdata = new char [strlen(value) + 1];
+ strcpy(newsdata, value);
+ directives[21].done = true;
+ }
+ else if (stricmp(directive, "REFRESHPERIOD") == 0)
+ {
+ value = strtok(NULL, " ");
+ refreshperiod = stringtoint(value);
+ directives[22].done = true;
+ }
+ else if (stricmp(directive, "WELCOMEMSG") == 0)
+ {
+ // This directive is optional
+ value = strtok(NULL, "");
+ welcomemsg = new char[strlen(value) + 1];
+ strcpy(welcomemsg, value);
+ setWelcome();
+ }
+ else if (stricmp(directive, "USEPRIVMSG") == 0)
+ {
+ // This directive is optional
+ setUsePrivmsg();
+ }
+ else if (stricmp(directive, "BOPER") == 0)
+ {
+ // This directive is optional
+ setBOper();
+ }
+ else if (stricmp(directive, "IGNORESERVERS") == 0)
+ {
+ // This directive is optional
+ value = strtok(NULL, "");
+ ignoreserverslist = new char[strlen(value) + 1];
+ strcpy(ignoreserverslist, value);
}
else
{
- cout << "Unknown Directive. Buffer: " << buf << endl;
+ #ifdef DEBUGMODE
+ log("Unknown Directive. Buffer: %s", buf);
+ cerr << "Unknown " << config << " directive. Buffer: "
+ << buf << endl;
+ #endif
continue;
}
}
delete [] buf;
infile.close();
+
+ int nonemissing = 1;
+ for (int count2 = 0; count2 < numdirectives; count2++)
+ {
+ if (!directives[count2].done)
+ {
+ cerr << "Missing config directive: " << directives[count2].desc << endl;
+ nonemissing = 0;
+ }
+ }
+
+ return nonemissing;
}