X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/624c035291676ede6f8125aa7319694250a9596b..c7bceafda9c7c1045b398d8454a0a2ed0fbd9170:/gameserv/config.cpp diff --git a/gameserv/config.cpp b/gameserv/config.cpp index 4481832..7fce944 100644 --- a/gameserv/config.cpp +++ b/gameserv/config.cpp @@ -3,6 +3,7 @@ #include #include #include "extern.h" +#include "flags.h" using std::ifstream; using std::cerr; @@ -21,9 +22,21 @@ char *c_Forest; // Forest channel char *c_ForestTopic; // Forest Channel Topic char *adminpass; // Administrator password char *welcomemsg; // Welcome Message +char *ignoreserverslist; // Servernames to ignore +char *nsname; // NickServ's name +char *nspass; // GameServ's NickServ Password + 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 +int level1expire; // Days for level 1 players to expire +int defaultexpire; // Days for other levels to expire +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. @@ -31,8 +44,13 @@ char *remoteserver; // Server to connect to char *remoteport; // Port to connect to on remoteserver char *remotepass; // Password for the server link +char *tavernitemdata; // File to store the items available in the tavern +char *itemdata; // File to store the items in char *playerdata; // File to store player data in -char *monsterdata; // File to load monster data from +char *dragondata; // File to store current dragon data in +char *masterdata; // File to store the master data in +char *newsdata; // File to store news data in +char *pidfile; // Process ID file #if defined(P10) char *gsnum = "[]AAA"; // GameServ Numeric @@ -60,21 +78,102 @@ void unload_config_file() delete [] remotepass; if (playerdata) delete [] playerdata; - if (monsterdata) - delete [] monsterdata; + if (tavernitemdata) + delete [] tavernitemdata; + if (itemdata) + delete [] itemdata; + if (dragondata) + delete [] dragondata; + if (masterdata) + delete [] masterdata; if (adminpass) delete [] adminpass; if (welcomemsg) delete [] welcomemsg; + if (pidfile) + delete [] pidfile; + if (ignoreserverslist) + delete [] ignoreserverslist; + if (newsdata) + delete [] newsdata; + if (nsname) + delete [] nsname; + if (nspass) + delete [] nspass; + + configflags = 0; } int load_config_file(char *config) { char *buf, *directive, *value; - buf = new char[1024]; + + #define numdirectives 32 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 = "SAVEDNOTICE - True/False as to wether or not to tell the forest "\ + "channel that the player database has been saved"; + 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"; + directives[23].desc = "LEVEL1EXPIRE - Amount of days until a "\ + "level 1 player's account is deleted due to "\ + "inactivity."; + directives[24].desc = "DEFAULTEXPIRE - Amount of days until a "\ + "level 2 and above player's account is "\ + "deleted due to inactivity"; + directives[25].desc = "USENICKSERV - True/False as to wether or not "\ + "GameServ should identify with NickServ"; + directives[26].desc = "NSNAME - Your network's NickServ nickname"; + directives[27].desc = "NSPASS - GameServ's NickServ Password"; + directives[28].desc = "DRAGONDATA - File to store the current "\ + "dragon's stats in"; + directives[29].desc = "MASTERDATA - File to store the level master stats in"; + directives[30].desc = "ITEMDATA - File to store the items in"; + directives[31].desc = "TAVERNITEMDATA - File in which to store the items that are available in the tavern"; + + configflags = 0; + + for (int count = 0; count < numdirectives; count++) + { + directives[count].done = false; + } + ifstream infile; infile.open(config); if (infile.fail()) @@ -84,6 +183,8 @@ int load_config_file(char *config) return 0; } + buf = new char[1024]; + while (infile.getline(buf, 1024, '\n')) { #ifdef DEBUGMODE @@ -101,6 +202,7 @@ int load_config_file(char *config) 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) @@ -108,93 +210,243 @@ int load_config_file(char *config) 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) + else if (stricmp(directive, "SAVEDNOTICE") == 0) { value = strtok(NULL, ""); - monsterdata = new char[strlen(value) + 1]; - strcpy(monsterdata, value); + if (stricmp(value, "TRUE") == 0) + setSavedNotice(); + 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, "LEVEL1EXPIRE") == 0) + { + value = strtok(NULL, " "); + level1expire = stringtoint(value); + directives[23].done = true; + } + else if (stricmp(directive, "DEFAULTEXPIRE") == 0) + { + value = strtok(NULL, " "); + defaultexpire = stringtoint(value); + directives[24].done = true; + } + else if (stricmp(directive, "USENICKSERV") == 0) + { + value = strtok(NULL, " "); + if (stricmp(value, "TRUE") == 0) + { + setUseNickServ(); + } + + directives[25].done = true; + } + else if (stricmp(directive, "NSNAME") == 0) + { + value = strtok(NULL, ""); + nsname = new char[strlen(value) + 1]; + strcpy(nsname, value); + directives[26].done = true; + } + else if (stricmp(directive, "NSPASS") == 0) + { + value = strtok(NULL, ""); + nspass = new char[strlen(value) + 1]; + strcpy(nspass, value); + directives[27].done = true; + } + else if (stricmp(directive, "DRAGONDATA") == 0) + { + value = strtok(NULL, ""); + dragondata = new char[strlen(value) + 1]; + strcpy(dragondata, value); + directives[28].done = true; + } + else if (stricmp(directive, "MASTERDATA") == 0) + { + value = strtok(NULL, ""); + masterdata = new char[strlen(value) + 1]; + strcpy(masterdata, value); + directives[29].done = true; + } + else if (stricmp(directive, "ITEMDATA") == 0) + { + value = strtok(NULL, ""); + itemdata = new char[strlen(value) + 1]; + strcpy(itemdata, value); + directives[30].done = true; + } + else if (stricmp(directive, "TAVERNITEMDATA") == 0) + { + value = strtok(NULL, ""); + itemdata = new char[strlen(value) + 1]; + strcpy(itemdata, value); + directives[31].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 { @@ -208,5 +460,16 @@ int load_config_file(char *config) } delete [] buf; infile.close(); -return 1; + + 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; }