X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/c10b78ac46128eec6922660394cda759eb520d80..000f8409e78b93b3c6bc8eac7cfae0458c3bef2d:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index e32b564..b07cef9 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -33,7 +33,7 @@ using namespace std; char *PACKAGE = "GameServ"; -char *VERSION = "1.3.2 +devel"; +char *VERSION = "1.3.3 +devel"; int sock; long lastrefresh; @@ -47,6 +47,8 @@ void load_lastrollover(); void save_lastrollover(); void prettyIntro(); void check_idles(); +void clearClients(); +void clearPlayers(); // Make this a daemon int daemon(int nochdir, int noclose); @@ -181,11 +183,12 @@ int main(int argc, char *argv[]) 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; - } + if (sock == -1) + { + fprintf(stderr,"make_connection failed.\n"); + unload_config_file(); + return -1; + } log("%S socket connected."); #ifdef UNREAL @@ -274,7 +277,9 @@ int main(int argc, char *argv[]) cmd = strtok(NULL, " "); } else - cmd = strtok(buf, " "); + { + cmd = strtok(buf, " "); + } #else source = strtok(buf, " "); cmd = strtok(NULL, " "); @@ -305,7 +310,7 @@ int main(int argc, char *argv[]) // Refresh players and clear news if the time is up currentTime = time(NULL); - + if (isRolloverForestFights()) { if (currentTime - lastrollover >= rolloverperiod) @@ -345,46 +350,57 @@ int main(int argc, char *argv[]) #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)))) + if (stricmp(cmd, "PING") == 0) { - 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); + char *timestamp; + timestamp = strtok(NULL, ""); + raw("PONG %s", timestamp); } - } - else - { - char *nick; - #else +#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) + { + 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; @@ -395,10 +411,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++) { @@ -410,16 +425,16 @@ int main(int argc, char *argv[]) } nick = strtok(NULL, " "); } - #endif +#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) @@ -472,10 +487,10 @@ int main(int argc, char *argv[]) #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 } else if (stricmp(cmd, "QUIT") == 0) { @@ -494,8 +509,6 @@ int main(int argc, char *argv[]) goto end; } - - notice(s_GameServ, "Kain", "Nick: %s", quitter->getNick()); clients[hv].remove(quitter); // logout(quitter); @@ -504,33 +517,7 @@ int main(int argc, char *argv[]) if (z == ':') source--; - /* 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 - } - */ - - #if defined(P10) +#if defined(P10) } else if (stricmp(cmd, "P") == 0) { char *rest, *dest; char *longname; @@ -550,7 +537,7 @@ int main(int argc, char *argv[]) delete [] longname; forest(source, rest); } - #else +#else } else if (stricmp(cmd, "PRIVMSG") == 0) { char *rest, *dest; dest = strtok(NULL, " "); @@ -559,12 +546,12 @@ int main(int argc, char *argv[]) gameserv(source, rest); else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) forest(source, rest); - #endif - #if defined(P10) +#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, " "); @@ -578,23 +565,23 @@ int main(int argc, char *argv[]) if (stricmp(channel, c_Forest) == 0 && is_playing(joiner)) { - #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)); +#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 @@ -620,9 +607,9 @@ int main(int argc, char *argv[]) } #endif } else { - #ifdef DEBUGMODE +#ifdef DEBUGMODE log("Unrecognized Message: cmd = %s source = %s", cmd, source); - #endif +#endif } } @@ -633,12 +620,14 @@ int main(int argc, char *argv[]) save_gs_dbase(); save_dragon(); saveNews(newsdata, todaysnews); + clearClients(); + clearPlayers(); delete_monsters(); - #ifdef DEBUGMODE +#ifdef DEBUGMODE log(""); - #endif +#endif close(sock); unload_config_file(); @@ -713,45 +702,16 @@ aClient *findbynick(char *nick) return client; } -aClient *findIRCplayer(const char *nick) -{ - list::iterator iter; - aClient *p = NULL; - - p = find(nick); - - if (!is_playing(p)) - return NULL; - - unsigned long hv = iHASH((unsigned char *) p->stats->getName().c_str()); - - for (iter = players[hv].begin(); iter != players[hv].end(); iter++) - { - p = (*iter); -#ifdef P10 - if (strcmp(p->getNick(), nick) == 0) - { -#else - if (stricmp(p->getNick(), nick) == 0) - { -#endif - return p; - } - p = NULL; - } - return NULL; -} - -aClient *findplayer(const char *name) +Player *findplayer(const char *name) { - list::iterator iter; - Player *p = NULL; + list::iterator iter; + Player *p; unsigned long hv = iHASH((unsigned char *) name); for (iter = players[hv].begin(); iter != players[hv].end(); iter++) { - p = (*iter)->stats; + p = (*iter); if (stricmp(p->getName().c_str(), name) == 0) - return (*iter); + return p; p = NULL; } return NULL; @@ -759,23 +719,21 @@ aClient *findplayer(const char *name) void check_idles() { - list::iterator iter; + list::iterator iter; + Player *p; - Player *p = NULL; - for (int x = 0; x < U_TABLE_SIZE; x++) { for (iter = players[x].begin(); iter != players[x].end(); iter++) { - p = (*iter)->stats; + p = (*iter); switch(p->getLevel()) { case 1: if ((time(NULL) - p->lastlogin) / 86400 >= level1expire) { - logout((*iter)); - players[x].remove((*iter)); + logout(p->getClient()); return; } break; @@ -783,8 +741,7 @@ void check_idles() default: if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire) { - logout((*iter)); - players[x].remove((*iter)); + logout(p->getClient()); return; } break; @@ -811,7 +768,7 @@ aClient *findbynick(const char *nick) for (iter = clients[hv].begin(); iter != clients[hv].end(); iter++) { client = (*iter); - #ifdef P10 +#ifdef P10 if (strcmp(client->getNick(), nick) == 0) #else if (stricmp(client->getNick(), nick) == 0) @@ -904,15 +861,15 @@ 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 actual time as their refreshperiod @@ -990,3 +947,28 @@ void save_lastrollover() outfile << lastrollover << endl; outfile.close(); } + +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); + } + } +}