X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/c8ada07e2ac45fbb2aeee5fcdf25115ec8bf94f7..1af35752f2d368fd53598eb57dc837076e862b15:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 2597e27..30a5051 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -13,6 +13,7 @@ */ #include "sockhelp.h" +#include "options.h" #include "list.h" #include "aClient.h" #include "extern.h" @@ -20,21 +21,29 @@ #include #include #include +#include #include -#include #include +char *PACKAGE = "GameServ"; +char *VERSION = "1.1.2"; + int sock; +long timestamp; + List clients; +void save_timestamp(); +void load_timestamp(); + int main(int argc, char *argv[]) { - char buffer[1024], buf[1024], input[1024], uplink[80], kb[1024]; + char buffer[1024], buf[1024]; int connected = 1; char *cmd, *source = NULL; srand(time(NULL)); - - load_config_file(); + + load_config_file(); if (argc == 1) { argc = 3; @@ -56,14 +65,23 @@ int main(int argc, char *argv[]) return -1; } +#ifdef UNREAL raw("PROTOCTL NICKv2 VHP"); raw("PASS :%s", remotepass); - raw("SERVER %s 1 :Testing Server", servername); - raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :GameServ", time(NULL), gshost, - servername, time(NULL), gshost); + 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(":%S JOIN %s", c_Forest); + raw(":%S MODE %s +mtn", 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); +#endif raw(":%S MODE %s +o %S", c_Forest); - raw(":%S MODE %s +ntm", c_Forest); + raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic); sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to David Duchene for pointing out the possible @@ -72,7 +90,12 @@ int main(int argc, char *argv[]) printf("Server: %s\n",buffer); init_monsters(); + init_masters(); load_gs_dbase(); + load_timestamp(); + int loadtime = time(NULL); + bool loaded = false; + while (connected) { if (sock_gets(sock,buffer,sizeof(buffer)) == -1) { connected = 0; @@ -88,15 +111,31 @@ int main(int argc, char *argv[]) cmd = strtok(buf, " "); cout << "Server: " << buffer << endl << flush; + + // Wait five seconds then we're loaded. + if (!loaded) + { + if (time(NULL) >= 5 + loadtime) + loaded = true; + } + if (stricmp(cmd, "PING") == 0) { char *timestamp; timestamp = strtok(NULL, ""); raw("PONG %s", timestamp); + } else if (stricmp(cmd, "VERSION") == 0) { + char *server; + server = strtok(NULL, " "); + server++; +//351 GameServ Unreal3.2-beta18. irc.the-irc.org :FhiXOo [Linux shell.the-irc.org +//2.4.16-010stab017.17.777-smp #1 SMP Wed Mar 19 16:25:17 MSK 2003 i686 unknown=2303] + + raw(":%s 351 %s %s %s. %s", servername, source+1, PACKAGE, VERSION, servername); } else if (strncmp(cmd, "NICK", 4) == 0) { if (buffer[0] == ':') { aClient *tempPtr; - if (tempPtr = find((source + 1))) + if ((tempPtr = find((source + 1)))) { char *nick; nick = strtok(NULL, " "); @@ -109,15 +148,18 @@ int main(int argc, char *argv[]) aClient *newuser; nick = strtok(NULL, " "); newuser = new aClient(nick); + if (loaded) + notice(s_GameServ, nick, "Hello, %s! This network utilizes a services package called GameServ. For info on how to play the game, type /msg %S help.", source + 1); + clients.insertAtBack(newuser); delete newuser; } } else if (stricmp(cmd, "QUIT") == 0) { aClient *quitter; - if (quitter = find(source + 1)) + if ((quitter = find(source + 1))) clients.remove(quitter); - if (quitter = findplayer(source + 1)) - players.remove(quitter); + if ((quitter = findplayer(source + 1))) + quitter->setNick("NULL"); } else if (stricmp(cmd, "PRIVMSG") == 0) { char *rest, *dest; @@ -132,12 +174,27 @@ int main(int argc, char *argv[]) channel = strtok(NULL, " "); if (stricmp(channel, c_Forest) == 0 && is_playing(source + 1)) raw(":%S MODE %s +v %s", c_Forest, (source + 1)); + + #if defined(BAHAMUT) + } else if (stricmp(cmd, "SJOIN") == 0) { + char *channel, *nick; + strtok(NULL, " "); // Ignore the TS + strtok(NULL, " "); // Ignore the TS + channel = strtok(NULL, " "); + strtok(NULL, " "); + nick = strtok(NULL, " "); + nick++; // Get rid of the : + if (stricmp(channel, c_Forest) == 0 && is_playing(nick)) + raw(":%S MODE %s +v %s", channel, nick); + #endif + } else { // cout << "Unrecognized Message: cmd = " << cmd << setw(30) << "source = " << // source << endl; } } save_gs_dbase(); + save_timestamp(); delete_monsters(); delete_masters(); @@ -209,3 +266,46 @@ aClient *findbynick(const char *nick) return client; } +void load_timestamp() +{ + ifstream infile; + + infile.open(".gstimestamp"); + + if (infile.fail()) + { + cout << "Error opening .gstimestamp" << endl; + cout << "Generating new timestamp" << endl; + generate: + timestamp = midnight(); + save_timestamp(); + return; + } + + infile >> timestamp; + infile.close(); + if (timestamp < 1000000) + goto generate; +} + +void save_timestamp() +{ + ofstream outfile; + + outfile.open(".gstimestamp"); + + if (outfile.fail()) + { + cout << "Error creating new file." << endl; + return; + } + + outfile << timestamp << endl; + + outfile.close(); +} + +long int midnight(long int offset) +{ + return (time(NULL) - (time(NULL) % 86400)) + (offset * 3600); +}