X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/553ba7ed079e5b7e018e2b3c609568f322e35d77..4890937ba3b77b5245a2de042b1bf7fbdc65a94f:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 1ba1ea3..df34234 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -14,10 +14,10 @@ #include "sockhelp.h" #include "options.h" -#include "list.h" #include "aClient.h" #include "extern.h" #include "flags.h" +#include "toplist.h" #include #include #include @@ -25,6 +25,7 @@ #include #include #include +#include //#include //#include @@ -33,17 +34,23 @@ using namespace std; char *PACKAGE = "GameServ"; -char *VERSION = "1.3.0 +devel"; +char *VERSION = "1.3.4 +devel"; int sock; long lastrefresh; +long lastrollover; -List clients[U_TABLE_SIZE]; +list clients[U_TABLE_SIZE]; void save_lastrefresh(); void load_lastrefresh(); +void load_lastrollover(); +void save_lastrollover(); void prettyIntro(); void check_idles(); +void clearClients(); +void clearPlayers(); +void clearItems(); // Make this a daemon int daemon(int nochdir, int noclose); @@ -53,59 +60,60 @@ void closeall(int fd); int main(int argc, char *argv[]) { - char buffer[1024], buf[1024]; - memset(buffer, 0, 1024); - memset(buf, 0, 1024); - int connected; - long lastidlecheck; - char *cmd, *source = NULL, *conf; - srand(time(NULL)); - conf = new char[16]; - strcpy(conf, "gameserv.conf"); - + char buffer[1024], buf[1024]; + memset(buffer, 0, 1024); + memset(buf, 0, 1024); + int connected; + long lastidlecheck; + char *cmd, *source = NULL, *conf; + srand(time(NULL)); + conf = new char[16]; + strcpy(conf, "gameserv.conf"); + /* * This needs to be fixed to work for any number of arguments in any * order * */ if (argc > 1) - { - if ( argc > 2 || stricmp(argv[1], "--help") == 0) { - cout << "Usage: gameserv [options] [configfile]" << endl; - cout << "Options:" << endl; - cout << "--help Displays this help dialogue" << endl; - return 1; + if ( argc > 2 || stricmp(argv[1], "--help") == 0) + { + cout << "Usage: gameserv [options] [configfile]" << endl; + cout << "Options:" << endl; + cout << "--help Displays this help dialogue" << endl; + delete []conf; + return 1; + } + delete []conf; + conf = argv[1]; } - delete []conf; - conf = argv[1]; - } - + prettyIntro(); - + if (load_config_file(conf)) - { - cout << "Config file loaded ok...\n" - << "Turning into a daemon" << endl; - } + { + cout << "Config file loaded ok...\n" + << "Turning into a daemon" << endl; + } else exit(2); - - if (argc <= 1) + + if (argc <= 1) delete []conf; - - // Turn into a daemon - if (daemon(1,0) < 0) + + // Turn into a daemon + if (daemon(1,0) < 0) { - perror("Could not turn into a daemon"); - exit(3); + perror("Could not turn into a daemon"); + exit(3); } if (load_items() == 0) { log("Error loading items"); goto end; } - + if (load_store() == 0) { log("Error loading store"); @@ -116,11 +124,11 @@ int main(int argc, char *argv[]) log("Error loading tavern"); goto end; } - + load_gs_dbase(); loadNews(newsdata, todaysnews); - - + + if (load_masters() == false) { log("Error loading masters"); @@ -144,226 +152,272 @@ int main(int argc, char *argv[]) log("Error loading levels"); goto end; } - - shuttingdown = false; - - char ignoreservers[32][256]; - char *currentserver; - currentserver = strtok(ignoreserverslist, " "); - for (int server = 0; server < 32 && currentserver != NULL; server++) + + shuttingdown = false; + + char ignoreservers[32][256]; + char *currentserver; + currentserver = strtok(ignoreserverslist, " "); + for (int server = 0; server < 32 && currentserver != NULL; server++) { - strncpy(ignoreservers[server], currentserver, 255); - log("Placing %s on the server ignore list", currentserver); - currentserver = strtok(NULL, " "); + strncpy(ignoreservers[server], currentserver, 255); + log("Placing %s on the server ignore list", currentserver); + currentserver = strtok(NULL, " "); } - - // This loop will retry the connection 3 times - for (int retry = 0; retry < 3 && !shuttingdown; retry++) - { - connected = 1; - load_lastrefresh(); - - - long int loadtime = time(NULL); - long int currentTime; - long int oldTime = loadtime; - - lastidlecheck = loadtime; - - #ifdef DEBUGMODE - log("Setting primary Idle Check timestamp: %ld", lastidlecheck); - #endif - bool loaded = false; - - ignore_pipe(); - sock = conn(remoteserver, remoteport, localhost, 0); - // sock = make_connection(remoteport, SOCK_STREAM, remoteserver); - if (sock == -1) { - fprintf(stderr,"make_connection failed.\n"); - unload_config_file(); - return -1; - } - log("%S socket connected."); - + + // This loop will retry the connection 3 times + for (int retry = 0; retry < 3 && !shuttingdown; retry++) + { + connected = 1; + load_lastrefresh(); + load_lastrollover(); + + long int loadtime = time(NULL); + long int currentTime; + long int oldTime = loadtime; + + lastidlecheck = loadtime; + +#ifdef DEBUGMODE + log("Setting primary Idle Check timestamp: %ld", lastidlecheck); +#endif + bool loaded = false; + + ignore_pipe(); + sock = conn(remoteserver, remoteport, localhost, 0); + // sock = make_connection(remoteport, SOCK_STREAM, remoteserver); + if (sock == -1) + { + fprintf(stderr,"make_connection failed.\n"); + unload_config_file(); + return -1; + } + log("%S socket connected."); + #ifdef UNREAL - raw("PASS :%s", remotepass); - raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d %S %s %s %d :%s v%s", time(NULL), gshost, - servername, time(NULL), PACKAGE, VERSION); - raw(":%S JOIN %s", c_Forest); - raw(":%S MODE %s +tn", c_Forest); + raw("PASS :%s", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d %s %s %s %d :%s v%s", time(NULL), gsident, gshost, + servername, time(NULL), PACKAGE, VERSION); + raw(":%S JOIN %s", c_Forest); + raw(":%S MODE %s +tn", c_Forest); #elif defined(BAHAMUT) - raw("PASS %s :TS", remotepass); - raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d +w%s %s %s %s 0 :GameServ", time(NULL), (isBOper() ? "o" : ""), - gsident, gshost, servername); - raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest); + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d +w%s %s %s %s 0 :GameServ", time(NULL), (isBOper() ? "o" : ""), + gsident, gshost, servername); + raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest); #elif defined(HYBRID) - raw("PASS %s :TS", remotepass); - raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d +w%s %s %s %s :GameServ", time(NULL), (isBOper() ? "o" : ""), - gsident, gshost, servername); - raw(":%s SJOIN %ld %s +nt :@%S", servername, time(NULL), c_Forest); + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d +w%s %s %s %s :GameServ", time(NULL), (isBOper() ? "o" : ""), + gsident, gshost, servername); + raw(":%s SJOIN %ld %s +nt :@%S", servername, time(NULL), c_Forest); #elif defined(ULTIMATE2) - raw("PASS %s :TS", remotepass); - raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d %s %s %s 0 :GameServ", - time(NULL), gsident, gshost, servername); - if (isBOper()) + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d %s %s %s 0 :GameServ", + time(NULL), gsident, gshost, servername); + if (isBOper()) raw(":%S mode %S +o"); - raw(":%S JOIN %s", c_Forest); + raw(":%S JOIN %s", c_Forest); +#elif defined(PTLINK) + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d %s%s %s %s %s :GameServ", time(NULL), (isBOper() ? "+iow " : ""), gsident, gshost, gshost, servername); + raw(":%s SJOIN %d %s +nt :@%S", servername, time(NULL), c_Forest); +#elif defined(VLIFE) + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 %d :%s", servername, time(NULL), servername); + raw("NNICK %S 1 %d +w%s %s %s %s %s :GameServ", time(NULL),(isBOper() ? "o" : ""), gsident, gshost, gshost, servername); + raw(":%s SJOIN %d %s +nt :@%S", servername, time(NULL), c_Forest); +#elif defined(BAHAMUT8) + raw("PASS %s :TS", remotepass); + raw("SERVER %s %d :%s", servername, time(NULL), servername); + raw("NICK %S 1 %d +w%s %s %s %s 0 %d :GameServ", time(NULL), (isBOper() ? "o" : ""), gsident, gshost, servername, time(NULL)); + raw(":%s SJOIN %d %d %s +nt :@%S", servername, time(NULL), time(NULL), c_Forest); #elif defined(P10) - // Server numeric is: [] <-- must be unique - raw("PASS :%s", remotepass); - raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername); - raw("[] N %S 1 %d %s %s %s DAqAoB %s :%S", time(NULL), gsident, gshost, - (isBOper() ? "+o" : ""), gsnum); - raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum); + // Server numeric is: [] <-- must be unique + raw("PASS :%s", remotepass); + raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername); + raw("[] N %S 1 %d %s %s %s DAqAoB %s :%S", time(NULL), gsident, gshost, + (isBOper() ? "+o" : ""), gsnum); + raw("[] B %s %d +tn %s:o", c_Forest, time(NULL) - 864000, gsnum); #endif - + #if defined(P10) - raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic); - raw("[] EB"); // End burst + raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic); + raw("[] EB"); // End burst #else - #ifndef HYBRID - #if defined(ULTIMATE2) - raw(":%s MODE %s +o %S %ld", servername, c_Forest, - time(NULL)); - #else - raw(":%S MODE %s +o %S", c_Forest); - #endif - #endif - raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic); -#endif - - #ifndef P10 - if (isUseNickServ()) - { - raw(":%S PRIVMSG %s :IDENTIFY %s", nsname, nspass); - } - #endif - sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to - David Duchene for pointing out the possible - buffer overflow resulting from the linefeed added below. */ - - - #ifdef DEBUGMODE +#ifndef HYBRID +#if defined(ULTIMATE2) + raw(":%s MODE %s +o %S %ld", servername, c_Forest, + time(NULL)); +#else + raw(":%S MODE %s +o %S", c_Forest); +#endif +#endif + raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic); +#endif + +#ifndef P10 + if (isUseNickServ()) + { + raw(":%S PRIVMSG %s :IDENTIFY %s", nsname, nspass); + } +#endif + sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to + David Duchene for pointing out the possible + buffer overflow resulting from the linefeed added below. */ + + +#ifdef DEBUGMODE log("Server: %s",buffer); - #endif - - while (connected) { - if (sock_gets(sock,buffer,sizeof(buffer)) == -1) { - connected = 0; - } - strcpy(buf, buffer); - - #if !defined(P10) - if (buffer[0] == ':') - { - source = strtok(buf, " "); - cmd = strtok(NULL, " "); - } - else - cmd = strtok(buf, " "); - #else - source = strtok(buf, " "); - cmd = strtok(NULL, " "); - #endif - - #ifdef DEBUGMODE - log("Server: %s", buffer); - #endif - - // Wait N seconds then we're loaded. - if (!loaded) - { - if (time(NULL) >= welcomedelay + loadtime) - { - loaded = true; - retry = 0; // Start the reconnection cycle over - } - } - else - { - long TIME = time(NULL); - if (TIME - lastidlecheck >= idlecheckperiod) - { - check_idles(); - lastidlecheck = TIME; - } - } - - // Refresh players and clear news if the time is up - currentTime = time(NULL); - if (currentTime - lastrefresh >= refreshperiod) - { - refreshall(); - clearNews(todaysnews); - saveNews(newsdata, todaysnews); - lastrefresh = currentTime; - save_lastrefresh(); - notice(s_GameServ, c_Forest, "Refreshing all players "\ - "and resetting news!"); - } - - // Save the player data every updateperiod seconds - currentTime = time(NULL); - if (currentTime - oldTime >= updateperiod) - { - oldTime = currentTime; - log("Saving to %s", playerdata); - - save_gs_dbase(); - saveNews(newsdata, todaysnews); - if (isSavedNotice()) - { - // Send notice to the channel of the update - notice(s_GameServ, c_Forest, "%S player data saved"); - } - } +#endif + + while (connected) + { + if (sock_gets(sock,buffer,sizeof(buffer)) == -1) + { + connected = 0; + } + strcpy(buf, buffer); + +#if !defined(P10) + if (buffer[0] == ':') + { + source = strtok(buf, " "); + cmd = strtok(NULL, " "); + } + else + { + cmd = strtok(buf, " "); + } +#else + source = strtok(buf, " "); + cmd = strtok(NULL, " "); +#endif + +#ifdef DEBUGMODE + log("Server: %s", buffer); +#endif + + // Wait N seconds then we're loaded. + if (!loaded) + { + if (time(NULL) >= welcomedelay + loadtime) + { + loaded = true; + retry = 0; // Start the reconnection cycle over + } + } + else + { + long TIME = time(NULL); + if (TIME - lastidlecheck >= idlecheckperiod) + { + check_idles(); + lastidlecheck = TIME; + } + } + // Refresh players and clear news if the time is up + currentTime = time(NULL); + + if (isRolloverForestFights()) + { + if (currentTime - lastrollover >= rolloverperiod) + { + rolloverall(); + lastrollover = currentTime; + save_lastrollover(); + notice(s_GameServ, c_Forest, "Adding %d forest fights to all players!", numrolloverfights); + } + } + + if (currentTime - lastrefresh >= refreshperiod) + { + refreshall(); + clearNews(todaysnews); + saveNews(newsdata, todaysnews); + lastrefresh = currentTime; + save_lastrefresh(); + notice(s_GameServ, c_Forest, "Refreshing all players "\ + "and resetting news!"); + } - #if !defined(P10) - if (stricmp(cmd, "PING") == 0) { - char *timestamp; - timestamp = strtok(NULL, ""); - raw("PONG %s", timestamp); - #else - if (stricmp(cmd, "G") == 0) { - char *timestamp; - timestamp = strtok(NULL, " "); - raw("[] Z [] %s 0 %s", timestamp + 1, timestamp); - #endif - #ifdef P10 - } else if (stricmp(cmd, "EB") == 0) { - raw("[] EA"); - #endif - } else if (stricmp(cmd, "VERSION") == 0) { - char *server; - server = strtok(NULL, " "); - server++; - raw(":%s 351 %s %s_%s. %s", servername, source+1, PACKAGE, VERSION, servername); - #if !defined(P10) - } else if (strncmp(cmd, "NICK", 4) == 0) { - if (buffer[0] == ':') - { - aClient *tempPtr; - if ((tempPtr = find((source + 1)))) - { - char *nick; - unsigned long oldhv, newhv; - nick = strtok(NULL, " "); - oldhv = iHASH((unsigned char *) tempPtr->getNick()); - newhv = iHASH((unsigned char *) nick); - tempPtr->setNick(nick); - clients[oldhv].remove(tempPtr); - clients[newhv].insertAtBack(tempPtr); - } - } - else - { - char *nick; - #else + // Save the player data every updateperiod seconds + if (currentTime - oldTime >= updateperiod) + { + oldTime = currentTime; + log("Saving to %s", playerdata); + + save_gs_dbase(); + saveNews(newsdata, todaysnews); + if (isSavedNotice()) + { + // Send notice to the channel of the update + notice(s_GameServ, c_Forest, "%S player data saved"); + } + } + + +#if !defined(P10) + if (stricmp(cmd, "PING") == 0) + { + char *timestamp; + timestamp = strtok(NULL, ""); + raw("PONG %s", timestamp); + } +#else + // P10 Ping + if (stricmp(cmd, "G") == 0) + { + char *timestamp; + timestamp = strtok(NULL, " "); + raw("[] Z [] %s 0 %s", timestamp + 1, timestamp); + } +#endif +#ifdef P10 + else if (stricmp(cmd, "EB") == 0) + { + raw("[] EA"); + } +#endif + else if (stricmp(cmd, "VERSION") == 0) + { + char *server; + server = strtok(NULL, " "); + server++; + raw(":%s 351 %s %s_%s. %s", servername, source+1, PACKAGE, VERSION, servername); + } + // Code indenting is clean up until here! +#if !defined(P10) + else if (strncmp(cmd, "NICK", 4) == 0 + #ifdef VLIFE + || strncmp(cmd, "NNICK", 5) == 0 + #endif + ) + { + if (buffer[0] == ':') + { + aClient *tempPtr; + if ((tempPtr = find((source + 1)))) + { + char *nick; + unsigned long oldhv, newhv; + nick = strtok(NULL, " "); + oldhv = iHASH((unsigned char *) tempPtr->getNick()); + newhv = iHASH((unsigned char *) nick); + tempPtr->setNick(nick); + clients[oldhv].remove(tempPtr); + clients[newhv].push_back(tempPtr); + } + } + else + { + char *nick; +#else } else if (stricmp(cmd, "N") == 0 && strlen(source) == 2) { { char *nick, *realnick; @@ -374,10 +428,9 @@ int main(int argc, char *argv[]) if (nick[0] == '+') { - #ifdef DEBUGMODE +#ifdef DEBUGMODE log ("aClient has modes"); - #endif - +#endif // Searching for the +r mode (extra parameter) for (unsigned int count = 1; count < strlen(nick); count++) { @@ -389,157 +442,137 @@ int main(int argc, char *argv[]) } nick = strtok(NULL, " "); } - #endif - aClient *newuser, *temp; +#endif + aClient *newuser; nick = strtok(NULL, " "); - #ifdef P10 +#ifdef P10 newuser = new aClient(nick, realnick); - #else +#else newuser = new aClient(nick); - #endif - +#endif - if (loaded) - if (isWelcome()) - { - #ifdef P10 - notice(s_GameServ, nick, welcomemsg, realnick); - #else - notice(s_GameServ, nick, welcomemsg, nick); - #endif - } - #ifdef P10 + if (loaded) + if (isWelcome()) + { +#ifdef P10 + notice(s_GameServ, nick, welcomemsg, realnick); +#else + notice(s_GameServ, nick, welcomemsg, nick); +#endif + } +#ifdef P10 unsigned long hv = sHASH((unsigned char *) nick); - #else +#else unsigned long hv = iHASH((unsigned char *) nick); - #endif - - temp = clients[hv].insertAtBack(newuser); - - #if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2) - char *nickserver; - strtok(NULL, " "); - strtok(NULL, " "); - nickserver = strtok(NULL, " "); - if (nickserver[0] == '+') - strtok(NULL, " "); - strtok(NULL, " "); - nickserver = strtok(NULL, " "); - for (int x = 0; x < 32; x++) - { +#endif + +#if defined(HYBRID) || defined(BAHAMUT) || defined(ULTIMATE2) || defined(PTLINK) + char *nickserver; + strtok(NULL, " "); + strtok(NULL, " "); + nickserver = strtok(NULL, " "); + if (nickserver[0] == '+') + strtok(NULL, " "); + strtok(NULL, " "); + nickserver = strtok(NULL, " "); + for (int x = 0; x < 32; x++) + { if (stricmp(ignoreservers[x], nickserver) == 0) - { - setIgnore(temp); + { + setIgnore(newuser); break; - } - } - #elif defined(UNREAL) - char *nickserver; - strtok(NULL, " "); - strtok(NULL, " "); - strtok(NULL, " "); - strtok(NULL, " "); - nickserver = strtok(NULL, " "); - for (int x = 0; x < 32; x++) - { + } + } +#elif defined(UNREAL) + char *nickserver; + strtok(NULL, " "); + strtok(NULL, " "); + strtok(NULL, " "); + strtok(NULL, " "); + nickserver = strtok(NULL, " "); + for (int x = 0; x < 32; x++) + { if (stricmp(ignoreservers[x], nickserver) == 0) - { - setIgnore(temp); + { + setIgnore(newuser); break; - } - } - #endif - delete newuser; + } + } +#endif + clients[hv].push_back(newuser); } - #if defined(P10) +#if defined(P10) } else if (stricmp(cmd, "Q") == 0) { // unsigned long hv = sHASH((unsigned char *) source); - #else - } else if (stricmp(cmd, "QUIT") == 0) { -// unsigned long hv = iHASH((unsigned char *) source); - #endif - aClient *quitter; - char z = source[0]; +#else + } else if (stricmp(cmd, "QUIT") == 0) + { + +#endif + aClient *quitter; + char z = source[0]; if (z == ':') - source++; + source++; + unsigned long hv = iHASH((unsigned char *) source); if (!(quitter = find(source))) - { - log("Fatal Error: could not find %s in the "\ - "clients list", source); - goto end; - } - - logout(quitter); - - if (z == ':') - source--; + { + log("Fatal Error: could not find %s in the "\ + "clients list", source); + goto end; + } - /* Attempting to use the logout() function - if ((quitter = find(source))) clients[hv].remove(quitter); - if ((quitter = findIRCplayer(source))) - { - if (player_fight(quitter)) - { - // Stop the fight on the other client - aClient *otherplayer = quitter->stats->battle; - otherplayer->stats->battle = NULL; - notice(s_GameServ, otherplayer->getNick(), "%s "\ - "has quit IRC. The fight stops here.", - quitter->stats->name); - } - quitter->stats->battle = NULL; - quitter->stats->fight = NULL; - quitter->stats->master = NULL; - - quitter->setNick("Not Playing"); - #ifdef P10 - quitter->setRealNick("Not Playing"); - #endif - quitter->stats->client = NULL; // Unidentify them - } - */ + logout(quitter); - #if defined(P10) - } else if (stricmp(cmd, "P") == 0) { - char *rest, *dest; - char *longname; - longname = new char[strlen(s_GameServ) + strlen(servername) + 2]; - - sprintf(longname, "%S@%s", servername); + delete quitter; + + if (z == ':') + source--; - dest = strtok(NULL, " "); - rest = strtok(NULL, ""); - if (stricmp(dest, gsnum) == 0 || stricmp(dest, longname) == 0) - { - delete [] longname; - gameserv(source, rest); - } - else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) - { - delete [] longname; - forest(source, rest); - } - #else - } else if (stricmp(cmd, "PRIVMSG") == 0) { +#if defined(P10) + } + else if (stricmp(cmd, "P") == 0) + { + char *rest, *dest; + char *longname; + longname = new char[strlen(s_GameServ) + strlen(servername) + 2]; + + sprintf(longname, "%S@%s", servername); + + dest = strtok(NULL, " "); + rest = strtok(NULL, ""); + if (stricmp(dest, gsnum) == 0 || stricmp(dest, longname) == 0) + { + delete [] longname; + gameserv(source, rest); + } + else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) + { + delete [] longname; + forest(source, rest); + } +#else + } + else if (stricmp(cmd, "PRIVMSG") == 0) + { char *rest, *dest; dest = strtok(NULL, " "); rest = strtok(NULL, ""); if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0) - gameserv(source, rest); + gameserv(source, rest); else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) - forest(source, rest); - #endif - #if defined(P10) + forest(source, rest); +#endif +#if defined(P10) } else if (stricmp(cmd, "J") == 0) { - #else +#else } else if (stricmp(cmd, "JOIN") == 0) { - #endif +#endif char *channel; aClient *joiner; channel = strtok(NULL, " "); @@ -549,27 +582,27 @@ int main(int argc, char *argv[]) if (z == ':') source++; - joiner = find(source); + joiner = find(source); if (stricmp(channel, c_Forest) == 0 && is_playing(joiner)) { - #ifdef DEBUGMODE - log("Player %s (IRC: %s) joined %s", - joiner->stats->name.c_str(), - #ifdef P10 - joiner->getRealNick(), - #else - joiner->getNick(), - #endif - c_Forest); - #endif - raw(":%S MODE %s +v %s", c_Forest, (source)); +#ifdef DEBUGMODE + log("Player %s (IRC: %s) joined %s", + joiner->stats->getName().c_str(), +#ifdef P10 + joiner->getRealNick(), +#else + joiner->getNick(), +#endif + c_Forest); +#endif + raw(":%S MODE %s +v %s", c_Forest, (source)); } if (z == ':') source--; - #if defined(BAHAMUT) +#if defined(BAHAMUT) } else if (stricmp(cmd, "SJOIN") == 0) { char *channel, *nick, *tmp, *rest; strtok(NULL, " "); // Ignore the TS @@ -595,9 +628,9 @@ int main(int argc, char *argv[]) } #endif } else { - #ifdef DEBUGMODE +#ifdef DEBUGMODE log("Unrecognized Message: cmd = %s source = %s", cmd, source); - #endif +#endif } } @@ -608,12 +641,14 @@ int main(int argc, char *argv[]) save_gs_dbase(); save_dragon(); saveNews(newsdata, todaysnews); - + clearClients(); + clearPlayers(); + clearItems(); delete_monsters(); - #ifdef DEBUGMODE +#ifdef DEBUGMODE log(""); - #endif +#endif close(sock); unload_config_file(); @@ -662,137 +697,107 @@ aClient *findbyrealnick(char *realnick) aClient *findbynick(char *nick) { - ListNode *newPtr; - #ifdef P10 - unsigned long hv = sHASH((unsigned char *) nick); - #else - unsigned long hv = iHASH((unsigned char *) nick); - #endif - - newPtr = clients[hv].First(); - - aClient *client = NULL; + list::iterator iter; +#ifdef P10 + unsigned long hv = sHASH((unsigned char *) nick); +#else + unsigned long hv = iHASH((unsigned char *) nick); +#endif - while (newPtr) + aClient *client = NULL; + + for(iter = clients[hv].begin(); iter != clients[hv].end(); iter++) { - client = newPtr->getData(); - #ifdef P10 - if (strcmp(client->getNick(), nick) == 0) - #else - if (stricmp(client->getNick(), nick) == 0) - #endif - return client; - client = NULL; - newPtr = newPtr->Next(); + client = (*iter); +#ifdef P10 + if (strcmp(client->getNick(), nick) == 0) + { +#else + if (stricmp(client->getNick(), nick) == 0) + { +#endif + return client; + } + client = NULL; } - return client; + return client; } -aClient *findIRCplayer(const char *nick) +Player *findplayer(const char *name) { - ListNode *newPtr; - aClient *p = NULL; - - p = find(nick); - - if (!is_playing(p)) - return NULL; - - unsigned long hv = iHASH((unsigned char *) p->stats->name.c_str()); - - for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next()) + list::iterator iter; + Player *p; + unsigned long hv = iHASH((unsigned char *) name); + for (iter = players[hv].begin(); iter != players[hv].end(); iter++) { - p = newPtr->getData(); - #ifdef P10 - if (strcmp(p->getNick(), nick) == 0) - #else - if (stricmp(p->getNick(), nick) == 0) - #endif + p = (*iter); + if (stricmp(p->getName().c_str(), name) == 0) return p; - p = NULL; + p = NULL; } - return NULL; -} - -aClient *findplayer(const char *name) -{ - ListNode *newPtr; - Player *p = NULL; - unsigned long hv = iHASH((unsigned char *) name); - for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next()) - { - p = newPtr->getData()->stats; - if (stricmp(p->name.c_str(), name) == 0) - return newPtr->getData(); - p = NULL; - } - return NULL; + return NULL; } void check_idles() { - ListNode *newPtr; - Player *p = NULL; - - for (int x = 0; x < U_TABLE_SIZE; x++) + list::iterator iter; + Player *p; + + for (int x = 0; x < U_TABLE_SIZE; x++) { - for (newPtr = players[x].First(); newPtr; newPtr = newPtr->Next()) - { - p = newPtr->getData()->stats; - switch(p->level) - { - case 1: - if ((time(NULL) - p->lastlogin) / 86400 >= level1expire) + for (iter = players[x].begin(); iter != players[x].end(); iter++) { - logout(newPtr->getData()); - players[x].remove(newPtr->getData()); - return; - } - break; + p = (*iter); - default: - if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire) - { - logout(newPtr->getData()); - players[x].remove(newPtr->getData()); - return; + switch(p->getLevel()) + { + case 1: + if ((time(NULL) - p->lastlogin) / 86400 >= level1expire) + { + logout(p->getClient()); + return; + } + break; + + default: + if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire) + { + logout(p->getClient()); + return; + } + break; + } + if (timedOut(p)) + { + timeOutEvent(p); + } } - break; - } - if (timedOut(p)) - { - timeOutEvent(p); - } - } } } aClient *findbynick(const char *nick) { - ListNode *newPtr; - #ifdef P10 - unsigned long hv = sHASH((unsigned char *) nick); - #else - unsigned long hv = iHASH((unsigned char *) nick); - #endif - - newPtr = clients[hv].First(); - - aClient *client = NULL; - - while (newPtr) + list::iterator iter; +#ifdef P10 + unsigned long hv = sHASH((unsigned char *) nick); +#else + unsigned long hv = iHASH((unsigned char *) nick); +#endif + + aClient *client = NULL; + + for (iter = clients[hv].begin(); iter != clients[hv].end(); iter++) { - client = newPtr->getData(); - #ifdef P10 - if (strcmp(client->getNick(), nick) == 0) - #else + client = (*iter); +#ifdef P10 + if (strcmp(client->getNick(), nick) == 0) +#else if (stricmp(client->getNick(), nick) == 0) - #endif - return client; - client = NULL; - newPtr = newPtr->Next(); +#endif + return client; + client = NULL; } - return client; + return client; } /* daemon() - detach process from user and disappear into the background @@ -877,32 +882,62 @@ void load_lastrefresh() infile.open(".gsrefresh"); if (infile.fail()) { - #ifdef DEBUGMODE +#ifdef DEBUGMODE log("Error opening .gsrefresh"); - #endif +#endif generate: long mytime = time(NULL); - #ifdef DEBUGMODE +#ifdef DEBUGMODE log("Generating new refresh time"); - #endif +#endif // Just a safety measure... tho no one should - // get anywhere near the time as their refreshperiod + // get anywhere near the actual time as their refreshperiod if (refreshperiod >= mytime) + { + log("Refresh period is greater than or equal to the actual time... setting it to 86400"); refreshperiod = 86400; - + } + lastrefresh = mytime - (mytime % refreshperiod); + refreshall(); save_lastrefresh(); return; } infile >> lastrefresh; + infile.close(); if (lastrefresh < 0) goto generate; } +void load_lastrollover() +{ + ifstream infile; + infile.open(".gsrollover"); + if (infile.fail()) + { +#ifdef DEBUGMODE + log("Error opening .gsrollover"); +#endif + + generate: + long mytime = time(NULL); +#ifdef DEBUGMODE + log("Generating new rollover time"); +#endif + lastrollover = mytime; + return; + } + infile >> lastrollover; + + infile.close(); + if (lastrollover < 0) + goto generate; +} + void save_lastrefresh() { ofstream outfile; @@ -914,7 +949,56 @@ void save_lastrefresh() log("Error creating new file .gsrefresh"); return; } - outfile << lastrefresh << endl; + outfile << lastrefresh << endl << lastrollover; + + outfile.close(); +} + +void save_lastrollover() +{ + ofstream outfile; + + outfile.open(".gsrollover"); + if (outfile.fail()) + { + log("Error creating new file .gsrollover"); + return; + } + outfile << lastrollover << endl; outfile.close(); } +void clearItems() +{ + list::iterator iter; + for (iter = Items.begin(); iter != Items.end(); iter++) + { + delete (*iter); + Items.erase(iter); + } +} +void clearClients() +{ + list::iterator iter; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for (iter = clients[x].begin(); iter != clients[x].end(); iter++) + { + delete (*iter); + clients[x].erase(iter); + } + } +} + +void clearPlayers() +{ + list::iterator iter; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + delete (*iter); + players[x].erase(iter); + } + } +}