X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/0b6098d5181341bad81f5a23a709110e4678ce2c..1fe6fccdcc6c293d4d0ce7278698f5847175d4ec:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 4220155..86a0b84 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -17,6 +17,7 @@ #include "list.h" #include "aClient.h" #include "extern.h" +#include "flags.h" #include #include #include @@ -24,27 +25,26 @@ #include #include #include + //#include //#include //#include - - -using std::ofstream; -using std::ifstream; -using std::cerr; -using std::endl; +using namespace std; char *PACKAGE = "GameServ"; -char *VERSION = "1.2.0 +devel"; +char *VERSION = "1.3.0 +devel"; int sock; -int day; +long lastrefresh; +long lastrollover; List clients[U_TABLE_SIZE]; -void save_day(); -void load_day(); +void save_lastrefresh(); +void load_lastrefresh(); +void load_lastrollover(); +void save_lastrollover(); void prettyIntro(); void check_idles(); @@ -56,11 +56,15 @@ void closeall(int fd); int main(int argc, char *argv[]) { - char buffer[1024], buf[1024]; - int connected; - long lastidlecheck; - char *cmd, *source = NULL, *conf = "gameserv.conf"; - srand(time(NULL)); + 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 @@ -76,8 +80,8 @@ int main(int argc, char *argv[]) cout << "--help Displays this help dialogue" << endl; return 1; } - conf = new char[strlen(argv[1])]; - strcpy(conf, argv[1]); + delete []conf; + conf = argv[1]; } prettyIntro(); @@ -90,35 +94,78 @@ int main(int argc, char *argv[]) else exit(2); + if (argc <= 1) + delete []conf; + // Turn into a daemon if (daemon(1,0) < 0) { perror("Could not turn into a daemon"); - exit(2); + exit(3); + } + if (load_items() == 0) + { + log("Error loading items"); + goto end; + } + + if (load_store() == 0) + { + log("Error loading store"); + goto end; + } + if (load_tavern() == 0) + { + log("Error loading tavern"); + goto end; } - init_masters(); load_gs_dbase(); + loadNews(newsdata, todaysnews); + + if (load_masters() == false) + { + log("Error loading masters"); + goto end; + } + if (load_monsters() == false) - goto end; + { + log("Error loading monsters"); + goto end; + } + + if (!load_dragon()) + { + log("Error loading dragon"); + goto end; + } + + if (load_levels() == false) + { + log("Error loading levels"); + goto end; + } - shuttingdown = false; + shuttingdown = false; - strcpy(boss.name, "Red Dragon"); - strcpy(boss.weapon, "Breath of Unholy Fire"); - boss.strength = 6667; - boss.gold = 2000000000; - boss.exp = 2000000000; - strcpy(boss.death, "You finally snuff out the deadly murderous "\ - "dragon's dark flames. You have freed the land of its terror "\ - "filled reign from above!"); + 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, " "); + } // This loop will retry the connection 3 times for (int retry = 0; retry < 3 && !shuttingdown; retry++) { connected = 1; - load_day(); + load_lastrefresh(); + load_lastrollover(); long int loadtime = time(NULL); long int currentTime; @@ -132,52 +179,72 @@ int main(int argc, char *argv[]) bool loaded = false; ignore_pipe(); - sock = make_connection(remoteport, SOCK_STREAM, remoteserver); + 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("PROTOCTL NICKv2 VHP"); raw("PASS :%s", remotepass); raw("SERVER %s 1 :%s", servername, servername); - raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL), gshost, - servername, time(NULL), gshost, PACKAGE, VERSION); + 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 +mtn", 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 +o %s %s %s 0 :GameServ", time(NULL), gsident, gshost, - servername); - raw(":%s SJOIN %d %d %s +mnt :@%S", servername, time(NULL), time(NULL), c_Forest); + 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 +o %s %s %s :GameServ", time(NULL), gsident, gshost, - servername); - // Sending a timestamp of 1 to force ops. - raw(":%s SJOIN 1 %s +ntm :@%S", servername, c_Forest); + 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(":%S mode %S +o"); + raw(":%S JOIN %s", 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 DAqAoB %s :%S", time(NULL), gsident, gshost, gsnum); - raw("[] B %s %d +tnm %s:o", c_Forest, time(NULL) - 864000, gsnum); + 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 #else -#ifndef HYBRID - raw(":%S MODE %s +o %S", c_Forest); -#endif + #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. */ @@ -229,13 +296,44 @@ int main(int argc, char *argv[]) } } - // Save the player data every updateperiod seconds + // 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!", forestfights); + } + } + + 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 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"); + } } @@ -269,9 +367,8 @@ int main(int argc, char *argv[]) char *nick; unsigned long oldhv, newhv; nick = strtok(NULL, " "); - oldhv = HASH((unsigned char *) tempPtr->getNick(), - U_TABLE_SIZE); - newhv = HASH((unsigned char *) nick, U_TABLE_SIZE); + oldhv = iHASH((unsigned char *) tempPtr->getNick()); + newhv = iHASH((unsigned char *) nick); tempPtr->setNick(nick); clients[oldhv].remove(tempPtr); clients[newhv].insertAtBack(tempPtr); @@ -307,7 +404,7 @@ int main(int argc, char *argv[]) nick = strtok(NULL, " "); } #endif - aClient *newuser; + aClient *newuser, *temp; nick = strtok(NULL, " "); @@ -319,19 +416,64 @@ int main(int argc, char *argv[]) if (loaded) + + if (isWelcome()) + { + #ifdef P10 + notice(s_GameServ, nick, welcomemsg, realnick); + #else + notice(s_GameServ, nick, welcomemsg, nick); + #endif + } #ifdef P10 - notice(s_GameServ, nick, welcomemsg, realnick); - #else - notice(s_GameServ, nick, welcomemsg, nick); + unsigned long hv = sHASH((unsigned char *) nick); + #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++) + { + if (stricmp(ignoreservers[x], nickserver) == 0) + { + setIgnore(temp); + break; + } + } + #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); + break; + } + } #endif - unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); - clients[hv].insertAtBack(newuser); delete newuser; } #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]; @@ -339,7 +481,19 @@ int main(int argc, char *argv[]) if (z == ':') source++; - unsigned long hv = HASH((unsigned char *) source, U_TABLE_SIZE); + if (!(quitter = find(source))) + { + log("Fatal Error: could not find %s in the "\ + "clients list", source); + goto end; + } + + logout(quitter); + + if (z == ':') + source--; + + /* Attempting to use the logout() function if ((quitter = find(source))) clients[hv].remove(quitter); if ((quitter = findIRCplayer(source))) @@ -363,9 +517,7 @@ int main(int argc, char *argv[]) #endif quitter->stats->client = NULL; // Unidentify them } - - if (z == ':') - source--; + */ #if defined(P10) } else if (stricmp(cmd, "P") == 0) { @@ -382,7 +534,7 @@ int main(int argc, char *argv[]) delete [] longname; gameserv(source, rest); } - else if (stricmp(dest, c_Forest) == 0) + else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) { delete [] longname; forest(source, rest); @@ -394,7 +546,7 @@ int main(int argc, char *argv[]) rest = strtok(NULL, ""); if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0) gameserv(source, rest); - else if (stricmp(dest, c_Forest) == 0) + else if (stricmp(dest, c_Forest) == 0 && isListenOnCF()) forest(source, rest); #endif #if defined(P10) @@ -417,7 +569,7 @@ int main(int argc, char *argv[]) { #ifdef DEBUGMODE log("Player %s (IRC: %s) joined %s", - joiner->stats->name, + joiner->stats->name.c_str(), #ifdef P10 joiner->getRealNick(), #else @@ -468,10 +620,10 @@ int main(int argc, char *argv[]) end: save_gs_dbase(); - save_day(); + save_dragon(); + saveNews(newsdata, todaysnews); delete_monsters(); - delete_masters(); #ifdef DEBUGMODE log(""); @@ -497,7 +649,7 @@ aClient *find(const char *nick) aClient *findbyrealnick(char *realnick) { ListNode *newPtr; - unsigned long hv = HASH((unsigned char *) realnick, U_TABLE_SIZE); + unsigned long hv = sHASH((unsigned char *) realnick); newPtr = clients[hv].First(); aClient *client = NULL; @@ -525,7 +677,12 @@ aClient *findbyrealnick(char *realnick) aClient *findbynick(char *nick) { ListNode *newPtr; - unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); + #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; @@ -550,7 +707,13 @@ aClient *findIRCplayer(const char *nick) ListNode *newPtr; aClient *p = NULL; - unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); + 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()) { p = newPtr->getData(); @@ -569,11 +732,11 @@ aClient *findplayer(const char *name) { ListNode *newPtr; Player *p = NULL; - unsigned long hv = HASH((unsigned char *) name, U_TABLE_SIZE); + unsigned long hv = iHASH((unsigned char *) name); for (newPtr = players[hv].First(); newPtr; newPtr = newPtr->Next()) { p = newPtr->getData()->stats; - if (stricmp(p->name, name) == 0) + if (stricmp(p->name.c_str(), name) == 0) return newPtr->getData(); p = NULL; } @@ -590,6 +753,26 @@ void check_idles() 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) + { + logout(newPtr->getData()); + players[x].remove(newPtr->getData()); + return; + } + break; + + default: + if ((time(NULL) - p->lastlogin) / 86400 >= defaultexpire) + { + logout(newPtr->getData()); + players[x].remove(newPtr->getData()); + return; + } + break; + } if (timedOut(p)) { timeOutEvent(p); @@ -601,7 +784,12 @@ void check_idles() aClient *findbynick(const char *nick) { ListNode *newPtr; - unsigned long hv = HASH((unsigned char *) nick, U_TABLE_SIZE); + #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; @@ -621,56 +809,6 @@ aClient *findbynick(const char *nick) return client; } -void load_day() -{ - ifstream infile; - - infile.open(".gsday"); - - if (infile.fail()) - { - #ifdef DEBUGMODE - log("Error opening .gsday"); - #endif - - generate: - #ifdef DEBUGMODE - log("Generating new day"); - #endif - struct tm *tm; - time_t ti; - time(&ti); - tm = localtime(&ti); - - day = tm->tm_mday; - - save_day(); - return; - } - - infile >> day; - infile.close(); - if (day < 1 || day > 31) - goto generate; -} - -void save_day() -{ - ofstream outfile; - - outfile.open(".gsday"); - - if (outfile.fail()) - { - log("Error creating new file .gsday"); - return; - } - - outfile << day << endl; - - outfile.close(); -} - /* daemon() - detach process from user and disappear into the background * returns -1 on failure, but you can't do much except exit in that case * since we may already have forked. This is based on the BSD version, @@ -736,12 +874,106 @@ void closeall(int fd) void prettyIntro() { -cout << endl; -cout << " GGGG AAA MM MM EEEEEEE SSSSS EEEEEEE RRRRRR VV VV " << endl; -cout << " GG GG AAAAA MMM MMM EE SS EE RR RR VV VV " << endl; -cout << "GG AA AA MM MM MM EEEEE SSSSS EEEEE RRRRRR VV VV " << endl; -cout << "GG GGG AAAAAAA MM MM EE SS EE RR RR VV VV " << endl; -cout << "G G AA AA MM MM EEEEEEE SSSSS EEEEEEE RR RR VVV" << endl; -cout << " GGGGG V\n\n" << endl; -cout << "Version: " << VERSION << endl; + cout << endl; + cout << " GGGG AAA MM MM EEEEEEE SSSSS EEEEEEE RRRRRR VV VV " << endl; + cout << " GG GG AAAAA MMM MMM EE SS EE RR RR VV VV " << endl; + cout << "GG AA AA MM MM MM EEEEE SSSSS EEEEE RRRRRR VV VV " << endl; + cout << "GG GGG AAAAAAA MM MM EE SS EE RR RR VV VV " << endl; + cout << "G G AA AA MM MM EEEEEEE SSSSS EEEEEEE RR RR VVV" << endl; + cout << " GGGGG V\n\n" << endl; + cout << "Version: " << VERSION << endl; + cout << "http://www.gameserv.us - http://www.sourceforge.net/projects/gameservirc" << endl; +} + +void load_lastrefresh() +{ + ifstream infile; + infile.open(".gsrefresh"); + if (infile.fail()) + { + #ifdef DEBUGMODE + log("Error opening .gsrefresh"); + #endif + + generate: + long mytime = time(NULL); + #ifdef DEBUGMODE + log("Generating new refresh time"); + #endif + + // Just a safety measure... tho no one should + // 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; + + outfile.open(".gsrefresh"); + + if (outfile.fail()) + { + log("Error creating new file .gsrefresh"); + return; + } + 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(); }